diff --git a/DEPS b/DEPS
index 523ab29..86b8c2b 100644
--- a/DEPS
+++ b/DEPS
@@ -253,7 +253,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:c93fd3c5ebdc3999eea86a7623dbd1ed4b40bc78',
+  'luci_go': 'git_revision:78063b01b53dd33a541938207b785cc86d34be37',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -310,7 +310,7 @@
   # 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': '90de5eb32b7edd7107ad5ab7c083d55ee84bee83',
+  'skia_revision': 'b1d73cf5f0581e3bc06bd212565e90c816e5a8df',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -326,7 +326,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': '93797296015034f67cbb4464b947544ce9e8cd25',
+  'pdfium_revision': '3c226cd176f7cf0fb8a3c7d50c5b23d0968c5ed7',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling BoringSSL
   # and whatever else without interference from each other.
@@ -337,7 +337,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Fuchsia sdk
   # and whatever else without interference from each other.
-  'fuchsia_version': 'version:9.20220915.3.1',
+  'fuchsia_version': 'version:9.20220916.1.1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling google-toolbox-for-mac
   # and whatever else without interference from each other.
@@ -381,7 +381,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': 'c06765563619e1d881a26f0e74ef20b69c33c287',
+  'catapult_revision': '14d227abed32499b0038bb58050a952d0d9c0c32',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -796,7 +796,7 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '7e899845af747ef1b8f5b8ace107dd79d39c3a1b',
+    'url': Var('chromium_git') + '/website.git' + '@' + '6212a1c32f19061f556d01d2149c087e2cbb0d91',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -885,7 +885,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'Y3vDcuXgYTosolRwsaziNc_mik48-WLlwUPsUgxeAnkC',
+          'version': 'OoM8BXmm9VM35EseeIOIrAN-ui00xJ2uUxUz95quufgC',
         },
       ],
       'dep_type': 'cipd',
@@ -896,7 +896,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'G2OtoWUEI0-wVZHRLL7YQd7BKr2Jl4jWkAsWBSkWbZYC',
+          'version': 'JMK20MmpZ40gjdj731OKUwyOx912kyqdqRyIL6WsGJ4C',
         },
       ],
       'dep_type': 'cipd',
@@ -907,7 +907,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'h8mT4J8MUHPy0GQ5Qwo8gBOsgyn5pioUXwRFrffdhWcC',
+          'version': 'guca2Wx5IhHtnbKMuBNAB8QWQRBjvFJncspTvgE7wNQC',
         },
       ],
       'dep_type': 'cipd',
@@ -1612,7 +1612,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'de4b5d49c14337173ee73a2b091d1bece86fe1c9',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'cd3e2b402ea0b790022cf819eb6da4e188b7be93',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1793,10 +1793,10 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'd1b65aa5a88f6efd900604dfcda840154e9f16e2',
 
   'src/third_party/webgpu-cts/src':
-    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'dec4d77ee3e525c74ae69f77acf3c9c67dd7e7ce',
+    Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'fc6864066b49a7c49f15bb354155af416e9f2e0c',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '024bd84ca1cf7d3650c27912a3b5bfbb54da152a',
+    Var('webrtc_git') + '/src.git' + '@' + 'babdaa862321bb53a45f38167d3cb84f3de246c6',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1869,7 +1869,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ca3501336d91fb0ca52ed59d3c00b5d011e3761e',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@147252ebc94d20ca285c5a9eb1a49eabf1dd43db',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 1a6bf6d..2061661 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -21,35 +21,35 @@
 
 _EXCLUDED_PATHS = (
     # Generated file
-    (r"chrome[\\/]android[\\/]webapk[\\/]shell_apk[\\/]src[\\/]org[\\/]chromium"
-     r"[\\/]webapk[\\/]lib[\\/]runtime_library[\\/]IWebApkApi.java"),
+    (r"chrome/android/webapk/shell_apk/src/org/chromium"
+     r"/webapk/lib/runtime_library/IWebApkApi.java"),
     # File needs to write to stdout to emulate a tool it's replacing.
-    r"chrome[\\/]updater[\\/]mac[\\/]keystone[\\/]ksadmin.mm",
+    r"chrome/updater/mac/keystone/ksadmin.mm",
     # Generated file.
-    (r"^components[\\/]variations[\\/]proto[\\/]devtools[\\/]"
+    (r"^components/variations/proto/devtools/"
      r"client_variations.js"),
     # These are video files, not typescript.
-    r"^media[\\/]test[\\/]data[\\/].*.ts",
-    r"^native_client_sdksrc[\\/]build_tools[\\/]make_rules.py",
-    r"^native_client_sdk[\\/]src[\\/]build_tools[\\/]make_simple.py",
-    r"^native_client_sdk[\\/]src[\\/]tools[\\/].*.mk",
-    r"^net[\\/]tools[\\/]spdyshark[\\/].*",
-    r"^skia[\\/].*",
-    r"^third_party[\\/]blink[\\/].*",
-    r"^third_party[\\/]breakpad[\\/].*",
+    r"^media/test/data/.*.ts",
+    r"^native_client_sdksrc/build_tools/make_rules.py",
+    r"^native_client_sdk/src/build_tools/make_simple.py",
+    r"^native_client_sdk/src/tools/.*.mk",
+    r"^net/tools/spdyshark/.*",
+    r"^skia/.*",
+    r"^third_party/blink/.*",
+    r"^third_party/breakpad/.*",
     # sqlite is an imported third party dependency.
-    r"^third_party[\\/]sqlite[\\/].*",
-    r"^v8[\\/].*",
+    r"^third_party/sqlite/.*",
+    r"^v8/.*",
     r".*MakeFile$",
     r".+_autogen\.h$",
     r".+_pb2(_grpc)?\.py$",
-    r".+[\\/]pnacl_shim\.c$",
-    r"^gpu[\\/]config[\\/].*_list_json\.cc$",
-    r"tools[\\/]md_browser[\\/].*\.css$",
+    r".+/pnacl_shim\.c$",
+    r"^gpu/config/.*_list_json\.cc$",
+    r"tools/md_browser/.*\.css$",
     # Test pages for Maps telemetry tests.
-    r"tools[\\/]perf[\\/]page_sets[\\/]maps_perf_test.*",
+    r"tools/perf/page_sets/maps_perf_test.*",
     # Test pages for WebRTC telemetry tests.
-    r"tools[\\/]perf[\\/]page_sets[\\/]webrtc_cases.*",
+    r"tools/perf/page_sets/webrtc_cases.*",
 )
 
 _EXCLUDED_SET_NO_PARENT_PATHS = (
@@ -72,15 +72,15 @@
 
 # Paths with sources that don't use //base.
 _NON_BASE_DEPENDENT_PATHS = (
-    r"^chrome[\\/]browser[\\/]browser_switcher[\\/]bho[\\/]",
-    r"^tools[\\/]win[\\/]",
+    r"^chrome/browser/browser_switcher/bho/",
+    r"^tools/win/",
 )
 
 
 # Regular expression that matches code only used for test binaries
 # (best effort).
 _TEST_CODE_EXCLUDED_PATHS = (
-    r'.*[\\/](fake_|test_|mock_).+%s' % _IMPLEMENTATION_EXTENSIONS,
+    r'.*/(fake_|test_|mock_).+%s' % _IMPLEMENTATION_EXTENSIONS,
     r'.+_test_(base|support|util)%s' % _IMPLEMENTATION_EXTENSIONS,
     # Test suite files, like:
     # foo_browsertest.cc
@@ -90,21 +90,21 @@
         _IMPLEMENTATION_EXTENSIONS,
     r'.+_(fuzz|fuzzer)(_[a-z]+)?%s' % _IMPLEMENTATION_EXTENSIONS,
     r'.+sync_service_impl_harness%s' % _IMPLEMENTATION_EXTENSIONS,
-    r'.*[\\/](test|tool(s)?)[\\/].*',
+    r'.*/(test|tool(s)?)/.*',
     # content_shell is used for running content_browsertests.
-    r'content[\\/]shell[\\/].*',
+    r'content/shell/.*',
     # Web test harness.
-    r'content[\\/]web_test[\\/].*',
+    r'content/web_test/.*',
     # Non-production example code.
-    r'mojo[\\/]examples[\\/].*',
+    r'mojo/examples/.*',
     # Launcher for running iOS tests on the simulator.
-    r'testing[\\/]iossim[\\/]iossim\.mm$',
+    r'testing/iossim/iossim\.mm$',
     # EarlGrey app side code for tests.
-    r'ios[\\/].*_app_interface\.mm$',
+    r'ios/.*_app_interface\.mm$',
     # Views Examples code
-    r'ui[\\/]views[\\/]examples[\\/].*',
+    r'ui/views/examples/.*',
     # Chromium Codelab
-    r'codelabs[\\/]*'
+    r'codelabs/*'
 )
 
 _THIRD_PARTY_EXCEPT_BLINK = 'third_party/(?!blink/)'
@@ -449,8 +449,8 @@
       True,
       (
         # Files that #define IGNORE_EINTR.
-        r'^base[\\/]posix[\\/]eintr_wrapper\.h$',
-        r'^ppapi[\\/]tests[\\/]test_broker\.cc$',
+        r'^base/posix/eintr_wrapper\.h$',
+        r'^ppapi/tests/test_broker\.cc$',
       ),
     ),
     BanRule(
@@ -461,7 +461,7 @@
       ),
       True,
       (
-        r'extensions[\\/]renderer[\\/]safe_builtins\.*',
+        r'extensions/renderer/safe_builtins\.*',
       ),
     ),
     BanRule(
@@ -471,8 +471,8 @@
       ),
       True,
       (
-          r'^base[\\/]third_party[\\/]symbolize[\\/].*',
-          r'^third_party[\\/]abseil-cpp[\\/].*',
+          r'^base/third_party/symbolize/.*',
+          r'^third_party/abseil-cpp/.*',
       ),
     ),
     BanRule(
@@ -515,9 +515,9 @@
       ),
       False,
       (
-        r'^content[\\/]browser[\\/]webui[\\/]web_ui_impl\.(cc|h)$',
-        r'^content[\\/]public[\\/]browser[\\/]web_ui\.h$',
-        r'^content[\\/]public[\\/]test[\\/]test_web_ui\.(cc|h)$',
+        r'^content/browser/webui/web_ui_impl\.(cc|h)$',
+        r'^content/public/browser/web_ui\.h$',
+        r'^content/public/test/test_web_ui\.(cc|h)$',
       ),
     ),
     BanRule(
@@ -1032,7 +1032,7 @@
       ),
       True,
       (
-          r'^base[\\/]win[\\/]scoped_winrt_initializer\.cc$',
+          r'^base/win/scoped_winrt_initializer\.cc$',
       ),
     ),
     BanRule(
@@ -1071,9 +1071,9 @@
       [
         # base::Bind{Once,Repeating} references absl::FunctionRef to disallow
         # interoperability.
-        r'^base[\\/]functional[\\/]bind_internal\.h',
+        r'^base/functional/bind_internal\.h',
         # base::FunctionRef is implemented on top of absl::FunctionRef.
-        r'^base[\\/]functional[\\/]function_ref.*\..+',
+        r'^base/functional/function_ref.*\..+',
         # Not an error in third_party folders.
         _THIRD_PARTY_EXCEPT_BLINK,
       ],
@@ -1105,11 +1105,11 @@
 )
 
 _JAVA_MULTIPLE_DEFINITION_EXCLUDED_PATHS = [
-    r".*[\\/]AppHooksImpl\.java",
-    r".*[\\/]BuildHooksAndroidImpl\.java",
-    r".*[\\/]LicenseContentProvider\.java",
-    r".*[\\/]PlatformServiceBridgeImpl.java",
-    r".*chrome[\\\/]android[\\\/]feed[\\\/]dummy[\\\/].*\.java",
+    r".*/AppHooksImpl\.java",
+    r".*/BuildHooksAndroidImpl\.java",
+    r".*/LicenseContentProvider\.java",
+    r".*/PlatformServiceBridgeImpl.java",
+    r".*chrome/android/feed/dummy/.*\.java",
 ]
 
 # List of image extensions that are used as resources in chromium.
@@ -1117,17 +1117,17 @@
 
 # These paths contain test data and other known invalid JSON files.
 _KNOWN_TEST_DATA_AND_INVALID_JSON_FILE_PATTERNS = [
-    r'test[\\/]data[\\/]',
-    r'testing[\\/]buildbot[\\/]',
-    r'^components[\\/]policy[\\/]resources[\\/]policy_templates\.json$',
-    r'^third_party[\\/]protobuf[\\/]',
-    r'^third_party[\\/]blink[\\/]perf_tests[\\/]speedometer[\\/]resources[\\/]todomvc[\\/]learn.json',
-    r'^third_party[\\/]blink[\\/]renderer[\\/]devtools[\\/]protocol\.json$',
-    r'^third_party[\\/]blink[\\/]web_tests[\\/]external[\\/]wpt[\\/]',
-    r'^tools[\\/]perf[\\/]',
-    r'^tools[\\/]traceline[\\/]svgui[\\/]startup-release.json',
+    r'test/data/',
+    r'testing/buildbot/',
+    r'^components/policy/resources/policy_templates\.json$',
+    r'^third_party/protobuf/',
+    r'^third_party/blink/perf_tests/speedometer/resources/todomvc/learn.json',
+    r'^third_party/blink/renderer/devtools/protocol\.json$',
+    r'^third_party/blink/web_tests/external/wpt/',
+    r'^tools/perf/',
+    r'^tools/traceline/svgui/startup-release.json',
     # vscode configuration files allow comments
-    r'^tools[\\/]vscode[\\/]',
+    r'^tools/vscode/',
 ]
 
 # These are not checked on the public chromium-presubmit trybot.
@@ -1730,6 +1730,9 @@
             return False
 
         local_path = affected_file.LocalPath()
+        # Consistently use / as path separator to simplify the writing of regex
+        # expressions.
+        local_path = local_path.replace(input_api.os_path.sep, '/')
         for item in excluded_paths:
             if input_api.re.match(item, local_path):
                 return True
@@ -2040,9 +2043,11 @@
     v8_wrapper_pattern = input_api.re.compile(
         r'^\s*#include\s*"third_party/blink/renderer/platform/heap/v8_wrapper/.*"'
     )
+    # Consistently use / as path separator to simplify the writing of regex
+    # expressions.
     file_filter = lambda f: not input_api.re.match(
-        r"^third_party[\\/]blink[\\/]renderer[\\/]platform[\\/]heap[\\/].*",
-        f.LocalPath())
+        r"^third_party/blink/renderer/platform/heap/.*",
+        f.LocalPath().replace(input_api.os_path.sep, '/'))
     errors = []
 
     for f in input_api.AffectedFiles(file_filter=file_filter):
@@ -2116,7 +2121,7 @@
         """
         return input_api.FilterSourceFile(
             affected_file,
-            files_to_check=[r'^(android_webview|base|content|net)[\\/].*'],
+            files_to_check=[r'^(android_webview|base|content|net)/.*'],
             files_to_skip=(_EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS +
                            input_api.DEFAULT_FILES_TO_SKIP))
 
@@ -2197,9 +2202,9 @@
     """
     errors = []
     files_to_check = [r'.*_[a-z]_.*\.png$|.*_[a-z]\.png$']
-    files_to_skip = [r'^native_client_sdk[\\/]',
-                     r'^services[\\/]test[\\/]',
-                     r'^third_party[\\/]blink[\\/]web_tests[\\/]',
+    files_to_skip = [r'^native_client_sdk/',
+                     r'^services/test/',
+                     r'^third_party/blink/web_tests/',
                     ]
     file_filter = lambda f: input_api.FilterSourceFile(
         f, files_to_check=files_to_check, files_to_skip=files_to_skip)
@@ -2339,8 +2344,11 @@
 
     virtual_depended_on_files = set()
 
+    # Consistently use / as path separator to simplify the writing of regex
+    # expressions.
     file_filter = lambda f: not input_api.re.match(
-        r"^third_party[\\/]blink[\\/].*", f.LocalPath())
+        r"^third_party/blink/.*",
+        f.LocalPath().replace(input_api.os_path.sep, '/'))
     for f in input_api.AffectedFiles(include_deletes=False,
                                      file_filter=file_filter):
         filename = input_api.os_path.basename(f.LocalPath())
@@ -2428,52 +2436,45 @@
     files_to_skip = (
         _EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS +
         input_api.DEFAULT_FILES_TO_SKIP + (
-            r"^base[\\/]logging\.h$",
-            r"^base[\\/]logging\.cc$",
-            r"^base[\\/]task[\\/]thread_pool[\\/]task_tracker\.cc$",
-            r"^chrome[\\/]app[\\/]chrome_main_delegate\.cc$",
-            r"^chrome[\\/]browser[\\/]chrome_browser_main\.cc$",
-            r"^chrome[\\/]browser[\\/]ui[\\/]startup[\\/]"
-            r"startup_browser_creator\.cc$",
-            r"^chrome[\\/]browser[\\/]browser_switcher[\\/]bho[\\/].*",
-            r"^chrome[\\/]browser[\\/]diagnostics[\\/]" +
-            r"diagnostics_writer\.cc$",
-            r"^chrome[\\/]chrome_cleaner[\\/].*",
-            r"^chrome[\\/]chrome_elf[\\/]dll_hash[\\/]" +
-            r"dll_hash_main\.cc$",
-            r"^chrome[\\/]installer[\\/]setup[\\/].*",
-            r"^chromecast[\\/]",
-            r"^components[\\/]browser_watcher[\\/]"
-            r"dump_stability_report_main_win\.cc$",
-            r"^components[\\/]media_control[\\/]renderer[\\/]"
-            r"media_playback_options\.cc$",
-            r"^components[\\/]viz[\\/]service[\\/]display[\\/]"
+            r"^base/logging\.h$",
+            r"^base/logging\.cc$",
+            r"^base/task/thread_pool/task_tracker\.cc$",
+            r"^chrome/app/chrome_main_delegate\.cc$",
+            r"^chrome/browser/chrome_browser_main\.cc$",
+            r"^chrome/browser/ui/startup/startup_browser_creator\.cc$",
+            r"^chrome/browser/browser_switcher/bho/.*",
+            r"^chrome/browser/diagnostics/diagnostics_writer\.cc$",
+            r"^chrome/chrome_cleaner/.*",
+            r"^chrome/chrome_elf/dll_hash/dll_hash_main\.cc$",
+            r"^chrome/installer/setup/.*",
+            r"^chromecast/",
+            r"^components/browser_watcher/dump_stability_report_main_win\.cc$",
+            r"^components/media_control/renderer/media_playback_options\.cc$",
+            r"^components/viz/service/display/"
             r"overlay_strategy_underlay_cast\.cc$",
-            r"^components[\\/]zucchini[\\/].*",
+            r"^components/zucchini/.*",
             # TODO(peter): Remove exception. https://crbug.com/534537
-            r"^content[\\/]browser[\\/]notifications[\\/]"
+            r"^content/browser/notifications/"
             r"notification_event_dispatcher_impl\.cc$",
-            r"^content[\\/]common[\\/]gpu[\\/]client[\\/]"
-            r"gl_helper_benchmark\.cc$",
-            r"^courgette[\\/]courgette_minimal_tool\.cc$",
-            r"^courgette[\\/]courgette_tool\.cc$",
-            r"^extensions[\\/]renderer[\\/]logging_native_handler\.cc$",
-            r"^fuchsia_web[\\/]common[\\/]init_logging\.cc$",
-            r"^fuchsia_web[\\/]runners[\\/]common[\\/]web_component\.cc$",
-            r"^fuchsia_web[\\/]shell[\\/].*_shell\.cc$",
-            r"^headless[\\/]app[\\/]headless_shell\.cc$",
-            r"^ipc[\\/]ipc_logging\.cc$",
-            r"^native_client_sdk[\\/]",
-            r"^remoting[\\/]base[\\/]logging\.h$",
-            r"^remoting[\\/]host[\\/].*",
-            r"^sandbox[\\/]linux[\\/].*",
-            r"^storage[\\/]browser[\\/]file_system[\\/]" +
-            r"dump_file_system\.cc$",
-            r"^tools[\\/]",
-            r"^ui[\\/]base[\\/]resource[\\/]data_pack\.cc$",
-            r"^ui[\\/]aura[\\/]bench[\\/]bench_main\.cc$",
-            r"^ui[\\/]ozone[\\/]platform[\\/]cast[\\/]",
-            r"^ui[\\/]base[\\/]x[\\/]xwmstartupcheck[\\/]"
+            r"^content/common/gpu/client/gl_helper_benchmark\.cc$",
+            r"^courgette/courgette_minimal_tool\.cc$",
+            r"^courgette/courgette_tool\.cc$",
+            r"^extensions/renderer/logging_native_handler\.cc$",
+            r"^fuchsia_web/common/init_logging\.cc$",
+            r"^fuchsia_web/runners/common/web_component\.cc$",
+            r"^fuchsia_web/shell/.*_shell\.cc$",
+            r"^headless/app/headless_shell\.cc$",
+            r"^ipc/ipc_logging\.cc$",
+            r"^native_client_sdk/",
+            r"^remoting/base/logging\.h$",
+            r"^remoting/host/.*",
+            r"^sandbox/linux/.*",
+            r"^storage/browser/file_system/dump_file_system\.cc$",
+            r"^tools/",
+            r"^ui/base/resource/data_pack\.cc$",
+            r"^ui/aura/bench/bench_main\.cc$",
+            r"^ui/ozone/platform/cast/",
+            r"^ui/base/x/xwmstartupcheck/"
             r"xwmstartupcheck\.cc$"))
     source_file_filter = lambda x: input_api.FilterSourceFile(
         x, files_to_check=file_inclusion_pattern, files_to_skip=files_to_skip)
@@ -2754,12 +2755,12 @@
     }
     # Most JSON files are preprocessed and support comments, but these do not.
     json_no_comments_patterns = [
-        r'^testing[\\/]',
+        r'^testing/',
     ]
     # Only run IDL checker on files in these directories.
     idl_included_patterns = [
-        r'^chrome[\\/]common[\\/]extensions[\\/]api[\\/]',
-        r'^extensions[\\/]common[\\/]api[\\/]',
+        r'^chrome/common/extensions/api/',
+        r'^extensions/common/api/',
     ]
 
     def get_action(affected_file):
@@ -2840,8 +2841,8 @@
     sources = lambda affected_file: input_api.FilterSourceFile(
         affected_file,
         files_to_skip=(_EXCLUDED_PATHS + input_api.DEFAULT_FILES_TO_SKIP + (
-            r'^build[\\/]android[\\/]devil_chromium\.py',
-            r'^third_party[\\/].*',
+            r'^build/android/devil_chromium\.py',
+            r'^third_party/.*',
         )),
         files_to_check=[r'.*\.py$'])
 
@@ -2865,6 +2866,9 @@
 
 
 def _MatchesFile(input_api, patterns, path):
+    # Consistently use / as path separator to simplify the writing of regex
+    # expressions.
+    path = path.replace(input_api.os_path.sep, '/')
     for pattern in patterns:
         if input_api.re.search(pattern, path):
             return True
@@ -3397,12 +3401,11 @@
         files_to_skip=(
             _EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS + input_api.
             DEFAULT_FILES_TO_SKIP + (
-                r"^android_webview[\\/]support_library[\\/]"
-                "boundary_interfaces[\\/]",
-                r"^chrome[\\/]android[\\/]webapk[\\/].*",
-                r'^third_party[\\/].*',
-                r"tools[\\/]android[\\/]customtabs_benchmark[\\/].*",
-                r"webview[\\/]chromium[\\/]License.*",
+                r"^android_webview/support_library/boundary_interfaces/",
+                r"^chrome/android/webapk/.*",
+                r'^third_party/.*',
+                r"tools/android/customtabs_benchmark/.*",
+                r"webview/chromium/License.*",
             )),
         files_to_check=[r'.*\.java$'])
 
@@ -3435,8 +3438,8 @@
     sources = lambda affected_file: input_api.FilterSourceFile(
         affected_file,
         files_to_skip=(_EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS + input_api.
-                       DEFAULT_FILES_TO_SKIP + (r'^chromecast[\\/].*',
-                                                r'^remoting[\\/].*')),
+                       DEFAULT_FILES_TO_SKIP + (r'^chromecast/.*',
+                                                r'^remoting/.*')),
         files_to_check=[r'.*\.java$'])
 
     for f in input_api.AffectedSourceFiles(sources):
@@ -3467,13 +3470,13 @@
     # Do not check format of logs in the given files
     cr_log_check_excluded_paths = [
         # //chrome/android/webapk cannot depend on //base
-        r"^chrome[\\/]android[\\/]webapk[\\/].*",
+        r"^chrome/android/webapk/.*",
         # WebView license viewer code cannot depend on //base; used in stub APK.
-        r"^android_webview[\\/]glue[\\/]java[\\/]src[\\/]com[\\/]android[\\/]"
-        r"webview[\\/]chromium[\\/]License.*",
+        r"^android_webview/glue/java/src/com/android/"
+        r"webview/chromium/License.*",
         # The customtabs_benchmark is a small app that does not depend on Chromium
         # java pieces.
-        r"tools[\\/]android[\\/]customtabs_benchmark[\\/].*",
+        r"tools/android/customtabs_benchmark/.*",
     ]
 
     cr_log_import_pattern = input_api.re.compile(
@@ -3689,8 +3692,8 @@
         affected_file,
         files_to_skip=(_EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS + input_api.
                        DEFAULT_FILES_TO_SKIP + (
-                           r'^android_webview[\\/]glue[\\/].*',
-                           r'^weblayer[\\/].*',
+                           r'^android_webview/glue/.*',
+                           r'^weblayer/.*',
                        )),
         files_to_check=[r'.*\.java$'])
 
@@ -3948,9 +3951,8 @@
     def FileFilter(affected_file):
         # It's ok for base/memory/singleton.h to have |Singleton<|.
         files_to_skip = (_EXCLUDED_PATHS + input_api.DEFAULT_FILES_TO_SKIP +
-                         (r"^base[\\/]memory[\\/]singleton\.h$",
-                          r"^net[\\/]quic[\\/]platform[\\/]impl[\\/]"
-                          r"quic_singleton_impl\.h$"))
+                         (r"^base/memory/singleton\.h$",
+                          r"^net/quic/platform/impl/quic_singleton_impl\.h$"))
         return input_api.FilterSourceFile(affected_file,
                                           files_to_skip=files_to_skip)
 
@@ -4416,7 +4418,7 @@
     def FilterFile(affected_file):
         """Ignore libFuzzer source code."""
         files_to_check = r'.*fuzz.*\.(h|hpp|hcc|cc|cpp|cxx)$'
-        files_to_skip = r"^third_party[\\/]libFuzzer"
+        files_to_skip = r"^third_party/libFuzzer"
 
         return input_api.FilterSourceFile(affected_file,
                                           files_to_check=[files_to_check],
@@ -4513,16 +4515,16 @@
 # TODO(chrishall): could we additionally match on any path owned by
 #                  ui/accessibility/OWNERS ?
 _ACCESSIBILITY_PATHS = (
-    r"^chrome[\\/]browser.*[\\/]accessibility[\\/]",
-    r"^chrome[\\/]browser[\\/]extensions[\\/]api[\\/]automation.*[\\/]",
-    r"^chrome[\\/]renderer[\\/]extensions[\\/]accessibility_.*",
-    r"^chrome[\\/]tests[\\/]data[\\/]accessibility[\\/]",
-    r"^content[\\/]browser[\\/]accessibility[\\/]",
-    r"^content[\\/]renderer[\\/]accessibility[\\/]",
-    r"^content[\\/]tests[\\/]data[\\/]accessibility[\\/]",
-    r"^extensions[\\/]renderer[\\/]api[\\/]automation[\\/]",
-    r"^ui[\\/]accessibility[\\/]",
-    r"^ui[\\/]views[\\/]accessibility[\\/]",
+    r"^chrome/browser.*/accessibility/",
+    r"^chrome/browser/extensions/api/automation.*/",
+    r"^chrome/renderer/extensions/accessibility_.*",
+    r"^chrome/tests/data/accessibility/",
+    r"^content/browser/accessibility/",
+    r"^content/renderer/accessibility/",
+    r"^content/tests/data/accessibility/",
+    r"^extensions/renderer/api/automation/",
+    r"^ui/accessibility/",
+    r"^ui/views/accessibility/",
 )
 
 def CheckAccessibilityRelnotesField(input_api, output_api):
@@ -4564,22 +4566,22 @@
 
 
 _ACCESSIBILITY_EVENTS_TEST_PATH = (
-    r"^content[\\/]test[\\/]data[\\/]accessibility[\\/]event[\\/].*\.html",
+    r"^content/test/data/accessibility/event/.*\.html",
 )
 
 _ACCESSIBILITY_TREE_TEST_PATH = (
-    r"^content[\\/]test[\\/]data[\\/]accessibility[\\/]accname[\\/].*\.html",
-    r"^content[\\/]test[\\/]data[\\/]accessibility[\\/]aria[\\/].*\.html",
-    r"^content[\\/]test[\\/]data[\\/]accessibility[\\/]css[\\/].*\.html",
-    r"^content[\\/]test[\\/]data[\\/]accessibility[\\/]html[\\/].*\.html",
+    r"^content/test/data/accessibility/accname/.*\.html",
+    r"^content/test/data/accessibility/aria/.*\.html",
+    r"^content/test/data/accessibility/css/.*\.html",
+    r"^content/test/data/accessibility/html/.*\.html",
 )
 
 _ACCESSIBILITY_ANDROID_EVENTS_TEST_PATH = (
-    r"^.*[\\/]WebContentsAccessibilityEventsTest\.java",
+    r"^.*/WebContentsAccessibilityEventsTest\.java",
 )
 
 _ACCESSIBILITY_ANDROID_TREE_TEST_PATH = (
-    r"^.*[\\/]WebContentsAccessibilityTreeTest\.java",
+    r"^.*/WebContentsAccessibilityTreeTest\.java",
 )
 
 def CheckAccessibilityEventsTestsAreIncludedForAndroid(input_api, output_api):
@@ -5248,7 +5250,7 @@
         input_api,
         output_api,
         detection_list=['config=nacl', 'enable-nacl', 'cpu=pnacl', 'nacl_io'],
-        files_to_skip=files_to_skip + [r"^native_client_sdk[\\/]"])
+        files_to_skip=files_to_skip + [r"^native_client_sdk/"])
 
     # PPAPI: any C/C++ file that in its diff includes a ppapi library
     problems += _CheckForDeprecatedTech(
@@ -5257,7 +5259,7 @@
         detection_list=['#include "ppapi', '#include <ppapi'],
         files_to_check=(r'.+%s' % _HEADER_EXTENSIONS,
                         r'.+%s' % _IMPLEMENTATION_EXTENSIONS),
-        files_to_skip=[r"^ppapi[\\/]"])
+        files_to_skip=[r"^ppapi/"])
 
     if problems:
         return [
@@ -5910,9 +5912,9 @@
     # problematic blink APIs, (2) apply to desktop or android chrome, and (3)
     # are known to have a significant number of uses of the APIs of concern.
     files_to_check = (
-        r'^(chrome|components|content|extensions|third_party[\\/]blink[\\/]renderer)[\\/].+%s' %
+        r'^(chrome|components|content|extensions|third_party/blink/renderer)/.+%s' %
         _IMPLEMENTATION_EXTENSIONS,
-        r'^(chrome|components|content|extensions|third_party[\\/]blink[\\/]renderer)[\\/].+%s' %
+        r'^(chrome|components|content|extensions|third_party/blink/renderer)/.+%s' %
         _HEADER_EXTENSIONS,
     )
     files_to_skip = (_EXCLUDED_PATHS + _TEST_CODE_EXCLUDED_PATHS +
diff --git a/WATCHLISTS b/WATCHLISTS
index 79821a6..426c469 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -748,16 +748,22 @@
     },
     'chromeos_bluetooth': {
       'filepath': 'ash/system/bluetooth/'\
+                  '|chromeos/ash/components/hid_detection/'\
+                  '|chromeos/ash/services/bluetooth_config/'\
                   '|chrome/browser/ui/webui/chromeos/bluetooth'\
                   '|chrome/browser/resources/settings/chromeos/bluetooth_page/'\
+                  '|chrome/browser/resources/settings/chromeos/os_bluetooth_page/'\
                   '|chrome/browser/resources/chromeos/bluetooth_pairing_dialog/'\
+                  '|chrome/test/data/webui/cr_components/chromeos/bluetooth/'\
                   '|device/bluetooth/bluez/'\
                   '|device/bluetooth/chromeos/'\
-                  '|ui/webui/resources/cr_components/chromeos/bluetooth'
+                  '|device/bluetooth/floss/'\
+                  '|ui/webui/resources/cr_components/chromeos/bluetooth/'
     },
     'chromeos_cellular': {
       'filepath': 'chromeos/ash/services/cellular_setup/|'\
                   'chromeos/ash/components/dbus/hermes/|'\
+                  'chrome/test/data/webui/cr_components/chromeos/cellular_setup/|'\
                   'ui/webui/resources/cr_components/chromeos/cellular_setup/',
     },
     'chromeos_geolocation': {
@@ -788,8 +794,11 @@
                   'chrome/browser/resources/chromeos/internet_detail_dialog/|'\
                   'chrome/browser/resources/chromeos/network_ui/|'\
                   'chrome/browser/resources/settings/chromeos/internet_page/|'\
+                  'chrome/browser/ui/ash/network/|'\
+                  'chrome/browser/ui/webui/chromeos/network|'\
+                  'chrome/test/data/webui/cr_components/chromeos/network/|'\
+                  'components/onc/|'\
                   'extensions/browser/api/networking_private/|'\
-                  'ui/chromeos/network/|'\
                   'ui/webui/resources/cr_components/chromeos/network/'
     },
     'chromeos_tast_control': {
@@ -2466,29 +2475,33 @@
     'chromedriver': ['mathias@chromium.org'],
     'chromeos': ['oshima+watch@chromium.org'],
     'chromeos_attestation': ['dkrahn+watch@chromium.org'],
-    'chromeos_bluetooth': ['azeemarshad+watch-bluetooth@chromium.org',
+    'chromeos_bluetooth': ['andrewdear+watch-bluetooth@google.com',
+                          'azeemarshad+watch-bluetooth@chromium.org',
                           'chadduffin+watch-bluetooth@chromium.org',
-                          'hansberry+watch-bluetooth@chromium.org',
                           'gordonseto+watch-bluetooth@google.com',
+                          'hansberry+watch-bluetooth@chromium.org',
                           'hsuregan+watch-bluetooth@chromium.org',
                           'jiajunz+watch-bluetooth@google.com',
                           'khorimoto+watch-bluetooth@chromium.org',
+                          'nikhilcn+watch-bluetooth@google.com',
                           'tjohnsonkanu+watch-bluetooth@google.com'],
-    'chromeos_cellular': ['azeemarshad+watch-cellular@chromium.org',
+    'chromeos_cellular': ['andrewdear+watch-cellular@google.com',
+                          'azeemarshad+watch-cellular@chromium.org',
                           'chadduffin+watch-cellular@chromium.org',
                           'ejcaruso+watch-cellular@chromium.org',
                           'gordonseto+watch-cellular@google.com',
                           'hsuregan+watch-cellular@chromium.org',
                           'jiajunz+watch-cellular@google.com',
                           'khorimoto+watch-cellular@chromium.org',
+                          'nikhilcn+watch-cellular@google.com',
                           'tjohnsonkanu+watch-cellular@google.com'],
     'chromeos_geolocation': ['alemate+watch@chromium.org'],
-    'chromeos_lkgm': ['achuith+watch@chromium.org',
-                      'bpastene+watch@chromium.org'],
+    'chromeos_lkgm': ['achuith+watch@chromium.org'],
     'chromeos_login': ['alemate+watch@chromium.org',
                        'tbarzic+watch@chromium.org'],
     'chromeos_media_app': ['cros-essential-apps-dev-watch@chromium.org'],
-    'chromeos_net': ['azeemarshad+watch-network@chromium.org',
+    'chromeos_net': ['andrewdear+watch-network@google.com',
+                     'azeemarshad+watch-network@chromium.org',
                      'chadduffin+watch-network@chromium.org',
                      'ejcaruso+watch-network@chromium.org',
                      'gordonseto+watch-network@google.com',
@@ -2496,10 +2509,10 @@
                      'jiajunz+watch-network@google.com',
                      'jonmann+watch-network@chromium.org',
                      'khorimoto+watch-network@chromium.org',
+                     'nikhilcn+watch-network@google.com',
                      'stevenjb+watch-network@chromium.org',
                      'tjohnsonkanu+watch-network@google.com'],
     'chromeos_tast_control': ['chromeos-engprod+watch@google.com',
-                              'bpastene+watch@chromium.org',
                               'chrome-os-gardeners+watch@google.com'],
     'chromeos_timezone': ['alemate+watch@chromium.org'],
     'chromeos_webui': ['alemate+watch@chromium.org'],
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
index 80a9807e..7efc8ab 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
@@ -398,6 +398,15 @@
         // it's OK to upload the next record.
         mRule.loadUrlAsync(mAwContents, "about:blank");
 
+        // Disregard the second UMA log as well because it is also created very early on
+        // (since we have "fast startup for testing" enabled), and is very likely to have
+        // been opened before the allowlist was loaded.
+        mPlatformServiceBridge.waitForNextMetricsLog();
+
+        // Load a blank page to indicate to the MetricsService that the app is "in use" and
+        // it's OK to upload the next record.
+        mRule.loadUrlAsync(mAwContents, "about:blank");
+
         ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog();
         SystemProfileProto systemProfile = log.getSystemProfile();
         assertEquals(appPackageName, systemProfile.getAppPackageName());
diff --git a/ash/accelerators/ash_accelerator_configuration.cc b/ash/accelerators/ash_accelerator_configuration.cc
index b83e051a..be74a62 100644
--- a/ash/accelerators/ash_accelerator_configuration.cc
+++ b/ash/accelerators/ash_accelerator_configuration.cc
@@ -20,6 +20,12 @@
 AshAcceleratorConfiguration::~AshAcceleratorConfiguration() = default;
 
 // TODO(jimmyxgong): Implement all functions below as these are only stubs.
+
+const std::vector<mojom::AcceleratorLayoutInfoPtr>&
+AshAcceleratorConfiguration::GetAcceleratorLayoutInfos() {
+  return layout_infos_;
+}
+
 const std::vector<AcceleratorInfo>&
 AshAcceleratorConfiguration::GetConfigForAction(AcceleratorActionId action_id) {
   DCHECK(base::Contains(id_to_accelerator_infos_, action_id));
@@ -75,7 +81,29 @@
 
     accelerator_infos_.push_back(info);
     id_to_accelerator_infos_[action_id].push_back(info);
+
+    AddLayoutInfo(data);
   }
 }
 
+void AshAcceleratorConfiguration::AddLayoutInfo(const AcceleratorData& data) {
+  // TODO(jimmyxgong): Replace with real i18n strings.
+  std::u16string ash_category = u"Chrome OS";
+  std::u16string system_sub_category = u"System";
+
+  // TODO(jimmyxgong): This a basic stub implementation, replace with real
+  // implementation.
+  mojom::AcceleratorLayoutInfoPtr layout_info =
+      mojom::AcceleratorLayoutInfo::New();
+  layout_info->category = std::move(ash_category);
+  layout_info->sub_category = std::move(system_sub_category);
+  // TODO(jimmyxgong): Create a mapping between action_id and description.
+  layout_info->description = u"Stub description";
+  layout_info->style = mojom::AcceleratorLayoutStyle::kDefault;
+  layout_info->source = mojom::AcceleratorSource::kAsh;
+  layout_info->action = static_cast<uint32_t>(data.action);
+
+  layout_infos_.push_back(std::move(layout_info));
+}
+
 }  // namespace ash
diff --git a/ash/accelerators/ash_accelerator_configuration.h b/ash/accelerators/ash_accelerator_configuration.h
index 2227aea..e36c6f96 100644
--- a/ash/accelerators/ash_accelerator_configuration.h
+++ b/ash/accelerators/ash_accelerator_configuration.h
@@ -13,6 +13,7 @@
 #include "ash/public/cpp/accelerators.h"
 #include "ash/public/mojom/accelerator_info.mojom.h"
 #include "base/containers/span.h"
+#include "mojo/public/cpp/bindings/clone_traits.h"
 
 namespace ash {
 
@@ -28,6 +29,8 @@
   ~AshAcceleratorConfiguration() override;
 
   // AcceleratorConfiguration::
+  const std::vector<mojom::AcceleratorLayoutInfoPtr>&
+  GetAcceleratorLayoutInfos() override;
   const std::vector<AcceleratorInfo>& GetConfigForAction(
       AcceleratorActionId action_id) override;
   bool IsMutable() const override;
@@ -53,11 +56,14 @@
   }
 
  private:
+  void AddLayoutInfo(const AcceleratorData& data);
+
   std::vector<AcceleratorInfo> accelerator_infos_;
   // One accelerator action ID can potentially have multiple accelerators
   // associated with it.
   std::map<AcceleratorActionId, std::vector<AcceleratorInfo>>
       id_to_accelerator_infos_;
+  std::vector<mojom::AcceleratorLayoutInfoPtr> layout_infos_;
 };
 
 }  // namespace ash
diff --git a/ash/public/cpp/accelerator_configuration.h b/ash/public/cpp/accelerator_configuration.h
index a312db3..a6515343 100644
--- a/ash/public/cpp/accelerator_configuration.h
+++ b/ash/public/cpp/accelerator_configuration.h
@@ -58,6 +58,10 @@
 
   void RemoveAcceleratorsUpdatedCallback(AcceleratorsUpdatedCallback callback);
 
+  // Get all AcceleratorLayoutInfos for an accelerator configuration provider.
+  virtual const std::vector<mojom::AcceleratorLayoutInfoPtr>&
+  GetAcceleratorLayoutInfos() = 0;
+
   // Get the accelerators for a single action.
   virtual const std::vector<AcceleratorInfo>& GetConfigForAction(
       AcceleratorActionId action_id) = 0;
diff --git a/ash/webui/diagnostics_ui/resources/BUILD.gn b/ash/webui/diagnostics_ui/resources/BUILD.gn
index 4ad816c..f2604283 100644
--- a/ash/webui/diagnostics_ui/resources/BUILD.gn
+++ b/ash/webui/diagnostics_ui/resources/BUILD.gn
@@ -12,8 +12,6 @@
 
 js_type_check("closure_compile_module") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
-
   deps = [
     ":battery_status_card",
     ":cellular_info",
diff --git a/ash/webui/diagnostics_ui/resources/diagnostics_network_icon.js b/ash/webui/diagnostics_ui/resources/diagnostics_network_icon.js
index 3b28c63f..f06a5acd 100644
--- a/ash/webui/diagnostics_ui/resources/diagnostics_network_icon.js
+++ b/ash/webui/diagnostics_ui/resources/diagnostics_network_icon.js
@@ -9,14 +9,13 @@
  * @see //ui/webui/resources/cr_components/chromeos/network/network_icon.js
  */
 
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
 import 'chrome://resources/cr_components/chromeos/network/network_icon.js';
 import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 import './diagnostics_shared_css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {NetworkStateProperties, SecurityType as MojomSecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType as MojomConnectionStateType, NetworkType as MojomNetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Network, NetworkState, NetworkType, SecurityType} from './diagnostics_types.js';
@@ -24,27 +23,29 @@
 
 /**
  * Type alias for network_config NetworkStateProperties struct.
- * @typedef {NetworkStateProperties}
+ * @typedef {chromeos.networkConfig.mojom.NetworkStateProperties}
  */
-export const CrosNetworkStateProperties = NetworkStateProperties;
+export const CrosNetworkStateProperties =
+    chromeos.networkConfig.mojom.NetworkStateProperties;
 
 /**
  * Type alias for network_config ConnectionStateType enum.
- * @typedef {MojomConnectionStateType}
+ * @typedef {chromeos.networkConfig.mojom.ConnectionStateType}
  */
-export const ConnectionStateType = MojomConnectionStateType;
+export const ConnectionStateType =
+    chromeos.networkConfig.mojom.ConnectionStateType;
 
 /**
  * Type alias for network_config NetworkType enum.
- * @typedef {MojomNetworkType}
+ * @typedef {chromeos.networkConfig.mojom.NetworkType}
  */
-export const CrosNetworkType = MojomNetworkType;
+export const CrosNetworkType = chromeos.networkConfig.mojom.NetworkType;
 
 /**
  * Type alias for network_config SecurityType enum.
- * @typedef {MojomSecurityType}
+ * @typedef {chromeos.networkConfig.mojom.SecurityType}
  */
-export const CrosSecurityType = MojomSecurityType;
+export const CrosSecurityType = chromeos.networkConfig.mojom.SecurityType;
 
 /**
  * Struct for minimal required network state required to display network-icon
diff --git a/ash/webui/shimless_rma/resources/BUILD.gn b/ash/webui/shimless_rma/resources/BUILD.gn
index 6f27e2d..26bcce3 100644
--- a/ash/webui/shimless_rma/resources/BUILD.gn
+++ b/ash/webui/shimless_rma/resources/BUILD.gn
@@ -90,7 +90,7 @@
 js_type_check("closure_compile_module") {
   is_polymer3 = true
 
-  closure_flags = default_closure_args + mojom_js_args
+  closure_flags = default_closure_args
   deps = [
     ":base_page",
     ":calibration_component_chip",
@@ -221,7 +221,7 @@
     ":fake_data",
     ":fake_shimless_rma_service",
     ":shimless_rma_types",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/js:cr.m",
   ]
 }
@@ -295,7 +295,7 @@
     ":icons",
     ":mojo_interface_provider",
     ":shimless_rma_types",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/cr_components/chromeos/network:network_config",
     "//ui/webui/resources/cr_components/chromeos/network:network_list",
     "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
@@ -487,7 +487,7 @@
 js_library("shimless_rma_types") {
   deps = [
     "//ash/webui/shimless_rma/mojom:mojom_js_library_for_compile",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
   ]
 }
 
diff --git a/ash/webui/shimless_rma/resources/fake_data.js b/ash/webui/shimless_rma/resources/fake_data.js
index edefe82..3205325 100644
--- a/ash/webui/shimless_rma/resources/fake_data.js
+++ b/ash/webui/shimless_rma/resources/fake_data.js
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {CalibrationComponentStatus, CalibrationStatus, Component, ComponentRepairStatus, ComponentType, Network, QrCode, RmadErrorCode, State, StateResult} from './shimless_rma_types.js';
 
@@ -306,7 +305,8 @@
 
 /** @type {!Array<!Network>} */
 export const fakeNetworks = [
-  OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi0'),
+  OncMojo.getDefaultNetworkState(
+      chromeos.networkConfig.mojom.NetworkType.kWiFi, 'wifi0'),
 ];
 
 /** @type {!Array<string>} */
diff --git a/ash/webui/shimless_rma/resources/mojo_interface_provider.js b/ash/webui/shimless_rma/resources/mojo_interface_provider.js
index fd39f9e..4072018 100644
--- a/ash/webui/shimless_rma/resources/mojo_interface_provider.js
+++ b/ash/webui/shimless_rma/resources/mojo_interface_provider.js
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {CrosNetworkConfig} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 import {fakeCalibrationComponentsWithFails, fakeChromeVersion, fakeComponents, fakeDeviceRegions, fakeDeviceSkus, fakeDeviceWhiteLabels, fakeLog, fakeLogSavePath, fakeRsuChallengeCode, fakeRsuChallengeQrCode, fakeStates} from './fake_data.js';
 import {FakeShimlessRmaService} from './fake_shimless_rma_service.js';
@@ -129,7 +128,8 @@
  */
 export function getNetworkConfigService() {
   if (!networkConfigService) {
-    networkConfigService = CrosNetworkConfig.getRemote();
+    networkConfigService =
+        chromeos.networkConfig.mojom.CrosNetworkConfig.getRemote();
   }
 
   assert(!!networkConfigService);
diff --git a/ash/webui/shimless_rma/resources/onboarding_network_page.js b/ash/webui/shimless_rma/resources/onboarding_network_page.js
index 2f514e0..040c3fe 100644
--- a/ash/webui/shimless_rma/resources/onboarding_network_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_network_page.js
@@ -16,10 +16,8 @@
 import {HTMLEscape} from '//resources/js/util.m.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {FilterType, NetworkStateProperties, NO_LIMIT, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getNetworkConfigService, getShimlessRmaService} from './mojo_interface_provider.js';
@@ -63,7 +61,7 @@
       /**
        * Array of available networks
        * @protected
-       * @type {!Array<NetworkStateProperties>}
+       * @type {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
        */
       networks_: {
         type: Array,
@@ -165,16 +163,16 @@
 
   refreshNetworks() {
     const networkFilter = {
-      filter: FilterType.kVisible,
-      networkType: NetworkType.kAll,
-      limit: NO_LIMIT,
+      filter: chromeos.networkConfig.mojom.FilterType.kVisible,
+      networkType: chromeos.networkConfig.mojom.NetworkType.kAll,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
     };
 
     this.networkConfig_.getNetworkStateList(networkFilter).then(res => {
       // Filter again since networkFilter above doesn't take two network types.
       this.networks_ = res.result.filter(
-          (network) => [NetworkType.kWiFi,
-                        NetworkType.kEthernet,
+          (network) => [chromeos.networkConfig.mojom.NetworkType.kWiFi,
+                        chromeos.networkConfig.mojom.NetworkType.kEthernet,
       ].includes(network.type));
 
       this.isOnline_ = this.networks_.some(function(network) {
@@ -195,7 +193,8 @@
     const displayName = OncMojo.getNetworkStateDisplayName(networkState);
 
     this.networkShowConnect_ =
-        (networkState.connectionState === ConnectionStateType.kNotConnected);
+        (networkState.connectionState ===
+         chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected);
 
     if (!this.canAttemptConnection_(networkState)) {
       this.showConfig_(type, networkState.guid, displayName);
@@ -204,7 +203,8 @@
 
     this.networkConfig_.startConnect(networkState.guid).then(response => {
       this.refreshNetworks();
-      if (response.result === StartConnectResult.kUnknown) {
+      if (response.result ===
+          chromeos.networkConfig.mojom.StartConnectResult.kUnknown) {
         console.error(
             'startConnect failed for: ' + networkState.guid +
             ' Error: ' + response.message);
@@ -221,7 +221,8 @@
    * @private
    */
   canAttemptConnection_(state) {
-    if (state.connectionState !== ConnectionStateType.kNotConnected) {
+    if (state.connectionState !==
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected) {
       return false;
     }
 
@@ -234,13 +235,15 @@
   }
 
   /**
-   * @param {NetworkType} type
+   * @param {chromeos.networkConfig.mojom.NetworkType} type
    * @param {string} guid
    * @param {string} name
    * @private
    */
   showConfig_(type, guid, name) {
-    assert(type !== NetworkType.kCellular && type !== NetworkType.kTether);
+    assert(
+        type !== chromeos.networkConfig.mojom.NetworkType.kCellular &&
+        type !== chromeos.networkConfig.mojom.NetworkType.kTether);
 
     this.networkType_ = OncMojo.getNetworkTypeString(type);
     this.networkName_ = name || '';
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_types.js b/ash/webui/shimless_rma/resources/shimless_rma_types.js
index 9bad67d..b71d0a98 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma_types.js
+++ b/ash/webui/shimless_rma/resources/shimless_rma_types.js
@@ -13,7 +13,7 @@
 import './file_path.mojom-lite.js';
 import './mojom/shimless_rma.mojom-lite.js';
 
-import {CrosNetworkConfigInterface, CrosNetworkConfigRemote, NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 
 /**
  * @typedef {ash.shimlessRma.mojom.StateResult}
@@ -344,21 +344,23 @@
 
 /**
  * Type alias for NetworkConfigServiceInterface.
- * @typedef {CrosNetworkConfigInterface}
+ * @typedef {chromeos.networkConfig.mojom.CrosNetworkConfigInterface}
  */
-export const NetworkConfigServiceInterface = CrosNetworkConfigInterface;
+export const NetworkConfigServiceInterface =
+    chromeos.networkConfig.mojom.CrosNetworkConfigInterface;
 
 /**
  * Type alias for NetworkConfigServiceRemote.
- * @typedef {CrosNetworkConfigRemote}
+ * @typedef {chromeos.networkConfig.mojom.CrosNetworkConfigRemote}
  */
-export const NetworkConfigServiceRemote = CrosNetworkConfigRemote;
+export const NetworkConfigServiceRemote =
+    chromeos.networkConfig.mojom.CrosNetworkConfigRemote;
 
 /**
  * Type alias for Network
- * @typedef {NetworkStateProperties}
+ * @typedef {chromeos.networkConfig.mojom.NetworkStateProperties}
  */
-export const Network = NetworkStateProperties;
+export const Network = chromeos.networkConfig.mojom.NetworkStateProperties;
 
 /**
  * Type alias for the ShutdownMethod.
diff --git a/ash/wm/workspace/workspace_layout_manager_unittest.cc b/ash/wm/workspace/workspace_layout_manager_unittest.cc
index f5d47b1..ef07a85 100644
--- a/ash/wm/workspace/workspace_layout_manager_unittest.cc
+++ b/ash/wm/workspace/workspace_layout_manager_unittest.cc
@@ -41,7 +41,6 @@
 #include "ash/wm/fullscreen_window_finder.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_grid.h"
-#include "ash/wm/overview/rounded_label_widget.h"
 #include "ash/wm/splitview/split_view_controller.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "ash/wm/window_properties.h"
diff --git a/base/PRESUBMIT.py b/base/PRESUBMIT.py
index 40562e4..13c17065 100644
--- a/base/PRESUBMIT.py
+++ b/base/PRESUBMIT.py
@@ -20,7 +20,7 @@
   # The only valid extensions for cpplint are .cc, .h, .cpp, .cu, and .ch.
   # Only process those extensions which are used in Chromium, in directories
   # that currently lint clean.
-  CLEAN_CPP_FILES_ONLY = (r'base[\\/]win[\\/].*\.(cc|h)$', )
+  CLEAN_CPP_FILES_ONLY = (r'base/win/.*\.(cc|h)$', )
   source_file_filter = lambda x: input_api.FilterSourceFile(
       x,
       files_to_check=CLEAN_CPP_FILES_ONLY,
@@ -90,9 +90,9 @@
     r".*\.(h|cc|mm)$",
   ]
   files_to_skip = [
-    r".*[\\/]test[\\/].*",
-    r".*[\\/]trace_event[\\/].*",
-    r".*[\\/]tracing[\\/].*",
+    r".*/test/.*",
+    r".*/trace_event/.*",
+    r".*/tracing/.*",
   ]
 
   locations = _FindLocations(input_api, discouraged_includes, files_to_check,
@@ -123,9 +123,9 @@
     r".*\.(h|cc|mm)$",
   ]
   files_to_skip = [
-    r".*[\\/]test[\\/].*",
-    r".*[\\/]trace_event[\\/].*",
-    r".*[\\/]tracing[\\/].*",
+    r".*/test/.*",
+    r".*/trace_event/.*",
+    r".*/tracing/.*",
   ]
 
   locations = _FindLocations(input_api, warn_includes, files_to_check,
diff --git a/base/process/process_mac.cc b/base/process/process_mac.cc
index f604f1e8..f216bcc9 100644
--- a/base/process/process_mac.cc
+++ b/base/process/process_mac.cc
@@ -43,7 +43,7 @@
 
 bool Process::IsProcessBackgrounded(PortProvider* port_provider) const {
   DCHECK(IsValid());
-  if (port_provider == nullptr || !CanBackgroundProcesses())
+  if (port_provider == nullptr)
     return false;
 
   mach_port_t task_port = port_provider->TaskForPid(Pid());
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index f440dbb..dbb7b17 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1842,6 +1842,7 @@
                              TESTONLY_AND_VISIBILITY + [
                                    "deps",
                                    "data",
+                                   "data_deps",
                                  ])
       inputs = [ invoker.input_jar ]
       if (defined(invoker.inputs)) {
@@ -1885,6 +1886,7 @@
       forward_variables_from(invoker,
                              [
                                "data",
+                               "data_deps",
                                "jar_excluded_patterns",
                                "jar_included_patterns",
                              ])
@@ -3938,6 +3940,14 @@
           # __device targets without the need to create a separate group()
           # target. This trade-off works because process_java_library is fast.
           deps += _java_host_deps
+
+          # Add runtime_deps here since robolectric_binary does not depend on top-level group.
+          if (defined(invoker.data)) {
+            data += invoker.data
+          }
+          if (defined(invoker.data_deps)) {
+            data_deps = invoker.data_deps
+          }
         }
       }
 
diff --git a/build/fuchsia/device_target.py b/build/fuchsia/device_target.py
index 6e87377..792255a 100644
--- a/build/fuchsia/device_target.py
+++ b/build/fuchsia/device_target.py
@@ -23,7 +23,7 @@
 
 sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
                                              'test')))
-from compatible_utils import get_sdk_hash
+from compatible_utils import get_sdk_hash, pave
 
 # The maximum times to attempt mDNS resolution when connecting to a freshly
 # booted Fuchsia instance before aborting.
@@ -367,23 +367,7 @@
     return self._ssh_config_path
 
   def _ProvisionDevice(self):
-    _, auth_keys, _ = RunGnSdkFunction('fuchsia-common.sh',
-                                       'get-fuchsia-auth-keys-file')
-    pave_command = [
-        os.path.join(self._system_image_dir, 'pave.sh'), '--authorized-keys',
-        auth_keys.strip()
-    ]
-    if self._node_name:
-      pave_command.extend(['-n', self._node_name, '-1'])
-    logging.info(' '.join(pave_command))
-    try:
-      return_code, stdout, stderr = SubprocessCallWithTimeout(pave_command,
-                                                              timeout_secs=300)
-      if return_code != 0:
-        raise ProvisionDeviceException('Could not pave device.')
-    except TimeoutError as ex:
-      raise ProvisionDeviceException('Timed out while paving device.') from ex
-    self._ParseNodename(stderr)
+    self._ParseNodename(pave(self._system_image_dir, self._node_name).stderr)
 
   def Restart(self):
     """Restart the device."""
diff --git a/build/fuchsia/test/compatible_utils.py b/build/fuchsia/test/compatible_utils.py
index 55107bc..64122ca 100644
--- a/build/fuchsia/test/compatible_utils.py
+++ b/build/fuchsia/test/compatible_utils.py
@@ -5,8 +5,10 @@
 
 import os
 import re
+import subprocess
 
-from typing import List, Tuple
+from typing import List, Optional, Tuple
+
 
 # File indicating version of an image downloaded to the host
 _BUILD_ARGS = "buildargs.gn"
@@ -18,6 +20,19 @@
     """Thrown when version info cannot be retrieved from device."""
 
 
+def pave(image_dir: str, target_id: Optional[str])\
+        -> subprocess.CompletedProcess:
+    """"Pave a device using the pave script inside |image_dir|."""
+
+    pave_command = [
+        os.path.join(image_dir, 'pave.sh'), '--authorized-keys',
+        os.path.expanduser('~/.ssh/fuchsia_authorized_keys')
+    ]
+    if target_id:
+        pave_command.extend(['-n', target_id, '-1'])
+    return subprocess.run(pave_command, check=True, text=True, timeout=300)
+
+
 def parse_host_port(host_port_pair: str) -> Tuple[str, int]:
     """Parses a host name or IP address and a port number from a string of
     any of the following forms:
diff --git a/build/fuchsia/test/flash_device.py b/build/fuchsia/test/flash_device.py
index 7ab5f1d..4ad5afe9 100755
--- a/build/fuchsia/test/flash_device.py
+++ b/build/fuchsia/test/flash_device.py
@@ -37,35 +37,43 @@
     return ('', '')
 
 
+def update_required(os_check, system_image_dir: Optional[str],
+                    target: Optional[str]) -> bool:
+    """Returns True if a system updated is required."""
+
+    if os_check == 'ignore':
+        return False
+    if not system_image_dir:
+        raise ValueError('System image directory must be specified.')
+    if (os_check == 'check'
+            and get_sdk_hash(system_image_dir) == _get_system_info(target)):
+        return False
+    return True
+
+
 def flash(system_image_dir: str,
           os_check: str,
           target: Optional[str],
           serial_num: Optional[str] = None) -> None:
     """Flash the device."""
 
-    if os_check == 'ignore':
-        return
-    if not system_image_dir:
-        raise ValueError('System image directory must be specified.')
-    if (os_check == 'check'
-            and get_sdk_hash(system_image_dir) == _get_system_info(target)):
-        return
-    manifest = os.path.join(system_image_dir, 'flash-manifest.manifest')
-    with ScopedFfxConfig('fastboot.reboot.reconnect_timeout', '120'):
-        if serial_num:
-            with ScopedFfxConfig('discovery.zedboot.enabled', 'true'):
-                run_ffx_command(('target', 'reboot', '-b'),
-                                target,
-                                check=False)
-            for _ in range(10):
-                time.sleep(10)
-                if run_ffx_command(('target', 'list', serial_num),
-                                   check=False).returncode == 0:
-                    break
-            run_ffx_command(('target', 'flash', manifest), serial_num)
-        else:
-            run_ffx_command(('target', 'flash', manifest), target)
-    run_ffx_command(('target', 'wait'), target)
+    if update_required(os_check, system_image_dir, target):
+        manifest = os.path.join(system_image_dir, 'flash-manifest.manifest')
+        with ScopedFfxConfig('fastboot.reboot.reconnect_timeout', '120'):
+            if serial_num:
+                with ScopedFfxConfig('discovery.zedboot.enabled', 'true'):
+                    run_ffx_command(('target', 'reboot', '-b'),
+                                    target,
+                                    check=False)
+                for _ in range(10):
+                    time.sleep(10)
+                    if run_ffx_command(('target', 'list', serial_num),
+                                       check=False).returncode == 0:
+                        break
+                run_ffx_command(('target', 'flash', manifest), serial_num)
+            else:
+                run_ffx_command(('target', 'flash', manifest), target)
+        run_ffx_command(('target', 'wait'), target)
 
 
 def register_flash_args(arg_parser: argparse.ArgumentParser,
diff --git a/build/fuchsia/test/run_test.py b/build/fuchsia/test/run_test.py
index ddb408a..0fd3f24 100755
--- a/build/fuchsia/test/run_test.py
+++ b/build/fuchsia/test/run_test.py
@@ -13,8 +13,9 @@
 
 from common import register_common_args, register_device_args, \
                    register_log_args, resolve_packages, resolve_v1_packages
+from compatible_utils import pave
 from ffx_integration import test_connection
-from flash_device import flash, register_flash_args
+from flash_device import register_flash_args, update_required
 from log_manager import LogManager, start_system_log
 from publish_package import publish_packages, register_package_args
 from run_blink_test import BlinkTestRunner
@@ -73,9 +74,13 @@
 
     with ExitStack() as stack:
         log_manager = stack.enter_context(LogManager(runner_args.logs_dir))
-        if runner_args.device:
-            flash(runner_args.system_image_dir, runner_args.os_check,
-                  runner_args.target_id, runner_args.serial_num)
+        if (runner_args.device and update_required(
+                runner_args.os_check, runner_args.system_image_dir,
+                runner_args.target_id)):
+
+            # TODO(https://fxbug.dev/91843): Switch to flashing the device
+            # when the ffx command is more stable.
+            pave(runner_args.system_image_dir, runner_args.target_id)
         else:
             runner_args.target_id = stack.enter_context(
                 create_emulator_from_args(runner_args))
diff --git a/build/lacros/lacros_resource_sizes.py b/build/lacros/lacros_resource_sizes.py
index 08f93e59..6004ae7f 100755
--- a/build/lacros/lacros_resource_sizes.py
+++ b/build/lacros/lacros_resource_sizes.py
@@ -91,6 +91,13 @@
     self.track_stripped = track_stripped
     self.track_compressed = track_compressed
 
+  def __eq__(self, other):
+    """Overrides the default implementation"""
+    if isinstance(other, _Group):
+      return (self.paths == other.paths) & (self.title == other.title) & (
+          self.track_stripped == other.track_stripped) & (
+              self.track_compressed == other.track_compressed)
+    return False
 
 # Common artifacts in official builder lacros-arm32 and lacros64 in
 # src-internal. The artifcts can be found in
@@ -304,8 +311,8 @@
   # TODO(https://crbug.com/1356761): remove the following part once nacl files
   # are available.
   elif args.arch == 'arm64':
-    tracked_groups.remove(paths=['nacl_helper'])
-
+    tracked_groups.remove(
+        _Group(paths=['nacl_helper'], title='File: nacl_helper'))
   for g in tracked_groups:
     sizes = sum(
         map(_get_catagorized_filesizes, _visit_paths(args.out_dir, g.paths)),
diff --git a/build_overrides/vulkan_validation_layers.gni b/build_overrides/vulkan_validation_layers.gni
index d16e9972..471639e2 100644
--- a/build_overrides/vulkan_validation_layers.gni
+++ b/build_overrides/vulkan_validation_layers.gni
@@ -4,5 +4,6 @@
 
 import("//build_overrides/vulkan_common.gni")
 
+vvl_spirv_headers_dir = "//third_party/vulkan-deps/spirv-headers/src"
 vvl_spirv_tools_dir = "//third_party/vulkan-deps/spirv-tools/src"
 vvl_glslang_dir = "//third_party/vulkan-deps/glslang/src"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
index 790f5b9..f299418 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
@@ -33,10 +33,13 @@
 import android.widget.LinearLayout;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.Px;
 import androidx.annotation.VisibleForTesting;
 import androidx.core.view.WindowCompat;
+import androidx.core.view.WindowInsetsAnimationControlListenerCompat;
+import androidx.core.view.WindowInsetsAnimationControllerCompat;
 import androidx.core.view.WindowInsetsCompat;
 import androidx.core.view.WindowInsetsControllerCompat;
 import androidx.swiperefreshlayout.widget.CircularProgressDrawable;
@@ -177,6 +180,10 @@
     // Used in 'window-above-navbar' version only.
     private int mHeight;
 
+    // Class used to control show / hide nav bar.
+    private NavBarTransitionController mNavbarTransitionController =
+            new NavBarTransitionController();
+
     public PartialCustomTabHeightStrategy(Activity activity, @Px int initialHeight,
             Integer navigationBarColor, Integer navigationBarDividerColor, boolean isFixedHeight,
             OnResizedCallback onResizedCallback, ActivityLifecycleDispatcher lifecycleDispatcher,
@@ -827,6 +834,12 @@
             // Can we remove the slow fade-out animation?
             controller.hide(WindowInsetsCompat.Type.navigationBars());
         }
+
+        // Take over the control of insets animation after the #show / #hide. This call needs to
+        // happen after the #show / #hide call to work correctly.
+        mNavbarTransitionController.setShow(show);
+        controller.controlWindowInsetsAnimation(WindowInsetsCompat.Type.navigationBars(),
+                /*durationMillis*/ 1, null, null, mNavbarTransitionController);
     }
 
     // TODO(jinsukkim): Explore the way to use androidx.window.WindowManager or
@@ -1035,4 +1048,25 @@
         // MotionEvents directly in the tests.
         return new PartialCustomTabHandleStrategy(null, this::isFullHeight, () -> mStatus, this);
     }
+
+    // Reusable class used to control nav bar transitioning, to make the transition instant.
+    private static class NavBarTransitionController
+            implements WindowInsetsAnimationControlListenerCompat {
+        private boolean mShown;
+
+        void setShow(boolean show) {
+            mShown = show;
+        }
+
+        @Override
+        public void onReady(@NonNull WindowInsetsAnimationControllerCompat controller, int types) {
+            controller.finish(mShown);
+        }
+
+        @Override
+        public void onFinished(WindowInsetsAnimationControllerCompat controller) {}
+
+        @Override
+        public void onCancelled(WindowInsetsAnimationControllerCompat controller) {}
+    }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
index 0e5b96b..0052446 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
@@ -59,7 +59,6 @@
 import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.Restriction;
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.R;
@@ -762,8 +761,8 @@
 
     @Test
     @MediumTest
-    @FlakyTest(message = "crbug.com/1315415")
-    public void testEndIconVisiblityInSearchMode() throws Exception {
+    @Features.EnableFeatures({ChromeFeatureList.READ_LATER + ":use_root_bookmark_as_default/false"})
+    public void testEndIconVisibilityInSearchMode() throws Exception {
         BookmarkId testId = addFolder(TEST_FOLDER_TITLE);
         addFolder(TEST_TITLE_A);
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/SwitchToTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/SwitchToTabTest.java
index a70920c..0faa326 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/SwitchToTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/SwitchToTabTest.java
@@ -148,7 +148,7 @@
      *
      * @param locationBarLayout The layout which omnibox suggestions will show in.
      * @param tab The tab which the AutocompleteMatch should suggest.
-     * @return The suggesstion which suggests the |tab|.
+     * @return The suggestion which suggests the |tab|.
      */
     private AutocompleteMatch findTabMatchOmniboxSuggestion(
             LocationBarLayout locationBarLayout, Tab tab) {
@@ -237,7 +237,7 @@
     }
 
     /**
-     * Launch the SearchActiviy.
+     * Launch the SearchActivity.
      */
     private SearchActivity startSearchActivity() {
         final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
@@ -265,6 +265,7 @@
 
     @Test
     @MediumTest
+    @CommandLineFlags.Add({"disable-features=OmniboxUpdateResultDebounce"})
     public void testSwitchToTabSuggestion() throws InterruptedException {
         mTestServer = EmbeddedTestServer.createAndStartHTTPSServer(
                 InstrumentationRegistry.getInstrumentation().getContext(),
@@ -358,6 +359,7 @@
 
     @Test
     @MediumTest
+    @CommandLineFlags.Add({"disable-features=OmniboxUpdateResultDebounce"})
     public void testSwitchToTabInSearchActivity() throws InterruptedException {
         mTestServer = EmbeddedTestServer.createAndStartHTTPSServer(
                 InstrumentationRegistry.getInstrumentation().getContext(),
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 3d1b4ac6..c6fd8022 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3260,6 +3260,8 @@
       "segmentation_platform/android/segmentation_platform_service_factory_android.cc",
       "segmentation_platform/default_model/chrome_start_model_android.cc",
       "segmentation_platform/default_model/chrome_start_model_android.h",
+      "segmentation_platform/default_model/chrome_start_model_android_v2.cc",
+      "segmentation_platform/default_model/chrome_start_model_android_v2.h",
       "sessions/session_restore_android.cc",
       "sharing/click_to_call/click_to_call_message_handler_android.cc",
       "sharing/click_to_call/click_to_call_message_handler_android.h",
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc
index bb4da24..4ed0e8a 100644
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -5653,17 +5653,14 @@
 // guests.
 class SitePerProcessWebViewTest : public WebViewTestBase {
  public:
-  SitePerProcessWebViewTest() = default;
+  SitePerProcessWebViewTest() {
+    feature_list_.InitAndEnableFeature(features::kSiteIsolationForGuests);
+  }
   ~SitePerProcessWebViewTest() override = default;
   SitePerProcessWebViewTest(const SitePerProcessWebViewTest&) = delete;
   SitePerProcessWebViewTest& operator=(const SitePerProcessWebViewTest&) =
       delete;
 
-  void SetUp() override {
-    feature_list_.InitAndEnableFeature(features::kSiteIsolationForGuests);
-    WebViewTestBase::SetUp();
-  }
-
  private:
   base::test::ScopedFeatureList feature_list_;
 };
@@ -6233,6 +6230,13 @@
                                     "http://isolated.com");
     SitePerProcessWebViewTest::SetUpCommandLine(command_line);
   }
+
+  content::test::FencedFrameTestHelper& fenced_frame_test_helper() {
+    return fenced_frame_test_helper_;
+  }
+
+ private:
+  content::test::FencedFrameTestHelper fenced_frame_test_helper_;
 };
 
 // Check that when strict site isolation is turned off (via a command-line flag
@@ -6367,22 +6371,78 @@
             starting_instance->GetStoragePartitionConfig());
 }
 
-class WebViewFencedFrameTest : public WebViewTest {
+IN_PROC_BROWSER_TEST_F(WebViewWithDefaultSiteInstanceTest, FencedFrame) {
+  TestHelper("testAddFencedFrame", "web_view/shim", NEEDS_TEST_SERVER);
+
+  auto* guest_rfh =
+      GetGuestViewManager()->WaitForSingleGuestRenderFrameHostCreated();
+  std::vector<content::RenderFrameHost*> rfhs =
+      content::CollectAllRenderFrameHosts(guest_rfh);
+  ASSERT_EQ(rfhs.size(), 2u);
+  ASSERT_EQ(rfhs[0], guest_rfh);
+  content::RenderFrameHostWrapper fenced_frame(rfhs[1]);
+  EXPECT_TRUE(fenced_frame->IsFencedFrameRoot());
+
+  content::SiteInstance* fenced_frame_site_instance =
+      fenced_frame->GetSiteInstance();
+  EXPECT_FALSE(fenced_frame->IsErrorDocument());
+  EXPECT_NE(fenced_frame_site_instance, guest_rfh->GetSiteInstance());
+  EXPECT_TRUE(fenced_frame_site_instance->IsGuest());
+  EXPECT_EQ(fenced_frame_site_instance->GetStoragePartitionConfig(),
+            guest_rfh->GetSiteInstance()->GetStoragePartitionConfig());
+  EXPECT_EQ(fenced_frame->GetProcess(), guest_rfh->GetProcess());
+}
+
+class WebViewFencedFrameTest
+    : public WebViewTestBase,
+      public testing::WithParamInterface<std::tuple<bool, bool>> {
  public:
+  WebViewFencedFrameTest() {
+    bool should_enable_site_isolation_for_guests = std::get<0>(GetParam());
+    bool should_enable_process_isolation_for_fenced_frames =
+        std::get<1>(GetParam());
+    std::vector<base::Feature> enabled_features, disabled_features;
+
+    if (should_enable_site_isolation_for_guests) {
+      enabled_features.push_back(features::kSiteIsolationForGuests);
+    } else {
+      disabled_features.push_back(features::kSiteIsolationForGuests);
+    }
+
+    if (should_enable_process_isolation_for_fenced_frames) {
+      enabled_features.push_back(features::kIsolateFencedFrames);
+    } else {
+      disabled_features.push_back(features::kIsolateFencedFrames);
+    }
+
+    scoped_feature_list_.InitWithFeatures(std::move(enabled_features),
+                                          std::move(disabled_features));
+  }
   ~WebViewFencedFrameTest() override = default;
 
   content::test::FencedFrameTestHelper& fenced_frame_test_helper() {
     return fenced_frame_test_helper_;
   }
 
+  static std::string DescribeParams(
+      const testing::TestParamInfo<ParamType>& info) {
+    return base::StringPrintf(
+        "%s_%s",
+        std::get<0>(info.param) ? "SiteIsolationForGuestsEnabled"
+                                : "SiteIsolationForGuestsDisabled",
+        std::get<1>(info.param) ? "IsolateFencedFramesEnabled"
+                                : "IsolateFencedFramesDisabled");
+  }
+
  private:
   content::test::FencedFrameTestHelper fenced_frame_test_helper_;
+  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 INSTANTIATE_TEST_SUITE_P(WebViewTests,
                          WebViewFencedFrameTest,
-                         testing::Bool(),
-                         WebViewTest::DescribeParams);
+                         testing::Combine(testing::Bool(), testing::Bool()),
+                         WebViewFencedFrameTest::DescribeParams);
 
 IN_PROC_BROWSER_TEST_P(WebViewFencedFrameTest,
                        FencedFrameInGuestHasGuestSiteInstance) {
@@ -6394,13 +6454,30 @@
       content::CollectAllRenderFrameHosts(guest_rfh);
   ASSERT_EQ(rfhs.size(), 2u);
   ASSERT_EQ(rfhs[0], guest_rfh);
-  content::RenderFrameHostWrapper fenced_frame(rfhs[1]);
+  content::RenderFrameHostWrapper ff_rfh(rfhs[1]);
 
-  content::SiteInstance* fenced_frame_site_instance =
-      fenced_frame->GetSiteInstance();
-  EXPECT_TRUE(fenced_frame_site_instance->IsGuest());
-  EXPECT_EQ(fenced_frame_site_instance->GetStoragePartitionConfig(),
+  EXPECT_NE(ff_rfh->GetSiteInstance(), guest_rfh->GetSiteInstance());
+  EXPECT_TRUE(guest_rfh->GetSiteInstance()->IsGuest());
+  EXPECT_TRUE(ff_rfh->GetSiteInstance()->IsGuest());
+  EXPECT_EQ(ff_rfh->GetSiteInstance()->GetStoragePartitionConfig(),
             guest_rfh->GetSiteInstance()->GetStoragePartitionConfig());
+
+  // The fenced frame will be in a different process from the embedding guest
+  // only if both Site Isolation for Guests and Process Isolation for Fenced
+  // Frames are enabled.
+  if (content::SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled() &&
+      content::SiteIsolationPolicy::
+          IsProcessIsolationForFencedFramesEnabled()) {
+    EXPECT_NE(ff_rfh->GetProcess(), guest_rfh->GetProcess());
+  } else {
+    EXPECT_EQ(ff_rfh->GetProcess(), guest_rfh->GetProcess());
+  }
+
+  // Add a second fenced frame (same-site with the first fenced frame).
+  auto* ff_rfh_2 = fenced_frame_test_helper().CreateFencedFrame(
+      guest_rfh, ff_rfh->GetLastCommittedURL());
+  EXPECT_NE(ff_rfh_2->GetSiteInstance(), ff_rfh->GetSiteInstance());
+  EXPECT_EQ(ff_rfh->GetProcess(), ff_rfh_2->GetProcess());
 }
 
 class WebViewPortalTest : public WebViewTest {
diff --git a/chrome/browser/ash/browser_accelerator_configuration.cc b/chrome/browser/ash/browser_accelerator_configuration.cc
index a6d9e06b..b381f736 100644
--- a/chrome/browser/ash/browser_accelerator_configuration.cc
+++ b/chrome/browser/ash/browser_accelerator_configuration.cc
@@ -14,6 +14,11 @@
 
 BrowserAcceleratorConfiguration::~BrowserAcceleratorConfiguration() = default;
 
+const std::vector<mojom::AcceleratorLayoutInfoPtr>&
+BrowserAcceleratorConfiguration::GetAcceleratorLayoutInfos() {
+  return layout_infos_;
+}
+
 const std::vector<AcceleratorInfo>&
 BrowserAcceleratorConfiguration::GetConfigForAction(
     AcceleratorActionId action_id) {
diff --git a/chrome/browser/ash/browser_accelerator_configuration.h b/chrome/browser/ash/browser_accelerator_configuration.h
index 95d076d5..2cda6841 100644
--- a/chrome/browser/ash/browser_accelerator_configuration.h
+++ b/chrome/browser/ash/browser_accelerator_configuration.h
@@ -7,6 +7,7 @@
 
 #include "ash/ash_export.h"
 #include "ash/public/cpp/accelerator_configuration.h"
+#include "ash/public/mojom/accelerator_info.mojom.h"
 #include "ui/base/accelerators/accelerator.h"
 
 #include <vector>
@@ -29,6 +30,8 @@
   ~BrowserAcceleratorConfiguration() override;
 
   // AcceleratorConfiguration:
+  const std::vector<mojom::AcceleratorLayoutInfoPtr>&
+  GetAcceleratorLayoutInfos() override;
   const std::vector<AcceleratorInfo>& GetConfigForAction(
       AcceleratorActionId action_id) override;
   bool IsMutable() const override;
@@ -48,6 +51,7 @@
 
  private:
   std::vector<AcceleratorInfo> accelerator_infos_;
+  std::vector<mojom::AcceleratorLayoutInfoPtr> layout_infos_;
 };
 
 }  // namespace ash
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
index 7713381..a9dbdef 100644
--- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc
+++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -290,6 +290,7 @@
     network_portal_detector::SetNetworkPortalDetector(
         new NetworkPortalDetectorImpl());
   }
+  network_portal_detector::GetInstance()->Enable();
 }
 
 void ApplySigninProfileModifications(Profile* profile) {
@@ -1139,17 +1140,6 @@
     // active networks. Should be called before call to initialize
     // ChromeSessionManager because it depends on NetworkPortalDetector.
     InitializeNetworkPortalDetector();
-    {
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-      bool is_official_build = true;
-#else
-      bool is_official_build = false;
-#endif
-      // Enable portal detector if EULA was previously accepted or if
-      // this is an unofficial build.
-      if (!is_official_build || StartupUtils::IsEulaAccepted())
-        network_portal_detector::GetInstance()->Enable();
-    }
 
     // Initialize an observer to update NetworkHandler's pref based services.
     network_pref_state_observer_ = std::make_unique<NetworkPrefStateObserver>();
diff --git a/chrome/browser/ash/file_manager/volume_manager_unittest.cc b/chrome/browser/ash/file_manager/volume_manager_unittest.cc
index 80ba34d..5c05c3b 100644
--- a/chrome/browser/ash/file_manager/volume_manager_unittest.cc
+++ b/chrome/browser/ash/file_manager/volume_manager_unittest.cc
@@ -1103,9 +1103,8 @@
   std::vector<base::WeakPtr<Volume>> volume_list =
       volume_manager()->GetVolumeList();
   ASSERT_GT(volume_list.size(), 0u);
-  auto volume = base::ranges::find_if(volume_list, [](auto& v) {
-    return v->volume_id() == "downloads:MyFiles";
-  });
+  auto volume =
+      base::ranges::find(volume_list, "downloads:MyFiles", &Volume::volume_id);
   EXPECT_FALSE(volume == volume_list.end());
   EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, (*volume)->type());
 }
diff --git a/chrome/browser/ash/login/lock/screen_locker.cc b/chrome/browser/ash/login/lock/screen_locker.cc
index 5deb9db..0d7415f 100644
--- a/chrome/browser/ash/login/lock/screen_locker.cc
+++ b/chrome/browser/ash/login/lock/screen_locker.cc
@@ -275,12 +275,16 @@
 }
 
 void ScreenLocker::OnAuthSuccess(const UserContext& user_context) {
+  if (unlock_started_) {
+    VLOG(1) << "OnAuthSuccess called while unlock is already runing";
+    return;
+  }
+
+  unlock_started_ = true;
   CHECK(!IsAuthTemporarilyDisabledForUser(user_context.GetAccountId()))
       << "Authentication is disabled for this user.";
 
   incorrect_passwords_count_ = 0;
-  DCHECK(!unlock_started_);
-  unlock_started_ = true;
   if (authentication_start_time_.is_null()) {
     if (user_context.GetAccountId().is_valid())
       LOG(ERROR) << "Start time is not set at authentication success";
diff --git a/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc b/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
index de889042..e96bba13 100644
--- a/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
+++ b/chrome/browser/ash/login/screens/update_required_screen_browsertest.cc
@@ -219,6 +219,7 @@
 
   network_portal_detector::InitializeForTesting(
       new NetworkPortalDetectorTestImpl());
+  network_portal_detector::GetInstance()->Enable();
 
   static_cast<UpdateRequiredScreen*>(
       WizardController::default_controller()->current_screen())
diff --git a/chrome/browser/ash/login/test/network_portal_detector_mixin.cc b/chrome/browser/ash/login/test/network_portal_detector_mixin.cc
index 6026faa..97e17754 100644
--- a/chrome/browser/ash/login/test/network_portal_detector_mixin.cc
+++ b/chrome/browser/ash/login/test/network_portal_detector_mixin.cc
@@ -104,6 +104,7 @@
   // Setup network portal detector to return online for the default network.
   network_portal_detector_ = new NetworkPortalDetectorTestImpl();
   network_portal_detector::InitializeForTesting(network_portal_detector_);
+  network_portal_detector_->Enable();
   SetDefaultNetwork(FakeShillManagerClient::kFakeEthernetNetworkGuid,
                     shill::kTypeEthernet,
                     NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE);
diff --git a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
index 5e1474a..ca9fdaf2 100644
--- a/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/ash/login/users/chrome_user_manager_impl.cc
@@ -870,11 +870,9 @@
   // device-local account list here to extract the kiosk_app_id.
   const std::vector<policy::DeviceLocalAccount> device_local_accounts =
       policy::GetDeviceLocalAccounts(cros_settings_);
-  const auto account = base::ranges::find_if(
-      device_local_accounts,
-      [&kiosk_app_account_id](const policy::DeviceLocalAccount& account) {
-        return account.user_id == kiosk_app_account_id.GetUserEmail();
-      });
+  const auto account = base::ranges::find(device_local_accounts,
+                                          kiosk_app_account_id.GetUserEmail(),
+                                          &policy::DeviceLocalAccount::user_id);
   std::string kiosk_app_id;
   if (account != device_local_accounts.end()) {
     kiosk_app_id = account->kiosk_app_id;
diff --git a/chrome/browser/ash/login/wizard_controller.cc b/chrome/browser/ash/login/wizard_controller.cc
index ecf6d60d..6f21ff0 100644
--- a/chrome/browser/ash/login/wizard_controller.cc
+++ b/chrome/browser/ash/login/wizard_controller.cc
@@ -2024,8 +2024,6 @@
 
   // Now that EULA has been accepted (for official builds), enable portal check.
   // ChromiumOS builds would go though this code path too.
-  NetworkHandler::Get()->network_state_handler()->SetCheckPortalList(
-      NetworkStateHandler::kDefaultCheckPortalList);
   GetAutoEnrollmentController()->Start();
   network_portal_detector::GetInstance()->Enable();
 }
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc
index 9bc2d3f..6611be12 100644
--- a/chrome/browser/ash/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -666,7 +666,7 @@
     WizardControllerTest::TearDownOnMainThread();
   }
 
-  void InitTimezoneResolver() {
+  void InitNetworkPortalDetector() {
     network_portal_detector_ = new NetworkPortalDetectorTestImpl();
     network_portal_detector::InitializeForTesting(network_portal_detector_);
 
@@ -730,8 +730,7 @@
     CheckCurrentScreen(NetworkScreenView::kScreenId);
     EXPECT_CALL(*mock_network_screen_, HideImpl()).Times(1);
 
-    // Enable TimeZone resolve
-    InitTimezoneResolver();
+    InitNetworkPortalDetector();
 
     EXPECT_CALL(*mock_update_screen_, ShowImpl()).Times(1);
     if (chromeos::features::IsOobeConsolidatedConsentEnabled()) {
@@ -923,6 +922,8 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerFlowTest, ControlFlowSkipUpdateEnroll) {
+  InitNetworkPortalDetector();
+
   CheckCurrentScreen(WelcomeView::kScreenId);
   EXPECT_CALL(*mock_update_screen_, ShowImpl()).Times(0);
   EXPECT_CALL(*mock_network_screen_, ShowImpl()).Times(1);
diff --git a/chrome/browser/ash/net/network_portal_detector_impl.cc b/chrome/browser/ash/net/network_portal_detector_impl.cc
index 024a2b1..d7f79086 100644
--- a/chrome/browser/ash/net/network_portal_detector_impl.cc
+++ b/chrome/browser/ash/net/network_portal_detector_impl.cc
@@ -14,11 +14,14 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "build/branding_buildflags.h"
+#include "chrome/browser/ash/login/startup_utils.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chromeos/ash/components/dbus/shill/shill_profile_client.h"
 #include "chromeos/ash/components/network/network_event_log.h"
+#include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_state.h"
 #include "chromeos/login/login_state/login_state.h"
 #include "content/public/browser/notification_service.h"
@@ -106,10 +109,21 @@
   if (enabled_)
     return;
 
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  if (!StartupUtils::IsEulaAccepted()) {
+    NET_LOG(EVENT) << "NetworkPortalDetector: Eula not accepted.";
+    return;
+  }
+#endif
+
   NET_LOG(EVENT) << "NetworkPortalDetector Enabled.";
   DCHECK(is_idle());
   enabled_ = true;
 
+  // Ensure that Shill portal detection is enabled.
+  NetworkHandler::Get()->network_state_handler()->SetCheckPortalList(
+      NetworkStateHandler::kDefaultCheckPortalList);
+
   const NetworkState* network = DefaultNetwork();
   if (!network)
     return;
diff --git a/chrome/browser/ash/net/network_portal_detector_test_impl.cc b/chrome/browser/ash/net/network_portal_detector_test_impl.cc
index 4e2579c..e2e2907 100644
--- a/chrome/browser/ash/net/network_portal_detector_test_impl.cc
+++ b/chrome/browser/ash/net/network_portal_detector_test_impl.cc
@@ -8,7 +8,9 @@
 
 #include "base/callback.h"
 #include "base/logging.h"
+#include "chromeos/ash/components/network/network_handler.h"
 #include "chromeos/ash/components/network/network_state.h"
+#include "chromeos/ash/components/network/network_state_handler.h"
 
 namespace ash {
 
@@ -55,9 +57,16 @@
 }
 
 bool NetworkPortalDetectorTestImpl::IsEnabled() {
-  return true;
+  return enabled_;
 }
 
-void NetworkPortalDetectorTestImpl::Enable() {}
+void NetworkPortalDetectorTestImpl::Enable() {
+  DVLOG(1) << "NetworkPortalDetectorTestImpl: Enabled.";
+  enabled_ = true;
+  if (NetworkHandler::IsInitialized()) {
+    NetworkHandler::Get()->network_state_handler()->SetCheckPortalList(
+        NetworkStateHandler::kDefaultCheckPortalList);
+  }
+}
 
 }  // namespace ash
diff --git a/chrome/browser/ash/net/network_portal_detector_test_impl.h b/chrome/browser/ash/net/network_portal_detector_test_impl.h
index 2a1b4b2..053356c2 100644
--- a/chrome/browser/ash/net/network_portal_detector_test_impl.h
+++ b/chrome/browser/ash/net/network_portal_detector_test_impl.h
@@ -41,6 +41,7 @@
   void Enable() override;
 
  private:
+  bool enabled_ = false;
   std::unique_ptr<NetworkState> default_network_;
   std::map<std::string, CaptivePortalStatus> portal_status_map_;
 };
diff --git a/chrome/browser/ash/net/network_portal_web_dialog.cc b/chrome/browser/ash/net/network_portal_web_dialog.cc
index bd406486..eb166b5 100644
--- a/chrome/browser/ash/net/network_portal_web_dialog.cc
+++ b/chrome/browser/ash/net/network_portal_web_dialog.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/ash/net/network_portal_web_dialog.h"
 
-#include "components/captive_portal/core/captive_portal_detector.h"
 #include "components/strings/grit/components_strings.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_base_types.h"
@@ -12,7 +11,6 @@
 #include "ui/display/screen.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/views/widget/widget.h"
-#include "url/gurl.h"
 
 namespace ash {
 
@@ -30,8 +28,9 @@
 
 }  // namespace
 
-NetworkPortalWebDialog::NetworkPortalWebDialog(base::WeakPtr<Delegate> delegate)
-    : delegate_(delegate), widget_(nullptr) {
+NetworkPortalWebDialog::NetworkPortalWebDialog(const GURL& url,
+                                               base::WeakPtr<Delegate> delegate)
+    : url_(url), delegate_(delegate), widget_(nullptr) {
   set_can_resize(false);
 }
 
@@ -59,7 +58,7 @@
 }
 
 GURL NetworkPortalWebDialog::GetDialogContentURL() const {
-  return GURL(captive_portal::CaptivePortalDetector::kDefaultURL);
+  return url_;
 }
 
 void NetworkPortalWebDialog::GetWebUIMessageHandlers(
diff --git a/chrome/browser/ash/net/network_portal_web_dialog.h b/chrome/browser/ash/net/network_portal_web_dialog.h
index e7b3f4ad..b2aa541 100644
--- a/chrome/browser/ash/net/network_portal_web_dialog.h
+++ b/chrome/browser/ash/net/network_portal_web_dialog.h
@@ -7,6 +7,7 @@
 
 #include "base/memory/weak_ptr.h"
 #include "ui/web_dialogs/web_dialog_delegate.h"
+#include "url/gurl.h"
 
 namespace views {
 class Widget;
@@ -29,7 +30,7 @@
     virtual void OnDialogDestroyed(const NetworkPortalWebDialog* dialog) = 0;
   };
 
-  explicit NetworkPortalWebDialog(base::WeakPtr<Delegate> delegate);
+  NetworkPortalWebDialog(const GURL& url, base::WeakPtr<Delegate> delegate);
   NetworkPortalWebDialog(const NetworkPortalWebDialog&) = delete;
   NetworkPortalWebDialog& operator=(const NetworkPortalWebDialog&) = delete;
   ~NetworkPortalWebDialog() override;
@@ -51,8 +52,8 @@
                        bool* out_close_dialog) override;
   bool ShouldShowDialogTitle() const override;
 
+  GURL url_;
   base::WeakPtr<Delegate> delegate_;
-
   views::Widget* widget_;
 };
 
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc
index c0fefa7b..8e2b375f 100644
--- a/chrome/browser/autofill/autofill_browsertest.cc
+++ b/chrome/browser/autofill/autofill_browsertest.cc
@@ -437,39 +437,41 @@
               testing::UnorderedElementsAreArray(expected_phone_numbers));
 }
 
-// Prepend country codes when formatting phone numbers, but only if the user
-// provided one in the first place.
+// Prepend country codes when formatting phone numbers if:
+// - It was provided in the first place.
+// - `AutofillInferCountryCallingCode` is enabled.
 IN_PROC_BROWSER_TEST_F(AutofillTest, AppendCountryCodeForAggregatedPhones) {
-  FormMap data;
-  data["NAME_FIRST"] = "Bob";
-  data["NAME_LAST"] = "Smith";
-  data["ADDRESS_HOME_LINE1"] = "1234 H St.";
-  data["ADDRESS_HOME_CITY"] = "San Jose";
-  data["ADDRESS_HOME_STATE"] = "CA";
-  data["ADDRESS_HOME_ZIP"] = "95110";
-  data["ADDRESS_HOME_COUNTRY"] = "Germany";
-  data["PHONE_HOME_WHOLE_NUMBER"] = "+4908450777777";
+  FormMap data = {{"NAME_FIRST", "Bob"},
+                  {"NAME_LAST", "Smith"},
+                  {"ADDRESS_HOME_LINE1", "1234 H St."},
+                  {"ADDRESS_HOME_CITY", "San Jose"},
+                  {"ADDRESS_HOME_STATE", "CA"},
+                  {"ADDRESS_HOME_ZIP", "95110"},
+                  {"ADDRESS_HOME_COUNTRY", "Germany"},
+                  {"PHONE_HOME_WHOLE_NUMBER", "+4908450777777"}};
   FillFormAndSubmit("autofill_test_form.html", data);
 
   data["ADDRESS_HOME_LINE1"] = "4321 H St.";
   data["PHONE_HOME_WHOLE_NUMBER"] = "08450777777";
   FillFormAndSubmit("autofill_test_form.html", data);
 
-  ASSERT_EQ(2u, personal_data_manager()->GetProfiles().size());
-  int second_address_index =
-      personal_data_manager()->GetProfiles()[0]->GetRawInfo(
-          ADDRESS_HOME_LINE1) == u"4321 H St."
-          ? 0
-          : 1;
+  std::vector<std::u16string> actual_phone_numbers;
+  for (const AutofillProfile* profile :
+       personal_data_manager()->GetProfiles()) {
+    actual_phone_numbers.push_back(
+        profile->GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
+  }
 
-  EXPECT_EQ(u"+49 8450 777777", personal_data_manager()
-                                    ->GetProfiles()[1 - second_address_index]
-                                    ->GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
+  // With `AutofillInferCountryCallingCode` enabled, the country code of the
+  // second phone number is derived from the profile (Germany).
+  std::vector<std::u16string> expected_phone_numbers = {
+      u"+49 8450 777777",
+      base::FeatureList::IsEnabled(features::kAutofillInferCountryCallingCode)
+          ? u"+49 8450 777777"
+          : u"08450 777777"};
 
-  EXPECT_EQ(
-      u"08450 777777",
-      personal_data_manager()->GetProfiles()[second_address_index]->GetRawInfo(
-          PHONE_HOME_WHOLE_NUMBER));
+  EXPECT_THAT(actual_phone_numbers,
+              testing::UnorderedElementsAreArray(expected_phone_numbers));
 }
 
 // Test that Autofill uses '+' sign for international numbers.
diff --git a/chrome/browser/autofill/autofill_server_browsertest.cc b/chrome/browser/autofill/autofill_server_browsertest.cc
index 18f0d5f..4fe789c3 100644
--- a/chrome/browser/autofill/autofill_server_browsertest.cc
+++ b/chrome/browser/autofill/autofill_server_browsertest.cc
@@ -270,20 +270,29 @@
       features::kAutofillEnableSupportForHonorificPrefixes);
 
   // Combinations of honorific_prefix without structured_names are omitted
-  // because honorific_prefix can only be enabled ontop of structured_names.
+  // because honorific_prefix can only be enabled on top of structured_names.
+  std::string data_present;
   if (structured_names && !structured_address && !honorific_prefix) {
-    upload->set_data_present("1f7e0003780000080004000000040018");
+    data_present = "1f7e0003780000080004000000040018";
   } else if (structured_names && honorific_prefix && !structured_address) {
-    upload->set_data_present("1f7e0003780000080004000000040418");
+    data_present = "1f7e0003780000080004000000040418";
   } else if (structured_names && !honorific_prefix && structured_address) {
-    upload->set_data_present("1f7e0003780000080004000001c40018");
+    data_present = "1f7e0003780000080004000001c40018";
   } else if (structured_names && honorific_prefix && structured_address) {
-    upload->set_data_present("1f7e0003780000080004000001c40418");
+    data_present = "1f7e0003780000080004000001c40418";
   } else if (!structured_names && !honorific_prefix && structured_address) {
-    upload->set_data_present("1f7e0003780000080004000001c00018");
+    data_present = "1f7e0003780000080004000001c00018";
   } else {
-    upload->set_data_present("1f7e0003780000080004000000000018");
+    data_present = "1f7e0003780000080004000000000018";
   }
+  // TODO(crbug.com/1311937): Additional phone number trunk types are present
+  // if AutofillEnableSupportForPhoneNumberTrunkTypes is enabled. Clean-up
+  // implementation when launched.
+  if (base::FeatureList::IsEnabled(
+          features::kAutofillEnableSupportForPhoneNumberTrunkTypes)) {
+    data_present.rbegin()[1] = '7';
+  }
+  upload->set_data_present(data_present);
 
   upload->set_passwords_revealed(false);
   upload->set_submission_event(
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc
index ba63e6c6..ab1444b4 100644
--- a/chrome/browser/autofill/form_structure_browsertest.cc
+++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -231,9 +231,15 @@
        // TODO(crbug.com/1341387): Remove once launched.
        features::kAutofillParseVcnCardOnFileStandaloneCvcFields,
        // TODO(crbug.com/1339277): Remove once launched.
-       features::kAutofillImprovedLabelForInference},
+       features::kAutofillImprovedLabelForInference,
+       // TODO(crbug.com/1311937): Remove once launched.
+       features::kAutofillEnableSupportForPhoneNumberTrunkTypes,
+       features::kAutofillInferCountryCallingCode},
       // Disabled
-      {});
+      {// TODO(crbug.com/1311937): Remove once launched.
+       // This feature is part of the AutofillRefinedPhoneNumberTypes rollout.
+       // As it is not supported on iOS yet, it is disabled.
+       features::kAutofillConsiderPhoneNumberSeparatorsValidLabels});
 }
 
 FormStructureBrowserTest::~FormStructureBrowserTest() = default;
diff --git a/chrome/browser/browser_switcher/browser_switcher_service.cc b/chrome/browser/browser_switcher/browser_switcher_service.cc
index 3883ba9..cc34097 100644
--- a/chrome/browser/browser_switcher/browser_switcher_service.cc
+++ b/chrome/browser/browser_switcher/browser_switcher_service.cc
@@ -355,8 +355,7 @@
   // Record |BrowserSwitcher.AlternativeBrowser| when the
   // |BrowserSwitcherEnabled| or |AlternativeBrowserPath| policies change.
   bool should_record_metrics =
-      changed_prefs.end() !=
-      base::ranges::find_if(changed_prefs, [](const std::string& pref) {
+      base::ranges::any_of(changed_prefs, [](const std::string& pref) {
         return pref == prefs::kEnabled ||
                pref == prefs::kAlternativeBrowserPath;
       });
diff --git a/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
index 7cdecd6..e5cc0e1 100644
--- a/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
+++ b/chrome/browser/chromeos/arc/arc_external_protocol_dialog.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "build/chromeos_buildflags.h"
 #include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/apps/intent_helper/page_transition_util.h"
@@ -365,10 +366,8 @@
   if (!web_contents)
     return;
 
-  const auto it = std::find_if(devices.begin(), devices.end(),
-                               [&device_guid](const auto& device) {
-                                 return device->guid() == device_guid;
-                               });
+  const auto it =
+      base::ranges::find(devices, device_guid, &syncer::DeviceInfo::guid);
   DCHECK(it != devices.end());
   auto* device = it->get();
 
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
index 22384f8..563f15e 100644
--- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.h"
 
-#include <algorithm>
 #include <deque>
 #include <map>
 #include <memory>
@@ -60,6 +59,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/no_destructor.h"
 #include "base/numerics/safe_conversions.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/scoped_observation.h"
 #include "base/strings/strcat.h"
@@ -751,9 +751,7 @@
 
 aura::Window* FindAppWindowById(const int64_t id) {
   auto list = ash::GetAppWindowList();
-  auto iter = std::find_if(
-      list.begin(), list.end(),
-      [id](aura::Window* window) { return window->GetId() == id; });
+  auto iter = base::ranges::find(list, id, &aura::Window::GetId);
   if (iter == list.end())
     return nullptr;
   return *iter;
@@ -762,9 +760,9 @@
 // Returns the first available Browser that is not a web app.
 Browser* GetFirstRegularBrowser() {
   const BrowserList* list = BrowserList::GetInstance();
-  auto iter = std::find_if(list->begin(), list->end(), [](Browser* browser) {
-    return browser->app_controller() == nullptr;
-  });
+  const web_app::AppBrowserController* (Browser::*app_controller)() const =
+      &Browser::app_controller;
+  auto iter = base::ranges::find(*list, nullptr, app_controller);
   if (iter == list->end())
     return nullptr;
   return *iter;
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.cc b/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.cc
index 53afae31..a8f3e5c 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.cc
@@ -4,11 +4,11 @@
 
 #include "chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.h"
 
-#include <algorithm>
 #include <memory>
 #include <vector>
 
 #include "base/containers/cxx20_erase_vector.h"
+#include "base/ranges/algorithm.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_histogram_helper.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h"
@@ -157,12 +157,11 @@
     const DlpConfidentialContents& other) {
   contents_.insert(other.contents_.begin(), other.contents_.end());
   for (auto other_content : other.contents_) {
-    auto it =
-        std::find_if(contents_.begin(), contents_.end(),
-                     [&other_content](const DlpConfidentialContent& content) {
-                       return content == other_content &&
-                              content.title != other_content.title;
-                     });
+    auto it = base::ranges::find_if(
+        contents_, [&other_content](const DlpConfidentialContent& content) {
+          return content == other_content &&
+                 content.title != other_content.title;
+        });
     if (it != contents_.end()) {
       *it = other_content;
     }
@@ -205,22 +204,21 @@
     content::WebContents* web_contents,
     DlpRulesManager::Restriction restriction) const {
   const GURL url = web_contents->GetLastCommittedURL();
-  return std::find_if(entries_.begin(), entries_.end(),
-                      [&](const std::unique_ptr<Entry>& entry) {
-                        return entry->restriction == restriction &&
-                               entry->content.url.EqualsIgnoringRef(url);
-                      }) != entries_.end();
+  return base::ranges::any_of(
+      entries_, [&](const std::unique_ptr<Entry>& entry) {
+        return entry->restriction == restriction &&
+               entry->content.url.EqualsIgnoringRef(url);
+      });
 }
 
 bool DlpConfidentialContentsCache::Contains(
     const DlpConfidentialContent& content,
     DlpRulesManager::Restriction restriction) const {
-  return std::find_if(
-             entries_.begin(), entries_.end(),
-             [&](const std::unique_ptr<Entry>& entry) {
-               return entry->restriction == restriction &&
-                      entry->content.url.EqualsIgnoringRef(content.url);
-             }) != entries_.end();
+  return base::ranges::any_of(
+      entries_, [&](const std::unique_ptr<Entry>& entry) {
+        return entry->restriction == restriction &&
+               entry->content.url.EqualsIgnoringRef(content.url);
+      });
 }
 
 size_t DlpConfidentialContentsCache::GetSizeForTesting() const {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents_unittest.cc b/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents_unittest.cc
index daf9c5e4..992c988 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents_unittest.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_confidential_contents_unittest.cc
@@ -7,6 +7,7 @@
 #include <sstream>
 #include <string>
 
+#include "base/ranges/algorithm.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_histogram_helper.h"
@@ -62,13 +63,11 @@
   // |web_contents|.
   bool Contains(const DlpConfidentialContents& contents,
                 content::WebContents* web_contents) {
-    auto iter = std::find_if(contents.GetContents().begin(),
-                             contents.GetContents().end(),
-                             [&](const DlpConfidentialContent& content) {
-                               return content.url.EqualsIgnoringRef(
-                                   web_contents->GetLastCommittedURL());
-                             });
-    return iter != contents.GetContents().end();
+    return base::ranges::any_of(contents.GetContents(),
+                                [&](const DlpConfidentialContent& content) {
+                                  return content.url.EqualsIgnoringRef(
+                                      web_contents->GetLastCommittedURL());
+                                });
   }
 
  protected:
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
index eaed863..e1cce17 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_content_manager.cc
@@ -16,6 +16,7 @@
 #include "base/containers/cxx20_erase.h"
 #include "base/memory/weak_ptr.h"
 #include "base/notreached.h"
+#include "base/ranges/algorithm.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_confidential_contents.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_content_manager_observer.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_content_restriction_set.h"
@@ -627,9 +628,9 @@
     base::RepeatingClosure stop_callback,
     content::MediaStreamUI::StateChangeCallback state_change_callback,
     content::MediaStreamUI::SourceCallback source_callback) {
-  auto screen_share_it = std::find_if(
-      running_screen_shares_.begin(), running_screen_shares_.end(),
-      [&label, media_id](const std::unique_ptr<ScreenShareInfo>& info) -> bool {
+  auto screen_share_it = base::ranges::find_if(
+      running_screen_shares_,
+      [&label, media_id](const std::unique_ptr<ScreenShareInfo>& info) {
         return info && info->label() == label &&
                info->new_media_id() == media_id;
       });
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.cc b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.cc
index 55edfb75..b8a7ca06 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.cc
@@ -51,8 +51,8 @@
   if (!profile_manager)
     return nullptr;
   auto profiles = profile_manager->GetLoadedProfiles();
-  const auto profile_it = base::ranges::find_if(
-      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
+  const auto profile_it =
+      base::ranges::find_if(profiles, &Profile::IsMainProfile);
   if (profile_it == profiles.end())
     return nullptr;
   return *profile_it;
diff --git a/chrome/browser/download/download_prefs_unittest.cc b/chrome/browser/download/download_prefs_unittest.cc
index 948b16d..51835ef 100644
--- a/chrome/browser/download/download_prefs_unittest.cc
+++ b/chrome/browser/download/download_prefs_unittest.cc
@@ -185,8 +185,8 @@
 
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile;
-  ListPrefUpdate update(profile.GetPrefs(),
-                        prefs::kDownloadExtensionsToOpenByPolicy);
+  ScopedListPrefUpdate update(profile.GetPrefs(),
+                              prefs::kDownloadExtensionsToOpenByPolicy);
   update->Append("txt");
   DownloadPrefs prefs(&profile);
 
@@ -203,8 +203,8 @@
 
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile;
-  ListPrefUpdate update(profile.GetPrefs(),
-                        prefs::kDownloadExtensionsToOpenByPolicy);
+  ScopedListPrefUpdate update(profile.GetPrefs(),
+                              prefs::kDownloadExtensionsToOpenByPolicy);
   update->Append("exe");
   DownloadPrefs prefs(&profile);
   EXPECT_TRUE(prefs.EnableAutoOpenByUserBasedOnExtension(kFilePathType1));
@@ -222,8 +222,8 @@
 
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile;
-  ListPrefUpdate update(profile.GetPrefs(),
-                        prefs::kDownloadExtensionsToOpenByPolicy);
+  ScopedListPrefUpdate update(profile.GetPrefs(),
+                              prefs::kDownloadExtensionsToOpenByPolicy);
   update->Append("swf");
   DownloadPrefs prefs(&profile);
 
@@ -249,17 +249,17 @@
 
   // Update the policy preference.
   {
-    ListPrefUpdate update(profile.GetPrefs(),
-                          prefs::kDownloadExtensionsToOpenByPolicy);
+    ScopedListPrefUpdate update(profile.GetPrefs(),
+                                prefs::kDownloadExtensionsToOpenByPolicy);
     update->Append("swf");
   }
   EXPECT_TRUE(prefs.IsAutoOpenEnabled(kURL, kDangerousFilePath));
 
   // Remove the policy and ensure the file stops auto-opening.
   {
-    ListPrefUpdate update(profile.GetPrefs(),
-                          prefs::kDownloadExtensionsToOpenByPolicy);
-    update->ClearList();
+    ScopedListPrefUpdate update(profile.GetPrefs(),
+                                prefs::kDownloadExtensionsToOpenByPolicy);
+    update->clear();
   }
   EXPECT_FALSE(prefs.IsAutoOpenEnabled(kURL, kDangerousFilePath));
 }
@@ -271,11 +271,11 @@
 
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile;
-  ListPrefUpdate update_type(profile.GetPrefs(),
-                             prefs::kDownloadExtensionsToOpenByPolicy);
+  ScopedListPrefUpdate update_type(profile.GetPrefs(),
+                                   prefs::kDownloadExtensionsToOpenByPolicy);
   update_type->Append("txt");
-  ListPrefUpdate update_url(profile.GetPrefs(),
-                            prefs::kDownloadAllowedURLsForOpenByPolicy);
+  ScopedListPrefUpdate update_url(profile.GetPrefs(),
+                                  prefs::kDownloadAllowedURLsForOpenByPolicy);
   update_url->Append("basic.com");
   DownloadPrefs prefs(&profile);
 
@@ -291,8 +291,8 @@
 
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile;
-  ListPrefUpdate update_type(profile.GetPrefs(),
-                             prefs::kDownloadExtensionsToOpenByPolicy);
+  ScopedListPrefUpdate update_type(profile.GetPrefs(),
+                                   prefs::kDownloadExtensionsToOpenByPolicy);
   update_type->Append("txt");
   DownloadPrefs prefs(&profile);
 
@@ -302,8 +302,8 @@
 
   // Update the policy preference to only allow |kAllowedURL|.
   {
-    ListPrefUpdate update_url(profile.GetPrefs(),
-                              prefs::kDownloadAllowedURLsForOpenByPolicy);
+    ScopedListPrefUpdate update_url(profile.GetPrefs(),
+                                    prefs::kDownloadAllowedURLsForOpenByPolicy);
     update_url->Append("basic.com");
   }
 
@@ -312,9 +312,9 @@
 
   // Remove the policy and ensure both auto-open again.
   {
-    ListPrefUpdate update_url(profile.GetPrefs(),
-                              prefs::kDownloadAllowedURLsForOpenByPolicy);
-    update_url->ClearList();
+    ScopedListPrefUpdate update_url(profile.GetPrefs(),
+                                    prefs::kDownloadAllowedURLsForOpenByPolicy);
+    update_url->clear();
   }
   EXPECT_TRUE(prefs.IsAutoOpenByPolicy(kAllowedURL, kFilePath));
   EXPECT_TRUE(prefs.IsAutoOpenByPolicy(kDisallowedURL, kFilePath));
@@ -332,8 +332,8 @@
 
   content::BrowserTaskEnvironment task_environment_;
   TestingProfile profile;
-  ListPrefUpdate update_type(profile.GetPrefs(),
-                             prefs::kDownloadExtensionsToOpenByPolicy);
+  ScopedListPrefUpdate update_type(profile.GetPrefs(),
+                                   prefs::kDownloadExtensionsToOpenByPolicy);
   update_type->Append("txt");
   DownloadPrefs prefs(&profile);
 
@@ -345,8 +345,8 @@
 
   // Update the policy preference to only allow |kAllowedURL|.
   {
-    ListPrefUpdate update_url(profile.GetPrefs(),
-                              prefs::kDownloadAllowedURLsForOpenByPolicy);
+    ScopedListPrefUpdate update_url(profile.GetPrefs(),
+                                    prefs::kDownloadAllowedURLsForOpenByPolicy);
     update_url->Append("basic.com");
   }
 
diff --git a/chrome/browser/enterprise/connectors/common.cc b/chrome/browser/enterprise/connectors/common.cc
index 8399f77..bcc2f02 100644
--- a/chrome/browser/enterprise/connectors/common.cc
+++ b/chrome/browser/enterprise/connectors/common.cc
@@ -384,8 +384,7 @@
   if (!profile_manager)
     return nullptr;
   auto profiles = g_browser_process->profile_manager()->GetLoadedProfiles();
-  const auto main_it = base::ranges::find_if(
-      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
+  const auto main_it = base::ranges::find_if(profiles, &Profile::IsMainProfile);
   if (main_it == profiles.end())
     return nullptr;
   return *main_it;
diff --git a/chrome/browser/extensions/api/debugger/debugger_api.cc b/chrome/browser/extensions/api/debugger/debugger_api.cc
index abd20e6..c6a66ea6 100644
--- a/chrome/browser/extensions/api/debugger/debugger_api.cc
+++ b/chrome/browser/extensions/api/debugger/debugger_api.cc
@@ -21,6 +21,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/singleton.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "base/scoped_observation.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/types/optional_util.h"
@@ -593,9 +594,8 @@
       // Re-use existing browser agent hosts.
       const std::string& extension_id = extension()->id();
       AttachedClientHosts& hosts = g_attached_client_hosts.Get();
-      auto it = std::find_if(
-          hosts.begin(), hosts.end(),
-          [&extension_id](ExtensionDevToolsClientHost* client_host) {
+      auto it = base::ranges::find_if(
+          hosts, [&extension_id](ExtensionDevToolsClientHost* client_host) {
             return client_host->extension_id() == extension_id &&
                    client_host->agent_host() &&
                    client_host->agent_host()->GetType() ==
@@ -639,8 +639,8 @@
   const std::string& extension_id = extension()->id();
   DevToolsAgentHost* agent_host = agent_host_.get();
   AttachedClientHosts& hosts = g_attached_client_hosts.Get();
-  auto it = std::find_if(
-      hosts.begin(), hosts.end(),
+  auto it = base::ranges::find_if(
+      hosts,
       [&agent_host, &extension_id](ExtensionDevToolsClientHost* client_host) {
         return client_host->agent_host() == agent_host &&
                client_host->extension_id() == extension_id;
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 e6b1fec..1ef92adb 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/extensions/api/developer_private/developer_private_api.h"
 
 #include <stddef.h>
+
 #include <memory>
 #include <string>
 #include <tuple>
@@ -12,10 +13,12 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/containers/contains.h"
 #include "base/files/file_util.h"
 #include "base/guid.h"
 #include "base/lazy_instance.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -313,13 +316,9 @@
   if (inserted) {
     it->second.etld_plus_one = etld_plus_one;
     it->second.sites.push_back(CreateSiteInfo(site, site_set));
-  } else {
-    auto site_info = std::find_if(
-        it->second.sites.begin(), it->second.sites.end(),
-        [site](const developer::SiteInfo& info) { return info.site == site; });
-
-    if (site_info == it->second.sites.end())
-      it->second.sites.push_back(CreateSiteInfo(site, site_set));
+  } else if (!base::Contains(it->second.sites, site,
+                             &developer::SiteInfo::site)) {
+    it->second.sites.push_back(CreateSiteInfo(site, site_set));
   }
 }
 
@@ -758,10 +757,7 @@
   WebContentsData* data = GetOrCreateWebContentsData(web_contents);
   IdToPathMap& paths = data->allowed_unpacked_paths;
   auto existing =
-      std::find_if(paths.begin(), paths.end(),
-                   [path](const std::pair<std::string, base::FilePath>& entry) {
-                     return entry.second == path;
-                   });
+      base::ranges::find(paths, path, &IdToPathMap::value_type::second);
   if (existing != paths.end())
     return existing->first;
 
diff --git a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
index 0512b87..8e1d487 100644
--- a/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
+++ b/chrome/browser/extensions/api/extension_action/browser_action_interactive_test.cc
@@ -868,10 +868,8 @@
       extensions::ProcessManager::Get(browser()->profile());
   std::set<content::RenderFrameHost*> hosts =
       manager->GetRenderFrameHostsForExtension(extension->id());
-  const auto& it =
-      base::ranges::find_if(hosts, [](content::RenderFrameHost* host) {
-        return host->IsInPrimaryMainFrame();
-      });
+  const auto& it = base::ranges::find_if(
+      hosts, &content::RenderFrameHost::IsInPrimaryMainFrame);
   content::RenderFrameHost* primary_rfh = (it != hosts.end()) ? *it : nullptr;
   ASSERT_TRUE(primary_rfh);
 
diff --git a/chrome/browser/extensions/api/identity/identity_api.cc b/chrome/browser/extensions/api/identity/identity_api.cc
index 665a69f..3e507fc 100644
--- a/chrome/browser/extensions/api/identity/identity_api.cc
+++ b/chrome/browser/extensions/api/identity/identity_api.cc
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/containers/contains.h"
 #include "base/lazy_instance.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/trace_event/trace_event.h"
@@ -92,11 +93,7 @@
     absl::optional<std::string> gaia_id = GetGaiaIdForExtension(extension_id);
     if (!gaia_id)
       continue;
-    auto account_it = std::find_if(accounts.begin(), accounts.end(),
-                                   [&](const CoreAccountInfo& account) {
-                                     return account.gaia == *gaia_id;
-                                   });
-    if (account_it == accounts.end()) {
+    if (!base::Contains(accounts, *gaia_id, &CoreAccountInfo::gaia)) {
       EraseGaiaIdForExtension(extension_id);
     }
   }
diff --git a/chrome/browser/extensions/api/identity/identity_token_cache.cc b/chrome/browser/extensions/api/identity/identity_token_cache.cc
index 2256765..a2408468 100644
--- a/chrome/browser/extensions/api/identity/identity_token_cache.cc
+++ b/chrome/browser/extensions/api/identity/identity_token_cache.cc
@@ -4,8 +4,6 @@
 
 #include "chrome/browser/extensions/api/identity/identity_token_cache.h"
 
-#include <algorithm>
-
 #include "base/containers/cxx20_erase.h"
 #include "base/ranges/algorithm.h"
 #include "chrome/browser/extensions/api/identity/identity_constants.h"
@@ -224,9 +222,8 @@
   auto find_tokens_it = access_tokens_cache_.find(access_tokens_key);
   if (find_tokens_it != access_tokens_cache_.end()) {
     const AccessTokensValue& cached_tokens = find_tokens_it->second;
-    auto matched_token_it = std::find_if(
-        cached_tokens.begin(), cached_tokens.end(),
-        [&key](const auto& cached_token) {
+    auto matched_token_it =
+        base::ranges::find_if(cached_tokens, [&key](const auto& cached_token) {
           return key.scopes.size() <= cached_token.granted_scopes().size() &&
                  base::ranges::includes(cached_token.granted_scopes(),
                                         key.scopes);
diff --git a/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc b/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc
index 2920c141..cace1ca 100644
--- a/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc
+++ b/chrome/browser/extensions/api/notifications/extension_notification_display_helper.cc
@@ -4,8 +4,7 @@
 
 #include "chrome/browser/extensions/api/notifications/extension_notification_display_helper.h"
 
-#include <algorithm>
-
+#include "base/ranges/algorithm.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/notifications/notification_display_service_factory.h"
@@ -59,12 +58,8 @@
 
 bool ExtensionNotificationDisplayHelper::EraseDataForNotificationId(
     const std::string& notification_id) {
-  auto iter = std::find_if(
-      notifications_.begin(), notifications_.end(),
-      [notification_id](
-          const std::unique_ptr<message_center::Notification>& notification) {
-        return notification->id() == notification_id;
-      });
+  auto iter = base::ranges::find(notifications_, notification_id,
+                                 &message_center::Notification::id);
 
   if (iter == notifications_.end())
     return false;
diff --git a/chrome/browser/extensions/api/scripting/scripting_api.cc b/chrome/browser/extensions/api/scripting/scripting_api.cc
index e2a1951..8dc1f067 100644
--- a/chrome/browser/extensions/api/scripting/scripting_api.cc
+++ b/chrome/browser/extensions/api/scripting/scripting_api.cc
@@ -184,12 +184,8 @@
     }
 
     // ExtensionResource doesn't implement an operator==.
-    auto existing = base::ranges::find_if(
-        resources, [&resource](const ExtensionResource& other) {
-          return resource.relative_path() == other.relative_path();
-        });
-
-    if (existing != resources.end()) {
+    if (base::Contains(resources, resource.relative_path(),
+                       &ExtensionResource::relative_path)) {
       // Disallow duplicates. Note that we could allow this, if we wanted (and
       // there *might* be reason to with JS injection, to perform an operation
       // twice?). However, this matches content script behavior, and injecting
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 08049ab..8000c6e 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -7,7 +7,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <algorithm>
 #include <map>
 #include <memory>
 #include <set>
@@ -17,6 +16,7 @@
 
 #include "base/bind.h"
 #include "base/command_line.h"
+#include "base/containers/contains.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/json/json_file_value_serializer.h"
@@ -25,6 +25,7 @@
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/one_shot_event.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/strings/pattern.h"
 #include "base/strings/string_number_conversions.h"
@@ -251,14 +252,9 @@
 }
 
 bool HasExternalInstallBubble(ExtensionService* service) {
-  std::vector<ExternalInstallError*> errors =
-      service->external_install_manager()->GetErrorsForTesting();
-  auto found = std::find_if(
-      errors.begin(), errors.end(),
-      [](const ExternalInstallError* error) {
-    return error->alert_type() == ExternalInstallError::BUBBLE_ALERT;
-  });
-  return found != errors.end();
+  return base::Contains(
+      service->external_install_manager()->GetErrorsForTesting(),
+      ExternalInstallError::BUBBLE_ALERT, &ExternalInstallError::alert_type);
 }
 
 size_t GetExternalInstallBubbleCount(ExtensionService* service) {
@@ -796,11 +792,8 @@
   ExternalInstallError* GetError(const std::string& extension_id) {
     std::vector<ExternalInstallError*> errors =
         service_->external_install_manager()->GetErrorsForTesting();
-    auto found = std::find_if(
-        errors.begin(), errors.end(),
-        [&extension_id](const ExternalInstallError* error) {
-      return error->extension_id() == extension_id;
-    });
+    auto found = base::ranges::find(errors, extension_id,
+                                    &ExternalInstallError::extension_id);
     return found == errors.end() ? nullptr : *found;
   }
 
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc
index efc3203..b060f5e4 100644
--- a/chrome/browser/extensions/extension_web_ui.cc
+++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -15,6 +15,7 @@
 #include "base/bind.h"
 #include "base/command_line.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -203,14 +204,13 @@
 bool UpdateOverridesList(base::Value::List& overrides_list,
                          const std::string& override_url,
                          UpdateBehavior behavior) {
-  auto iter = std::find_if(overrides_list.begin(), overrides_list.end(),
-                           [&override_url](const base::Value& value) {
-                             if (!value.is_dict())
-                               return false;
-                             const std::string* entry =
-                                 value.GetDict().FindString(kEntry);
-                             return entry && *entry == override_url;
-                           });
+  auto iter = base::ranges::find_if(
+      overrides_list, [&override_url](const base::Value& value) {
+        if (!value.is_dict())
+          return false;
+        const std::string* entry = value.GetDict().FindString(kEntry);
+        return entry && *entry == override_url;
+      });
   if (iter != overrides_list.end()) {
     switch (behavior) {
       case UPDATE_DEACTIVATE: {
diff --git a/chrome/browser/extensions/extension_with_management_policy_apitest.cc b/chrome/browser/extensions/extension_with_management_policy_apitest.cc
index 6d02086..e1161cf 100644
--- a/chrome/browser/extensions/extension_with_management_policy_apitest.cc
+++ b/chrome/browser/extensions/extension_with_management_policy_apitest.cc
@@ -3,7 +3,9 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/extensions/extension_with_management_policy_apitest.h"
+
 #include "base/bind.h"
+#include "base/containers/contains.h"
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "net/dns/mock_host_resolver.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -45,10 +47,8 @@
 
 bool ExtensionApiTestWithManagementPolicy::BrowsedTo(
     const std::string& test_host) {
-  return std::find_if(request_log_.begin(), request_log_.end(),
-                      [test_host](const ManagementPolicyRequestLog& log) {
-                        return log.host == test_host;
-                      }) != request_log_.end();
+  return base::Contains(request_log_, test_host,
+                        &ManagementPolicyRequestLog::host);
 }
 
 void ExtensionApiTestWithManagementPolicy::ClearRequestLog() {
diff --git a/chrome/browser/extensions/external_pref_loader.cc b/chrome/browser/extensions/external_pref_loader.cc
index 7279045..c64e395 100644
--- a/chrome/browser/extensions/external_pref_loader.cc
+++ b/chrome/browser/extensions/external_pref_loader.cc
@@ -17,6 +17,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
+#include "base/ranges/algorithm.h"
 #include "base/scoped_observation.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -252,10 +253,8 @@
     ExternalPrefLoader::PrioritySyncReadyWaiter* waiter) {
   // Delete |waiter| from |pending_waiter_list_|.
   pending_waiter_list_.erase(
-      std::find_if(pending_waiter_list_.begin(), pending_waiter_list_.end(),
-                   [waiter](const std::unique_ptr<PrioritySyncReadyWaiter>& w) {
-                     return w.get() == waiter;
-                   }));
+      base::ranges::find(pending_waiter_list_, waiter,
+                         &std::unique_ptr<PrioritySyncReadyWaiter>::get));
   // Continue loading.
   GetExtensionFileTaskRunner()->PostTask(
       FROM_HERE, base::BindOnce(&ExternalPrefLoader::LoadOnFileThread, this));
diff --git a/chrome/browser/extensions/menu_manager.cc b/chrome/browser/extensions/menu_manager.cc
index 27f69ee..f451920 100644
--- a/chrome/browser/extensions/menu_manager.cc
+++ b/chrome/browser/extensions/menu_manager.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/extensions/menu_manager.h"
 
-#include <algorithm>
 #include <memory>
 #include <tuple>
 #include <utility>
@@ -15,6 +14,7 @@
 #include "base/json/json_writer.h"
 #include "base/notreached.h"
 #include "base/observer_list.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
@@ -462,10 +462,8 @@
       return false;
     }
     MenuItem::OwnedList& list = i->second;
-    auto j = std::find_if(list.begin(), list.end(),
-                          [child_ptr](const std::unique_ptr<MenuItem>& item) {
-                            return item.get() == child_ptr;
-                          });
+    auto j =
+        base::ranges::find(list, child_ptr, &std::unique_ptr<MenuItem>::get);
     if (j == list.end()) {
       NOTREACHED();
       return false;
diff --git a/chrome/browser/extensions/updater/extension_updater_unittest.cc b/chrome/browser/extensions/updater/extension_updater_unittest.cc
index e09eeab1..07a5b48 100644
--- a/chrome/browser/extensions/updater/extension_updater_unittest.cc
+++ b/chrome/browser/extensions/updater/extension_updater_unittest.cc
@@ -21,6 +21,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/strings/escape.h"
 #include "base/strings/string_number_conversions.h"
@@ -644,10 +645,8 @@
       const std::vector<std::pair<ExtensionDownloaderTask, DownloadFailure>>&
           failures,
       const ExtensionId& id) {
-    auto it = std::find_if(
-        failures.begin(), failures.end(),
-        [&](const std::pair<ExtensionDownloaderTask, DownloadFailure>&
-                failure) { return failure.first.id == id; });
+    auto it = base::ranges::find(
+        failures, id, [](const auto& failure) { return failure.first.id; });
     return it == failures.end() ? nullptr : &it->second;
   }
 
diff --git a/chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_impl.cc b/chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_impl.cc
index 8f8b3eea..6ae428f3 100644
--- a/chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_impl.cc
+++ b/chrome/browser/fast_checkout/fast_checkout_capabilities_fetcher_impl.cc
@@ -138,10 +138,10 @@
   }
 
   std::vector<CapabilitiesInfo>::const_iterator request_capabilities =
-      base::ranges::find_if(
-          capabilities, [&origin](const CapabilitiesInfo& info) {
-            return url::Origin::Create(GURL(info.url)) == origin;
-          });
+      base::ranges::find(capabilities, origin,
+                         [](const CapabilitiesInfo& info) {
+                           return url::Origin::Create(GURL(info.url));
+                         });
 
   if (request_capabilities != capabilities.end() &&
       request_capabilities->bundle_capabilities_information.has_value()) {
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 76482ebc..045ff62 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -324,6 +324,7 @@
     &kStartSurfaceAndroid,
     &kStartSurfaceReturnTime,
     &kStartSurfaceRefactor,
+    &kStartSurfaceDisabledFeedImprovement,
     &kUmaBackgroundSessions,
     &kUpdateHistoryEntryPointsInIncognito,
     &kUpdateNotificationScheduleServiceImmediateShowOption,
@@ -933,12 +934,15 @@
 const base::Feature kSearchResumptionModuleAndroid{
     "SearchResumptionModuleAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kStartSurfaceReturnTime{"kStartSurfaceReturnTime",
+const base::Feature kStartSurfaceReturnTime{"StartSurfaceReturnTime",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
 
 const base::Feature kStartSurfaceRefactor{"StartSurfaceRefactor",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kStartSurfaceDisabledFeedImprovement{
+    "StartSurfaceDisabledFeedImprovement", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // If enabled, keep logging and reporting UMA while chrome is backgrounded.
 const base::Feature kUmaBackgroundSessions{"UMABackgroundSessions",
                                            base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 719a16f..c6f63414 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -181,6 +181,7 @@
 extern const base::Feature kStartSurfaceAndroid;
 extern const base::Feature kStartSurfaceReturnTime;
 extern const base::Feature kStartSurfaceRefactor;
+extern const base::Feature kStartSurfaceDisabledFeedImprovement;
 extern const base::Feature kUmaBackgroundSessions;
 extern const base::Feature kUpdateHistoryEntryPointsInIncognito;
 extern const base::Feature
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
index f2dcbdef7..47eeefd 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -95,6 +95,7 @@
                     .put(ChromeFeatureList.START_SURFACE_ANDROID, true)
                     .put(ChromeFeatureList.START_SURFACE_RETURN_TIME, false)
                     .put(ChromeFeatureList.START_SURFACE_REFACTOR, false)
+                    .put(ChromeFeatureList.START_SURFACE_DISABLED_FEED_IMPROVEMENT, false)
                     .put(ChromeFeatureList.STORE_HOURS, false)
                     .put(ChromeFeatureList.SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, true)
                     .put(ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID, true)
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index e8355488..11c86fc 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -551,6 +551,8 @@
     public static final String SEARCH_RESUMPTION_MODULE_ANDROID = "SearchResumptionModuleAndroid";
     public static final String START_SURFACE_RETURN_TIME = "StartSurfaceReturnTime";
     public static final String START_SURFACE_REFACTOR = "StartSurfaceRefactor";
+    public static final String START_SURFACE_DISABLED_FEED_IMPROVEMENT =
+            "StartSurfaceDisabledFeedImprovement";
     public static final String STORE_HOURS = "StoreHoursAndroid";
     public static final String SUGGESTION_ANSWERS_COLOR_REVERSE = "SuggestionAnswersColorReverse";
     public static final String SUPPRESS_TOOLBAR_CAPTURES = "SuppressToolbarCaptures";
@@ -705,6 +707,8 @@
             new CachedFlag(START_SURFACE_RETURN_TIME, false);
     public static final CachedFlag sStartSurfaceRefactor =
             new CachedFlag(START_SURFACE_REFACTOR, false);
+    public static final CachedFlag sStartSurfaceDisabledFeedImprovement =
+            new CachedFlag(START_SURFACE_DISABLED_FEED_IMPROVEMENT, false);
     public static final CachedFlag sStoreHoursAndroid = new CachedFlag(STORE_HOURS, false);
     public static final CachedFlag sSwapPixelFormatToFixConvertFromTranslucent =
             new CachedFlag(SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT, true);
diff --git a/chrome/browser/headless/headless_mode_util.cc b/chrome/browser/headless/headless_mode_util.cc
index a434293..a4a38939 100644
--- a/chrome/browser/headless/headless_mode_util.cc
+++ b/chrome/browser/headless/headless_mode_util.cc
@@ -62,8 +62,11 @@
   }
   // If Ozone/Headless is enabled, Vulkan initialization crashes unless
   // Angle implementation is specified explicitly.
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      switches::kUseANGLE, gl::kANGLEImplementationSwiftShaderForWebGLName);
+  if (!command_line->HasSwitch(switches::kUseGL) &&
+      !command_line->HasSwitch(switches::kUseANGLE)) {
+    base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
+        switches::kUseANGLE, gl::kANGLEImplementationSwiftShaderForWebGLName);
+  }
 #endif  // BUILDFLAG(IS_LINUX)
 }
 
diff --git a/chrome/browser/lacros/lacros_file_system_provider.cc b/chrome/browser/lacros/lacros_file_system_provider.cc
index 24ba8ddd..d6e3485 100644
--- a/chrome/browser/lacros/lacros_file_system_provider.cc
+++ b/chrome/browser/lacros/lacros_file_system_provider.cc
@@ -21,8 +21,7 @@
 // Returns the single main profile, or nullptr if none is found.
 Profile* GetMainProfile() {
   auto profiles = g_browser_process->profile_manager()->GetLoadedProfiles();
-  const auto main_it = base::ranges::find_if(
-      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
+  const auto main_it = base::ranges::find_if(profiles, &Profile::IsMainProfile);
   if (main_it == profiles.end())
     return nullptr;
   return *main_it;
diff --git a/chrome/browser/lacros/lacros_startup_infobar_delegate.cc b/chrome/browser/lacros/lacros_startup_infobar_delegate.cc
index 549d906d..8bdebef 100644
--- a/chrome/browser/lacros/lacros_startup_infobar_delegate.cc
+++ b/chrome/browser/lacros/lacros_startup_infobar_delegate.cc
@@ -34,8 +34,7 @@
 // Returns the single main profile, or nullptr if none is found.
 Profile* GetMainProfile() {
   auto profiles = g_browser_process->profile_manager()->GetLoadedProfiles();
-  const auto main_it = base::ranges::find_if(
-      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
+  const auto main_it = base::ranges::find_if(profiles, &Profile::IsMainProfile);
   if (main_it == profiles.end())
     return nullptr;
   return *main_it;
diff --git a/chrome/browser/policy/profile_policy_connector.cc b/chrome/browser/policy/profile_policy_connector.cc
index 47a5769..fabe464e 100644
--- a/chrome/browser/policy/profile_policy_connector.cc
+++ b/chrome/browser/policy/profile_policy_connector.cc
@@ -340,8 +340,7 @@
     return true;
 
   auto profiles = profile_manager->GetLoadedProfiles();
-  const auto main_it = base::ranges::find_if(
-      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
+  const auto main_it = base::ranges::find_if(profiles, &Profile::IsMainProfile);
   if (main_it == profiles.end())
     return false;
   return (*main_it)->GetProfilePolicyConnector() == this;
diff --git a/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn b/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn
index a665995..9260c54 100644
--- a/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn
+++ b/chrome/browser/resources/chromeos/chromebox_for_meetings/BUILD.gn
@@ -46,8 +46,7 @@
 
 js_type_check("closure_compile") {
   is_polymer3 = true
-  closure_flags =
-      default_closure_args + mojom_js_args + [ "language_in=ECMASCRIPT_2020" ]
+  closure_flags = default_closure_args + [ "language_in=ECMASCRIPT_2020" ]
   deps = [
     ":cfm_network_settings",
     ":cfm_network_settings_browser_proxy",
diff --git a/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js b/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js
index 6556683..7d5fd834 100644
--- a/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js
+++ b/chrome/browser/resources/chromeos/chromebox_for_meetings/cfm_network_settings.js
@@ -12,8 +12,6 @@
 import {NetworkList} from 'chrome://resources/cr_components/chromeos/network/network_list_types.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {$} from 'chrome://resources/js/util.m.js';
-import {StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CfmNetworkSettingsBrowserProxy, CfmNetworkSettingsBrowserProxyImpl} from './cfm_network_settings_browser_proxy.js';
@@ -28,9 +26,10 @@
  * @param {!OncMojo.NetworkStateProperties} networkState
  */
 function shouldShowNetworkDetails(networkState) {
+  const mojom = chromeos.networkConfig.mojom;
   return OncMojo.connectionStateIsConnected(networkState.connectionState) ||
-      networkState.connectionState == ConnectionStateType.kConnecting ||
-      (networkState.type == NetworkType.kCellular);
+      networkState.connectionState == mojom.ConnectionStateType.kConnecting ||
+      (networkState.type == mojom.NetworkType.kCellular);
 }
 
 /**
@@ -75,6 +74,7 @@
    * @private
    */
   onNetworkItemSelected_(e) {
+    const mojom = chromeos.networkConfig.mojom;
     const networkState = e.detail;
     const guid = networkState.guid;
 
@@ -92,21 +92,21 @@
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
     networkConfig.startConnect(guid).then(response => {
       switch (response.result) {
-        case StartConnectResult.kSuccess:
+        case mojom.StartConnectResult.kSuccess:
           return;
-        case StartConnectResult.kInvalidGuid:
-        case StartConnectResult.kInvalidState:
-        case StartConnectResult.kCanceled:
+        case mojom.StartConnectResult.kInvalidGuid:
+        case mojom.StartConnectResult.kInvalidState:
+        case mojom.StartConnectResult.kCanceled:
           return;
-        case StartConnectResult.kNotConfigured:
+        case mojom.StartConnectResult.kNotConfigured:
           if (!OncMojo.networkTypeIsMobile(networkState.type)) {
             this.browserProxy_.showNetworkConfig(guid);
           } else {
             console.error('Cellular network is not configured: ' + guid);
           }
           return;
-        case StartConnectResult.kBlocked:
-        case StartConnectResult.kUnknown:
+        case mojom.StartConnectResult.kBlocked:
+        case mojom.StartConnectResult.kUnknown:
           console.error(
               'startConnect failed for: ' + guid + ': ' + response.message);
           return;
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
index 25b768fa3..297191a4 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
@@ -22,9 +22,10 @@
     input = rebase_path("$target_gen_dir/$preprocess_folder", root_build_dir)
     out_manifest = "$target_gen_dir/$build_manifest"
     excludes = [
-      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js",
-      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js",
-      "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js",
+      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js",
+      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js",
+      "chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
+      "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js",
     ]
 
     deps = [
@@ -61,7 +62,6 @@
 
 js_type_check("closure_compile") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
   deps = [ ":internet_config_dialog" ]
 }
 
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
index b3c5bcc..967677c4 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -24,10 +24,11 @@
 
     out_manifest = "$target_gen_dir/$build_manifest"
     excludes = [
-      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js",
-      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js",
-      "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js",
+      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js",
       "chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js",
+      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js",
+      "chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
+      "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js",
       "chrome://resources/js/cr.m.js",
     ]
 
@@ -80,7 +81,6 @@
 
 js_type_check("closure_compile") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
   deps = [
     ":internet_detail_dialog",
     ":internet_detail_dialog_browser_proxy",
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
index 86e85f8b..4f3a9379 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -23,11 +23,9 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
+import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {ApnProperties, ConfigProperties, CrosNetworkConfigRemote, GlobalPolicy, IPConfigProperties, ManagedProperties, NetworkStateProperties, ProxySettings, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {InternetDetailDialogBrowserProxy, InternetDetailDialogBrowserProxyImpl} from './internet_detail_dialog_browser_proxy.js';
@@ -53,7 +51,7 @@
     /** The network GUID to display details for. */
     guid: String,
 
-    /** @private {!ManagedProperties|undefined} */
+    /** @private {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties_: {
       type: Object,
       observer: 'managedPropertiesChanged_',
@@ -99,7 +97,7 @@
       computed: 'computeDisabled_(deviceState_.*)',
     },
 
-    /** @private {!GlobalPolicy|undefined} */
+    /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy_: Object,
   },
 
@@ -116,7 +114,7 @@
    */
   propertiesReceived_: false,
 
-  /** @private {?CrosNetworkConfigRemote} */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @private {?InternetDetailDialogBrowserProxy} */
@@ -207,7 +205,7 @@
     }
     // If the network was or is active, request an update.
     if (this.managedProperties_.connectionState !=
-            ConnectionStateType.kNotConnected ||
+            chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected ||
         networks.find(network => network.guid == this.guid)) {
       this.getNetworkDetails_();
     }
@@ -215,7 +213,7 @@
 
   /**
    * CrosNetworkConfigObserver impl
-   * @param {!NetworkStateProperties} network
+   * @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network
    */
   onNetworkStateChanged(network) {
     if (!this.guid || !this.managedProperties_) {
@@ -272,7 +270,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {!OncMojo.NetworkStateProperties}
    */
   getNetworkState_(managedProperties) {
@@ -280,7 +278,7 @@
   },
 
   /**
-   * @return {!ConfigProperties}
+   * @return {!chromeos.networkConfig.mojom.ConfigProperties}
    * @private
    */
   getDefaultConfigProperties_() {
@@ -288,7 +286,7 @@
   },
 
   /**
-   * @param {!ConfigProperties} config
+   * @param {!chromeos.networkConfig.mojom.ConfigProperties} config
    * @private
    */
   setMojoNetworkProperties_(config) {
@@ -306,7 +304,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {string}
    * @private
    */
@@ -319,7 +317,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {string}
    * @private
    */
@@ -328,7 +326,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean} True if the network is connected.
    * @private
    */
@@ -338,16 +336,17 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   isRemembered_(managedProperties) {
-    return managedProperties.source != OncSource.kNone;
+    return managedProperties.source !=
+        chromeos.networkConfig.mojom.OncSource.kNone;
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -357,44 +356,49 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   isCellular_(managedProperties) {
-    return managedProperties.type == NetworkType.kCellular;
+    return managedProperties.type ==
+        chromeos.networkConfig.mojom.NetworkType.kCellular;
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   showCellularSim_(managedProperties) {
-    return managedProperties.type == NetworkType.kCellular &&
+    return managedProperties.type ==
+        chromeos.networkConfig.mojom.NetworkType.kCellular &&
         managedProperties.typeProperties.cellular.family != 'CDMA';
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   showCellularChooseNetwork_(managedProperties) {
-    return managedProperties.type == NetworkType.kCellular &&
+    return managedProperties.type ==
+        chromeos.networkConfig.mojom.NetworkType.kCellular &&
         managedProperties.typeProperties.cellular.supportNetworkScan;
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   showForget_(managedProperties) {
-    if (!managedProperties || managedProperties.type != NetworkType.kWiFi) {
+    const mojom = chromeos.networkConfig.mojom;
+    if (!managedProperties ||
+        managedProperties.type != mojom.NetworkType.kWiFi) {
       return false;
     }
-    return managedProperties.source != OncSource.kNone &&
+    return managedProperties.source != mojom.OncSource.kNone &&
         !this.isPolicySource(managedProperties.source);
   },
 
@@ -410,7 +414,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {string}
    * @private
    */
@@ -422,7 +426,7 @@
   },
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
@@ -433,7 +437,7 @@
   },
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
@@ -443,12 +447,14 @@
       return false;
     }
     return managedProperties.connectable &&
-        managedProperties.type != NetworkType.kEthernet &&
-        managedProperties.connectionState == ConnectionStateType.kNotConnected;
+        managedProperties.type !=
+        chromeos.networkConfig.mojom.NetworkType.kEthernet &&
+        managedProperties.connectionState ==
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
   },
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
@@ -457,12 +463,14 @@
     if (!managedProperties) {
       return false;
     }
-    return managedProperties.type != NetworkType.kEthernet &&
-        managedProperties.connectionState != ConnectionStateType.kNotConnected;
+    return managedProperties.type !=
+        chromeos.networkConfig.mojom.NetworkType.kEthernet &&
+        managedProperties.connectionState !=
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -474,7 +482,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -494,7 +502,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean} Whether or not to enable the network connect button.
    * @private
    */
@@ -512,19 +520,20 @@
       return;
     }
 
+    const mojom = chromeos.networkConfig.mojom;
     const guid = this.managedProperties_.guid;
     this.networkConfig_.startConnect(this.guid).then(response => {
       switch (response.result) {
-        case StartConnectResult.kSuccess:
+        case mojom.StartConnectResult.kSuccess:
           break;
-        case StartConnectResult.kInvalidState:
-        case StartConnectResult.kCanceled:
+        case mojom.StartConnectResult.kInvalidState:
+        case mojom.StartConnectResult.kCanceled:
           // Ignore failures due to in-progress or cancelled connects.
           break;
-        case StartConnectResult.kInvalidGuid:
-        case StartConnectResult.kNotConfigured:
-        case StartConnectResult.kBlocked:
-        case StartConnectResult.kUnknown:
+        case mojom.StartConnectResult.kInvalidGuid:
+        case mojom.StartConnectResult.kNotConfigured:
+        case mojom.StartConnectResult.kBlocked:
+        case mojom.StartConnectResult.kUnknown:
           console.error(
               'Unexpected startConnect error for: ' + guid + ' Result: ' +
               response.result.toString() + ' Message: ' + response.message);
@@ -534,7 +543,7 @@
   },
 
   /**
-   * @param {!CustomEvent<!ApnProperties>} event
+   * @param {!CustomEvent<!chromeos.networkConfig.mojom.ApnProperties>} event
    * @private
    */
   onApnChange_(event) {
@@ -551,7 +560,7 @@
    * Event triggered when the IP Config or NameServers element changes.
    * @param {!CustomEvent<!{
    *     field: string,
-   *     value: (string|!IPConfigProperties|
+   *     value: (string|!chromeos.networkConfig.mojom.IPConfigProperties|
    *             !Array<string>)
    * }>} event The network-ip-config or network-nameservers change event.
    * @private
@@ -569,7 +578,7 @@
 
   /**
    * Event triggered when the Proxy configuration element changes.
-   * @param {!CustomEvent<!ProxySettings>} event
+   * @param {!CustomEvent<!chromeos.networkConfig.mojom.ProxySettings>} event
    * @private
    */
   onProxyChange_(event) {
@@ -609,7 +618,7 @@
   getInfoFields_() {
     /** @type {!Array<string>} */ const fields = [];
     const type = this.managedProperties_.type;
-    if (type == NetworkType.kCellular) {
+    if (type == chromeos.networkConfig.mojom.NetworkType.kCellular) {
       fields.push(
           'cellular.activationState', 'cellular.servingOperator.name',
           'cellular.networkTechnology');
@@ -620,7 +629,7 @@
     // Two separate checks for type == kCellular because the order of the array
     // dictates the order the fields appear on the UI. We want portalState to
     // show after the earlier Cellular fields but before these later fields.
-    if (type == NetworkType.kCellular) {
+    if (type == chromeos.networkConfig.mojom.NetworkType.kCellular) {
       fields.push(
           'cellular.homeProvider.name', 'cellular.homeProvider.country',
           'cellular.firmwareRevision', 'cellular.hardwareRevision',
@@ -639,7 +648,8 @@
       return true;
     }
 
-    if (this.managedProperties_.type !== NetworkType.kCellular) {
+    if (this.managedProperties_.type !==
+        chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return true;
     }
 
@@ -655,7 +665,8 @@
    */
   computeDisabled_() {
     if (!this.deviceState_ ||
-        this.deviceState_.type !== NetworkType.kCellular) {
+        this.deviceState_.type !==
+            chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return false;
     }
     // If this is a cellular device and inhibited, state cannot be changed, so
diff --git a/chrome/browser/resources/chromeos/login/components/BUILD.gn b/chrome/browser/resources/chromeos/login/components/BUILD.gn
index 91c5836e..45b8596 100644
--- a/chrome/browser/resources/chromeos/login/components/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/components/BUILD.gn
@@ -154,7 +154,6 @@
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/network_select_login.m.js" ]
   deps = [
     "../:cr_ui.m",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//ui/webui/resources/cr_components/chromeos/network:network_select",
     "//ui/webui/resources/cr_components/chromeos/network:onc_mojo",
     "//ui/webui/resources/js:assert.m",
diff --git a/chrome/browser/resources/chromeos/login/components/network_select_login.js b/chrome/browser/resources/chromeos/login/components/network_select_login.js
index 898d7a57..1c485c9d 100644
--- a/chrome/browser/resources/chromeos/login/components/network_select_login.js
+++ b/chrome/browser/resources/chromeos/login/components/network_select_login.js
@@ -7,8 +7,6 @@
  */
 
 /* #js_imports_placeholder */
-import {StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 /**
  * Custom data that is stored with network element to trigger action.
@@ -278,10 +276,12 @@
     const guid = networkState.guid;
 
     let shouldShowNetworkDetails = isNetworkConnected ||
-        networkState.connectionState === ConnectionStateType.kConnecting;
+        networkState.connectionState ===
+            chromeos.networkConfig.mojom.ConnectionStateType.kConnecting;
     // Cellular should normally auto connect. If it is selected, show the
     // details UI since there is no configuration UI for Cellular.
-    shouldShowNetworkDetails |= networkState.type === NetworkType.kCellular;
+    shouldShowNetworkDetails |= networkState.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular;
 
     if (shouldShowNetworkDetails) {
       chrome.send('showNetworkDetails', [oncType, guid]);
@@ -297,23 +297,24 @@
                               .getMojoServiceRemote();
 
     networkConfig.startConnect(guid).then(response => {
+      const mojom = chromeos.networkConfig.mojom;
       switch (response.result) {
-        case StartConnectResult.kSuccess:
+        case mojom.StartConnectResult.kSuccess:
           return;
-        case StartConnectResult.kInvalidGuid:
-        case StartConnectResult.kInvalidState:
-        case StartConnectResult.kCanceled:
+        case mojom.StartConnectResult.kInvalidGuid:
+        case mojom.StartConnectResult.kInvalidState:
+        case mojom.StartConnectResult.kCanceled:
           // TODO(stevenjb/khorimoto): Consider handling these cases.
           return;
-        case StartConnectResult.kNotConfigured:
+        case mojom.StartConnectResult.kNotConfigured:
           if (!OncMojo.networkTypeIsMobile(networkState.type)) {
             chrome.send('showNetworkConfig', [guid]);
           } else {
             console.error('Cellular network is not configured: ' + guid);
           }
           return;
-        case StartConnectResult.kBlocked:
-        case StartConnectResult.kUnknown:
+        case mojom.StartConnectResult.kBlocked:
+        case mojom.StartConnectResult.kUnknown:
           console.error(
               'startConnect failed for: ' + guid + ': ' + response.message);
           return;
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
index 51a4e34..2e34ad0a 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -43,7 +43,7 @@
 
 js_type_check("closure_compile_local") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
+  closure_flags = default_closure_args
   deps = [
     ":adb_sideloading",
     ":app_downloading",
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
index 93e24d5..86179b9 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/BUILD.gn
@@ -25,7 +25,7 @@
 
 js_type_check("closure_compile") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
+  closure_flags = default_closure_args
   deps = [
     ":auto_enrollment_check",
     ":demo_preferences.m",
diff --git a/chrome/browser/resources/chromeos/network_ui/BUILD.gn b/chrome/browser/resources/chromeos/network_ui/BUILD.gn
index ad6b3e8..2136757 100644
--- a/chrome/browser/resources/chromeos/network_ui/BUILD.gn
+++ b/chrome/browser/resources/chromeos/network_ui/BUILD.gn
@@ -108,7 +108,7 @@
 js_library("network_state_ui") {
   deps = [
     ":network_ui_browser_proxy",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider",
     "//ui/webui/resources/cr_components/chromeos/network:network_icon",
     "//ui/webui/resources/cr_components/chromeos/network:network_list",
diff --git a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js
index 42cceb8..359f7e8 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_state_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_state_ui.js
@@ -5,11 +5,11 @@
 import 'chrome://resources/cr_components/chromeos/network/network_icon.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {CrosNetworkConfig, CrosNetworkConfigRemote, FilterType, ManagedProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js';
@@ -57,7 +57,7 @@
    * This UI will use both the networkingPrivate extension API and the
    * networkConfig mojo API until we provide all of the required functionality
    * in networkConfig. TODO(stevenjb): Remove use of networkingPrivate api.
-   * @private {?CrosNetworkConfigRemote}
+   * @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote}
    */
   networkConfig_: null,
 
@@ -66,7 +66,8 @@
 
   /** @override */
   created() {
-    this.networkConfig_ = CrosNetworkConfig.getRemote();
+    this.networkConfig_ =
+        chromeos.networkConfig.mojom.CrosNetworkConfig.getRemote();
   },
 
   /** @override */
@@ -267,7 +268,7 @@
   },
 
   /**
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @return {string} A valid HTMLElement id.
    * @private
    */
@@ -430,7 +431,7 @@
   /**
    * @param {!HTMLTableCellElement} detailCell
    * @param {!OncMojo.NetworkStateProperties|!OncMojo.DeviceStateProperties|
-   *         !ManagedProperties|
+   *         !chromeos.networkConfig.mojom.ManagedProperties|
    *         !chrome.networkingPrivate.NetworkProperties} state
    * @param {!Object=} error
    * @private
@@ -520,7 +521,7 @@
       // |state.type| is expected to be the string "etherneteap", which is not
       // supported by the rest of this UI. Use the kEthernet constant instead.
       // See https://crbug.com/1213176.
-      state.type = NetworkType.kEthernet;
+      state.type = chromeos.networkConfig.mojom.NetworkType.kEthernet;
       states.push(state);
     }
     this.createStateTable_(
@@ -532,11 +533,12 @@
    * @private
    */
   requestNetworks_() {
+    const mojom = chromeos.networkConfig.mojom;
     this.networkConfig_
         .getNetworkStateList({
-          filter: FilterType.kVisible,
-          networkType: NetworkType.kAll,
-          limit: NO_LIMIT,
+          filter: mojom.FilterType.kVisible,
+          networkType: mojom.NetworkType.kAll,
+          limit: mojom.NO_LIMIT,
         })
         .then((responseParams) => {
           this.onVisibleNetworksReceived_(responseParams.result);
@@ -544,9 +546,9 @@
 
     this.networkConfig_
         .getNetworkStateList({
-          filter: FilterType.kConfigured,
-          networkType: NetworkType.kAll,
-          limit: NO_LIMIT,
+          filter: mojom.FilterType.kConfigured,
+          networkType: mojom.NetworkType.kAll,
+          limit: mojom.NO_LIMIT,
         })
         .then((responseParams) => {
           this.onFavoriteNetworksReceived_(responseParams.result);
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js
index 87dd82e..06fa172 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -10,6 +10,8 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 import 'chrome://resources/cr_elements/cr_tabs/cr_tabs.js';
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/polymer/v3_0/iron-pages/iron-pages.js';
 import './strings.m.js';
@@ -20,11 +22,11 @@
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CrosNetworkConfig, CrosNetworkConfigRemote, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js';
 
+
 /**
  * @fileoverview
  * Polymer element network debugging UI.
@@ -117,7 +119,7 @@
 
   },
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @type {!NetworkUIBrowserProxy} */
@@ -125,7 +127,8 @@
 
   /** @override */
   attached() {
-    this.networkConfig_ = CrosNetworkConfig.getRemote();
+    this.networkConfig_ =
+        chromeos.networkConfig.mojom.CrosNetworkConfig.getRemote();
 
     const select = this.$$('network-select');
     select.customItems = [
@@ -378,7 +381,8 @@
 
     // Otherwise, connect.
     this.networkConfig_.startConnect(networkState.guid).then(response => {
-      if (response.result == StartConnectResult.kSuccess) {
+      if (response.result ==
+          chromeos.networkConfig.mojom.StartConnectResult.kSuccess) {
         return;
       }
       console.error(
diff --git a/chrome/browser/resources/chromeos/password_change/BUILD.gn b/chrome/browser/resources/chromeos/password_change/BUILD.gn
index ace10cd..103b23b 100644
--- a/chrome/browser/resources/chromeos/password_change/BUILD.gn
+++ b/chrome/browser/resources/chromeos/password_change/BUILD.gn
@@ -80,7 +80,6 @@
 
 js_type_check("closure_compile") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
   deps = [
     ":lock_screen_network",
     ":password_change",
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_network.js b/chrome/browser/resources/chromeos/password_change/lock_screen_network.js
index d815027..e992ec1 100644
--- a/chrome/browser/resources/chromeos/password_change/lock_screen_network.js
+++ b/chrome/browser/resources/chromeos/password_change/lock_screen_network.js
@@ -14,18 +14,18 @@
 import './strings.m.js';
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfig, CrosNetworkConfigRemote, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 Polymer({
   is: 'lock-screen-network-ui',
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
   attached() {
-    this.networkConfig_ = CrosNetworkConfig.getRemote();
+    this.networkConfig_ =
+        chromeos.networkConfig.mojom.CrosNetworkConfig.getRemote();
 
     const select = this.$$('network-select');
     select.customItems = [
@@ -66,7 +66,8 @@
 
     // Otherwise, connect.
     this.networkConfig_.startConnect(networkState.guid).then(response => {
-      if (response.result == StartConnectResult.kSuccess) {
+      if (response.result ==
+          chromeos.networkConfig.mojom.StartConnectResult.kSuccess) {
         return;
       }
       chrome.send('showNetworkConfig', [networkState.guid]);
diff --git a/chrome/browser/resources/new_tab_page/middle_slot_promo.html b/chrome/browser/resources/new_tab_page/middle_slot_promo.html
index f1d5f17..901ee9e 100644
--- a/chrome/browser/resources/new_tab_page/middle_slot_promo.html
+++ b/chrome/browser/resources/new_tab_page/middle_slot_promo.html
@@ -31,7 +31,7 @@
   }
 
   a {
-    color: var(--cr-link-color);
+    color: var(--color-new-tab-page-link);
     cursor: pointer;
     text-decoration: underline;
   }
diff --git a/chrome/browser/resources/new_tab_page/middle_slot_promo.ts b/chrome/browser/resources/new_tab_page/middle_slot_promo.ts
index dc65aa8..b5de15d 100644
--- a/chrome/browser/resources/new_tab_page/middle_slot_promo.ts
+++ b/chrome/browser/resources/new_tab_page/middle_slot_promo.ts
@@ -112,9 +112,6 @@
     const linkOrText = link || text;
     if (el && linkOrText) {
       el.innerText = linkOrText.text;
-      if (linkOrText.color) {
-        el.style.color = linkOrText.color;
-      }
     }
     if (el) {
       hasContent = true;
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index fcdd32d..28330358 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -68,7 +68,9 @@
       "chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-lite.js",
       "chrome://resources/mojo/chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.js",
       "chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js",
+      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js",
       "chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js",
+      "chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js",
       "chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js",
       "chrome://resources/mojo/mojo/public/js/bindings.js",
       "chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
@@ -78,7 +80,7 @@
       "chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js",
       "chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js",
       "chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js",
-      "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js",
+      "chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js",
       "chrome://resources/mojo/skia/public/mojom/bitmap.mojom-lite.js",
       "chrome://resources/mojo/skia/public/mojom/image_info.mojom-lite.js",
       "chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js",
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
index 9925f5b..0efd349 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -286,7 +286,7 @@
 js_library("tether_connection_dialog") {
   deps = [
     "//chrome/browser/resources/settings/chromeos:os_route",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
index b0f633d..04ca8abe 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
@@ -25,11 +25,9 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkList} from 'chrome://resources/cr_components/chromeos/network/network_list_types.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
+import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
-import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
-import {CrosNetworkConfigRemote, GlobalPolicy, InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from '../multidevice_page/multidevice_browser_proxy.js';
@@ -101,7 +99,7 @@
        */
       tetherDeviceState: Object,
 
-      /** @type {!GlobalPolicy|undefined} */
+      /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
       globalPolicy: Object,
 
       /**
@@ -231,7 +229,7 @@
   constructor() {
     super();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
     this.fetchEuiccAndESimPendingProfileList_();
@@ -382,12 +380,14 @@
    * @private
    */
   onNetworksListChanged_() {
+    const mojom = chromeos.networkConfig.mojom;
+
     const pSimNetworks = [];
     const eSimNetworks = [];
     const tetherNetworks = [];
 
     for (const network of this.networks) {
-      if (network.type === NetworkType.kTether) {
+      if (network.type === mojom.NetworkType.kTether) {
         tetherNetworks.push(network);
         continue;
       }
@@ -543,7 +543,7 @@
   /**
    * Return true if the add cellular button should be disabled.
    * @param {!OncMojo.DeviceStateProperties|undefined} cellularDeviceState
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @return {boolean}
    * @private
    */
@@ -564,7 +564,7 @@
    * Return true if the policy indicator that next to the add cellular button
    * should be shown. This policy icon indicates the reason of disabling the
    * add cellular button.
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @return {boolean}
    * @private
    */
@@ -578,8 +578,9 @@
    * @private
    */
   deviceIsEnabled_(cellularDeviceState) {
+    const mojom = chromeos.networkConfig.mojom;
     return !!cellularDeviceState &&
-        cellularDeviceState.deviceState === DeviceStateType.kEnabled;
+        cellularDeviceState.deviceState === mojom.DeviceStateType.kEnabled;
   }
 
   /**
@@ -622,20 +623,21 @@
       return '';
     }
 
+    const mojom = chromeos.networkConfig.mojom.InhibitReason;
     const inhibitReason = this.cellularDeviceState.inhibitReason;
 
     switch (inhibitReason) {
-      case InhibitReason.kInstallingProfile:
+      case mojom.kInstallingProfile:
         return this.i18n('cellularNetworkInstallingProfile');
-      case InhibitReason.kRenamingProfile:
+      case mojom.kRenamingProfile:
         return this.i18n('cellularNetworkRenamingProfile');
-      case InhibitReason.kRemovingProfile:
+      case mojom.kRemovingProfile:
         return this.i18n('cellularNetworkRemovingProfile');
-      case InhibitReason.kConnectingToProfile:
+      case mojom.kConnectingToProfile:
         return this.i18n('cellularNetworkConnectingToProfile');
-      case InhibitReason.kRefreshingProfileList:
+      case mojom.kRefreshingProfileList:
         return this.i18n('cellularNetworRefreshingProfileListProfile');
-      case InhibitReason.kResettingEuiccMemory:
+      case mojom.kResettingEuiccMemory:
         return this.i18n('cellularNetworkResettingESim');
     }
 
@@ -651,7 +653,8 @@
    */
   shouldShowNoESimMessageOrDownloadLink_(
       inhibitReason, eSimNetworks, eSimPendingProfiles) {
-    if (inhibitReason === InhibitReason.kInstallingProfile) {
+    const mojom = chromeos.networkConfig.mojom.InhibitReason;
+    if (inhibitReason === mojom.kInstallingProfile) {
       return false;
     }
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
index 210272d..f97409a 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
@@ -18,10 +18,8 @@
 import {CrPolicyNetworkBehaviorMojo} from 'chrome://resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js';
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {CrosNetworkConfigRemote, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
@@ -55,7 +53,7 @@
         reflectToAttribute: true,
       },
 
-      /** @type {!ManagedProperties|undefined} */
+      /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
       managedProperties: {
         type: Object,
       },
@@ -89,7 +87,7 @@
   constructor() {
     super();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -166,7 +164,7 @@
     if (this.isRoamingProhibitedByPolicy_()) {
       this.set(
           'managedProperties.typeProperties.cellular.allowRoaming.policySource',
-          PolicySource.kDevicePolicyEnforced);
+          chromeos.networkConfig.mojom.PolicySource.kDevicePolicyEnforced);
     }
     this.isRoamingAllowedForNetwork_ = this.getRoamingAllowedForNetwork_();
   }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
index 61fec51..f74735d 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
@@ -13,7 +13,6 @@
 import {getESimProfile} from 'chrome://resources/cr_components/chromeos/cellular_setup/esim_manager_utils.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Router} from '../../router.js';
@@ -77,7 +76,8 @@
   /** @private */
   async init_() {
     if (!(this.networkState &&
-          this.networkState.type === NetworkType.kCellular)) {
+          this.networkState.type ===
+              chromeos.networkConfig.mojom.NetworkType.kCellular)) {
       return;
     }
     this.esimProfileRemote_ =
@@ -126,7 +126,10 @@
     });
     this.$.dialog.close();
     const params = new URLSearchParams();
-    params.append('type', OncMojo.getNetworkTypeString(NetworkType.kCellular));
+    params.append(
+        'type',
+        OncMojo.getNetworkTypeString(
+            chromeos.networkConfig.mojom.NetworkType.kCellular));
     Router.getInstance().setCurrentRoute(
         routes.INTERNET_NETWORKS, params, /*isPopState=*/ true);
   }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
index 24509956..6cdde106 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
@@ -14,7 +14,6 @@
 import {getESimProfile} from 'chrome://resources/cr_components/chromeos/cellular_setup/esim_manager_utils.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /** @type {number} */
@@ -109,7 +108,8 @@
   /** @private */
   async init_() {
     if (!(this.networkState &&
-          this.networkState.type === NetworkType.kCellular)) {
+          this.networkState.type ===
+              chromeos.networkConfig.mojom.NetworkType.kCellular)) {
       return;
     }
     this.esimProfileRemote_ =
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
index 76fa1d3..81e44a5a 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
@@ -14,9 +14,8 @@
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {HTMLEscape} from 'chrome://resources/js/util.m.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
@@ -177,7 +176,9 @@
    * @private
    */
   onPropertiesSet_() {
-    if (this.type === OncMojo.getNetworkTypeString(NetworkType.kWiFi)) {
+    if (this.type ===
+        OncMojo.getNetworkTypeString(
+            chromeos.networkConfig.mojom.NetworkType.kWiFi)) {
       recordSettingChange(Setting.kWifiAddNetwork, {stringValue: this.guid});
     } else {
       recordSettingChange();
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
index 58d1e56..4bd732d 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_menu.js
@@ -15,9 +15,8 @@
 import {ESimManagerListenerBehavior, ESimManagerListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/cellular_setup/esim_manager_listener_behavior.js';
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
 import {Route, Router} from '../../router.js';
@@ -26,7 +25,6 @@
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
 
 
-
 // TODO(crbug.com/1093185): Implement DeepLinkingBehavior and override methods
 // to show the actions for search result.
 /**
@@ -176,7 +174,9 @@
     const networkConfig =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
     networkConfig.getNetworkState(this.guid_).then(response => {
-      if (!response.result || response.result.type !== NetworkType.kCellular ||
+      if (!response.result ||
+          response.result.type !==
+              chromeos.networkConfig.mojom.NetworkType.kCellular ||
           !response.result.typeState.cellular.eid ||
           !response.result.typeState.cellular.iccid) {
         this.eSimNetworkState_ = null;
@@ -217,7 +217,8 @@
   isDotsMenuButtonDisabled_() {
     // Managed eSIM networks cannot be renamed or removed by user.
     if (this.eSimNetworkState_ &&
-        this.eSimNetworkState_.source === OncSource.kDevicePolicy) {
+        this.eSimNetworkState_.source ===
+            chromeos.networkConfig.mojom.OncSource.kDevicePolicy) {
       return true;
     }
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
index 9eec125..3ef1de8 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -40,12 +40,10 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {ActivationStateType, ApnProperties, ConfigProperties, CrosNetworkConfigRemote, FilterType, GlobalPolicy, HiddenSsidMode, IPConfigProperties, ManagedProperties, NetworkStateProperties, NO_LIMIT, ProxySettings, SecurityType, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, IPConfigType, NetworkType, OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
 import {afterNextRender, flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
@@ -119,7 +117,7 @@
       isWifiSyncEnabled_: Boolean,
 
       /**
-       * @private {!ManagedProperties|undefined}
+       * @private {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
        */
       managedProperties_: {
         type: Object,
@@ -179,7 +177,7 @@
         value: null,
       },
 
-      /** @type {!GlobalPolicy|undefined} */
+      /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
       globalPolicy: Object,
 
       /**
@@ -425,7 +423,7 @@
     /** @private  {!InternetPageBrowserProxy} */
     this.browserProxy_ = InternetPageBrowserProxyImpl.getInstance();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
 
@@ -657,7 +655,7 @@
     }
     // If the network was or is active, request an update.
     if (this.managedProperties_.connectionState !==
-            ConnectionStateType.kNotConnected ||
+            chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected ||
         networks.find(network => network.guid === this.guid)) {
       this.getNetworkDetails_();
     }
@@ -665,7 +663,7 @@
 
   /**
    * CrosNetworkConfigObserver impl
-   * @param {!NetworkStateProperties} network
+   * @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network
    */
   onNetworkStateChanged(network) {
     if (!this.guid || !this.managedProperties_) {
@@ -714,8 +712,9 @@
     }
 
     // Set the IPAddress property to the IPv4 Address.
-    const ipv4 =
-        OncMojo.getIPConfigForType(this.managedProperties_, IPConfigType.kIPv4);
+    const ipv4 = OncMojo.getIPConfigForType(
+        this.managedProperties_,
+        chromeos.networkConfig.mojom.IPConfigType.kIPv4);
     this.ipAddress_ = (ipv4 && ipv4.ipAddress) || '';
 
     // Update the detail page title.
@@ -737,7 +736,8 @@
     }
 
     if (this.shouldShowConfigureWhenNetworkLoaded_ &&
-        this.managedProperties_.type === NetworkType.kTether) {
+        this.managedProperties_.type ===
+            chromeos.networkConfig.mojom.NetworkType.kTether) {
       // Set |this.shouldShowConfigureWhenNetworkLoaded_| back to false to
       // ensure that the Tether dialog is only shown once.
       this.shouldShowConfigureWhenNetworkLoaded_ = false;
@@ -798,10 +798,10 @@
         this.deviceState_.scanning = newDeviceState.scanning;
         // Cellular properties are not updated while scanning (since they
         // may be invalid), so request them on scan completion.
-        if (type === NetworkType.kCellular) {
+        if (type === chromeos.networkConfig.mojom.NetworkType.kCellular) {
           shouldGetNetworkDetails = true;
         }
-      } else if (type === NetworkType.kCellular) {
+      } else if (type === chromeos.networkConfig.mojom.NetworkType.kCellular) {
         // If there are no device state property changes but type is
         // cellular, then always fetch network details. This is because
         // for cellular networks, some shill device level properties are
@@ -861,24 +861,24 @@
         Setting.kWifiHidden, {boolValue: !!this.hiddenPref_.value});
     const config = this.getDefaultConfigProperties_();
     config.typeConfig.wifi.hiddenSsid = this.hiddenPref_.value ?
-        HiddenSsidMode.kEnabled :
-        HiddenSsidMode.kDisabled;
+        chromeos.networkConfig.mojom.HiddenSsidMode.kEnabled :
+        chromeos.networkConfig.mojom.HiddenSsidMode.kDisabled;
     this.setMojoNetworkProperties_(config);
   }
 
   /**
-   * @param {!PolicySource} policySource
+   * @param {!chromeos.networkConfig.mojom.PolicySource} policySource
    * @return {!chrome.settingsPrivate.Enforcement|undefined}
    * @private
    */
   getPolicyEnforcement_(policySource) {
     switch (policySource) {
-      case PolicySource.kUserPolicyEnforced:
-      case PolicySource.kDevicePolicyEnforced:
+      case chromeos.networkConfig.mojom.PolicySource.kUserPolicyEnforced:
+      case chromeos.networkConfig.mojom.PolicySource.kDevicePolicyEnforced:
         return chrome.settingsPrivate.Enforcement.ENFORCED;
 
-      case PolicySource.kUserPolicyRecommended:
-      case PolicySource.kDevicePolicyRecommended:
+      case chromeos.networkConfig.mojom.PolicySource.kUserPolicyRecommended:
+      case chromeos.networkConfig.mojom.PolicySource.kDevicePolicyRecommended:
         return chrome.settingsPrivate.Enforcement.RECOMMENDED;
 
       default:
@@ -887,18 +887,18 @@
   }
 
   /**
-   * @param {!PolicySource} policySource
+   * @param {!chromeos.networkConfig.mojom.PolicySource} policySource
    * @return {!chrome.settingsPrivate.ControlledBy|undefined}
    * @private
    */
   getPolicyController_(policySource) {
     switch (policySource) {
-      case PolicySource.kDevicePolicyEnforced:
-      case PolicySource.kDevicePolicyRecommended:
+      case chromeos.networkConfig.mojom.PolicySource.kDevicePolicyEnforced:
+      case chromeos.networkConfig.mojom.PolicySource.kDevicePolicyRecommended:
         return chrome.settingsPrivate.ControlledBy.DEVICE_POLICY;
 
-      case PolicySource.kUserPolicyEnforced:
-      case PolicySource.kUserPolicyRecommended:
+      case chromeos.networkConfig.mojom.PolicySource.kUserPolicyEnforced:
+      case chromeos.networkConfig.mojom.PolicySource.kUserPolicyRecommended:
         return chrome.settingsPrivate.ControlledBy.USER_POLICY;
 
       default:
@@ -960,7 +960,8 @@
       return;
     }
 
-    if (this.managedProperties_.type !== NetworkType.kWiFi) {
+    if (this.managedProperties_.type !==
+        chromeos.networkConfig.mojom.NetworkType.kWiFi) {
       return;
     }
 
@@ -1017,9 +1018,9 @@
   /** @private */
   checkNetworkExists_() {
     const filter = {
-      filter: FilterType.kVisible,
-      networkType: NetworkType.kAll,
-      limit: NO_LIMIT,
+      filter: chromeos.networkConfig.mojom.FilterType.kVisible,
+      networkType: chromeos.networkConfig.mojom.NetworkType.kAll,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
     };
     this.networkConfig_.getNetworkState(this.guid).then(response => {
       if (response.result) {
@@ -1031,7 +1032,7 @@
         // Set the connection state since we won't receive an update for a non
         // existent network.
         this.managedProperties_.connectionState =
-            ConnectionStateType.kNotConnected;
+            chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
       }
     });
   }
@@ -1051,7 +1052,7 @@
   }
 
   /**
-   * @param {?ManagedProperties} properties
+   * @param {?chromeos.networkConfig.mojom.ManagedProperties} properties
    * @private
    */
   getPropertiesCallback_(properties) {
@@ -1082,14 +1083,15 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     properties
    * @private
    */
   updateManagedProperties_(properties) {
     this.applyingChanges_ = true;
     if (this.managedProperties_ &&
-        this.managedProperties_.type === NetworkType.kCellular &&
+        this.managedProperties_.type ===
+            chromeos.networkConfig.mojom.NetworkType.kCellular &&
         this.deviceState_ && this.deviceState_.scanning) {
       // Cellular properties may be invalid while scanning, so keep the existing
       // properties instead.
@@ -1118,17 +1120,17 @@
     managedProperties.connectable = networkState.connectable;
     managedProperties.connectionState = networkState.connectionState;
     switch (networkState.type) {
-      case NetworkType.kCellular:
+      case chromeos.networkConfig.mojom.NetworkType.kCellular:
         managedProperties.typeProperties.cellular.signalStrength =
             networkState.typeState.cellular.signalStrength;
         managedProperties.typeProperties.cellular.simLocked =
             networkState.typeState.cellular.simLocked;
         break;
-      case NetworkType.kTether:
+      case chromeos.networkConfig.mojom.NetworkType.kTether:
         managedProperties.typeProperties.tether.signalStrength =
             networkState.typeState.tether.signalStrength;
         break;
-      case NetworkType.kWiFi:
+      case chromeos.networkConfig.mojom.NetworkType.kWiFi:
         managedProperties.typeProperties.wifi.signalStrength =
             networkState.typeState.wifi.signalStrength;
         break;
@@ -1140,7 +1142,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} properties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
    * @return {!OncMojo.NetworkStateProperties|undefined}
    */
   getNetworkState_(properties) {
@@ -1151,7 +1153,7 @@
   }
 
   /**
-   * @return {!ConfigProperties}
+   * @return {!chromeos.networkConfig.mojom.ConfigProperties}
    * @private
    */
   getDefaultConfigProperties_() {
@@ -1159,7 +1161,7 @@
   }
 
   /**
-   * @param {!ConfigProperties} config
+   * @param {!chromeos.networkConfig.mojom.ConfigProperties} config
    * @private
    */
   setMojoNetworkProperties_(config) {
@@ -1178,7 +1180,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @param {boolean} propertiesReceived
    * @param {boolean} outOfRange
    * @param {?OncMojo.DeviceStateProperties} deviceState
@@ -1192,7 +1194,8 @@
     }
 
     if (this.isOutOfRangeOrNotEnabled_(outOfRange, deviceState)) {
-      return managedProperties.type === NetworkType.kTether ?
+      return managedProperties.type ===
+              chromeos.networkConfig.mojom.NetworkType.kTether ?
           this.i18n('tetherPhoneOutOfRange') :
           this.i18n('networkOutOfRange');
     }
@@ -1202,7 +1205,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {string} The text to display for auto-connect toggle label.
    * @private
    */
@@ -1213,7 +1216,7 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean} True if the network is connected.
    * @private
@@ -1224,16 +1227,18 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   isRemembered_(managedProperties) {
-    return !!managedProperties && managedProperties.source !== OncSource.kNone;
+    return !!managedProperties &&
+        managedProperties.source !==
+        chromeos.networkConfig.mojom.OncSource.kNone;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -1243,27 +1248,29 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   isCellular_(managedProperties) {
     return !!managedProperties &&
-        managedProperties.type === NetworkType.kCellular;
+        managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   isTether_(managedProperties) {
     return !!managedProperties &&
-        managedProperties.type === NetworkType.kTether;
+        managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kTether;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -1271,18 +1278,20 @@
     if (!managedProperties) {
       return false;
     }
-    if (managedProperties.type !== NetworkType.kVPN) {
+    if (managedProperties.type !==
+        chromeos.networkConfig.mojom.NetworkType.kVPN) {
       return false;
     }
     if (!managedProperties.typeProperties.vpn) {
       return false;
     }
-    return managedProperties.typeProperties.vpn.type === VpnType.kWireGuard;
+    return managedProperties.typeProperties.vpn.type ===
+        chromeos.networkConfig.mojom.VpnType.kWireGuard;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy|undefined} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean}
    * @private
@@ -1293,12 +1302,14 @@
       return false;
     }
 
-    if (managedProperties.type === NetworkType.kCellular &&
+    if (managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kCellular &&
         !!globalPolicy.allowOnlyPolicyCellularNetworks) {
       return true;
     }
 
-    if (managedProperties.type !== NetworkType.kWiFi) {
+    if (managedProperties.type !==
+        chromeos.networkConfig.mojom.NetworkType.kWiFi) {
       return false;
     }
     const hexSsid =
@@ -1311,9 +1322,9 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
-   * @param {!GlobalPolicy|undefined} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @param {?OncMojo.DeviceStateProperties} deviceState
    * @return {boolean}
@@ -1337,15 +1348,18 @@
     }
 
     if (managedProperties.connectionState !==
-        ConnectionStateType.kNotConnected) {
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected) {
       return false;
     }
 
-    if (deviceState && deviceState.deviceState !== DeviceStateType.kEnabled) {
+    if (deviceState &&
+        deviceState.deviceState !==
+            chromeos.networkConfig.mojom.DeviceStateType.kEnabled) {
       return false;
     }
 
-    const isEthernet = managedProperties.type === NetworkType.kEthernet;
+    const isEthernet = managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kEthernet;
 
     // Note: Ethernet networks do not have an explicit "Connect" button in the
     // UI.
@@ -1353,22 +1367,23 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
    */
   showDisconnect_(managedProperties) {
     if (!managedProperties ||
-        managedProperties.type === NetworkType.kEthernet) {
+        managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kEthernet) {
       return false;
     }
     return managedProperties.connectionState !==
-        ConnectionStateType.kNotConnected;
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -1377,7 +1392,8 @@
       return false;
     }
     const type = managedProperties.type;
-    if (type !== NetworkType.kWiFi && type !== NetworkType.kVPN) {
+    if (type !== chromeos.networkConfig.mojom.NetworkType.kWiFi &&
+        type !== chromeos.networkConfig.mojom.NetworkType.kVPN) {
       return false;
     }
     if (this.isArcVpn_(managedProperties)) {
@@ -1388,7 +1404,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -1407,13 +1423,15 @@
 
     const activation =
         managedProperties.typeProperties.cellular.activationState;
-    return activation === ActivationStateType.kNotActivated ||
-        activation === ActivationStateType.kPartiallyActivated;
+    return activation ===
+        chromeos.networkConfig.mojom.ActivationStateType.kNotActivated ||
+        activation ===
+        chromeos.networkConfig.mojom.ActivationStateType.kPartiallyActivated;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean}
    * @private
@@ -1427,16 +1445,18 @@
       return false;
     }
     const type = managedProperties.type;
-    if (type === NetworkType.kCellular || type === NetworkType.kTether) {
+    if (type === chromeos.networkConfig.mojom.NetworkType.kCellular ||
+        type === chromeos.networkConfig.mojom.NetworkType.kTether) {
       return false;
     }
-    if (type === NetworkType.kWiFi &&
-        managedProperties.typeProperties.wifi.security === SecurityType.kNone) {
+    if (type === chromeos.networkConfig.mojom.NetworkType.kWiFi &&
+        managedProperties.typeProperties.wifi.security ===
+            chromeos.networkConfig.mojom.SecurityType.kNone) {
       return false;
     }
-    if (type === NetworkType.kWiFi &&
+    if (type === chromeos.networkConfig.mojom.NetworkType.kWiFi &&
         (managedProperties.connectionState !==
-         ConnectionStateType.kNotConnected)) {
+         chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected)) {
       return false;
     }
     if (this.isArcVpn_(managedProperties) &&
@@ -1447,7 +1467,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @param {!chrome.settingsPrivate.PrefObject} vpnConfigAllowed
    * @return {boolean}
    * @private
@@ -1456,12 +1476,13 @@
     if (this.disabled_ || !managedProperties) {
       return true;
     }
-    return managedProperties.type === NetworkType.kVPN && vpnConfigAllowed &&
-        !vpnConfigAllowed.value;
+    return managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kVPN &&
+        vpnConfigAllowed && !vpnConfigAllowed.value;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @param {!chrome.settingsPrivate.PrefObject} vpnConfigAllowed
    * @return {boolean}
    * @private
@@ -1470,8 +1491,9 @@
     if (this.disabled_ || !managedProperties) {
       return true;
     }
-    if (managedProperties.type === NetworkType.kVPN && vpnConfigAllowed &&
-        !vpnConfigAllowed.value) {
+    if (managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kVPN &&
+        vpnConfigAllowed && !vpnConfigAllowed.value) {
       return true;
     }
     return this.isPolicySource(managedProperties.source) &&
@@ -1480,7 +1502,7 @@
 
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    */
   hasRecommendedFields_(managedProperties) {
@@ -1496,8 +1518,10 @@
                 /** @type {!OncMojo.ManagedProperty} */ (value))) {
           return true;
         }
-      } else if (this.hasRecommendedFields_(
-                     /** @type {!ManagedProperties} */ (value))) {
+      } else if (
+          this.hasRecommendedFields_(
+              /** @type {!chromeos.networkConfig.mojom.ManagedProperties} */ (
+                  value))) {
         return true;
       }
     }
@@ -1505,7 +1529,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -1547,12 +1571,12 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @param {?OncMojo.NetworkStateProperties} defaultNetwork
    * @param {boolean} propertiesReceived
    * @param {boolean} outOfRange
-   * @param {!GlobalPolicy|undefined} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @param {?OncMojo.DeviceStateProperties} deviceState
    * @return {boolean} Whether or not to enable the network connect button.
@@ -1571,13 +1595,16 @@
       return false;
     }
 
-    if (managedProperties.type === NetworkType.kVPN && !defaultNetwork) {
+    if (managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kVPN &&
+        !defaultNetwork) {
       return false;
     }
 
     // Cannot connect to a network which is SIM locked; the user must first
     // unlock the SIM before attempting a connection.
-    if (managedProperties.type === NetworkType.kCellular &&
+    if (managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kCellular &&
         managedProperties.typeProperties.cellular.simLocked) {
       return false;
     }
@@ -1606,8 +1633,10 @@
     // policy indicator on the connect/disconnect buttons, so it shouldn't be
     // shown on non-VPN networks.
     if (this.managedProperties_ &&
-        this.managedProperties_.type === NetworkType.kVPN && this.prefs &&
-        this.prefs.vpn_config_allowed && !this.prefs.vpn_config_allowed.value) {
+        this.managedProperties_.type ===
+            chromeos.networkConfig.mojom.NetworkType.kVPN &&
+        this.prefs && this.prefs.vpn_config_allowed &&
+        !this.prefs.vpn_config_allowed.value) {
       fakeAlwaysOnVpnEnforcementPref.enforcement =
           chrome.settingsPrivate.Enforcement.ENFORCED;
       fakeAlwaysOnVpnEnforcementPref.controlledBy =
@@ -1634,7 +1663,8 @@
 
   /** @private */
   handleConnectTap_() {
-    if (this.managedProperties_.type === NetworkType.kTether &&
+    if (this.managedProperties_.type ===
+            chromeos.networkConfig.mojom.NetworkType.kTether &&
         (!this.managedProperties_.typeProperties.tether.hasConnectedToHost)) {
       this.showTetherDialog_();
       return;
@@ -1751,7 +1781,8 @@
       this.close();
     });
 
-    if (this.managedProperties_.type === NetworkType.kWiFi) {
+    if (this.managedProperties_.type ===
+        chromeos.networkConfig.mojom.NetworkType.kWiFi) {
       recordSettingChange(Setting.kForgetWifiNetwork);
     } else {
       recordSettingChange();
@@ -1803,7 +1834,8 @@
     return loadTimeData.getBoolean('showHiddenNetworkWarning') &&
         !!this.autoConnectPref_ && !!this.autoConnectPref_.value &&
         !!this.managedProperties_ &&
-        this.managedProperties_.type === NetworkType.kWiFi &&
+        this.managedProperties_.type ===
+        chromeos.networkConfig.mojom.NetworkType.kWiFi &&
         !!OncMojo.getActiveValue(
             this.managedProperties_.typeProperties.wifi.hiddenSsid);
   }
@@ -1848,7 +1880,7 @@
   }
 
   /**
-   * @param {!CustomEvent<!ApnProperties>} event
+   * @param {!CustomEvent<!chromeos.networkConfig.mojom.ApnProperties>} event
    * @private
    */
   onApnChange_(event) {
@@ -1867,7 +1899,7 @@
    * @param {!CustomEvent<!{
    *     field: string,
    *     value:
-   * (string|!IPConfigProperties|!Array<string>)
+   * (string|!chromeos.networkConfig.mojom.IPConfigProperties|!Array<string>)
    * }>} event The network-ip-config or network-nameservers change event.
    * @private
    */
@@ -1884,7 +1916,7 @@
 
   /**
    * Event triggered when the Proxy configuration element changes.
-   * @param {!CustomEvent<!ProxySettings>} event
+   * @param {!CustomEvent<!chromeos.networkConfig.mojom.ProxySettings>} event
    * @private
    */
   onProxyChange_(event) {
@@ -1908,7 +1940,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {string} To display in the shared notice section.
    * @private
    */
@@ -1923,7 +1955,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {string} To show in the synced notice section.
    * @private
    */
@@ -1932,7 +1964,9 @@
       return '';
     } else if (!managedProperties.typeProperties.wifi.isSyncable) {
       return this.i18nAdvanced('networkNotSynced');
-    } else if (managedProperties.source === OncSource.kUser) {
+    } else if (
+        managedProperties.source ===
+        chromeos.networkConfig.mojom.OncSource.kUser) {
       return this.i18nAdvanced('networkSyncedUser');
     } else {
       return this.i18nAdvanced('networkSyncedDevice');
@@ -1941,8 +1975,8 @@
 
   /**
    * @param {string} name
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @param {boolean} isSecondaryUser
    * @param {boolean} isWifiSyncEnabled
@@ -1970,8 +2004,8 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @param {boolean} isWifiSyncEnabled
    * @return {boolean} Synced message section should be shown.
@@ -1985,28 +2019,31 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean} If the shared message section should be shown.
    * @private
    */
   showShared_(managedProperties, globalPolicy, managedNetworkAvailable) {
     return !this.propertiesMissingOrBlockedByPolicy_() &&
-        (managedProperties.source === OncSource.kDevice ||
-         managedProperties.source === OncSource.kDevicePolicy);
+        (managedProperties.source ===
+             chromeos.networkConfig.mojom.OncSource.kDevice ||
+         managedProperties.source ===
+             chromeos.networkConfig.mojom.OncSource.kDevicePolicy);
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean} True if the AutoConnect checkbox should be shown.
    * @private
    */
   showAutoConnect_(managedProperties, globalPolicy, managedNetworkAvailable) {
     return !!managedProperties &&
-        managedProperties.type !== NetworkType.kEthernet &&
+        managedProperties.type !==
+        chromeos.networkConfig.mojom.NetworkType.kEthernet &&
         this.isRemembered_(managedProperties) &&
         !this.isArcVpn_(managedProperties) &&
         !this.isBlockedByPolicy_(
@@ -2014,8 +2051,8 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean} True if the Hidden checkbox should be shown.
    * @private
@@ -2029,7 +2066,8 @@
       return false;
     }
 
-    if (managedProperties.type !== NetworkType.kWiFi) {
+    if (managedProperties.type !==
+        chromeos.networkConfig.mojom.NetworkType.kWiFi) {
       return false;
     }
 
@@ -2053,12 +2091,14 @@
     const managedProperties = this.managedProperties_;
     return this.showMeteredToggle_ && !!managedProperties &&
         this.isRemembered_(managedProperties) &&
-        (managedProperties.type === NetworkType.kCellular ||
-         managedProperties.type === NetworkType.kWiFi);
+        (managedProperties.type ===
+             chromeos.networkConfig.mojom.NetworkType.kCellular ||
+         managedProperties.type ===
+             chromeos.networkConfig.mojom.NetworkType.kWiFi);
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean} Whether the toggle for the Always-on VPN feature is
    * displayed.
    * @private
@@ -2082,8 +2122,8 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean} True if the prefer network checkbox should be shown.
    * @private
@@ -2094,7 +2134,8 @@
     }
 
     const type = managedProperties.type;
-    if (type === NetworkType.kEthernet || type === NetworkType.kCellular ||
+    if (type === chromeos.networkConfig.mojom.NetworkType.kEthernet ||
+        type === chromeos.networkConfig.mojom.NetworkType.kCellular ||
         this.isArcVpn_(managedProperties)) {
       return false;
     }
@@ -2165,35 +2206,35 @@
 
     /** @type {!Array<string>} */ const fields = [];
     switch (this.managedProperties_.type) {
-      case NetworkType.kCellular:
+      case chromeos.networkConfig.mojom.NetworkType.kCellular:
         fields.push('cellular.servingOperator.name');
         break;
-      case NetworkType.kTether:
+      case chromeos.networkConfig.mojom.NetworkType.kTether:
         fields.push(
             'tether.batteryPercentage', 'tether.signalStrength',
             'tether.carrier');
         break;
-      case NetworkType.kVPN:
+      case chromeos.networkConfig.mojom.NetworkType.kVPN:
         const vpnType = this.managedProperties_.typeProperties.vpn.type;
         switch (vpnType) {
-          case VpnType.kExtension:
+          case chromeos.networkConfig.mojom.VpnType.kExtension:
             fields.push('vpn.providerName');
             break;
-          case VpnType.kArc:
+          case chromeos.networkConfig.mojom.VpnType.kArc:
             fields.push('vpn.type');
             fields.push('vpn.providerName');
             break;
-          case VpnType.kOpenVPN:
+          case chromeos.networkConfig.mojom.VpnType.kOpenVPN:
             fields.push(
                 'vpn.type', 'vpn.host', 'vpn.openVpn.username',
                 'vpn.openVpn.extraHosts');
             break;
-          case VpnType.kL2TPIPsec:
+          case chromeos.networkConfig.mojom.VpnType.kL2TPIPsec:
             fields.push('vpn.type', 'vpn.host', 'vpn.l2tp.username');
             break;
         }
         break;
-      case NetworkType.kWiFi:
+      case chromeos.networkConfig.mojom.NetworkType.kWiFi:
         break;
     }
     if (OncMojo.isRestrictedConnectivity(this.managedProperties_.portalState)) {
@@ -2216,12 +2257,12 @@
 
     /** @dict */ const editFields = {};
     const type = this.managedProperties_.type;
-    if (type === NetworkType.kVPN) {
+    if (type === chromeos.networkConfig.mojom.NetworkType.kVPN) {
       const vpnType = this.managedProperties_.typeProperties.vpn.type;
-      if (vpnType !== VpnType.kExtension) {
+      if (vpnType !== chromeos.networkConfig.mojom.VpnType.kExtension) {
         editFields['vpn.host'] = 'String';
       }
-      if (vpnType === VpnType.kOpenVPN) {
+      if (vpnType === chromeos.networkConfig.mojom.VpnType.kOpenVPN) {
         editFields['vpn.openVpn.username'] = 'String';
         editFields['vpn.openVpn.extraHosts'] = 'StringArray';
       }
@@ -2241,10 +2282,10 @@
     /** @type {!Array<string>} */ const fields = [];
     const type = this.managedProperties_.type;
     switch (type) {
-      case NetworkType.kCellular:
+      case chromeos.networkConfig.mojom.NetworkType.kCellular:
         fields.push('cellular.activationState', 'cellular.networkTechnology');
         break;
-      case NetworkType.kWiFi:
+      case chromeos.networkConfig.mojom.NetworkType.kWiFi:
         fields.push(
             'wifi.ssid', 'wifi.bssid', 'wifi.signalStrength', 'wifi.security',
             'wifi.eap.outer', 'wifi.eap.inner', 'wifi.eap.domainSuffixMatch',
@@ -2252,10 +2293,10 @@
             'wifi.eap.identity', 'wifi.eap.anonymousIdentity',
             'wifi.frequency');
         break;
-      case NetworkType.kVPN:
+      case chromeos.networkConfig.mojom.NetworkType.kVPN:
         const vpnType = this.managedProperties_.typeProperties.vpn.type;
         switch (vpnType) {
-          case VpnType.kOpenVPN:
+          case chromeos.networkConfig.mojom.VpnType.kOpenVPN:
             if (this.isManagedByPolicy_()) {
               fields.push(
                   'vpn.openVpn.auth', 'vpn.openVpn.cipher',
@@ -2275,7 +2316,8 @@
    */
   getDeviceFields_() {
     if (!this.managedProperties_ ||
-        this.managedProperties_.type !== NetworkType.kCellular) {
+        this.managedProperties_.type !==
+            chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return [];
     }
 
@@ -2319,7 +2361,8 @@
     if (this.showMetered_()) {
       return true;
     }
-    if (this.managedProperties_.type === NetworkType.kTether) {
+    if (this.managedProperties_.type ===
+        chromeos.networkConfig.mojom.NetworkType.kTether) {
       // These properties apply to the underlying WiFi network, not the Tether
       // network.
       return false;
@@ -2344,14 +2387,16 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean}
    * @private
    */
   hasNetworkSection_(managedProperties, globalPolicy, managedNetworkAvailable) {
-    if (!managedProperties || managedProperties.type === NetworkType.kTether) {
+    if (!managedProperties ||
+        managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kTether) {
       // These settings apply to the underlying WiFi network, not the Tether
       // network.
       return false;
@@ -2360,21 +2405,24 @@
             managedProperties, globalPolicy, managedNetworkAvailable)) {
       return false;
     }
-    if (managedProperties.type === NetworkType.kCellular) {
+    if (managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return true;
     }
     return this.isRememberedOrConnected_(managedProperties);
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean}
    * @private
    */
   hasProxySection_(managedProperties, globalPolicy, managedNetworkAvailable) {
-    if (!managedProperties || managedProperties.type === NetworkType.kTether) {
+    if (!managedProperties ||
+        managedProperties.type ===
+            chromeos.networkConfig.mojom.NetworkType.kTether) {
       // Proxy settings apply to the underlying WiFi network, not the Tether
       // network.
       return false;
@@ -2387,13 +2435,14 @@
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   showCellularChooseNetwork_(managedProperties) {
     return !!managedProperties &&
-        managedProperties.type === NetworkType.kCellular &&
+        managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular &&
         managedProperties.typeProperties.cellular.supportNetworkScan;
   }
 
@@ -2403,49 +2452,57 @@
    */
   showScanningSpinner_() {
     if (!this.managedProperties_ ||
-        this.managedProperties_.type !== NetworkType.kCellular) {
+        this.managedProperties_.type !==
+            chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return false;
     }
     return !!this.deviceState_ && this.deviceState_.scanning;
   }
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
   showCellularSimUpdatedUi_(managedProperties) {
     return !!managedProperties &&
-        managedProperties.type === NetworkType.kCellular &&
+        managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular &&
         managedProperties.typeProperties.cellular.family !== 'CDMA';
   }
 
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
    */
   isArcVpn_(managedProperties) {
-    return !!managedProperties && managedProperties.type === NetworkType.kVPN &&
-        managedProperties.typeProperties.vpn.type === VpnType.kArc;
+    return !!managedProperties &&
+        managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kVPN &&
+        managedProperties.typeProperties.vpn.type ===
+        chromeos.networkConfig.mojom.VpnType.kArc;
   }
 
   /**
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
    */
   isThirdPartyVpn_(managedProperties) {
-    return !!managedProperties && managedProperties.type === NetworkType.kVPN &&
-        managedProperties.typeProperties.vpn.type === VpnType.kExtension;
+    return !!managedProperties &&
+        managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kVPN &&
+        managedProperties.typeProperties.vpn.type ===
+        chromeos.networkConfig.mojom.VpnType.kExtension;
   }
 
   /**
    * @param {string} ipAddress
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -2492,7 +2549,9 @@
    */
   isOutOfRangeOrNotEnabled_(outOfRange, deviceState) {
     return outOfRange ||
-        (!!deviceState && deviceState.deviceState !== DeviceStateType.kEnabled);
+        (!!deviceState &&
+         deviceState.deviceState !==
+             chromeos.networkConfig.mojom.DeviceStateType.kEnabled);
   }
 
   /**
@@ -2504,10 +2563,11 @@
       return true;
     }
 
+    const mojom = chromeos.networkConfig.mojom;
     const networkState =
         OncMojo.managedPropertiesToNetworkState(this.managedProperties_);
     assert(networkState);
-    if (networkState.type !== NetworkType.kCellular) {
+    if (networkState.type !== mojom.NetworkType.kCellular) {
       return true;
     }
     return isActiveSim(networkState, this.deviceState_);
@@ -2519,7 +2579,8 @@
    */
   computeDisabled_() {
     if (!this.deviceState_ ||
-        this.deviceState_.type !== NetworkType.kCellular) {
+        this.deviceState_.type !==
+            chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return false;
     }
     // If this is a cellular device and inhibited, state cannot be changed, so
@@ -2560,6 +2621,7 @@
    * @private
    */
   isManagedByPolicy_() {
+    const OncSource = chromeos.networkConfig.mojom.OncSource;
     return this.managedProperties_.source === OncSource.kUserPolicy ||
         this.managedProperties_.source === OncSource.kDevicePolicy;
   }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
index 0077577..445466f 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
@@ -18,10 +18,8 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {ConfigProperties, CrosNetworkConfigRemote, FilterType, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
@@ -65,7 +63,7 @@
     return {
       /**
        * The type of networks to list.
-       * @type {NetworkType|undefined}
+       * @type {chromeos.networkConfig.mojom.NetworkType|undefined}
        */
       networkType: {
         type: Number,
@@ -128,7 +126,7 @@
     /** @private {string} */
     this.selectedGuid_ = '';
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -174,8 +172,8 @@
       return;
     }
     const filter = {
-      filter: FilterType.kConfigured,
-      limit: NO_LIMIT,
+      filter: chromeos.networkConfig.mojom.FilterType.kConfigured,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
       networkType: this.networkType,
     };
     this.networkConfig_.getNetworkStateList(filter).then(response => {
@@ -298,7 +296,7 @@
   }
 
   /**
-   * @param {!ConfigProperties} config
+   * @param {!chromeos.networkConfig.mojom.ConfigProperties} config
    * @private
    */
   setProperties_(config) {
@@ -340,7 +338,7 @@
       this.refreshNetworks_();
     });
 
-    if (this.networkType === NetworkType.kWiFi) {
+    if (this.networkType === chromeos.networkConfig.mojom.NetworkType.kWiFi) {
       recordSettingChange(Setting.kForgetWifiNetwork);
     } else {
       recordSettingChange();
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
index d8c7b3c..fbf5f656 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -36,12 +36,10 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CrosNetworkConfigRemote, GlobalPolicy, NetworkStateProperties, StartConnectResult, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
@@ -54,6 +52,8 @@
 import {InternetConfigElement} from './internet_config.js';
 import {InternetPageBrowserProxy, InternetPageBrowserProxyImpl} from './internet_page_browser_proxy.js';
 
+const mojom = chromeos.networkConfig.mojom;
+
 /** @type {number} */
 const ESIM_PROFILE_LIMIT = 5;
 
@@ -123,14 +123,14 @@
 
       /**
        * The network type for the networks subpage when shown.
-       * @type {NetworkType}
+       * @type {chromeos.networkConfig.mojom.NetworkType}
        * @private
        */
       subpageType_: Number,
 
       /**
        * The network type for the known networks subpage when shown.
-       * @type {NetworkType}
+       * @type {chromeos.networkConfig.mojom.NetworkType}
        * @private
        */
       knownNetworksType_: Number,
@@ -153,7 +153,7 @@
         value: false,
       },
 
-      /** @private {!GlobalPolicy|undefined} */
+      /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
       globalPolicy_: Object,
 
       /**
@@ -167,7 +167,7 @@
 
       /**
        * List of third party (Extension + Arc) VPN providers.
-       * @type {!Array<!VpnProvider>}
+       * @type {!Array<!chromeos.networkConfig.mojom.VpnProvider>}
        * @private
        */
       vpnProviders_: {
@@ -247,7 +247,7 @@
 
       /**
        * eSIM network used in internet detail menu.
-       * @private {NetworkStateProperties}
+       * @private {chromeos.networkConfig.mojom.NetworkStateProperties}
        */
       eSimNetworkState_: {
         type: Object,
@@ -288,14 +288,14 @@
 
     /**
      * Type of last detail page visited
-     * @private {NetworkType|undefined}
+     * @private {chromeos.networkConfig.mojom.NetworkType|undefined}
      */
     this.detailType_ = undefined;
 
     /** @private  {!InternetPageBrowserProxy} */
     this.browserProxy_ = InternetPageBrowserProxyImpl.getInstance();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -308,7 +308,7 @@
           /**
            * @type {!CustomEvent<!{
            *     enabled: boolean,
-           *     type: NetworkType
+           *     type: chromeos.networkConfig.mojom.NetworkType
            * }>}
            */
           (event));
@@ -340,19 +340,19 @@
     });
     this.addEventListener('show-known-networks', (event) => {
       this.onShowKnownNetworks_(
-          /** @type {!CustomEvent<NetworkType>} */
+          /** @type {!CustomEvent<chromeos.networkConfig.mojom.NetworkType>} */
           (event));
     });
     this.addEventListener('show-networks', (event) => {
       this.onShowNetworks_(
-          /** @type {!CustomEvent<NetworkType>} */
+          /** @type {!CustomEvent<chromeos.networkConfig.mojom.NetworkType>} */
           (event));
     });
     this.addEventListener('show-esim-profile-rename-dialog', (event) => {
       this.onShowESimProfileRenameDialog_(
           /**
                    @type {!CustomEvent<!{networkState:
-                       NetworkStateProperties}>}
+                       chromeos.networkConfig.mojom.NetworkStateProperties}>}
                      */
           (event));
     });
@@ -360,7 +360,7 @@
       this.onShowESimRemoveProfileDialog_(
           /**
              @type {!CustomEvent<!{networkState:
-                 NetworkStateProperties}>}
+                 chromeos.networkConfig.mojom.NetworkStateProperties}>}
                */
           (event));
     });
@@ -388,9 +388,9 @@
     // Manually show the deep links for settings nested within elements.
     let networkType = null;
     if (settingId === Setting.kWifiOnOff) {
-      networkType = NetworkType.kWiFi;
+      networkType = mojom.NetworkType.kWiFi;
     } else if (settingId === Setting.kMobileOnOff) {
-      networkType = NetworkType.kCellular;
+      networkType = mojom.NetworkType.kCellular;
     }
 
     afterNextRender(this, () => {
@@ -439,7 +439,7 @@
       // update.
       this.pendingShowSimLockDialog_ = !oldRoute &&
           !!queryParams.get('showSimLockDialog') &&
-          this.subpageType_ === NetworkType.kCellular;
+          this.subpageType_ === mojom.NetworkType.kCellular;
     } else if (route === routes.KNOWN_NETWORKS) {
       // Handle direct navigation to the known networks page,
       // e.g. chrome://settings/internet/knownNetworks?type=WiFi
@@ -448,7 +448,7 @@
       if (type) {
         this.knownNetworksType_ = OncMojo.getNetworkTypeFromString(type);
       } else {
-        this.knownNetworksType_ = NetworkType.kWiFi;
+        this.knownNetworksType_ = mojom.NetworkType.kWiFi;
       }
     } else if (route === routes.INTERNET) {
       // Show deep links for the internet page.
@@ -530,7 +530,7 @@
    * Event triggered by a device state enabled toggle.
    * @param {!CustomEvent<!{
    *     enabled: boolean,
-   *     type: NetworkType
+   *     type: chromeos.networkConfig.mojom.NetworkType
    * }>} event
    * @private
    */
@@ -573,9 +573,9 @@
    */
   attemptShowCellularSetupDialog_(pageName) {
     const cellularDeviceState =
-        this.getDeviceState_(NetworkType.kCellular, this.deviceStates);
+        this.getDeviceState_(mojom.NetworkType.kCellular, this.deviceStates);
     if (!cellularDeviceState ||
-        cellularDeviceState.deviceState !== DeviceStateType.kEnabled) {
+        cellularDeviceState.deviceState !== mojom.DeviceStateType.kEnabled) {
       this.showErrorToast_(this.i18n('eSimMobileDataNotEnabledErrorToast'));
       return;
     }
@@ -636,13 +636,15 @@
 
   /**
    * @param {boolean} configAndConnect
-   * @param {NetworkType} type
+   * @param {chromeos.networkConfig.mojom.NetworkType} type
    * @param {?string=} opt_guid
    * @param {?string=} opt_name
    * @private
    */
   showConfig_(configAndConnect, type, opt_guid, opt_name) {
-    assert(type !== NetworkType.kCellular && type !== NetworkType.kTether);
+    assert(
+        type !== chromeos.networkConfig.mojom.NetworkType.kCellular &&
+        type !== chromeos.networkConfig.mojom.NetworkType.kTether);
     if (this.showInternetConfig_) {
       return;
     }
@@ -682,7 +684,7 @@
 
   /**
    * @param {!CustomEvent<!{networkState:
-   *     NetworkStateProperties}>} event
+   *     chromeos.networkConfig.mojom.NetworkStateProperties}>} event
    * @private
    */
   onShowESimProfileRenameDialog_(event) {
@@ -697,7 +699,7 @@
 
   /**
    * @param {!CustomEvent<!{networkState:
-   *     NetworkStateProperties}>} event
+   *     chromeos.networkConfig.mojom.NetworkStateProperties}>} event
    * @private
    */
   onShowESimRemoveProfileDialog_(event) {
@@ -711,7 +713,7 @@
   }
 
   /**
-   * @param {!CustomEvent<NetworkType>} event
+   * @param {!CustomEvent<chromeos.networkConfig.mojom.NetworkType>} event
    * @private
    */
   onShowNetworks_(event) {
@@ -726,8 +728,8 @@
     // The shared Cellular/Tether subpage is referred to as "Mobile".
     // TODO(khorimoto): Remove once Cellular/Tether are split into their own
     // sections.
-    if (this.subpageType_ === NetworkType.kCellular ||
-        this.subpageType_ === NetworkType.kTether) {
+    if (this.subpageType_ === mojom.NetworkType.kCellular ||
+        this.subpageType_ === mojom.NetworkType.kTether) {
       return this.i18n('OncTypeMobile');
     }
     return this.i18n(
@@ -735,7 +737,7 @@
   }
 
   /**
-   * @param {NetworkType} subpageType
+   * @param {chromeos.networkConfig.mojom.NetworkType} subpageType
    * @param {!Object<!OncMojo.DeviceStateProperties>|undefined} deviceStates
    * @return {!OncMojo.DeviceStateProperties|undefined}
    * @private
@@ -746,9 +748,9 @@
     }
     // If both Tether and Cellular are enabled, use the Cellular device state
     // when directly navigating to the Tether page.
-    if (subpageType === NetworkType.kTether &&
-        this.deviceStates[NetworkType.kCellular]) {
-      subpageType = NetworkType.kCellular;
+    if (subpageType === mojom.NetworkType.kTether &&
+        this.deviceStates[mojom.NetworkType.kCellular]) {
+      subpageType = mojom.NetworkType.kCellular;
     }
     return deviceStates[subpageType];
   }
@@ -759,7 +761,7 @@
    * @private
    */
   getTetherDeviceState_(deviceStates) {
-    return deviceStates[NetworkType.kTether];
+    return deviceStates[mojom.NetworkType.kTether];
   }
 
   /**
@@ -768,7 +770,8 @@
    * @private
    */
   onDeviceStatesChanged_(newValue, oldValue) {
-    const wifiDeviceState = this.getDeviceState_(NetworkType.kWiFi, newValue);
+    const wifiDeviceState =
+        this.getDeviceState_(mojom.NetworkType.kWiFi, newValue);
     let managedNetworkAvailable = false;
     if (wifiDeviceState) {
       managedNetworkAvailable = !!wifiDeviceState.managedNetworkAvailable;
@@ -778,9 +781,10 @@
       this.managedNetworkAvailable = managedNetworkAvailable;
     }
 
-    const vpn = this.deviceStates[NetworkType.kVPN];
-    this.vpnIsProhibited_ =
-        !!vpn && vpn.deviceState === DeviceStateType.kProhibited;
+    const vpn = this.deviceStates[mojom.NetworkType.kVPN];
+    this.vpnIsProhibited_ = !!vpn &&
+        vpn.deviceState ===
+            chromeos.networkConfig.mojom.DeviceStateType.kProhibited;
 
     if (this.detailType_ && !this.deviceStates[this.detailType_]) {
       // If the device type associated with the current network has been
@@ -807,7 +811,7 @@
   }
 
   /**
-   * @param {!CustomEvent<NetworkType>} event
+   * @param {!CustomEvent<chromeos.networkConfig.mojom.NetworkType>} event
    * @private
    */
   onShowKnownNetworks_(event) {
@@ -821,18 +825,22 @@
 
   /** @private */
   onAddWiFiTap_() {
-    this.showConfig_(true /* configAndConnect */, NetworkType.kWiFi);
+    this.showConfig_(
+        true /* configAndConnect */,
+        chromeos.networkConfig.mojom.NetworkType.kWiFi);
   }
 
   /** @private */
   onAddVPNTap_() {
     if (!this.vpnIsProhibited_) {
-      this.showConfig_(true /* configAndConnect */, NetworkType.kVPN);
+      this.showConfig_(
+          true /* configAndConnect */,
+          chromeos.networkConfig.mojom.NetworkType.kVPN);
     }
   }
 
   /**
-   * @param {!{model: !{item: !VpnProvider}}} event
+   * @param {!{model: !{item: !mojom.VpnProvider}}} event
    * @private
    */
   onAddThirdPartyVpnTap_(event) {
@@ -842,7 +850,7 @@
   }
 
   /**
-   * @param {NetworkType} type
+   * @param {chromeos.networkConfig.mojom.NetworkType} type
    * @private
    */
   showNetworksSubpage_(type) {
@@ -854,8 +862,8 @@
   }
 
   /**
-   * @param {!VpnProvider} vpnProvider1
-   * @param {!VpnProvider} vpnProvider2
+   * @param {!mojom.VpnProvider} vpnProvider1
+   * @param {!mojom.VpnProvider} vpnProvider2
    * @return {number}
    */
   compareVpnProviders_(vpnProvider1, vpnProvider2) {
@@ -884,12 +892,14 @@
    * @private
    */
   wifiIsEnabled_(deviceStates) {
-    const wifi = deviceStates[NetworkType.kWiFi];
-    return !!wifi && wifi.deviceState === DeviceStateType.kEnabled;
+    const wifi = deviceStates[mojom.NetworkType.kWiFi];
+    return !!wifi &&
+        wifi.deviceState ===
+        chromeos.networkConfig.mojom.DeviceStateType.kEnabled;
   }
 
   /**
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @param {!Array<!OncMojo.DeviceStateProperties>} deviceStates
    * @return {boolean}
@@ -902,7 +912,7 @@
   }
 
   /**
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean}
    */
@@ -917,7 +927,7 @@
   }
 
   /**
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!mojom.GlobalPolicy} globalPolicy
    * @param {boolean} managedNetworkAvailable
    * @return {boolean}
    */
@@ -929,7 +939,7 @@
   }
 
   /**
-   * @param {!VpnProvider} provider
+   * @param {!mojom.VpnProvider} provider
    * @return {string}
    */
   getAddThirdPartyVpnLabel_(provider) {
@@ -950,7 +960,8 @@
     const type = networkState.type;
     const displayName = OncMojo.getNetworkStateDisplayName(networkState);
 
-    if (!event.detail.bypassConnectionDialog && type === NetworkType.kTether &&
+    if (!event.detail.bypassConnectionDialog &&
+        type === mojom.NetworkType.kTether &&
         !networkState.typeState.tether.hasConnectedToHost) {
       const params = new URLSearchParams();
       params.append('guid', networkState.guid);
@@ -972,24 +983,24 @@
 
     this.networkConfig_.startConnect(networkState.guid).then(response => {
       switch (response.result) {
-        case StartConnectResult.kSuccess:
+        case mojom.StartConnectResult.kSuccess:
           return;
-        case StartConnectResult.kInvalidGuid:
-        case StartConnectResult.kInvalidState:
-        case StartConnectResult.kCanceled:
+        case mojom.StartConnectResult.kInvalidGuid:
+        case mojom.StartConnectResult.kInvalidState:
+        case mojom.StartConnectResult.kCanceled:
           // TODO(stevenjb/khorimoto): Consider handling these cases.
           return;
-        case StartConnectResult.kNotConfigured:
+        case mojom.StartConnectResult.kNotConfigured:
           if (OncMojo.networkTypeHasConfigurationFlow(type)) {
             this.showConfig_(
                 true /* configAndConnect */, type, networkState.guid,
                 displayName);
           }
           return;
-        case StartConnectResult.kBlocked:
+        case mojom.StartConnectResult.kBlocked:
           // This shouldn't happen, the UI should prevent this, fall through and
           // show the error.
-        case StartConnectResult.kUnknown:
+        case mojom.StartConnectResult.kUnknown:
           console.error(
               'startConnect failed for: ' + networkState.guid +
               ' Error: ' + response.message);
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
index 505da9ba..21950dc 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
@@ -27,11 +27,9 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {AlwaysOnVpnMode, AlwaysOnVpnProperties, CrosNetworkConfigRemote, FilterType, GlobalPolicy, NO_LIMIT, VpnProvider, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
@@ -44,6 +42,8 @@
 
 import {InternetPageBrowserProxy, InternetPageBrowserProxyImpl} from './internet_page_browser_proxy.js';
 
+const mojom = chromeos.networkConfig.mojom;
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -100,12 +100,12 @@
        */
       tetherDeviceState: Object,
 
-      /** @type {!GlobalPolicy|undefined} */
+      /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
       globalPolicy: Object,
 
       /**
        * List of third party (Extension + Arc) VPN providers.
-       * @type {!Array<!VpnProvider>}
+       * @type {!Array<!chromeos.networkConfig.mojom.VpnProvider>}
        */
       vpnProviders: Array,
 
@@ -166,7 +166,7 @@
 
       /**
        * Always-on VPN operating mode.
-       * @private {!AlwaysOnVpnMode|undefined}
+       * @private {!chromeos.networkConfig.mojom.AlwaysOnVpnMode|undefined}
        */
       alwaysOnVpnMode_: Number,
 
@@ -263,7 +263,7 @@
     /** @private  {!InternetPageBrowserProxy} */
     this.browserProxy_ = InternetPageBrowserProxyImpl.getInstance();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -390,7 +390,7 @@
 
   /** NetworkListenerBehavior override */
   onVpnProvidersChanged() {
-    if (this.deviceState.type !== NetworkType.kVPN) {
+    if (this.deviceState.type !== mojom.NetworkType.kVPN) {
       return;
     }
     this.getNetworkStateList_();
@@ -400,16 +400,16 @@
   deviceStateChanged_() {
     if (this.deviceState !== undefined) {
       // Set |vpnIsEnabled_| to be used for VPN special cases.
-      if (this.deviceState.type === NetworkType.kVPN) {
-        this.vpnIsEnabled_ =
-            this.deviceState.deviceState === DeviceStateType.kEnabled;
+      if (this.deviceState.type === mojom.NetworkType.kVPN) {
+        this.vpnIsEnabled_ = this.deviceState.deviceState ===
+            chromeos.networkConfig.mojom.DeviceStateType.kEnabled;
       }
 
       // A scan has completed if the spinner was active (i.e., scanning was
       // active) and the device is no longer scanning.
       this.hasCompletedScanSinceLastEnabled_ = this.showSpinner &&
           !this.deviceState.scanning &&
-          this.deviceState.deviceState === DeviceStateType.kEnabled;
+          this.deviceState.deviceState === mojom.DeviceStateType.kEnabled;
 
       // If the cellular network list is showing and currently inhibited, there
       // is a separate spinner that shows in the CellularNetworkList.
@@ -448,14 +448,14 @@
    */
   shouldStartScan_() {
     // Scans should be kicked off from the Wi-Fi networks subpage.
-    if (this.deviceState.type === NetworkType.kWiFi) {
+    if (this.deviceState.type === mojom.NetworkType.kWiFi) {
       return true;
     }
 
     // Scans should be kicked off from the Mobile data subpage, as long as it
     // includes Tether networks.
-    if (this.deviceState.type === NetworkType.kTether ||
-        (this.deviceState.type === NetworkType.kCellular &&
+    if (this.deviceState.type === mojom.NetworkType.kTether ||
+        (this.deviceState.type === mojom.NetworkType.kCellular &&
          this.tetherDeviceState)) {
       return true;
     }
@@ -470,10 +470,10 @@
     }
     const INTERVAL_MS = 10 * 1000;
     let type = this.deviceState.type;
-    if (type === NetworkType.kCellular && this.tetherDeviceState) {
+    if (type === mojom.NetworkType.kCellular && this.tetherDeviceState) {
       // Only request tether scan. Cellular scan is disruptive and should
       // only be triggered by explicit user action.
-      type = NetworkType.kTether;
+      type = mojom.NetworkType.kTether;
     }
     this.networkConfig_.requestNetworkScan(type);
     this.scanIntervalId_ = window.setInterval(() => {
@@ -496,8 +496,8 @@
       return;
     }
     const filter = {
-      filter: FilterType.kVisible,
-      limit: NO_LIMIT,
+      filter: chromeos.networkConfig.mojom.FilterType.kVisible,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
       networkType: this.deviceState.type,
     };
     this.networkConfig_.getNetworkStateList(filter).then(response => {
@@ -527,12 +527,12 @@
     }
 
     // For the Cellular/Mobile subpage, also request Tether networks.
-    if (this.deviceState.type === NetworkType.kCellular &&
+    if (this.deviceState.type === mojom.NetworkType.kCellular &&
         this.tetherDeviceState) {
       const filter = {
-        filter: FilterType.kVisible,
-        limit: NO_LIMIT,
-        networkType: NetworkType.kTether,
+        filter: chromeos.networkConfig.mojom.FilterType.kVisible,
+        limit: chromeos.networkConfig.mojom.NO_LIMIT,
+        networkType: mojom.NetworkType.kTether,
       };
       this.networkConfig_.getNetworkStateList(filter).then(response => {
         this.set('networkStateList_', networkStates.concat(response.result));
@@ -541,25 +541,25 @@
     }
 
     // For VPNs, separate out third party (Extension + Arc) VPNs.
-    if (this.deviceState.type === NetworkType.kVPN) {
+    if (this.deviceState.type === mojom.NetworkType.kVPN) {
       const builtinNetworkStates = [];
       const thirdPartyVpns = {};
       networkStates.forEach(state => {
-        assert(state.type === NetworkType.kVPN);
+        assert(state.type === mojom.NetworkType.kVPN);
         switch (state.typeState.vpn.type) {
-          case VpnType.kIKEv2:
-          case VpnType.kL2TPIPsec:
-          case VpnType.kOpenVPN:
-          case VpnType.kWireGuard:
+          case mojom.VpnType.kIKEv2:
+          case mojom.VpnType.kL2TPIPsec:
+          case mojom.VpnType.kOpenVPN:
+          case mojom.VpnType.kWireGuard:
             builtinNetworkStates.push(state);
             break;
-          case VpnType.kArc:
+          case mojom.VpnType.kArc:
             // Only show connected Arc VPNs.
             if (!OncMojo.connectionStateIsConnected(state.connectionState)) {
               break;
             }
           // Otherwise Arc VPNs are treated the same as Extension VPNs.
-          case VpnType.kExtension:
+          case mojom.VpnType.kExtension:
             const providerId = state.typeState.vpn.providerId;
             thirdPartyVpns[providerId] = thirdPartyVpns[providerId] || [];
             thirdPartyVpns[providerId].push(state);
@@ -576,9 +576,9 @@
   /**
    * Returns an ordered list of VPN providers for all third party VPNs and any
    * other known providers.
-   * @param {!Array<!VpnProvider>} vpnProviders
+   * @param {!Array<!chromeos.networkConfig.mojom.VpnProvider>} vpnProviders
    * @param {!Object<!Array<!OncMojo.NetworkStateProperties>>} thirdPartyVpns
-   * @return {!Array<!VpnProvider>}
+   * @return {!Array<!chromeos.networkConfig.mojom.VpnProvider>}
    * @private
    */
   getVpnProviders_(vpnProviders, thirdPartyVpns) {
@@ -624,8 +624,8 @@
    */
   deviceIsEnabled_(deviceState) {
     return !!deviceState &&
-        (deviceState.type === NetworkType.kVPN ||
-         deviceState.deviceState === DeviceStateType.kEnabled);
+        (deviceState.type === mojom.NetworkType.kVPN ||
+         deviceState.deviceState === mojom.DeviceStateType.kEnabled);
   }
 
   /**
@@ -645,8 +645,8 @@
    * @private
    */
   enableToggleIsVisible_(deviceState) {
-    return !!deviceState && deviceState.type !== NetworkType.kEthernet &&
-        deviceState.type !== NetworkType.kVPN;
+    return !!deviceState && deviceState.type !== mojom.NetworkType.kEthernet &&
+        deviceState.type !== mojom.NetworkType.kVPN;
   }
 
   /**
@@ -658,7 +658,8 @@
     if (!deviceState) {
       return false;
     }
-    if (deviceState.deviceState === DeviceStateType.kProhibited) {
+    if (deviceState.deviceState ===
+        chromeos.networkConfig.mojom.DeviceStateType.kProhibited) {
       return false;
     }
     if (OncMojo.deviceStateIsIntermediate(deviceState.deviceState)) {
@@ -688,10 +689,10 @@
       return '';
     }
     switch (deviceState.type) {
-      case NetworkType.kTether:
-      case NetworkType.kCellular:
+      case mojom.NetworkType.kTether:
+      case mojom.NetworkType.kCellular:
         return this.i18n('internetToggleMobileA11yLabel');
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         return this.i18n('internetToggleWiFiA11yLabel');
     }
     assertNotReached();
@@ -699,7 +700,7 @@
   }
 
   /**
-   * @param {!VpnProvider} provider
+   * @param {!mojom.VpnProvider} provider
    * @return {string}
    * @private
    */
@@ -709,7 +710,7 @@
 
   /**
    * @param {!OncMojo.DeviceStateProperties|undefined} deviceState
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!mojom.GlobalPolicy} globalPolicy
    * @return {boolean}
    * @private
    */
@@ -722,12 +723,12 @@
 
   /**
    * @param {!OncMojo.DeviceStateProperties|undefined} deviceState
-   * @param {!GlobalPolicy} globalPolicy
+   * @param {!mojom.GlobalPolicy} globalPolicy
    * @return {boolean}
    * @private
    */
   showAddWifiButton_(deviceState, globalPolicy) {
-    if (!deviceState || deviceState.type !== NetworkType.kWiFi) {
+    if (!deviceState || deviceState.type !== mojom.NetworkType.kWiFi) {
       return false;
     }
     return this.allowAddConnection_(deviceState, globalPolicy);
@@ -750,7 +751,7 @@
   onAddWifiButtonTap_() {
     assert(this.deviceState, 'Device state is falsey - Wifi expected.');
     const type = this.deviceState.type;
-    assert(type === NetworkType.kWiFi, 'Wifi type expected.');
+    assert(type === mojom.NetworkType.kWiFi, 'Wifi type expected.');
     this.dispatchShowConfigEvent_(OncMojo.getNetworkTypeString(type));
   }
 
@@ -758,12 +759,12 @@
   onAddVpnButtonTap_() {
     assert(this.deviceState, 'Device state is falsey - VPN expected.');
     const type = this.deviceState.type;
-    assert(type === NetworkType.kVPN, 'VPN type expected.');
+    assert(type === mojom.NetworkType.kVPN, 'VPN type expected.');
     this.dispatchShowConfigEvent_(OncMojo.getNetworkTypeString(type));
   }
 
   /**
-   * @param {!{model: !{item: !VpnProvider}}} event
+   * @param {!{model: !{item: !mojom.VpnProvider}}} event
    * @private
    */
   onAddThirdPartyVpnTap_(event) {
@@ -778,7 +779,7 @@
    * @private
    */
   knownNetworksIsVisible_(deviceState) {
-    return !!deviceState && deviceState.type === NetworkType.kWiFi;
+    return !!deviceState && deviceState.type === mojom.NetworkType.kWiFi;
   }
 
   /**
@@ -786,7 +787,7 @@
    * @private
    */
   onKnownNetworksTap_() {
-    assert(this.deviceState.type === NetworkType.kWiFi);
+    assert(this.deviceState.type === mojom.NetworkType.kWiFi);
     const showKnownNetworksEvent = new CustomEvent('show-known-networks', {
       bubbles: true,
       composed: true,
@@ -816,7 +817,7 @@
 
   /**
    * @param {!Object<!Array<!OncMojo.NetworkStateProperties>>} thirdPartyVpns
-   * @param {!VpnProvider} provider
+   * @param {!mojom.VpnProvider} provider
    * @return {!Array<!OncMojo.NetworkStateProperties>}
    * @private
    */
@@ -826,7 +827,7 @@
 
   /**
    * @param {!Object<!Array<!OncMojo.NetworkStateProperties>>} thirdPartyVpns
-   * @param {!VpnProvider} provider
+   * @param {!mojom.VpnProvider} provider
    * @return {boolean}
    * @private
    */
@@ -870,15 +871,15 @@
    * @private
    */
   isBlockedByPolicy_(state) {
-    if (state.type !== NetworkType.kWiFi &&
-        state.type !== NetworkType.kCellular) {
+    if (state.type !== mojom.NetworkType.kWiFi &&
+        state.type !== mojom.NetworkType.kCellular) {
       return false;
     }
     if (this.isPolicySource(state.source) || !this.globalPolicy) {
       return false;
     }
 
-    if (state.type === NetworkType.kCellular) {
+    if (state.type === mojom.NetworkType.kCellular) {
       return !!this.globalPolicy.allowOnlyPolicyCellularNetworks;
     }
 
@@ -898,7 +899,7 @@
    * @private
    */
   canAttemptConnection_(state) {
-    if (state.connectionState !== ConnectionStateType.kNotConnected) {
+    if (state.connectionState !== mojom.ConnectionStateType.kNotConnected) {
       return false;
     }
 
@@ -908,7 +909,7 @@
 
     // VPNs can only be connected if there is an existing network connection to
     // use with the VPN.
-    if (state.type === NetworkType.kVPN &&
+    if (state.type === mojom.NetworkType.kVPN &&
         (!this.defaultNetwork ||
          !OncMojo.connectionStateIsConnected(
              this.defaultNetwork.connectionState))) {
@@ -916,7 +917,7 @@
     }
 
     // Locked SIM profiles must be unlocked before a connection can occur.
-    if (state.type === NetworkType.kCellular &&
+    if (state.type === mojom.NetworkType.kCellular &&
         state.typeState.cellular.simLocked) {
       return false;
     }
@@ -946,7 +947,8 @@
       return false;
     }
 
-    if (!!this.deviceState && this.deviceState.type === NetworkType.kVPN) {
+    if (!!this.deviceState &&
+        this.deviceState.type === mojom.NetworkType.kVPN) {
       return this.shouldShowVpnList_();
     }
     return this.networkStateList_.length > 0;
@@ -968,7 +970,7 @@
   shouldShowCellularNetworkList_() {
     // Only shown if the currently-active subpage is for Cellular networks.
     return !!this.deviceState &&
-        this.deviceState.type === NetworkType.kCellular;
+        this.deviceState.type === mojom.NetworkType.kCellular;
   }
 
   /**
@@ -990,12 +992,12 @@
    */
   getNoNetworksInnerHtml_(deviceState, tetherDeviceState) {
     const type = deviceState.type;
-    if (type === NetworkType.kTether ||
-        (type === NetworkType.kCellular && this.tetherDeviceState)) {
+    if (type === mojom.NetworkType.kTether ||
+        (type === mojom.NetworkType.kCellular && this.tetherDeviceState)) {
       return this.i18nAdvanced('internetNoNetworksMobileData');
     }
 
-    if (type === NetworkType.kVPN) {
+    if (type === mojom.NetworkType.kVPN) {
       return this.i18n('internetNoNetworks');
     }
 
@@ -1051,7 +1053,7 @@
       return false;
     }
     return this.matchesType_(
-        OncMojo.getNetworkTypeString(NetworkType.kVPN), this.deviceState);
+        OncMojo.getNetworkTypeString(mojom.NetworkType.kVPN), this.deviceState);
   }
 
   /**
@@ -1077,7 +1079,7 @@
    * @private
    */
   getAlwaysOnVpnNetworks_() {
-    if (!this.deviceState || this.deviceState.type !== NetworkType.kVPN) {
+    if (!this.deviceState || this.deviceState.type !== mojom.NetworkType.kVPN) {
       return [];
     }
 
@@ -1089,8 +1091,8 @@
       // - TODO(b/188864779): ARC VPNs are not supported yet,
       // - Chrome VPN apps are deprecated and incompatible with lockdown mode
       //   (see b/206910855).
-      if (vpnList[0].typeState.vpn.type === VpnType.kArc ||
-          vpnList[0].typeState.vpn.type === VpnType.kExtension) {
+      if (vpnList[0].typeState.vpn.type === mojom.VpnType.kArc ||
+          vpnList[0].typeState.vpn.type === mojom.VpnType.kExtension) {
         continue;
       }
       alwaysOnVpnList.push(...vpnList);
@@ -1104,7 +1106,7 @@
    * @private
    */
   updateAlwaysOnVpnPreferences_() {
-    if (!this.deviceState || this.deviceState.type !== NetworkType.kVPN) {
+    if (!this.deviceState || this.deviceState.type !== mojom.NetworkType.kVPN) {
       return;
     }
 
@@ -1125,7 +1127,7 @@
       return;
     }
 
-    /** @type {!AlwaysOnVpnProperties} */
+    /** @type {!chromeos.networkConfig.mojom.AlwaysOnVpnProperties} */
     const properties = {
       mode: this.alwaysOnVpnMode_,
       serviceGuid: this.alwaysOnVpnService_,
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
index 3320c69..4164127 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
@@ -12,9 +12,10 @@
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {AlwaysOnVpnMode} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+const mojom = chromeos.networkConfig.mojom;
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -43,7 +44,7 @@
 
       /**
        * Always-on VPN operating mode.
-       * @type {!AlwaysOnVpnMode|undefined}
+       * @type {!chromeos.networkConfig.mojom.AlwaysOnVpnMode|undefined}
        */
       mode: {
         type: Number,
@@ -79,7 +80,7 @@
    */
   shouldShowAlwaysOnVpnOptions_() {
     return !this.shouldDisableAlwaysOnVpn_() &&
-        this.mode !== AlwaysOnVpnMode.kOff;
+        this.mode !== mojom.AlwaysOnVpnMode.kOff;
   }
 
   /**
@@ -89,7 +90,7 @@
    */
   computeAlwaysOnVpnEnabled_() {
     return !this.shouldDisableAlwaysOnVpn_() &&
-        this.mode !== AlwaysOnVpnMode.kOff;
+        this.mode !== mojom.AlwaysOnVpnMode.kOff;
   }
 
   /**
@@ -99,10 +100,10 @@
    */
   onAlwaysOnEnableChanged_(event) {
     if (!event.target.checked) {
-      this.mode = AlwaysOnVpnMode.kOff;
+      this.mode = mojom.AlwaysOnVpnMode.kOff;
       return;
     }
-    this.mode = AlwaysOnVpnMode.kBestEffort;
+    this.mode = mojom.AlwaysOnVpnMode.kBestEffort;
   }
 
   /**
@@ -111,7 +112,7 @@
    * @private
    */
   computeAlwaysOnVpnLockdown_() {
-    return this.mode === AlwaysOnVpnMode.kStrict;
+    return this.mode === mojom.AlwaysOnVpnMode.kStrict;
   }
 
   /**
@@ -121,13 +122,14 @@
    * @private
    */
   onAlwaysOnVpnLockdownChanged_(event) {
-    if (this.mode === AlwaysOnVpnMode.kOff) {
+    if (this.mode === mojom.AlwaysOnVpnMode.kOff) {
       // The event should not be fired when always-on VPN is disabled (the
       // enable toggle is disabled).
       return;
     }
-    this.mode = event.target.checked ? AlwaysOnVpnMode.kStrict :
-                                       AlwaysOnVpnMode.kBestEffort;
+    this.mode = event.target.checked ?
+        mojom.AlwaysOnVpnMode.kStrict :
+        mojom.AlwaysOnVpnMode.kBestEffort;
   }
 
   /**
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
index 8864bbd..fc16724 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
@@ -23,8 +23,6 @@
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {ManagedProperties, ManagedString} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {routes} from '../os_route.js';
@@ -72,7 +70,7 @@
         value: false,
       },
 
-      /** @type {!ManagedProperties|undefined} */
+      /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
       managedProperties: Object,
 
       /**
@@ -179,12 +177,13 @@
    * @private
    */
   isShared_() {
-    return this.managedProperties.source === OncSource.kDevice ||
-        this.managedProperties.source === OncSource.kDevicePolicy;
+    const mojom = chromeos.networkConfig.mojom;
+    return this.managedProperties.source === mojom.OncSource.kDevice ||
+        this.managedProperties.source === mojom.OncSource.kDevicePolicy;
   }
 
   /**
-   * @return {!ManagedString|undefined}
+   * @return {!chromeos.networkConfig.mojom.ManagedString|undefined}
    * @private
    */
   getProxySettingsTypeProperty_() {
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_summary.js b/chrome/browser/resources/settings/chromeos/internet_page/network_summary.js
index 7c674de9..6812d26 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_summary.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_summary.js
@@ -12,11 +12,9 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote, FilterType, GlobalPolicy, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {NetworkSummaryItemElement} from './network_summary_item.js';
+const mojom = chromeos.networkConfig.mojom;
 
 /**
  * @constructor
@@ -59,9 +57,9 @@
         type: Object,
         value() {
           const result = {};
-          result[NetworkType.kWiFi] = {
-            deviceState: DeviceStateType.kDisabled,
-            type: NetworkType.kWiFi,
+          result[chromeos.networkConfig.mojom.NetworkType.kWiFi] = {
+            deviceState: chromeos.networkConfig.mojom.DeviceStateType.kDisabled,
+            type: chromeos.networkConfig.mojom.NetworkType.kWiFi,
           };
           return result;
         },
@@ -76,7 +74,7 @@
       activeNetworkStates_: {
         type: Array,
         value() {
-          return [OncMojo.getDefaultNetworkState(NetworkType.kWiFi)];
+          return [OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi)];
         },
       },
 
@@ -88,12 +86,12 @@
         type: Object,
         value() {
           const result = {};
-          result[NetworkType.kWiFi] = [];
+          result[mojom.NetworkType.kWiFi] = [];
           return result;
         },
       },
 
-      /** @private {!GlobalPolicy|undefined} */
+      /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
       globalPolicy_: Object,
     };
   }
@@ -108,7 +106,7 @@
      */
     this.activeNetworkIds_ = null;
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -162,16 +160,15 @@
     this.getNetworkLists_();
   }
 
-  /**
+  /*
    * Returns the network-summary-item element corresponding to the
    * |networkType|.
-   * @param {!NetworkType} networkType
+   * @param {!chromeos.networkConfig.mojom.NetworkType} networkType
    * @return {?NetworkSummaryItemElement}
    */
   getNetworkRow(networkType) {
     const networkTypeString = OncMojo.getNetworkTypeString(networkType);
-    return /** @type {NetworkSummaryItemElement} */ (
-        this.shadowRoot.querySelector(`#${networkTypeString}`));
+    return this.shadowRoot.querySelector(`#${networkTypeString}`);
   }
 
   /**
@@ -197,9 +194,9 @@
    */
   getNetworkStates_(deviceStateList) {
     const filter = {
-      filter: FilterType.kVisible,
-      limit: NO_LIMIT,
-      networkType: NetworkType.kAll,
+      filter: chromeos.networkConfig.mojom.FilterType.kVisible,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
+      networkType: mojom.NetworkType.kAll,
     };
     this.networkConfig_.getNetworkStateList(filter).then(response => {
       this.updateNetworkStates_(response.result, deviceStateList);
@@ -220,16 +217,16 @@
     }
 
     const orderedNetworkTypes = [
-      NetworkType.kEthernet,
-      NetworkType.kWiFi,
-      NetworkType.kCellular,
-      NetworkType.kTether,
-      NetworkType.kVPN,
+      mojom.NetworkType.kEthernet,
+      mojom.NetworkType.kWiFi,
+      mojom.NetworkType.kCellular,
+      mojom.NetworkType.kTether,
+      mojom.NetworkType.kVPN,
     ];
 
     // Clear any current networks.
     const activeNetworkStatesByType =
-        /** @type {!Map<NetworkType, !OncMojo.NetworkStateProperties>} */
+        /** @type {!Map<mojom.NetworkType, !OncMojo.NetworkStateProperties>} */
         (new Map());
 
     // Complete list of states by type.
@@ -243,7 +240,8 @@
       const type = networkState.type;
       if (!activeNetworkStatesByType.has(type)) {
         activeNetworkStatesByType.set(type, networkState);
-        if (!firstConnectedNetwork && networkState.type !== NetworkType.kVPN &&
+        if (!firstConnectedNetwork &&
+            networkState.type !== mojom.NetworkType.kVPN &&
             OncMojo.connectionStateIsConnected(networkState.connectionState)) {
           firstConnectedNetwork = networkState;
         }
@@ -267,7 +265,7 @@
       // A VPN device state will always exist in |deviceStateList| even if there
       // is no active VPN. This check is to add the VPN network summary item
       // only if there is at least one active VPN.
-      if (device.type === NetworkType.kVPN &&
+      if (device.type === mojom.NetworkType.kVPN &&
           !activeNetworkStatesByType.has(device.type)) {
         continue;
       }
@@ -275,11 +273,11 @@
       // If both 'Tether' and 'Cellular' technologies exist, merge the network
       // lists and do not add an active network for 'Tether' so that there is
       // only one 'Mobile data' section / subpage.
-      if (type === NetworkType.kTether &&
-          newDeviceStates[NetworkType.kCellular]) {
-        newNetworkStateLists[NetworkType.kCellular] =
-            newNetworkStateLists[NetworkType.kCellular].concat(
-                newNetworkStateLists[NetworkType.kTether]);
+      if (type === mojom.NetworkType.kTether &&
+          newDeviceStates[mojom.NetworkType.kCellular]) {
+        newNetworkStateLists[mojom.NetworkType.kCellular] =
+            newNetworkStateLists[mojom.NetworkType.kCellular].concat(
+                newNetworkStateLists[mojom.NetworkType.kTether]);
         continue;
       }
 
@@ -287,10 +285,11 @@
       // types are enabled but no Cellular network exists (edge case).
       const networkState =
           this.getActiveStateForType_(activeNetworkStatesByType, type);
-      if (networkState.source === OncSource.kNone &&
-          device.deviceState === DeviceStateType.kProhibited) {
+      if (networkState.source === mojom.OncSource.kNone &&
+          device.deviceState === mojom.DeviceStateType.kProhibited) {
         // Prohibited technologies are enforced by the device policy.
-        networkState.source = OncSource.kDevicePolicy;
+        networkState.source =
+            chromeos.networkConfig.mojom.OncSource.kDevicePolicy;
       }
       newActiveNetworkStates.push(networkState);
       this.activeNetworkIds_.add(networkState.guid);
@@ -309,16 +308,16 @@
    * Returns the active network state for |type| or a default network state.
    * If there is no 'Cellular' network, return the active 'Tether' network if
    * any since the two types are represented by the same section / subpage.
-   * @param {!Map<NetworkType, !OncMojo.NetworkStateProperties>}
+   * @param {!Map<mojom.NetworkType, !OncMojo.NetworkStateProperties>}
    *     activeStatesByType
-   * @param {!NetworkType} type
+   * @param {!mojom.NetworkType} type
    * @return {!OncMojo.NetworkStateProperties|undefined}
    * @private
    */
   getActiveStateForType_(activeStatesByType, type) {
     let activeState = activeStatesByType.get(type);
-    if (!activeState && type === NetworkType.kCellular) {
-      activeState = activeStatesByType.get(NetworkType.kTether);
+    if (!activeState && type === mojom.NetworkType.kCellular) {
+      activeState = activeStatesByType.get(mojom.NetworkType.kTether);
     }
     return activeState || OncMojo.getDefaultNetworkState(type);
   }
@@ -339,7 +338,7 @@
    * @private
    */
   getTetherDeviceState_(deviceStates) {
-    return this.deviceStates[NetworkType.kTether];
+    return this.deviceStates[mojom.NetworkType.kTether];
   }
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js b/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
index 2b5e793..4c73277 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
@@ -19,14 +19,14 @@
 import {getSimSlotCount} from 'chrome://resources/cr_components/chromeos/network/cellular_utils.js';
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {GlobalPolicy, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+const mojom = chromeos.networkConfig.mojom;
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -37,7 +37,7 @@
     mixinBehaviors([CrPolicyNetworkBehaviorMojo, I18nBehavior], PolymerElement);
 
 /** @polymer */
-export class NetworkSummaryItemElement extends NetworkSummaryItemElementBase {
+class NetworkSummaryItemElement extends NetworkSummaryItemElementBase {
   static get is() {
     return 'network-summary-item';
   }
@@ -101,7 +101,7 @@
         },
       },
 
-      /** @private {!GlobalPolicy|undefined} */
+      /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
       globalPolicy: Object,
     };
   }
@@ -135,20 +135,20 @@
     // No network state, use device state.
     const deviceState = this.deviceState;
     if (deviceState) {
-      if (deviceState.type === NetworkType.kTether) {
-        if (deviceState.deviceState === DeviceStateType.kUninitialized) {
+      if (deviceState.type === mojom.NetworkType.kTether) {
+        if (deviceState.deviceState === mojom.DeviceStateType.kUninitialized) {
           return this.i18n('tetherEnableBluetooth');
         }
       }
 
       // Enabled or enabling states.
-      if (deviceState.deviceState === DeviceStateType.kEnabled) {
+      if (deviceState.deviceState === mojom.DeviceStateType.kEnabled) {
         return this.networkStateList.length > 0 ?
             this.i18n('networkListItemNotConnected') :
             this.i18n('networkListItemNoNetwork');
       }
 
-      if (deviceState.deviceState === DeviceStateType.kEnabling) {
+      if (deviceState.deviceState === mojom.DeviceStateType.kEnabling) {
         return this.i18n('internetDeviceEnabling');
       }
     }
@@ -172,11 +172,11 @@
       // Ethernet networks always have the display name 'Ethernet' so we use the
       // state text 'Connected' to avoid repeating the label in the sublabel.
       // See http://crbug.com/989907 for details.
-      return networkState.type === NetworkType.kEthernet ?
+      return networkState.type === mojom.NetworkType.kEthernet ?
           this.i18n('networkListItemConnected') :
           name;
     }
-    if (connectionState === ConnectionStateType.kConnecting) {
+    if (connectionState === mojom.ConnectionStateType.kConnecting) {
       return name ? this.i18n('networkListItemConnectingTo', name) :
                     this.i18n('networkListItemConnecting');
     }
@@ -205,7 +205,8 @@
    */
   getPolicyIndicatorType_(activeNetworkState) {
     if (this.isProhibitedVpn_()) {
-      return this.getIndicatorTypeForSource(OncSource.kDevicePolicy);
+      return this.getIndicatorTypeForSource(
+          chromeos.networkConfig.mojom.OncSource.kDevicePolicy);
     }
     return this.getIndicatorTypeForSource(activeNetworkState.source);
   }
@@ -216,7 +217,7 @@
    * @private
    */
   showSimInfo_(deviceState) {
-    if (!deviceState || deviceState.type !== NetworkType.kCellular) {
+    if (!deviceState || deviceState.type !== mojom.NetworkType.kCellular) {
       return false;
     }
 
@@ -246,7 +247,7 @@
    * @private
    */
   shouldShowLockedWarningMessage_(deviceState) {
-    if (!deviceState || deviceState.type !== NetworkType.kCellular ||
+    if (!deviceState || deviceState.type !== mojom.NetworkType.kCellular ||
         !deviceState.simLockStatus) {
       return false;
     }
@@ -288,8 +289,8 @@
    */
   deviceIsEnabled_(deviceState) {
     return !!deviceState &&
-        (deviceState.type === NetworkType.kVPN ||
-         deviceState.deviceState === DeviceStateType.kEnabled ||
+        (deviceState.type === mojom.NetworkType.kVPN ||
+         deviceState.deviceState === mojom.DeviceStateType.kEnabled ||
          OncMojo.deviceIsInhibited(deviceState));
   }
 
@@ -303,18 +304,18 @@
       return false;
     }
     switch (deviceState.type) {
-      case NetworkType.kEthernet:
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kEthernet:
+      case mojom.NetworkType.kVPN:
         return false;
 
-      case NetworkType.kTether:
+      case mojom.NetworkType.kTether:
         return true;
 
-      case NetworkType.kWiFi:
-        return deviceState.deviceState !== DeviceStateType.kUninitialized;
+      case mojom.NetworkType.kWiFi:
+        return deviceState.deviceState !== mojom.DeviceStateType.kUninitialized;
 
-      case NetworkType.kCellular:
-        if (deviceState.deviceState === DeviceStateType.kUninitialized) {
+      case mojom.NetworkType.kCellular:
+        if (deviceState.deviceState === mojom.DeviceStateType.kUninitialized) {
           return false;
         }
 
@@ -333,7 +334,7 @@
    */
   enableToggleIsEnabled_(deviceState) {
     return this.enableToggleIsVisible_(deviceState) &&
-        deviceState.deviceState !== DeviceStateType.kProhibited &&
+        deviceState.deviceState !== mojom.DeviceStateType.kProhibited &&
         !OncMojo.deviceIsInhibited(deviceState) &&
         !OncMojo.deviceStateIsIntermediate(deviceState.deviceState);
   }
@@ -348,10 +349,10 @@
       return '';
     }
     switch (deviceState.type) {
-      case NetworkType.kTether:
-      case NetworkType.kCellular:
+      case mojom.NetworkType.kTether:
+      case mojom.NetworkType.kCellular:
         return this.i18n('internetToggleMobileA11yLabel');
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         return this.i18n('internetToggleWiFiA11yLabel');
     }
     assertNotReached();
@@ -367,8 +368,8 @@
     // Use network state text to describe toggle for uninitialized tether
     // device. This announces details about enabling bluetooth.
     if (this.enableToggleIsVisible_(deviceState) &&
-        deviceState.type === NetworkType.kTether &&
-        deviceState.deviceState === DeviceStateType.kUninitialized) {
+        deviceState.type === mojom.NetworkType.kTether &&
+        deviceState.deviceState === mojom.DeviceStateType.kUninitialized) {
       return 'networkState';
     }
     return '';
@@ -380,17 +381,19 @@
    * @private
    */
   isProhibitedVpn_() {
-    return !!this.deviceState && this.deviceState.type === NetworkType.kVPN &&
+    return !!this.deviceState &&
+        this.deviceState.type === mojom.NetworkType.kVPN &&
         this.builtInVpnProhibited_(this.deviceState);
   }
 
   /**
-   * @param {!VpnType} vpnType
+   * @param {!chromeos.networkConfig.mojom.VpnType} vpnType
    * @return {boolean}
    * @private
    */
   isBuiltInVpnType_(vpnType) {
-    return vpnType === VpnType.kL2TPIPsec || vpnType === VpnType.kOpenVPN;
+    return vpnType === chromeos.networkConfig.mojom.VpnType.kL2TPIPsec ||
+        vpnType === chromeos.networkConfig.mojom.VpnType.kOpenVPN;
   }
 
   /**
@@ -412,7 +415,8 @@
    */
   builtInVpnProhibited_(deviceState) {
     return !!deviceState &&
-        deviceState.deviceState === DeviceStateType.kProhibited;
+        deviceState.deviceState ===
+        chromeos.networkConfig.mojom.DeviceStateType.kProhibited;
   }
 
   /**
@@ -437,7 +441,7 @@
    * @private
    */
   shouldShowDetails_(activeNetworkState, deviceState, networkStateList) {
-    if (!!deviceState && deviceState.type === NetworkType.kVPN) {
+    if (!!deviceState && deviceState.type === mojom.NetworkType.kVPN) {
       return this.anyVpnExists_(deviceState, networkStateList);
     }
 
@@ -457,14 +461,14 @@
     }
     const type = deviceState.type;
 
-    if (type === NetworkType.kTether ||
-        (type === NetworkType.kCellular && this.tetherDeviceState)) {
+    if (type === mojom.NetworkType.kTether ||
+        (type === mojom.NetworkType.kCellular && this.tetherDeviceState)) {
       // The "Mobile data" subpage should always be shown if Tether is
       // available, even if there are currently no associated networks.
       return true;
     }
 
-    if (type === NetworkType.kCellular) {
+    if (type === mojom.NetworkType.kCellular) {
       if (OncMojo.deviceIsInhibited(deviceState)) {
         // The "Mobile data" subpage should be shown if the device state is
         // inhibited.
@@ -478,12 +482,12 @@
       }
     }
 
-    if (type === NetworkType.kVPN) {
+    if (type === mojom.NetworkType.kVPN) {
       return this.anyVpnExists_(deviceState, networkStateList);
     }
 
     let minlen;
-    if (type === NetworkType.kWiFi) {
+    if (type === mojom.NetworkType.kWiFi) {
       // WiFi subpage includes 'Known Networks' so always show, even if the
       // technology is still enabling / scanning, or none are visible.
       minlen = 0;
@@ -607,8 +611,8 @@
 
     // Set the device state to enabling or disabling until updated.
     this.deviceState.deviceState = deviceIsEnabled ?
-        DeviceStateType.kDisabling :
-        DeviceStateType.kEnabling;
+        mojom.DeviceStateType.kDisabling :
+        mojom.DeviceStateType.kEnabling;
   }
 
   /**
@@ -630,7 +634,7 @@
   }
 
   /**
-   * @param {!NetworkType} type
+   * @param {!mojom.NetworkType} type
    * @return {string}
    * @private
    */
@@ -638,8 +642,9 @@
     // The shared Cellular/Tether subpage is referred to as "Mobile".
     // TODO(khorimoto): Remove once Cellular/Tether are split into their own
     // sections.
-    if (type === NetworkType.kCellular || type === NetworkType.kTether) {
-      type = NetworkType.kMobile;
+    if (type === mojom.NetworkType.kCellular ||
+        type === mojom.NetworkType.kTether) {
+      type = mojom.NetworkType.kMobile;
     }
     return this.i18n('OncType' + OncMojo.getNetworkTypeString(type));
   }
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
index 9d17340..66c4e29 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
@@ -6,6 +6,7 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import '../os_icons.js';
@@ -14,7 +15,6 @@
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {HTMLEscape} from 'chrome://resources/js/util.m.js';
-import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
@@ -61,7 +61,7 @@
 
   static get properties() {
     return {
-      /** @type {!ManagedProperties|undefined} */
+      /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
       managedProperties: Object,
 
       /**
@@ -113,7 +113,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {boolean}
    * @private
    */
@@ -125,7 +126,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string} The battery percentage integer value converted to a
    *     string. Note that this will not return a string with a "%" suffix.
    * @private
@@ -140,7 +142,7 @@
    * Retrieves an image that corresponds to signal strength of the tether host.
    * Custom icons are used here instead of a <network-icon> because this
    * dialog uses a special color scheme.
-   * @param {!ManagedProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *    managedProperties
    * @return {string} The name of the icon to be used to represent the network's
    *     signal strength.
@@ -155,7 +157,8 @@
 
   /**
    * Retrieves a localized accessibility label for the signal strength.
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string} The localized signal strength label.
    */
   getSignalStrengthLabel_(managedProperties) {
@@ -168,7 +171,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string}
    * @private
    */
@@ -177,7 +181,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string}
    * @private
    */
@@ -190,7 +195,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string}
    * @private
    */
@@ -203,7 +209,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string}
    * @private
    */
@@ -216,7 +223,8 @@
   }
 
   /**
-   * @param {!ManagedProperties|undefined} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *    managedProperties
    * @return {string}
    * @private
    */
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js
index 4db83f6..0b95a8b 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js
@@ -19,8 +19,6 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote, FilterType, InhibitReason, NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
@@ -96,7 +94,7 @@
   constructor() {
     super();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -120,7 +118,7 @@
    * onNetworkStateListChanged, triggering updateTetherNetworkState_ and
    * rendering this callback redundant. As a result, we return early if the
    * active network is not changed.
-   * @param {!Array<NetworkStateProperties>}
+   * @param {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     networks
    * @private
    */
@@ -156,13 +154,13 @@
    */
   updateTetherDeviceState_() {
     this.networkConfig_.getDeviceStateList().then(response => {
-      const kTether = NetworkType.kTether;
+      const kTether = chromeos.networkConfig.mojom.NetworkType.kTether;
       const deviceStates = response.result;
       const deviceState =
           deviceStates.find(deviceState => deviceState.type === kTether);
       this.deviceState_ = deviceState || {
-        deviceState: DeviceStateType.kDisabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        deviceState: chromeos.networkConfig.mojom.DeviceStateType.kDisabled,
+        inhibitReason: chromeos.networkConfig.mojom.InhibitReason.kNotInhibited,
         managedNetworkAvailable: false,
         scanning: false,
         simAbsent: false,
@@ -180,9 +178,9 @@
    * @private
    */
   updateTetherNetworkState_() {
-    const kTether = NetworkType.kTether;
+    const kTether = chromeos.networkConfig.mojom.NetworkType.kTether;
     const filter = {
-      filter: FilterType.kVisible,
+      filter: chromeos.networkConfig.mojom.FilterType.kVisible,
       limit: 1,
       networkType: kTether,
     };
@@ -197,7 +195,7 @@
    * Returns an array containing the active network state if there is one
    * (note that if there is not GUID will be falsy).  Returns an empty array
    * otherwise.
-   * @return {!Array<NetworkStateProperties>}
+   * @return {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    * @private
    */
   getNetworkStateList_() {
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/browser_proxy.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/browser_proxy.js
index c87b8f8..e1b788d 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/browser_proxy.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/browser_proxy.js
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
 import 'chrome://resources/mojo/skia/public/mojom/image_info.mojom-lite.js';
 import 'chrome://resources/mojo/skia/public/mojom/bitmap.mojom-lite.js';
 import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notification_row.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notification_row.js
index ba4716fa..12fb5660 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notification_row.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notification_row.js
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
 import 'chrome://resources/mojo/skia/public/mojom/image_info.mojom-lite.js';
 import 'chrome://resources/mojo/skia/public/mojom/bitmap.mojom-lite.js';
 import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
index 32488086..f009692 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_notifications_page/app_notifications_subpage.js
@@ -4,7 +4,6 @@
 
 import './app_notification_row.js';
 import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
-import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
 import 'chrome://resources/mojo/skia/public/mojom/image_info.mojom-lite.js';
 import 'chrome://resources/mojo/skia/public/mojom/bitmap.mojom-lite.js';
 import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
index d5f039a1..4e8a498b7 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
@@ -21,8 +21,6 @@
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {CrosNetworkConfigRemote, FilterType, NetworkStateProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
@@ -191,7 +189,7 @@
     /** @private {!CupsPrintersBrowserProxy} */
     this.browserProxy_ = CupsPrintersBrowserProxyImpl.getInstance();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
@@ -218,7 +216,7 @@
 
   /**
    * CrosNetworkConfigObserver impl
-   * @param {!Array<NetworkStateProperties>}
+   * @param {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     networks
    * @private
    */
@@ -521,9 +519,9 @@
   refreshNetworks_() {
     this.networkConfig_
         .getNetworkStateList({
-          filter: FilterType.kActive,
-          networkType: NetworkType.kAll,
-          limit: NO_LIMIT,
+          filter: chromeos.networkConfig.mojom.FilterType.kActive,
+          networkType: chromeos.networkConfig.mojom.NetworkType.kAll,
+          limit: chromeos.networkConfig.mojom.NO_LIMIT,
         })
         .then((responseParams) => {
           this.onActiveNetworksChanged(responseParams.result);
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
index 0b6f99a4..f48e1b25 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
@@ -29,13 +29,11 @@
 
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/cr_components/chromeos/network/network_listener_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {addWebUIListener, removeWebUIListener, sendWithPromise, WebUIListener} from 'chrome://resources/js/cr.m.js';
 import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink_js.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {CrosNetworkConfigRemote, FilterType, NetworkStateProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
@@ -197,7 +195,7 @@
   constructor() {
     super();
 
-    /** @private {!CrosNetworkConfigRemote} */
+    /** @private {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
 
@@ -215,9 +213,9 @@
 
     this.networkConfig_
         .getNetworkStateList({
-          filter: FilterType.kActive,
-          networkType: NetworkType.kAll,
-          limit: NO_LIMIT,
+          filter: chromeos.networkConfig.mojom.FilterType.kActive,
+          networkType: chromeos.networkConfig.mojom.NetworkType.kAll,
+          limit: chromeos.networkConfig.mojom.NO_LIMIT,
         })
         .then((responseParams) => {
           this.onActiveNetworksChanged(responseParams.result);
@@ -308,7 +306,7 @@
 
   /**
    * CrosNetworkConfigObserver impl
-   * @param {!Array<NetworkStateProperties>}
+   * @param {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     networks
    * @private
    */
@@ -317,7 +315,8 @@
       // Note: Check for kOnline rather than using
       // OncMojo.connectionStateIsConnected() since the latter could return true
       // for networks without connectivity (e.g., captive portals).
-      return network.connectionState === ConnectionStateType.kOnline;
+      return network.connectionState ===
+          chromeos.networkConfig.mojom.ConnectionStateType.kOnline;
     });
   }
 
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js
index 8e64a5c..7b46eac6 100644
--- a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js
@@ -16,7 +16,6 @@
 import './os_powerwash_dialog_esim_item.js';
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {LifetimeBrowserProxyImpl} from '../../lifetime_browser_proxy.js';
@@ -116,7 +115,10 @@
     event.detail.event.preventDefault();
 
     const params = new URLSearchParams();
-    params.append('type', OncMojo.getNetworkTypeString(NetworkType.kCellular));
+    params.append(
+        'type',
+        OncMojo.getNetworkTypeString(
+            chromeos.networkConfig.mojom.NetworkType.kCellular));
     Router.getInstance().navigateTo(routes.INTERNET_NETWORKS, params);
 
     this.$.dialog.close();
diff --git a/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.cc b/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.cc
new file mode 100644
index 0000000..38c2c20
--- /dev/null
+++ b/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.cc
@@ -0,0 +1,80 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.h"
+
+#include <array>
+
+#include "base/threading/sequenced_task_runner_handle.h"
+#include "components/segmentation_platform/internal/metadata/metadata_writer.h"
+#include "components/segmentation_platform/public/model_provider.h"
+#include "components/segmentation_platform/public/proto/model_metadata.pb.h"
+
+namespace segmentation_platform {
+
+namespace {
+using proto::SegmentId;
+
+// Default parameters for Chrome Start model.
+constexpr SegmentId kChromeStartSegmentId =
+    SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2;
+constexpr int64_t kChromeStartSignalStorageLength = 28;
+constexpr int64_t kChromeStartMinSignalCollectionLength = 1;
+
+// InputFeatures.
+constexpr std::array<MetadataWriter::UMAFeature, 3> kChromeStartUMAFeatures = {
+    MetadataWriter::UMAFeature::FromValueHistogram(
+        "ContentSuggestions.Feed.EngagementType",
+        7,
+        proto::Aggregation::COUNT),
+    MetadataWriter::UMAFeature::FromUserAction("MobileNewTabOpened", 7),
+    MetadataWriter::UMAFeature::FromUserAction("MobileNTPMostVisited", 7),
+};
+
+}  // namespace
+
+ChromeStartModelV2::ChromeStartModelV2()
+    : ModelProvider(kChromeStartSegmentId) {}
+
+void ChromeStartModelV2::InitAndFetchModel(
+    const ModelUpdatedCallback& model_updated_callback) {
+  proto::SegmentationModelMetadata chrome_start_metadata;
+  MetadataWriter writer(&chrome_start_metadata);
+  writer.SetDefaultSegmentationMetadataConfig(
+      kChromeStartMinSignalCollectionLength, kChromeStartSignalStorageLength);
+
+  // Set features.
+  writer.AddUmaFeatures(kChromeStartUMAFeatures.data(),
+                        kChromeStartUMAFeatures.size());
+
+  constexpr int kModelVersion = 1;
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindRepeating(model_updated_callback, kChromeStartSegmentId,
+                          std::move(chrome_start_metadata), kModelVersion));
+}
+
+void ChromeStartModelV2::ExecuteModelWithInput(const std::vector<float>& inputs,
+                                               ExecutionCallback callback) {
+  // Invalid inputs.
+  if (inputs.size() != kChromeStartUMAFeatures.size()) {
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), absl::nullopt));
+    return;
+  }
+
+  // Do not use the inputs, return the current default value defined.
+  // Defined in TAB_SWITCHER_ON_RETURN_MS.
+  // TODO(ssid): Consider getting the param value from field trials and use it
+  // here instead.
+  float return_time_in_seconds = 28800;  // 8 hours
+  base::SequencedTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), return_time_in_seconds));
+}
+
+bool ChromeStartModelV2::ModelAvailable() {
+  return true;
+}
+
+}  // namespace segmentation_platform
diff --git a/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.h b/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.h
new file mode 100644
index 0000000..f7b9c1c
--- /dev/null
+++ b/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.h
@@ -0,0 +1,33 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_SEGMENTATION_PLATFORM_DEFAULT_MODEL_CHROME_START_MODEL_ANDROID_V2_H_
+#define CHROME_BROWSER_SEGMENTATION_PLATFORM_DEFAULT_MODEL_CHROME_START_MODEL_ANDROID_V2_H_
+
+#include "components/segmentation_platform/public/model_provider.h"
+
+namespace segmentation_platform {
+
+// Segmentation Chrome Start model provider. Provides a default model and
+// metadata for the chrome start optimization target.
+class ChromeStartModelV2 : public ModelProvider {
+ public:
+  ChromeStartModelV2();
+  ~ChromeStartModelV2() override = default;
+
+  // Disallow copy/assign.
+  ChromeStartModelV2(ChromeStartModelV2&) = delete;
+  ChromeStartModelV2& operator=(ChromeStartModelV2&) = delete;
+
+  // ModelProvider implementation.
+  void InitAndFetchModel(
+      const ModelUpdatedCallback& model_updated_callback) override;
+  void ExecuteModelWithInput(const std::vector<float>& inputs,
+                             ExecutionCallback callback) override;
+  bool ModelAvailable() override;
+};
+
+}  // namespace segmentation_platform
+
+#endif  // CHROME_BROWSER_SEGMENTATION_PLATFORM_DEFAULT_MODEL_CHROME_START_MODEL_ANDROID_V2_H_
diff --git a/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2_unittest.cc b/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2_unittest.cc
new file mode 100644
index 0000000..fe9b988
--- /dev/null
+++ b/chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2_unittest.cc
@@ -0,0 +1,92 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.h"
+
+#include "base/run_loop.h"
+#include "base/test/task_environment.h"
+#include "components/segmentation_platform/internal/metadata/metadata_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace segmentation_platform {
+
+class ChromeStartModelV2Test : public testing::Test {
+ public:
+  ChromeStartModelV2Test() = default;
+  ~ChromeStartModelV2Test() override = default;
+
+  void SetUp() override {
+    chrome_start_model_ = std::make_unique<ChromeStartModelV2>();
+  }
+
+  void TearDown() override {
+    chrome_start_model_.reset();
+    RunUntilIdle();
+  }
+
+  void RunUntilIdle() { task_environment_.RunUntilIdle(); }
+
+  void ExpectInitAndFetchModel() {
+    base::RunLoop loop;
+    chrome_start_model_->InitAndFetchModel(
+        base::BindRepeating(&ChromeStartModelV2Test::OnInitFinishedCallback,
+                            base::Unretained(this), loop.QuitClosure()));
+    loop.Run();
+  }
+
+  void OnInitFinishedCallback(base::RepeatingClosure closure,
+                              proto::SegmentId target,
+                              proto::SegmentationModelMetadata metadata,
+                              int64_t) {
+    EXPECT_EQ(metadata_utils::ValidateMetadataAndFeatures(metadata),
+              metadata_utils::ValidationResult::kValidationSuccess);
+    std::move(closure).Run();
+  }
+
+  void ExpectExecutionWithInput(const std::vector<float>& inputs,
+                                bool expected_error,
+                                float expected_result) {
+    base::RunLoop loop;
+    chrome_start_model_->ExecuteModelWithInput(
+        inputs,
+        base::BindOnce(&ChromeStartModelV2Test::OnExecutionFinishedCallback,
+                       base::Unretained(this), loop.QuitClosure(),
+                       expected_error, expected_result));
+    loop.Run();
+  }
+
+  void OnExecutionFinishedCallback(base::RepeatingClosure closure,
+                                   bool expected_error,
+                                   float expected_result,
+                                   const absl::optional<float>& result) {
+    if (expected_error) {
+      EXPECT_FALSE(result.has_value());
+    } else {
+      EXPECT_TRUE(result.has_value());
+      EXPECT_EQ(result.value(), expected_result);
+    }
+    std::move(closure).Run();
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  std::unique_ptr<ChromeStartModelV2> chrome_start_model_;
+};
+
+TEST_F(ChromeStartModelV2Test, InitAndFetchModel) {
+  ExpectInitAndFetchModel();
+}
+
+TEST_F(ChromeStartModelV2Test, ExecuteModelWithInput) {
+  // 3 input features definde in `kChromeStartUMAFeatures`, set all to 0.
+  std::vector<float> input = {0, 0, 0};
+  const float kDefaultReturnTimeSeconds = 28800;
+  ExpectExecutionWithInput(input, false, kDefaultReturnTimeSeconds);
+
+  // Set to higher values, the model returns the same result.
+  input = {3, 6, 3};
+  ExpectExecutionWithInput(input, false, kDefaultReturnTimeSeconds);
+}
+
+}  // namespace segmentation_platform
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_config.cc b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
index 56c3942a..71169ea 100644
--- a/chrome/browser/segmentation_platform/segmentation_platform_config.cc
+++ b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
 #include "components/segmentation_platform/embedder/default_model/cross_device_user_segment.h"
 #include "components/segmentation_platform/embedder/default_model/feed_user_segment.h"
-#include "components/segmentation_platform/embedder/default_model/intentional_user_model.h"
 #include "components/segmentation_platform/embedder/default_model/low_user_engagement_model.h"
 #include "components/segmentation_platform/embedder/default_model/shopping_user_model.h"
 #include "components/segmentation_platform/internal/config_parser.h"
@@ -30,10 +29,12 @@
 #include "chrome/browser/flags/android/cached_feature_flags.h"
 #include "chrome/browser/flags/android/chrome_feature_list.h"
 #include "chrome/browser/segmentation_platform/default_model/chrome_start_model_android.h"
+#include "chrome/browser/segmentation_platform/default_model/chrome_start_model_android_v2.h"
 #include "chrome/browser/ui/android/start_surface/start_surface_android.h"
 #include "components/commerce/core/commerce_feature_list.h"
 #include "components/commerce/core/shopping_service.h"
 #include "components/query_tiles/switches.h"
+#include "components/segmentation_platform/embedder/default_model/intentional_user_model.h"
 #include "components/segmentation_platform/embedder/default_model/price_tracking_action_model.h"
 #include "components/segmentation_platform/embedder/default_model/query_tiles_model.h"
 #include "components/segmentation_platform/embedder/input_delegate/price_tracking_input_delegate.h"
@@ -149,6 +150,33 @@
   return config;
 }
 
+std::unique_ptr<ModelProvider> GetChromeStartAndroidModelV2() {
+  if (!base::GetFieldTrialParamByFeatureAsBool(
+          chrome::android::kStartSurfaceReturnTime, kDefaultModelEnabledParam,
+          true)) {
+    return nullptr;
+  }
+  return std::make_unique<ChromeStartModelV2>();
+}
+
+std::unique_ptr<Config> GetConfigForChromeStartAndroidV2() {
+  auto config = std::make_unique<Config>();
+  config->segmentation_key = kChromeStartAndroidV2SegmentationKey;
+  config->segmentation_uma_name = kChromeStartAndroidV2UmaName;
+  config->AddSegmentId(
+      SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2,
+      GetChromeStartAndroidModelV2());
+
+  int segment_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt(
+      chrome::android::kStartSurfaceReturnTime,
+      kVariationsParamNameSegmentSelectionTTLDays,
+      kChromeStartDefaultSelectionTTLDays);
+  config->segment_selection_ttl = base::Days(segment_selection_ttl_days);
+  config->unknown_selection_ttl = config->segment_selection_ttl;
+
+  return config;
+}
+
 std::unique_ptr<ModelProvider> GetQueryTilesDefaultModel() {
   if (!base::GetFieldTrialParamByFeatureAsBool(
           query_tiles::features::kQueryTilesSegmentation,
@@ -384,6 +412,7 @@
     configs.emplace_back(GetConfigForQueryTiles());
   }
 
+  configs.emplace_back(GetConfigForChromeStartAndroidV2());
   configs.emplace_back(GetConfigForIntentionalUser());
 #endif
   if (IsLowEngagementFeatureEnabled()) {
diff --git a/chrome/browser/ui/ash/network/network_portal_signin_controller.cc b/chrome/browser/ui/ash/network/network_portal_signin_controller.cc
index 236fcd64..c1362a2 100644
--- a/chrome/browser/ui/ash/network/network_portal_signin_controller.cc
+++ b/chrome/browser/ui/ash/network/network_portal_signin_controller.cc
@@ -11,6 +11,9 @@
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
 #include "chrome/browser/ui/singleton_tabs.h"
 #include "chrome/common/pref_names.h"
+#include "chromeos/ash/components/network/network_handler.h"
+#include "chromeos/ash/components/network/network_state.h"
+#include "chromeos/ash/components/network/network_state_handler.h"
 #include "components/captive_portal/core/captive_portal_detector.h"
 #include "components/prefs/pref_service.h"
 #include "components/user_manager/user_manager.h"
@@ -28,23 +31,30 @@
 }
 
 void NetworkPortalSigninController::ShowSignin() {
+  GURL url;
+  const NetworkState* default_network =
+      NetworkHandler::Get()->network_state_handler()->DefaultNetwork();
+  if (default_network)
+    url = default_network->probe_url();
+  if (url.is_empty())
+    url = GURL(captive_portal::CaptivePortalDetector::kDefaultURL);
+
   Profile* profile = ProfileManager::GetActiveUserProfile();
-
-  bool use_incognito_profile =
-      profile && profile->GetPrefs()->GetBoolean(
-                     prefs::kCaptivePortalAuthenticationIgnoresProxy);
-
-  if (use_incognito_profile) {
-    ShowDialog();
-  } else {
-    if (!profile)
-      return;
-    chrome::ScopedTabbedBrowserDisplayer displayer(profile);
-    if (!displayer.browser())
-      return;
-    GURL url(captive_portal::CaptivePortalDetector::kDefaultURL);
-    ShowSingletonTab(displayer.browser(), url);
+  if (!profile) {
+    // Login screen. Always show an incognito dialog.
+    ShowDialog(ProfileHelper::GetSigninProfile(), url);
+    return;
   }
+
+  if (profile->GetPrefs()->GetBoolean(
+          prefs::kCaptivePortalAuthenticationIgnoresProxy)) {
+    // If allowed, use an incognito dialog to ignore any proxies.
+    ShowDialog(ProfileHelper::GetSigninProfile(), url);
+    return;
+  }
+
+  // Otherwise show in a singleton browser tab.
+  ShowTab(profile, url);
 }
 
 void NetworkPortalSigninController::CloseSignin() {
@@ -64,14 +74,23 @@
   SigninProfileHandler::Get()->ClearSigninProfile(base::NullCallback());
 }
 
-void NetworkPortalSigninController::ShowDialog() {
+void NetworkPortalSigninController::ShowDialog(Profile* profile,
+                                               const GURL& url) {
   if (dialog_)
     return;
 
-  Profile* signin_profile = ProfileHelper::GetSigninProfile();
-  dialog_ = new NetworkPortalWebDialog(web_dialog_weak_factory_.GetWeakPtr());
+  dialog_ =
+      new NetworkPortalWebDialog(url, web_dialog_weak_factory_.GetWeakPtr());
   dialog_->SetWidget(views::Widget::GetWidgetForNativeWindow(
-      chrome::ShowWebDialog(nullptr, signin_profile, dialog_)));
+      chrome::ShowWebDialog(nullptr, profile, dialog_)));
+}
+
+void NetworkPortalSigninController::ShowTab(Profile* profile, const GURL& url) {
+  chrome::ScopedTabbedBrowserDisplayer displayer(profile);
+  if (!displayer.browser())
+    return;
+
+  ShowSingletonTab(displayer.browser(), url);
 }
 
 }  // namespace ash
diff --git a/chrome/browser/ui/ash/network/network_portal_signin_controller.h b/chrome/browser/ui/ash/network/network_portal_signin_controller.h
index 2a26bc65..6d859fd54 100644
--- a/chrome/browser/ui/ash/network/network_portal_signin_controller.h
+++ b/chrome/browser/ui/ash/network/network_portal_signin_controller.h
@@ -7,6 +7,8 @@
 
 #include "chrome/browser/ash/net/network_portal_web_dialog.h"
 
+class Profile;
+
 namespace ash {
 
 class NetworkPortalSigninController : public NetworkPortalWebDialog::Delegate {
@@ -21,20 +23,23 @@
   virtual base::WeakPtr<NetworkPortalSigninController> GetWeakPtr();
 
   // Shows the signin UI.
-  virtual void ShowSignin();
+  void ShowSignin();
 
   // Closes the signin UI if appropriate.
-  virtual void CloseSignin();
+  void CloseSignin();
 
   // Returns whether the sigin UI is show.
-  virtual bool DialogIsShown();
+  bool DialogIsShown();
 
   // NetworkPortalWebDialog::Delegate
   void OnDialogDestroyed(const NetworkPortalWebDialog* dialog) override;
 
- private:
-  void ShowDialog();
+ protected:
+  // May be overridden in tests.
+  virtual void ShowDialog(Profile* profile, const GURL& url);
+  virtual void ShowTab(Profile* profile, const GURL& url);
 
+ private:
   NetworkPortalWebDialog* dialog_ = nullptr;
   base::WeakPtrFactory<NetworkPortalWebDialog::Delegate>
       web_dialog_weak_factory_{this};
diff --git a/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc b/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc
new file mode 100644
index 0000000..4177bc0
--- /dev/null
+++ b/chrome/browser/ui/ash/network/network_portal_signin_controller_unittest.cc
@@ -0,0 +1,141 @@
+// 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/ui/ash/network/network_portal_signin_controller.h"
+
+#include <memory>
+
+#include "base/run_loop.h"
+#include "chrome/browser/profiles/profile_manager.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/ash/components/network/network_handler.h"
+#include "chromeos/ash/components/network/network_handler_test_helper.h"
+#include "chromeos/ash/components/network/network_state.h"
+#include "chromeos/ash/components/network/network_state_handler.h"
+#include "components/captive_portal/core/captive_portal_detector.h"
+#include "components/prefs/pref_service.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
+
+namespace ash {
+
+namespace {
+
+constexpr char kTestPortalUrl[] = "http://www.gstatic.com/generate_204";
+
+class TestSigninController : public NetworkPortalSigninController {
+ public:
+  TestSigninController() = default;
+  TestSigninController(const TestSigninController&) = delete;
+  TestSigninController& operator=(const TestSigninController&) = delete;
+  ~TestSigninController() override = default;
+
+  // NetworkPortalSigninController
+  void ShowDialog(Profile* profile, const GURL& url) override {
+    dialog_url_ = url.spec();
+  }
+  void ShowTab(Profile* profile, const GURL& url) override {
+    tab_url_ = url.spec();
+  }
+
+  const std::string& dialog_url() const { return dialog_url_; }
+  const std::string& tab_url() const { return tab_url_; }
+
+ private:
+  std::string dialog_url_;
+  std::string tab_url_;
+};
+
+}  // namespace
+
+class NetworkPortalSigninControllerTest : public testing::Test {
+ public:
+  NetworkPortalSigninControllerTest() = default;
+  NetworkPortalSigninControllerTest(const NetworkPortalSigninControllerTest&) =
+      delete;
+  NetworkPortalSigninControllerTest& operator=(
+      const NetworkPortalSigninControllerTest&) = delete;
+  ~NetworkPortalSigninControllerTest() override = default;
+
+  void SetUp() override {
+    network_helper_ = std::make_unique<NetworkHandlerTestHelper>();
+    controller_ = std::make_unique<TestSigninController>();
+    base::RunLoop().RunUntilIdle();
+  }
+
+  void TearDown() override { network_helper_.reset(); }
+
+ protected:
+  void SimulateLogin() {
+    test_profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(test_profile_manager_->SetUp());
+    test_profile_manager_->CreateTestingProfile("primary_user");
+  }
+
+  std::string SetProbeUrl(const std::string& url) {
+    std::string expected_url;
+    if (!url.empty()) {
+      std::string default_path = NetworkHandler::Get()
+                                     ->network_state_handler()
+                                     ->DefaultNetwork()
+                                     ->path();
+      ShillServiceClient::Get()->SetProperty(
+          dbus::ObjectPath(default_path), shill::kProbeUrlProperty,
+          base::Value(url), base::DoNothing(), base::DoNothing());
+      base::RunLoop().RunUntilIdle();
+      expected_url = url;
+    } else {
+      expected_url = captive_portal::CaptivePortalDetector::kDefaultURL;
+    }
+    return expected_url;
+  }
+
+  content::BrowserTaskEnvironment task_environment_;
+  std::unique_ptr<NetworkHandlerTestHelper> network_helper_;
+  std::unique_ptr<TestingProfileManager> test_profile_manager_;
+  std::unique_ptr<TestSigninController> controller_;
+};
+
+TEST_F(NetworkPortalSigninControllerTest, LoginScreen) {
+  controller_->ShowSignin();
+  EXPECT_FALSE(controller_->dialog_url().empty());
+}
+
+TEST_F(NetworkPortalSigninControllerTest, AuthenticationIgnoresProxyTrue) {
+  SimulateLogin();
+  // kCaptivePortalAuthenticationIgnoresProxy defaults to true
+  controller_->ShowSignin();
+  EXPECT_FALSE(controller_->dialog_url().empty());
+}
+
+TEST_F(NetworkPortalSigninControllerTest, AuthenticationIgnoresProxyFalse) {
+  SimulateLogin();
+  test_profile_manager_->profile_manager()
+      ->GetActiveUserProfile()
+      ->GetPrefs()
+      ->SetBoolean(prefs::kCaptivePortalAuthenticationIgnoresProxy, false);
+  controller_->ShowSignin();
+  EXPECT_FALSE(controller_->tab_url().empty());
+}
+
+TEST_F(NetworkPortalSigninControllerTest, ProbeUrl) {
+  SimulateLogin();
+  std::string expected_url = SetProbeUrl(kTestPortalUrl);
+  controller_->ShowSignin();
+  EXPECT_EQ(controller_->dialog_url(), expected_url);
+}
+
+TEST_F(NetworkPortalSigninControllerTest, NoProbeUrl) {
+  SimulateLogin();
+  std::string expected_url = SetProbeUrl(std::string());
+  controller_->ShowSignin();
+  EXPECT_EQ(controller_->dialog_url(), expected_url);
+}
+
+}  // namespace ash
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
index ef3bc1e..d82368b 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_browsertest.cc
@@ -22,8 +22,10 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/autofill/content/browser/content_autofill_driver.h"
+#include "components/autofill/content/browser/test_autofill_manager_injector.h"
 #include "components/autofill/core/browser/form_data_importer.h"
 #include "components/autofill/core/browser/payments/credit_card_save_manager.h"
+#include "components/autofill/core/browser/test_autofill_manager_waiter.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_navigation_observer.h"
@@ -351,10 +353,39 @@
   base::RunLoop run_loop_;
 };
 
+namespace {
+
+class TestAutofillManager : public autofill::BrowserAutofillManager {
+ public:
+  TestAutofillManager(autofill::ContentAutofillDriver* driver,
+                      autofill::AutofillClient* client)
+      : BrowserAutofillManager(driver,
+                               client,
+                               "en-US",
+                               EnableDownloadManager(false)) {}
+
+  [[nodiscard]] testing::AssertionResult WaitForFormsSeen(
+      int min_num_awaited_calls) {
+    return forms_seen_waiter_.Wait(min_num_awaited_calls);
+  }
+
+ private:
+  autofill::TestAutofillManagerWaiter forms_seen_waiter_{
+      *this,
+      {&AutofillManager::Observer::OnAfterFormsSeen}};
+};
+
+}  // namespace
+
 // Tests that hosted app frames reflect the theme color set by HTML meta tags.
 IN_PROC_BROWSER_TEST_F(BrowserNonClientFrameViewBrowserTest, SaveCardIcon) {
+  autofill::TestAutofillManagerFutureInjectors<TestAutofillManager>
+      autofill_manager_injectors;
   InstallAndLaunchBookmarkApp(embedded_test_server()->GetURL(
       "/autofill/credit_card_upload_form_address_and_cc.html"));
+  ASSERT_TRUE(
+      autofill_manager_injectors[0].GetForPrimaryMainFrame()->WaitForFormsSeen(
+          1));
   ASSERT_TRUE(content::ExecJs(web_contents_.get(), "fill_form.click();"));
 
   content::TestNavigationObserver nav_observer(web_contents_);
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
index 794ecff..3101a1f 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view_browsertest.cc
@@ -548,6 +548,7 @@
   match.has_tab_match = true;
   matches.push_back(match);
   controller->result_.AppendMatches(matches);
+  controller->NotifyChanged();
   popup_view()->UpdatePopupAppearance();
 
   edit_model()->SetPopupSelection(OmniboxPopupSelection(1));
diff --git a/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_browsertest.cc
index 57b00ec..7459f5b 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_suggestion_button_row_browsertest.cc
@@ -111,6 +111,7 @@
     matches.push_back(action_match);
     matches.push_back(multiple_actions_match);
     results.AppendMatches(matches);
+    autocomplete_controller->NotifyChanged();
 
     // The omnibox popup should open with suggestions displayed.
     omnibox_view->model()->OnPopupResultChanged();
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
index 1ea48b7..2d6b346 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
@@ -460,7 +460,7 @@
       input, TemplateURLServiceFactory::GetForProfile(browser()->profile()));
 
   // The omnibox popup should open with suggestions displayed.
-  omnibox_view->model()->OnPopupResultChanged();
+  autocomplete_controller->NotifyChanged();
   EXPECT_TRUE(omnibox_view->model()->PopupIsOpen());
 
   // The omnibox text should be selected.
@@ -508,7 +508,7 @@
       input, TemplateURLServiceFactory::GetForProfile(browser()->profile()));
 
   // The omnibox popup should open with suggestions displayed.
-  omnibox_view->model()->OnPopupResultChanged();
+  autocomplete_controller->NotifyChanged();
   EXPECT_TRUE(omnibox_view->model()->PopupIsOpen());
 
   // TODO(krb): For some reason, we need to hit End twice to be registered.
@@ -611,7 +611,7 @@
 
   // The omnibox popup should open with suggestions displayed.
   chrome::FocusLocationBar(browser());
-  omnibox_view->model()->OnPopupResultChanged();
+  autocomplete_controller->NotifyChanged();
   EXPECT_TRUE(omnibox_view->model()->PopupIsOpen());
   OmniboxViewViews* omnibox_view_views =
       static_cast<OmniboxViewViews*>(omnibox_view);
@@ -710,7 +710,7 @@
       input, TemplateURLServiceFactory::GetForProfile(browser()->profile()));
 
   // The omnibox popup should open with suggestions displayed.
-  omnibox_view->model()->OnPopupResultChanged();
+  autocomplete_controller->NotifyChanged();
   EXPECT_TRUE(omnibox_view->model()->PopupIsOpen());
   ui::AXNodeData popup_node_data_2;
   popup_view->GetAccessibleNodeData(&popup_node_data_2);
@@ -833,7 +833,7 @@
       input, TemplateURLServiceFactory::GetForProfile(browser()->profile()));
 
   // The omnibox popup should open with suggestions displayed.
-  omnibox_view->model()->OnPopupResultChanged();
+  autocomplete_controller->NotifyChanged();
 
   // Wait for ControllerFor property changed event.
   open_waiter.Wait();
diff --git a/chrome/browser/ui/views/performance_controls/battery_saver_button.cc b/chrome/browser/ui/views/performance_controls/battery_saver_button.cc
index 9f73e56..cfad2ab 100644
--- a/chrome/browser/ui/views/performance_controls/battery_saver_button.cc
+++ b/chrome/browser/ui/views/performance_controls/battery_saver_button.cc
@@ -61,6 +61,8 @@
 }
 
 void BatterySaverButton::Hide() {
+  CloseFeaturePromo();
+
   if (IsBubbleShowing()) {
     // The bubble is closed sync and will be cleared in OnBubbleHidden
     BatterySaverBubbleView::CloseBubble(bubble_);
@@ -88,26 +90,9 @@
   }
 }
 
-void BatterySaverButton::OnFeatureEngagementInitialized(bool initialized) {
-  if (!initialized)
-    return;
-
-  browser_view_->MaybeShowFeaturePromo(
-      feature_engagement::kIPHBatterySaverModeFeature);
-}
-
 void BatterySaverButton::MaybeShowFeaturePromo() {
-  auto* const promo_controller = browser_view_->GetFeaturePromoController();
-  if (!promo_controller)
-    return;
-
-  // Toolbar button could be visible early in browser startup where the feature
-  // engagement tracker might not have fully initialized. So wait for the
-  // initialization to complete before triggering the promo.
-  auto* tracker = promo_controller->feature_engagement_tracker();
-  tracker->AddOnInitializedCallback(
-      base::BindOnce(&BatterySaverButton::OnFeatureEngagementInitialized,
-                     weak_ptr_factory_.GetWeakPtr()));
+  browser_view_->MaybeShowStartupFeaturePromo(
+      feature_engagement::kIPHBatterySaverModeFeature);
 }
 
 void BatterySaverButton::CloseFeaturePromo() {
diff --git a/chrome/browser/ui/views/performance_controls/battery_saver_button.h b/chrome/browser/ui/views/performance_controls/battery_saver_button.h
index 23a62151..9d2367a 100644
--- a/chrome/browser/ui/views/performance_controls/battery_saver_button.h
+++ b/chrome/browser/ui/views/performance_controls/battery_saver_button.h
@@ -50,7 +50,6 @@
   // Handles press events from the button
   void OnClicked();
 
-  void OnFeatureEngagementInitialized(bool);
   void MaybeShowFeaturePromo();
   void CloseFeaturePromo();
 
diff --git a/chrome/browser/ui/views/performance_controls/battery_saver_button_browsertest.cc b/chrome/browser/ui/views/performance_controls/battery_saver_button_browsertest.cc
index 3fb3e05..d1f87038 100644
--- a/chrome/browser/ui/views/performance_controls/battery_saver_button_browsertest.cc
+++ b/chrome/browser/ui/views/performance_controls/battery_saver_button_browsertest.cc
@@ -108,6 +108,29 @@
   EXPECT_FALSE(promo_active);
 }
 
+// Check if the battery saver in-product help promo is closed if the promo is
+// active when the mode is deactivated.
+IN_PROC_BROWSER_TEST_F(BatterySaverHelpPromoTest, HidePromoOnModeDeactivation) {
+  auto lock = BrowserFeaturePromoController::BlockActiveWindowCheckForTesting();
+
+  bool initialized = WaitForFeatureTrackerInitialization();
+  EXPECT_TRUE(initialized);
+
+  SetBatterySaverModeEnabled(true);
+  base::RunLoop().RunUntilIdle();
+
+  bool promo_active = GetFeaturePromoController()->IsPromoActive(
+      feature_engagement::kIPHBatterySaverModeFeature);
+  EXPECT_TRUE(promo_active);
+
+  SetBatterySaverModeEnabled(false);
+  base::RunLoop().RunUntilIdle();
+
+  promo_active = GetFeaturePromoController()->IsPromoActive(
+      feature_engagement::kIPHBatterySaverModeFeature);
+  EXPECT_FALSE(promo_active);
+}
+
 // Confirm that the navigation to the performance settings page happens when
 // custom action button for battery saver promo bubble is clicked.
 IN_PROC_BROWSER_TEST_F(BatterySaverHelpPromoTest, PromoCustomActionClicked) {
@@ -133,8 +156,8 @@
   PressButton(custom_action_button);
   navigation_observer.Wait();
 
-  GURL expected(chrome::kChromeUIPerformanceSettingsURL);
-  EXPECT_EQ(expected.host(), navigation_observer.last_navigation_url().host());
+  GURL expected_url(chrome::kChromeUIPerformanceSettingsURL);
+  EXPECT_EQ(expected_url, navigation_observer.last_navigation_url());
 }
 
 class BatterySaverBubbleViewTest : public InProcessBrowserTest {
diff --git a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc
index 5b22944..ad2f14f0 100644
--- a/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc
+++ b/chrome/browser/ui/views/safe_browsing/tailored_security_desktop_dialog.cc
@@ -32,40 +32,41 @@
 DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kBodyText);
 }  // namespace
 
-// Model delegate for the disabled dialog. This class implements the click
-// behavior for the disabled dialog.
-class DisabledDialogModelDelegate : public ui::DialogModelDelegate {
+// Base model delegate for the Tailored Security dialogs. This class implements
+// the click behavior for the dialogs.
+class TailoredSecurityDialogModelDelegate : public ui::DialogModelDelegate {
  public:
+  explicit TailoredSecurityDialogModelDelegate(const char* kOutcomeMetricName)
+      : kOutcomeMetricName_(kOutcomeMetricName) {}
+
   void OnDialogAccepted() {
     // Just count the click.
-    base::UmaHistogramEnumeration(kDisabledDialogOutcome,
+    base::UmaHistogramEnumeration(kOutcomeMetricName_,
                                   TailoredSecurityOutcome::kAccepted);
   }
+
   void OnDialogRejected(Browser* browser) {
     // Redirect to the Chrome safe browsing settings page.
-    base::UmaHistogramEnumeration(kDisabledDialogOutcome,
+    base::UmaHistogramEnumeration(kOutcomeMetricName_,
                                   TailoredSecurityOutcome::kSettings);
 
     chrome::ShowSafeBrowsingEnhancedProtection(browser);
   }
+
+ private:
+  const std::string kOutcomeMetricName_;
 };
 
-// Model delegate for the enabled dialog. This class implements the click
-// behavior for the enabled dialog.
-class EnabledDialogModelDelegate : public ui::DialogModelDelegate {
+class DisabledDialogModelDelegate : public TailoredSecurityDialogModelDelegate {
  public:
-  void OnDialogAccepted() {
-    // Just count the click.
-    base::UmaHistogramEnumeration(kEnabledDialogOutcome,
-                                  TailoredSecurityOutcome::kAccepted);
-  }
-  void OnDialogRejected(Browser* browser) {
-    // Redirect to the Chrome safe browsing settings page.
-    base::UmaHistogramEnumeration(kEnabledDialogOutcome,
-                                  TailoredSecurityOutcome::kSettings);
+  DisabledDialogModelDelegate()
+      : TailoredSecurityDialogModelDelegate(kDisabledDialogOutcome) {}
+};
 
-    chrome::ShowSafeBrowsingEnhancedProtection(browser);
-  }
+class EnabledDialogModelDelegate : public TailoredSecurityDialogModelDelegate {
+ public:
+  EnabledDialogModelDelegate()
+      : TailoredSecurityDialogModelDelegate(kEnabledDialogOutcome) {}
 };
 
 void ShowEnabledDialogForBrowser(Browser* browser) {
diff --git a/chrome/browser/ui/webui/engagement/site_engagement_ui.cc b/chrome/browser/ui/webui/engagement/site_engagement_ui.cc
index 34f8b87..06f43f4 100644
--- a/chrome/browser/ui/webui/engagement/site_engagement_ui.cc
+++ b/chrome/browser/ui/webui/engagement/site_engagement_ui.cc
@@ -99,7 +99,7 @@
       content::WebUIDataSource::Create(chrome::kChromeUISiteEngagementHost));
   source->OverrideContentSecurityPolicy(
       network::mojom::CSPDirectiveName::ScriptSrc,
-      "script-src chrome://resources chrome://test 'self';");
+      "script-src chrome://resources chrome://webui-test 'self';");
   source->AddResourcePath("site_engagement.js", IDR_SITE_ENGAGEMENT_JS);
   source->AddResourcePath("site_engagement_details.mojom-webui.js",
                           IDR_SITE_ENGAGEMENT_DETAILS_MOJOM_WEBUI_JS);
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
index e9d6466..2b2769d 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -157,13 +157,11 @@
 };
 
 struct PromoLinkPart {
-  string? color;
   string text;
   url.mojom.Url url;
 };
 
 struct PromoTextPart {
-  string? color;
   string text;
 };
 
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index 780575a8..d8665208 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -378,10 +378,6 @@
           continue;
         }
         mojom_link->text = *text;
-        auto* color = part_dict.FindStringByDottedPath("link.color");
-        if (color && !color->empty()) {
-          mojom_link->color = *color;
-        }
         mojom_parts.push_back(
             new_tab_page::mojom::PromoPart::NewLink(std::move(mojom_link)));
       } else if (part_dict.Find("text")) {
@@ -391,10 +387,6 @@
           continue;
         }
         mojom_text->text = *text;
-        auto* color = part_dict.FindStringByDottedPath("text.color");
-        if (color && !color->empty()) {
-          mojom_text->color = *color;
-        }
         mojom_parts.push_back(
             new_tab_page::mojom::PromoPart::NewText(std::move(mojom_text)));
       }
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
index ec6aa14..5422a8e0 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
@@ -602,12 +602,10 @@
   EXPECT_EQ("https://image.com/target", image->target);
   ASSERT_TRUE(promo->middle_slot_parts[1]->is_link());
   const auto& link = promo->middle_slot_parts[1]->get_link();
-  EXPECT_EQ("red", link->color);
   EXPECT_EQ("bar", link->text);
   EXPECT_EQ("https://link.com/", link->url);
   ASSERT_TRUE(promo->middle_slot_parts[2]->is_text());
   const auto& text = promo->middle_slot_parts[2]->get_text();
-  EXPECT_EQ("green", text->color);
   EXPECT_EQ("blub", text->text);
 }
 
diff --git a/chrome/browser/web_applications/app_service/lacros_web_apps_controller_browsertest.cc b/chrome/browser/web_applications/app_service/lacros_web_apps_controller_browsertest.cc
index 19ff7a47..939d2af 100644
--- a/chrome/browser/web_applications/app_service/lacros_web_apps_controller_browsertest.cc
+++ b/chrome/browser/web_applications/app_service/lacros_web_apps_controller_browsertest.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/web_applications/app_service/lacros_web_apps_controller.h"
 
-#include <algorithm>
 #include <iterator>
 #include <memory>
 #include <vector>
@@ -14,6 +13,7 @@
 #include "base/files/scoped_file.h"
 #include "base/location.h"
 #include "base/notreached.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -417,11 +417,9 @@
 
   const std::vector<apps::PermissionPtr>& permissions =
       mock_app_publisher.get_deltas().back()->permissions;
-  auto camera_permission = std::find_if(
-      permissions.begin(), permissions.end(),
-      [](const apps::PermissionPtr& permission) {
-        return permission->permission_type == apps::PermissionType::kCamera;
-      });
+  auto camera_permission =
+      base::ranges::find(permissions, apps::PermissionType::kCamera,
+                         &apps::Permission::permission_type);
   ASSERT_TRUE(camera_permission != permissions.end());
   EXPECT_TRUE(absl::holds_alternative<apps::TriState>(
       (*camera_permission)->value->value));
diff --git a/chrome/browser/web_applications/os_integration/icns_encoder.cc b/chrome/browser/web_applications/os_integration/icns_encoder.cc
index 0381a3c..26b27c7 100644
--- a/chrome/browser/web_applications/os_integration/icns_encoder.cc
+++ b/chrome/browser/web_applications/os_integration/icns_encoder.cc
@@ -94,8 +94,8 @@
       bitmap.width() != bitmap.height())
     return false;
 
-  const IcnsBlockTypes* block_types = base::ranges::find_if(
-      kIcnsBlockTypes, [&](const auto& t) { return t.size == bitmap.width(); });
+  const IcnsBlockTypes* block_types = base::ranges::find(
+      kIcnsBlockTypes, bitmap.width(), &IcnsBlockTypes::size);
   if (block_types == std::end(kIcnsBlockTypes))
     return false;
 
diff --git a/chrome/browser/web_applications/policy/web_app_policy_manager.cc b/chrome/browser/web_applications/policy/web_app_policy_manager.cc
index cc498e1..e2dd78a 100644
--- a/chrome/browser/web_applications/policy/web_app_policy_manager.cc
+++ b/chrome/browser/web_applications/policy/web_app_policy_manager.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/web_applications/policy/web_app_policy_manager.h"
 
-#include <algorithm>
 #include <utility>
 #include <vector>
 
@@ -17,6 +16,7 @@
 #include "base/containers/flat_set.h"
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/syslog_logging.h"
 #include "base/values.h"
@@ -121,11 +121,10 @@
       pref_service_->GetList(prefs::kWebAppInstallForceList);
   const auto& web_apps_list = web_apps;
 
-  const auto it =
-      std::find_if(web_apps_list.begin(), web_apps_list.end(),
-                   [&url](const base::Value& entry) {
-                     return entry.FindKey(kUrlKey)->GetString() == url.spec();
-                   });
+  const auto it = base::ranges::find(
+      web_apps_list, url.spec(), [](const base::Value& entry) {
+        return entry.FindKey(kUrlKey)->GetString();
+      });
 
   bool is_placeholder_url =
       app_registrar_->LookupPlaceholderAppId(url, WebAppManagement::kPolicy)
@@ -291,9 +290,9 @@
   default_settings_ = std::make_unique<WebAppPolicyManager::WebAppSetting>();
 
   // Read default policy, if provided.
-  const auto it = std::find_if(
-      web_apps_list.begin(), web_apps_list.end(), [](const base::Value& entry) {
-        return entry.FindKey(kManifestId)->GetString() == kWildcard;
+  const auto it = base::ranges::find(
+      web_apps_list, kWildcard, [](const base::Value& entry) {
+        return entry.FindKey(kManifestId)->GetString();
       });
 
   if (it != web_apps_list.end() && it->is_dict()) {
diff --git a/chrome/browser/web_applications/policy/web_app_settings_policy_handler.cc b/chrome/browser/web_applications/policy/web_app_settings_policy_handler.cc
index 05ea5da6..4556474 100644
--- a/chrome/browser/web_applications/policy/web_app_settings_policy_handler.cc
+++ b/chrome/browser/web_applications/policy/web_app_settings_policy_handler.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/web_applications/policy/web_app_settings_policy_handler.h"
 
+#include "base/ranges/algorithm.h"
 #include "chrome/browser/web_applications/policy/web_app_policy_constants.h"
 #include "chrome/common/pref_names.h"
 #include "components/policy/core/browser/policy_error_map.h"
@@ -39,9 +40,9 @@
 
   const auto& web_apps_list =
       policy_entry->value(base::Value::Type::LIST)->GetList();
-  const auto it = std::find_if(
-      web_apps_list.begin(), web_apps_list.end(), [](const base::Value& entry) {
-        return entry.FindKey(kManifestId)->GetString() == kWildcard;
+  const auto it = base::ranges::find(
+      web_apps_list, kWildcard, [](const base::Value& entry) {
+        return entry.FindKey(kManifestId)->GetString();
       });
 
   if (it != web_apps_list.end() && it->is_dict()) {
diff --git a/chrome/browser/web_applications/url_handler_prefs.cc b/chrome/browser/web_applications/url_handler_prefs.cc
index 95a3648..657ebd6e 100644
--- a/chrome/browser/web_applications/url_handler_prefs.cc
+++ b/chrome/browser/web_applications/url_handler_prefs.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/web_applications/url_handler_prefs.h"
 
-#include <algorithm>
 #include <string>
 #include <utility>
 #include <vector>
@@ -723,12 +722,11 @@
         pref_value->GetDict().FindList(origin.Serialize());
     // One or more apps are already associated with this origin.
     if (handlers) {
-      auto it =
-          std::find_if(handlers->begin(), handlers->end(),
-                       [&app_id, &profile_path](const base::Value& handler) {
-                         return IsHandlerForApp(app_id, profile_path,
-                                                /*match_app_id=*/true, handler);
-                       });
+      auto it = base::ranges::find_if(
+          *handlers, [&app_id, &profile_path](const base::Value& handler) {
+            return IsHandlerForApp(app_id, profile_path,
+                                   /*match_app_id=*/true, handler);
+          });
       // If there is already an entry with the same app_id and profile, replace
       // it. Otherwise, add new entry to the end.
       if (it != handlers->end()) {
diff --git a/chrome/browser/web_applications/web_app_install_utils.cc b/chrome/browser/web_applications/web_app_install_utils.cc
index 801de76..6556060 100644
--- a/chrome/browser/web_applications/web_app_install_utils.cc
+++ b/chrome/browser/web_applications/web_app_install_utils.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 
-#include <algorithm>
 #include <array>
 #include <iterator>
 #include <map>
@@ -155,8 +154,8 @@
         WebAppShortcutsMenuItemInfo::Icon info;
 
         // Filter out non-square or too large icons.
-        auto valid_size_it = std::find_if(
-            icon.sizes.begin(), icon.sizes.end(), [](const gfx::Size& size) {
+        auto valid_size_it =
+            base::ranges::find_if(icon.sizes, [](const gfx::Size& size) {
               return size.width() == size.height() &&
                      size.width() <= kMaxIconSize;
             });
@@ -513,11 +512,11 @@
 
       if (!icon.sizes.empty()) {
         // Filter out non-square or too large icons.
-        auto valid_size = std::find_if(icon.sizes.begin(), icon.sizes.end(),
-                                       [](const gfx::Size& size) {
-                                         return size.width() == size.height() &&
-                                                size.width() <= kMaxIconSize;
-                                       });
+        auto valid_size =
+            base::ranges::find_if(icon.sizes, [](const gfx::Size& size) {
+              return size.width() == size.height() &&
+                     size.width() <= kMaxIconSize;
+            });
         if (valid_size == icon.sizes.end())
           continue;
         // TODO(https://crbug.com/1071308): Take the declared icon density and
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 69afb5bd..b595090 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1663329097-732fe32eaf2ca3fa8f301fab91984c0bf1379bb1.profdata
+chrome-linux-main-1663351186-c5d93aee8392d582bf6b70aaaeb80841cfb87433.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index fa642831..4391af0 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1663307958-fa2c701ff080458af388dda04537fc79969d5f8a.profdata
+chrome-mac-arm-main-1663351186-0ddaeeeaaa4c799cb365b1a98fc3165f6664eb1b.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 2462a645..cb10d7c 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1663329097-fa427bf3ed911873792bb35a6a2aa289ae9c2190.profdata
+chrome-mac-main-1663351186-e8cbb9cb34377e0db3f4f670f8460cdf3139a9aa.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 854db8b..493dfa98 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1663329097-ac334d2f071777500e10728ffc0557f546146a49.profdata
+chrome-win32-main-1663351186-4ee81464e36da407559106174b054996d1edf46f.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 1b23a37..c23a5c2 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1663329097-a2e42278b10d979eb2e49d13d59a10e0df349897.profdata
+chrome-win64-main-1663351186-78eb8dc64f75cb9f8b65eb73f09a91b6a2776749.profdata
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 69c8bc71..5e4b93b 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6398,6 +6398,7 @@
       "../browser/reputation/safety_tip_message_delegate_android_unittest.cc",
       "../browser/search/contextual_search_policy_handler_android_unittest.cc",
       "../browser/segmentation_platform/default_model/chrome_start_model_android_unittest.cc",
+      "../browser/segmentation_platform/default_model/chrome_start_model_android_v2_unittest.cc",
       "../browser/sharing/click_to_call/click_to_call_message_handler_android_unittest.cc",
       "../browser/sharing/optimization_guide/optimization_guide_message_handler_unittest.cc",
       "../browser/sharing/sms/sms_fetch_request_handler_unittest.cc",
@@ -7372,6 +7373,7 @@
       "../browser/ui/ash/multi_user/multi_user_util_chromeos_unittest.cc",
       "../browser/ui/ash/network/mobile_data_notifications_unittest.cc",
       "../browser/ui/ash/network/network_portal_notification_controller_unittest.cc",
+      "../browser/ui/ash/network/network_portal_signin_controller_unittest.cc",
       "../browser/ui/ash/network/network_state_notifier_unittest.cc",
       "../browser/ui/ash/network/tether_notification_presenter_unittest.cc",
       "../browser/ui/ash/projector/projector_client_impl_unittest.cc",
diff --git a/chrome/test/chromedriver/alert_commands.cc b/chrome/test/chromedriver/alert_commands.cc
index 1a92c3a..fe1b585 100644
--- a/chrome/test/chromedriver/alert_commands.cc
+++ b/chrome/test/chromedriver/alert_commands.cc
@@ -18,7 +18,7 @@
 
 Status ExecuteAlertCommand(const AlertCommand& alert_command,
                            Session* session,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
@@ -38,7 +38,9 @@
   if (status.IsError() && status.code() != kUnexpectedAlertOpen)
     return status;
 
-  return alert_command.Run(session, web_view, params, value);
+  return alert_command.Run(
+      session, web_view,
+      base::Value::AsDictionaryValue(base::Value(params.Clone())), value);
 }
 
 Status ExecuteGetAlert(Session* session,
diff --git a/chrome/test/chromedriver/alert_commands.h b/chrome/test/chromedriver/alert_commands.h
index 403f3ef..e26c2703 100644
--- a/chrome/test/chromedriver/alert_commands.h
+++ b/chrome/test/chromedriver/alert_commands.h
@@ -8,11 +8,7 @@
 #include <memory>
 
 #include "base/callback_forward.h"
-
-namespace base {
-class DictionaryValue;
-class Value;
-}
+#include "base/values.h"
 
 struct Session;
 class Status;
@@ -27,7 +23,7 @@
 // Executes an alert command.
 Status ExecuteAlertCommand(const AlertCommand& alert_command,
                            Session* session,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value);
 
 // Returns whether an alert is open.
diff --git a/chrome/test/chromedriver/capabilities.cc b/chrome/test/chromedriver/capabilities.cc
index f2ab336..3804db57 100644
--- a/chrome/test/chromedriver/capabilities.cc
+++ b/chrome/test/chromedriver/capabilities.cc
@@ -245,7 +245,8 @@
       else
         return Status(kInvalidArgument, "timeout can not be null");
     } else {
-      if (!GetOptionalSafeInt(timeouts, it.first, &timeout_ms_int64) ||
+      if (!GetOptionalSafeInt(timeouts->GetDict(), it.first,
+                              &timeout_ms_int64) ||
           timeout_ms_int64 < 0)
         return Status(kInvalidArgument, "value must be a non-negative integer");
       else
@@ -653,14 +654,30 @@
 }
 }  // namespace
 
-bool GetChromeOptionsDictionary(const base::DictionaryValue& params,
-                                const base::DictionaryValue** out) {
+bool GetChromeOptionsDictionaryDeprecated(const base::DictionaryValue& params,
+                                          const base::DictionaryValue** out) {
   if (params.GetDictionary(kChromeDriverOptionsKeyPrefixed, out)) {
     return true;
   }
   return params.GetDictionary(kChromeDriverOptionsKey, out);
 }
 
+bool GetChromeOptionsDictionary(const base::Value::Dict& params,
+                                const base::Value::Dict** out) {
+  const base::Value::Dict* result =
+      params.FindDict(kChromeDriverOptionsKeyPrefixed);
+  if (result) {
+    *out = result;
+    return true;
+  }
+  result = params.FindDict(kChromeDriverOptionsKey);
+  if (result) {
+    *out = result;
+    return true;
+  }
+  return false;
+}
+
 Switches::Switches() {}
 
 Switches::Switches(const Switches& other) = default;
@@ -875,7 +892,7 @@
   // mobile emulation is on.
 
   const base::DictionaryValue* chrome_options = nullptr;
-  if (GetChromeOptionsDictionary(desired_caps, &chrome_options) &&
+  if (GetChromeOptionsDictionaryDeprecated(desired_caps, &chrome_options) &&
       chrome_options->GetDictionary("mobileEmulation", nullptr)) {
     parser_map["networkConnectionEnabled"] =
         base::BindRepeating(&ParseBoolean, &network_emulation_enabled);
@@ -905,7 +922,7 @@
   LoggingPrefs::const_iterator iter = logging_prefs.find(
       WebDriverLog::kPerformanceType);
   if (iter == logging_prefs.end() || iter->second == Log::kOff) {
-    if (GetChromeOptionsDictionary(desired_caps, &chrome_options) &&
+    if (GetChromeOptionsDictionaryDeprecated(desired_caps, &chrome_options) &&
         chrome_options->FindKey("perfLoggingPrefs")) {
       return Status(kInvalidArgument,
                     "perfLoggingPrefs specified, "
@@ -916,7 +933,7 @@
       WebDriverLog::kDevToolsType);
   if (dt_events_logging_iter == logging_prefs.end()
       || dt_events_logging_iter->second == Log::kOff) {
-    if (GetChromeOptionsDictionary(desired_caps, &chrome_options) &&
+    if (GetChromeOptionsDictionaryDeprecated(desired_caps, &chrome_options) &&
         chrome_options->FindKey("devToolsEventsToLog")) {
       return Status(kInvalidArgument,
                     "devToolsEventsToLog specified, "
diff --git a/chrome/test/chromedriver/capabilities.h b/chrome/test/chromedriver/capabilities.h
index d163277a..64b1dae 100644
--- a/chrome/test/chromedriver/capabilities.h
+++ b/chrome/test/chromedriver/capabilities.h
@@ -192,7 +192,10 @@
   bool webSocketUrl = false;
 };
 
-bool GetChromeOptionsDictionary(const base::DictionaryValue& params,
-                                const base::DictionaryValue** out);
+bool GetChromeOptionsDictionaryDeprecated(const base::DictionaryValue& params,
+                                          const base::DictionaryValue** out);
+
+bool GetChromeOptionsDictionary(const base::Value::Dict& params,
+                                const base::Value::Dict** out);
 
 #endif  // CHROME_TEST_CHROMEDRIVER_CAPABILITIES_H_
diff --git a/chrome/test/chromedriver/chrome/chrome_impl.cc b/chrome/test/chromedriver/chrome/chrome_impl.cc
index eb435b71..23ab3ee 100644
--- a/chrome/test/chromedriver/chrome/chrome_impl.cc
+++ b/chrome/test/chromedriver/chrome/chrome_impl.cc
@@ -5,13 +5,14 @@
 #include "chrome/test/chromedriver/chrome/chrome_impl.h"
 
 #include <stddef.h>
-#include <algorithm>
+
 #include <memory>
 #include <utility>
 
 #include "base/bind.h"
 #include "base/check.h"
 #include "base/logging.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
@@ -701,9 +702,7 @@
     return status;
   }
 
-  auto it =
-      std::find_if(web_views_.begin(), web_views_.end(),
-                   [&id](const auto& view) { return view->GetId() == id; });
+  auto it = base::ranges::find(web_views_, id, &WebViewImpl::GetId);
   if (it != web_views_.end()) {
     web_views_.erase(it);
   }
diff --git a/chrome/test/chromedriver/chrome/device_manager.cc b/chrome/test/chromedriver/chrome/device_manager.cc
index 3907065..fa20dfce 100644
--- a/chrome/test/chromedriver/chrome/device_manager.cc
+++ b/chrome/test/chromedriver/chrome/device_manager.cc
@@ -4,7 +4,6 @@
 
 #include "chrome/test/chromedriver/chrome/device_manager.h"
 
-#include <algorithm>
 #include <vector>
 
 #include "base/bind.h"
@@ -12,6 +11,7 @@
 #include "base/callback_helpers.h"
 #include "base/check.h"
 #include "base/containers/contains.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
@@ -33,9 +33,7 @@
 
 // Only allow completely alpha exec names.
 bool IsValidExecName(const std::string& exec_name) {
-  return std::find_if_not(exec_name.begin(), exec_name.end(), [](char ch) {
-           return base::IsAsciiAlpha(ch);
-         }) == exec_name.end();
+  return base::ranges::all_of(exec_name, &base::IsAsciiAlpha<char>);
 }
 
 Status Device::SetUp(const std::string& package,
diff --git a/chrome/test/chromedriver/chrome/page_tracker.cc b/chrome/test/chromedriver/chrome/page_tracker.cc
index 9da0426..325ec686 100644
--- a/chrome/test/chromedriver/chrome/page_tracker.cc
+++ b/chrome/test/chromedriver/chrome/page_tracker.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "base/ranges/algorithm.h"
 #include "base/values.h"
 #include "chrome/test/chromedriver/chrome/devtools_client.h"
 #include "chrome/test/chromedriver/chrome/status.h"
@@ -33,11 +34,7 @@
       // Some types of Target.detachedFromTarget events do not have targetId.
       // We are not interested in those types of targets.
       return Status(kOk);
-    auto it = std::find_if(
-        web_views_->begin(), web_views_->end(),
-        [id = *target_id](const std::unique_ptr<WebViewImpl>& view) {
-          return view->GetId() == id;
-        });
+    auto it = base::ranges::find(*web_views_, *target_id, &WebViewImpl::GetId);
     if (it == web_views_->end()) {
       // There are some target types that we're not keeping track of, thus not
       // finding the target in frame_to_target_map_ is OK.
diff --git a/chrome/test/chromedriver/command.h b/chrome/test/chromedriver/command.h
index f612063a..df853d32 100644
--- a/chrome/test/chromedriver/command.h
+++ b/chrome/test/chromedriver/command.h
@@ -9,11 +9,7 @@
 #include <string>
 
 #include "base/callback_forward.h"
-
-namespace base {
-class DictionaryValue;
-class Value;
-}
+#include "base/values.h"
 
 class Status;
 
@@ -21,9 +17,8 @@
     void(const Status&, std::unique_ptr<base::Value>, const std::string&, bool)>
     CommandCallback;
 
-typedef base::RepeatingCallback<void(const base::DictionaryValue&,
-                                     const std::string&,
-                                     const CommandCallback&)>
+typedef base::RepeatingCallback<
+    void(const base::Value::Dict&, const std::string&, const CommandCallback&)>
     Command;
 
 #endif  // CHROME_TEST_CHROMEDRIVER_COMMAND_H_
diff --git a/chrome/test/chromedriver/commands.cc b/chrome/test/chromedriver/commands.cc
index d96d5d16..0434dba9 100644
--- a/chrome/test/chromedriver/commands.cc
+++ b/chrome/test/chromedriver/commands.cc
@@ -34,10 +34,9 @@
 #include "chrome/test/chromedriver/session_thread_map.h"
 #include "chrome/test/chromedriver/util.h"
 
-void ExecuteGetStatus(
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback) {
+void ExecuteGetStatus(const base::Value::Dict& params,
+                      const std::string& session_id,
+                      const CommandCallback& callback) {
   // W3C defined data:
   // ChromeDriver doesn't have a preset limit on number of active sessions,
   // so we are always ready.
@@ -64,7 +63,7 @@
 
 void ExecuteCreateSession(SessionThreadMap* session_thread_map,
                           const Command& init_session_cmd,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           const std::string& host,
                           const CommandCallback& callback) {
   std::string new_id = GenerateId();
@@ -116,7 +115,7 @@
 
 void ExecuteGetSessions(const Command& session_capabilities_command,
                         SessionThreadMap* session_thread_map,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         const std::string& session_id,
                         const CommandCallback& callback) {
   size_t get_remaining_count = session_thread_map->size();
@@ -163,12 +162,11 @@
 
 }  // namespace
 
-void ExecuteQuitAll(
-    const Command& quit_command,
-    SessionThreadMap* session_thread_map,
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback) {
+void ExecuteQuitAll(const Command& quit_command,
+                    SessionThreadMap* session_thread_map,
+                    const base::Value::Dict& params,
+                    const std::string& session_id,
+                    const CommandCallback& callback) {
   size_t quit_remaining_count = session_thread_map->size();
   base::WeakPtrFactory<size_t> weak_ptr_factory(&quit_remaining_count);
   if (!quit_remaining_count) {
@@ -206,7 +204,7 @@
     const SessionCommand& command,
     bool w3c_standard_command,
     bool return_ok_without_session,
-    std::unique_ptr<base::DictionaryValue> params,
+    const base::Value::Dict& params,
     scoped_refptr<base::SingleThreadTaskRunner> cmd_task_runner,
     const CommandCallback& callback_on_cmd,
     const base::RepeatingClosure& terminate_on_cmd) {
@@ -228,7 +226,8 @@
       // Note: ChromeDriver log-replay depends on the format of this logging.
       // see chromedriver/log_replay/client_replay.py
       VLOG(0) << "[" << session->id << "] "
-              << "COMMAND " << command_name << " " << PrettyPrintValue(*params);
+              << "COMMAND " << command_name << " "
+              << PrettyPrintValue(base::Value(params.Clone()));
     }
   }
 
@@ -259,7 +258,7 @@
     if (status.IsError()) {
       LOG(ERROR) << status.message();
     } else {
-      status = command.Run(session, *params, &value);
+      status = command.Run(session, params, &value);
 
       if (status.IsError() && session->chrome) {
         if (!session->quit && session->chrome->HasCrashedWebView()) {
@@ -332,7 +331,7 @@
                            const SessionCommand& command,
                            bool w3c_standard_command,
                            bool return_ok_without_session,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            const std::string& session_id,
                            const CommandCallback& callback) {
   auto iter = session_thread_map->find(session_id);
@@ -346,9 +345,7 @@
         base::BindOnce(
             &ExecuteSessionCommandOnSessionThread, command_name, session_id,
             command, w3c_standard_command, return_ok_without_session,
-            base::DictionaryValue::From(
-                base::Value::ToUniquePtrValue(params.Clone())),
-            base::ThreadTaskRunnerHandle::Get(), callback,
+            params.Clone(), base::ThreadTaskRunnerHandle::Get(), callback,
             base::BindRepeating(&TerminateSessionThreadOnCommandThread,
                                 session_thread_map, session_id)));
   }
diff --git a/chrome/test/chromedriver/commands.h b/chrome/test/chromedriver/commands.h
index 6aee884..89454b9 100644
--- a/chrome/test/chromedriver/commands.h
+++ b/chrome/test/chromedriver/commands.h
@@ -10,48 +10,41 @@
 
 #include "base/callback_forward.h"
 #include "base/memory/ref_counted.h"
+#include "base/values.h"
 #include "chrome/test/chromedriver/command.h"
 #include "chrome/test/chromedriver/session_thread_map.h"
 
-namespace base {
-class DictionaryValue;
-class Value;
-}
-
 struct Session;
 class Status;
 
 // Gets status/info about ChromeDriver.
-void ExecuteGetStatus(
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback);
+void ExecuteGetStatus(const base::Value::Dict& params,
+                      const std::string& session_id,
+                      const CommandCallback& callback);
 
 // Creates a new session.
 void ExecuteCreateSession(SessionThreadMap* session_thread_map,
                           const Command& init_session_cmd,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           const std::string& host,
                           const CommandCallback& callback);
 
 // Gets all sessions
-void ExecuteGetSessions(
-    const Command& session_capabilities_command,
-    SessionThreadMap* session_thread_map,
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback);
+void ExecuteGetSessions(const Command& session_capabilities_command,
+                        SessionThreadMap* session_thread_map,
+                        const base::Value::Dict& params,
+                        const std::string& session_id,
+                        const CommandCallback& callback);
 
 // Quits all sessions.
-void ExecuteQuitAll(
-    const Command& quit_command,
-    SessionThreadMap* session_thread_map,
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback);
+void ExecuteQuitAll(const Command& quit_command,
+                    SessionThreadMap* session_thread_map,
+                    const base::Value::Dict& params,
+                    const std::string& session_id,
+                    const CommandCallback& callback);
 
 typedef base::RepeatingCallback<Status(Session* session,
-                                       const base::DictionaryValue&,
+                                       const base::Value::Dict&,
                                        std::unique_ptr<base::Value>*)>
     SessionCommand;
 
@@ -62,7 +55,7 @@
                            const SessionCommand& command,
                            bool w3c_standard_command,
                            bool return_ok_without_session,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            const std::string& session_id,
                            const CommandCallback& callback);
 
diff --git a/chrome/test/chromedriver/commands_unittest.cc b/chrome/test/chromedriver/commands_unittest.cc
index 510fa96..acd11a8a 100644
--- a/chrome/test/chromedriver/commands_unittest.cc
+++ b/chrome/test/chromedriver/commands_unittest.cc
@@ -55,15 +55,14 @@
 }  // namespace
 
 TEST(CommandsTest, GetStatus) {
-  base::Value params(base::Value::Type::DICTIONARY);
-  ExecuteGetStatus(base::Value::AsDictionaryValue(params), std::string(),
-                   base::BindRepeating(&OnGetStatus));
+  base::Value::Dict params;
+  ExecuteGetStatus(params, std::string(), base::BindRepeating(&OnGetStatus));
 }
 
 namespace {
 
 void ExecuteStubGetSession(int* count,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            const std::string& session_id,
                            const CommandCallback& callback) {
   if (*count == 0) {
@@ -149,21 +148,20 @@
 
   Command cmd = base::BindRepeating(&ExecuteStubGetSession, &count);
 
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   base::test::SingleThreadTaskEnvironment task_environment;
 
-  ExecuteGetSessions(cmd, &map, base::Value::AsDictionaryValue(params),
-                     std::string(), base::BindRepeating(&OnGetSessions));
+  ExecuteGetSessions(cmd, &map, params, std::string(),
+                     base::BindRepeating(&OnGetSessions));
   ASSERT_EQ(2, count);
 }
 
 namespace {
 
-void ExecuteStubQuit(
-    int* count,
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback) {
+void ExecuteStubQuit(int* count,
+                     const base::Value::Dict& params,
+                     const std::string& session_id,
+                     const CommandCallback& callback) {
   if (*count == 0) {
     EXPECT_STREQ("id", session_id.c_str());
   } else {
@@ -192,22 +190,21 @@
 
   int count = 0;
   Command cmd = base::BindRepeating(&ExecuteStubQuit, &count);
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   base::test::SingleThreadTaskEnvironment task_environment;
-  ExecuteQuitAll(cmd, &map, base::Value::AsDictionaryValue(params),
-                 std::string(), base::BindRepeating(&OnQuitAll));
+  ExecuteQuitAll(cmd, &map, params, std::string(),
+                 base::BindRepeating(&OnQuitAll));
   ASSERT_EQ(2, count);
 }
 
 namespace {
 
 Status ExecuteSimpleCommand(const std::string& expected_id,
-                            base::Value* expected_params,
+                            base::Value::Dict* expected_params,
                             base::Value* value,
                             Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* return_value) {
-  EXPECT_TRUE(expected_params->is_dict());
   EXPECT_EQ(expected_id, session->id);
   EXPECT_EQ(*expected_params, params);
   *return_value = base::Value::ToUniquePtrValue(value->Clone());
@@ -241,8 +238,8 @@
       base::BindOnce(&internal::CreateSessionOnSessionThreadForTesting, id));
   map[id] = std::move(threadInfo);
 
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetIntKey("param", 5);
+  base::Value::Dict params;
+  params.Set("param", 5);
   base::Value expected_value(6);
   SessionCommand cmd =
       base::BindRepeating(&ExecuteSimpleCommand, id, &params, &expected_value);
@@ -250,8 +247,7 @@
   base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
   ExecuteSessionCommand(
-      &map, "cmd", cmd, true /*w3c_standard_command*/, false,
-      base::Value::AsDictionaryValue(params), id,
+      &map, "cmd", cmd, true /*w3c_standard_command*/, false, params, id,
       base::BindRepeating(&OnSimpleCommand, &run_loop, id, &expected_value));
   run_loop.Run();
 }
@@ -259,7 +255,7 @@
 namespace {
 
 Status ShouldNotBeCalled(Session* session,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value) {
   EXPECT_TRUE(false);
   return Status(kOk);
@@ -285,19 +281,17 @@
 
 TEST(CommandsTest, ExecuteSessionCommandOnNoSuchSession) {
   SessionThreadMap map;
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   ExecuteSessionCommand(&map, "cmd", base::BindRepeating(&ShouldNotBeCalled),
-                        true /*w3c_standard_command*/, false,
-                        base::Value::AsDictionaryValue(params), "session",
+                        true /*w3c_standard_command*/, false, params, "session",
                         base::BindRepeating(&OnNoSuchSession));
 }
 
 TEST(CommandsTest, ExecuteSessionCommandOnNoSuchSessionWhenItExpectsOk) {
   SessionThreadMap map;
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   ExecuteSessionCommand(&map, "cmd", base::BindRepeating(&ShouldNotBeCalled),
-                        true /*w3c_standard_command*/, true,
-                        base::Value::AsDictionaryValue(params), "session",
+                        true /*w3c_standard_command*/, true, params, "session",
                         base::BindRepeating(&OnNoSuchSessionIsOk));
 }
 
@@ -323,12 +317,11 @@
   map[id] = std::move(threadInfo);
 
   base::test::SingleThreadTaskEnvironment task_environment;
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   base::RunLoop run_loop;
   ExecuteSessionCommand(
       &map, "cmd", base::BindRepeating(&ShouldNotBeCalled),
-      true /*w3c_standard_command*/, false,
-      base::Value::AsDictionaryValue(params), "session",
+      true /*w3c_standard_command*/, false, params, "session",
       base::BindRepeating(&OnNoSuchSessionAndQuit, &run_loop));
   run_loop.Run();
 }
@@ -450,14 +443,13 @@
   Session session("id");
   session.implicit_wait = base::Seconds(1);
   session.SwitchToSubFrame("frame_id1", std::string());
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetStringKey("using", "css selector");
-  params.SetStringKey("value", "#a");
+  base::Value::Dict params;
+  params.Set("using", "css selector");
+  params.Set("value", "#a");
   std::unique_ptr<base::Value> result;
-  ASSERT_EQ(kOk, ExecuteFindElement(1, &session, &web_view,
-                                    base::Value::AsDictionaryValue(params),
-                                    &result, nullptr)
-                     .code());
+  ASSERT_EQ(kOk,
+            ExecuteFindElement(1, &session, &web_view, params, &result, nullptr)
+                .code());
   base::Value param(base::Value::Type::DICTIONARY);
   param.SetStringKey("css selector", "#a");
   base::Value expected_args(base::Value::Type::LIST);
@@ -468,14 +460,12 @@
 TEST(CommandsTest, FailedFindElement) {
   FindElementWebView web_view(true, kElementNotExistsQueryOnce);
   Session session("id");
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetStringKey("using", "css selector");
-  params.SetStringKey("value", "#a");
+  base::Value::Dict params;
+  params.Set("using", "css selector");
+  params.Set("value", "#a");
   std::unique_ptr<base::Value> result;
   ASSERT_EQ(kNoSuchElement,
-            ExecuteFindElement(1, &session, &web_view,
-                               base::Value::AsDictionaryValue(params), &result,
-                               nullptr)
+            ExecuteFindElement(1, &session, &web_view, params, &result, nullptr)
                 .code());
 }
 
@@ -484,14 +474,13 @@
   Session session("id");
   session.implicit_wait = base::Seconds(1);
   session.SwitchToSubFrame("frame_id2", std::string());
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetStringKey("using", "css selector");
-  params.SetStringKey("value", "*[name='b']");
+  base::Value::Dict params;
+  params.Set("using", "css selector");
+  params.Set("value", "*[name='b']");
   std::unique_ptr<base::Value> result;
-  ASSERT_EQ(kOk, ExecuteFindElements(1, &session, &web_view,
-                                     base::Value::AsDictionaryValue(params),
-                                     &result, nullptr)
-                     .code());
+  ASSERT_EQ(
+      kOk, ExecuteFindElements(1, &session, &web_view, params, &result, nullptr)
+               .code());
   base::Value param(base::Value::Type::DICTIONARY);
   param.SetStringKey("css selector", "*[name='b']");
   base::Value expected_args(base::Value::Type::LIST);
@@ -502,14 +491,13 @@
 TEST(CommandsTest, FailedFindElements) {
   Session session("id");
   FindElementWebView web_view(false, kElementNotExistsQueryOnce);
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetStringKey("using", "css selector");
-  params.SetStringKey("value", "#a");
+  base::Value::Dict params;
+  params.Set("using", "css selector");
+  params.Set("value", "#a");
   std::unique_ptr<base::Value> result;
-  ASSERT_EQ(kOk, ExecuteFindElements(1, &session, &web_view,
-                                     base::Value::AsDictionaryValue(params),
-                                     &result, nullptr)
-                     .code());
+  ASSERT_EQ(
+      kOk, ExecuteFindElements(1, &session, &web_view, params, &result, nullptr)
+               .code());
   ASSERT_TRUE(result->is_list());
   ASSERT_EQ(0U, result->GetList().size());
 }
@@ -596,15 +584,13 @@
   Session session("id");
   FindElementWebView web_view(true, kElementExistsTimeout);
   session.implicit_wait = base::Milliseconds(2);
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetStringKey("using", "css selector");
-  params.SetStringKey("value", "#a");
-  params.SetStringKey("id", "1");
+  base::Value::Dict params;
+  params.Set("using", "css selector");
+  params.Set("value", "#a");
+  params.Set("id", "1");
   std::unique_ptr<base::Value> result;
   ASSERT_EQ(kNoSuchElement,
-            ExecuteFindElement(1, &session, &web_view,
-                               base::Value::AsDictionaryValue(params), &result,
-                               nullptr)
+            ExecuteFindElement(1, &session, &web_view, params, &result, nullptr)
                 .code());
 }
 
@@ -633,19 +619,15 @@
 TEST(CommandsTest, ErrorFindElement) {
   Session session("id");
   ErrorCallFunctionWebView web_view(kUnknownError);
-  base::Value params(base::Value::Type::DICTIONARY);
-  params.SetStringKey("using", "css selector");
-  params.SetStringKey("value", "#a");
+  base::Value::Dict params;
+  params.Set("using", "css selector");
+  params.Set("value", "#a");
   std::unique_ptr<base::Value> value;
   ASSERT_EQ(kUnknownError,
-            ExecuteFindElement(1, &session, &web_view,
-                               base::Value::AsDictionaryValue(params), &value,
-                               nullptr)
+            ExecuteFindElement(1, &session, &web_view, params, &value, nullptr)
                 .code());
   ASSERT_EQ(kUnknownError,
-            ExecuteFindElements(1, &session, &web_view,
-                                base::Value::AsDictionaryValue(params), &value,
-                                nullptr)
+            ExecuteFindElements(1, &session, &web_view, params, &value, nullptr)
                 .code());
 }
 
@@ -697,14 +679,14 @@
 Status ExecuteAddListenerToSessionCommand(
     std::unique_ptr<CommandListener> listener,
     Session* session,
-    const base::DictionaryValue& params,
+    const base::Value::Dict& params,
     std::unique_ptr<base::Value>* return_value) {
   session->command_listeners.push_back(std::move(listener));
   return Status(kOk);
 }
 
 Status ExecuteQuitSessionCommand(Session* session,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* return_value) {
   session->quit = true;
   return Status(kOk);
@@ -733,7 +715,7 @@
 
   map[id] = std::move(threadInfo);
 
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   auto listener = std::make_unique<MockCommandListener>();
   auto proxy = std::make_unique<CommandListenerProxy>(listener.get());
   // We add |proxy| to the session instead of adding |listener| directly so that
@@ -748,8 +730,7 @@
   // Here, the command adds |listener| to the session, so |listener|
   // should not be notified since it will not have been added yet.
   ExecuteSessionCommand(
-      &map, "cmd", cmd, true /*w3c_standard_command*/, false,
-      base::Value::AsDictionaryValue(params), id,
+      &map, "cmd", cmd, true /*w3c_standard_command*/, false, params, id,
       base::BindRepeating(&OnSessionCommand, &run_loop_addlistener));
   run_loop_addlistener.Run();
 
@@ -761,8 +742,7 @@
   // |listener| was added to |session| by ExecuteAddListenerToSessionCommand
   // and should be notified before the next command, ExecuteQuitSessionCommand.
   ExecuteSessionCommand(
-      &map, "cmd", cmd, true /*w3c_standard_command*/, false,
-      base::Value::AsDictionaryValue(params), id,
+      &map, "cmd", cmd, true /*w3c_standard_command*/, false, params, id,
       base::BindRepeating(&OnSessionCommand, &run_loop_testlistener));
   run_loop_testlistener.Run();
 
@@ -824,15 +804,14 @@
       FROM_HERE, base::BindOnce(&AddListenerToSessionIfSessionExists,
                                 std::move(listener)));
 
-  base::Value params(base::Value::Type::DICTIONARY);
+  base::Value::Dict params;
   // The command should never be executed if BeforeCommand fails for a listener.
   SessionCommand cmd = base::BindRepeating(&ShouldNotBeCalled);
   base::test::SingleThreadTaskEnvironment task_environment;
   base::RunLoop run_loop;
 
   ExecuteSessionCommand(
-      &map, "cmd", cmd, true /*w3c_standard_command*/, false,
-      base::Value::AsDictionaryValue(params), id,
+      &map, "cmd", cmd, true /*w3c_standard_command*/, false, params, id,
       base::BindRepeating(&OnFailBecauseErrorNotifyingListeners, &run_loop));
   run_loop.Run();
 
diff --git a/chrome/test/chromedriver/element_commands.cc b/chrome/test/chromedriver/element_commands.cc
index 59e6c1c6..2a40303 100644
--- a/chrome/test/chromedriver/element_commands.cc
+++ b/chrome/test/chromedriver/element_commands.cc
@@ -178,16 +178,20 @@
 
 }  // namespace
 
-Status ExecuteElementCommand(
-    const ElementCommand& command,
-    Session* session,
-    WebView* web_view,
-    const base::DictionaryValue& params,
-    std::unique_ptr<base::Value>* value,
-    Timeout* timeout) {
-  std::string id;
-  if (params.GetString("id", &id) || params.GetString("element", &id))
-    return command.Run(session, web_view, id, params, value);
+Status ExecuteElementCommand(const ElementCommand& command,
+                             Session* session,
+                             WebView* web_view,
+                             const base::Value::Dict& params,
+                             std::unique_ptr<base::Value>* value,
+                             Timeout* timeout) {
+  const std::string* id = params.FindString("id");
+  if (!id)
+    id = params.FindString("element");
+  if (id) {
+    return command.Run(
+        session, web_view, *id,
+        base::Value::AsDictionaryValue(base::Value(params.Clone())), value);
+  }
   return Status(kInvalidArgument, "element identifier must be a string");
 }
 
diff --git a/chrome/test/chromedriver/element_commands.h b/chrome/test/chromedriver/element_commands.h
index 982f5c3..df5d101 100644
--- a/chrome/test/chromedriver/element_commands.h
+++ b/chrome/test/chromedriver/element_commands.h
@@ -9,11 +9,7 @@
 #include <string>
 
 #include "base/callback_forward.h"
-
-namespace base {
-class DictionaryValue;
-class Value;
-}
+#include "base/values.h"
 
 struct Session;
 class Status;
@@ -28,13 +24,12 @@
                                    std::unique_ptr<base::Value>*)>;
 
 // Execute a command on a specific element.
-Status ExecuteElementCommand(
-    const ElementCommand& command,
-    Session* session,
-    WebView* web_view,
-    const base::DictionaryValue& params,
-    std::unique_ptr<base::Value>* value,
-    Timeout* timeout);
+Status ExecuteElementCommand(const ElementCommand& command,
+                             Session* session,
+                             WebView* web_view,
+                             const base::Value::Dict& params,
+                             std::unique_ptr<base::Value>* value,
+                             Timeout* timeout);
 
 // Search for an element on the page, starting from the given element.
 Status ExecuteFindChildElement(int interval_ms,
diff --git a/chrome/test/chromedriver/key_converter.cc b/chrome/test/chromedriver/key_converter.cc
index f894de7c..3e1fe8be 100644
--- a/chrome/test/chromedriver/key_converter.cc
+++ b/chrome/test/chromedriver/key_converter.cc
@@ -614,17 +614,17 @@
   return Status(kOk);
 }
 
-Status ConvertKeyActionToKeyEvent(const base::DictionaryValue* action_object,
+Status ConvertKeyActionToKeyEvent(const base::Value::Dict& action_object,
                                   base::DictionaryValue* input_state,
                                   bool is_key_down,
                                   std::vector<KeyEvent>* key_events) {
-  std::string raw_key;
-  if (!action_object->GetString("value", &raw_key))
+  const std::string* raw_key = action_object.FindString("value");
+  if (!raw_key)
     return Status(kUnknownError, "missing 'value'");
 
   size_t char_index = 0;
   base_icu::UChar32 code_point;
-  base::ReadUnicodeCharacter(raw_key.c_str(), raw_key.size(), &char_index,
+  base::ReadUnicodeCharacter(raw_key->c_str(), raw_key->size(), &char_index,
                              &code_point);
 
   std::string key;
@@ -634,7 +634,7 @@
     key = kNormalisedKeyValue[code_point - kNormalisedKeyValueBase];
   }
   if (key.size() == 0)
-    key = raw_key;
+    key = *raw_key;
 
   base::DictionaryValue* pressed;
   if (!input_state->GetDictionary("pressed", &pressed))
@@ -750,8 +750,8 @@
       }
     } else {
       // Do a best effort and use the raw key we were given.
-      unmodified_text = raw_key;
-      modified_text = raw_key;
+      unmodified_text = *raw_key;
+      modified_text = *raw_key;
     }
   }
 
diff --git a/chrome/test/chromedriver/key_converter.h b/chrome/test/chromedriver/key_converter.h
index 0d43c7e..26eb609a 100644
--- a/chrome/test/chromedriver/key_converter.h
+++ b/chrome/test/chromedriver/key_converter.h
@@ -24,7 +24,7 @@
                               int* modifiers,
                               std::vector<KeyEvent>* key_events);
 
-Status ConvertKeyActionToKeyEvent(const base::DictionaryValue* action_object,
+Status ConvertKeyActionToKeyEvent(const base::Value::Dict& action_object,
                                   base::DictionaryValue* input_state,
                                   bool is_key_down,
                                   std::vector<KeyEvent>* client_key_events);
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc
index 1369579..cea2c72c 100644
--- a/chrome/test/chromedriver/server/http_handler.cc
+++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -1183,7 +1183,7 @@
     return;
   }
   // Pass host instead for potential WebSocketUrl if it's a new session
-  iter->command.Run(params,
+  iter->command.Run(params.GetDict(),
                     internal::IsNewSession(*iter)
                         ? request.GetHeaderValue("host")
                         : session_id,
@@ -1543,8 +1543,8 @@
 
   std::string session_id = it->second;
 
-  base::DictionaryValue params;
-  params.Set("bidiCommand", std::make_unique<base::Value>(data));
+  base::Value::Dict params;
+  params.Set("bidiCommand", data);
 
   auto callback = base::BindRepeating(
       [](base::RepeatingCallback<void(const Status&)> send_error,
diff --git a/chrome/test/chromedriver/server/http_handler_unittest.cc b/chrome/test/chromedriver/server/http_handler_unittest.cc
index cd03b27..b2d0eb5e 100644
--- a/chrome/test/chromedriver/server/http_handler_unittest.cc
+++ b/chrome/test/chromedriver/server/http_handler_unittest.cc
@@ -20,11 +20,10 @@
 
 namespace {
 
-void DummyCommand(
-    const Status& status,
-    const base::DictionaryValue& params,
-    const std::string& session_id,
-    const CommandCallback& callback) {
+void DummyCommand(const Status& status,
+                  const base::Value::Dict& params,
+                  const std::string& session_id,
+                  const CommandCallback& callback) {
   callback.Run(status, std::make_unique<base::Value>(1), "session_id", false);
 }
 
diff --git a/chrome/test/chromedriver/session.cc b/chrome/test/chromedriver/session.cc
index 1e1deff..1a0bef879 100644
--- a/chrome/test/chromedriver/session.cc
+++ b/chrome/test/chromedriver/session.cc
@@ -11,6 +11,7 @@
 #include "base/json/json_writer.h"
 #include "base/lazy_instance.h"
 #include "base/logging.h"
+#include "base/ranges/algorithm.h"
 #include "base/threading/thread_local.h"
 #include "base/values.h"
 #include "chrome/test/chromedriver/chrome/chrome.h"
@@ -197,10 +198,8 @@
 void Session::RemoveBidiConnection(int connection_id) {
   // Reallistically we will not have many connections, therefore linear search
   // is optimal.
-  auto it = std::find_if(bidi_connections_.begin(), bidi_connections_.end(),
-                         [connection_id](const auto& conn) {
-                           return conn.connection_id == connection_id;
-                         });
+  auto it = base::ranges::find(bidi_connections_, connection_id,
+                               &BidiConnection::connection_id);
   if (it != bidi_connections_.end()) {
     bidi_connections_.erase(it);
   }
diff --git a/chrome/test/chromedriver/session_commands.cc b/chrome/test/chromedriver/session_commands.cc
index 53660b7c..1befc45c 100644
--- a/chrome/test/chromedriver/session_commands.cc
+++ b/chrome/test/chromedriver/session_commands.cc
@@ -112,42 +112,38 @@
 InitSessionParams::~InitSessionParams() {}
 
 // Look for W3C mode setting in InitSession command parameters.
-bool GetW3CSetting(const base::DictionaryValue& params) {
-  const base::DictionaryValue* options_dict;
+bool GetW3CSetting(const base::Value::Dict& params) {
+  const base::Value::Dict* options_dict = nullptr;
 
-  const base::Value* caps_dict =
-      params.FindDictPath("capabilities.alwaysMatch");
-  if (caps_dict &&
-      GetChromeOptionsDictionary(base::Value::AsDictionaryValue(*caps_dict),
-                                 &options_dict)) {
-    absl::optional<bool> w3c = options_dict->FindBoolKey("w3c");
+  const base::Value::Dict* caps_dict =
+      params.FindDictByDottedPath("capabilities.alwaysMatch");
+  if (caps_dict && GetChromeOptionsDictionary(*caps_dict, &options_dict)) {
+    absl::optional<bool> w3c = options_dict->FindBool("w3c");
     if (w3c.has_value())
       return *w3c;
   }
 
-  const base::Value* list = params.FindListPath("capabilities.firstMatch");
-  if (list && list->GetList().size()) {
-    const base::Value& caps_dict_ref = std::move(list->GetList()[0]);
+  const base::Value::List* list =
+      params.FindListByDottedPath("capabilities.firstMatch");
+  if (list && list->size()) {
+    const base::Value& caps_dict_ref = (*list)[0];
     if (caps_dict_ref.is_dict() &&
-        GetChromeOptionsDictionary(
-            base::Value::AsDictionaryValue(caps_dict_ref), &options_dict)) {
-      absl::optional<bool> w3c = options_dict->FindBoolKey("w3c");
+        GetChromeOptionsDictionary(caps_dict_ref.GetDict(), &options_dict)) {
+      absl::optional<bool> w3c = options_dict->FindBool("w3c");
       if (w3c.has_value())
         return *w3c;
     }
   }
 
-  caps_dict = params.FindDictKey("desiredCapabilities");
-  if (caps_dict &&
-      GetChromeOptionsDictionary(base::Value::AsDictionaryValue(*caps_dict),
-                                 &options_dict)) {
-    absl::optional<bool> w3c = options_dict->FindBoolKey("w3c");
+  caps_dict = params.FindDict("desiredCapabilities");
+  if (caps_dict && GetChromeOptionsDictionary(*caps_dict, &options_dict)) {
+    absl::optional<bool> w3c = options_dict->FindBool("w3c");
     if (w3c.has_value())
       return *w3c;
   }
 
-  if (!params.FindKey("capabilities") &&
-      params.FindKey("desiredCapabilities")) {
+  if (!params.contains("capabilities") &&
+      params.contains("desiredCapabilities")) {
     return false;
   }
 
@@ -194,11 +190,11 @@
   if (session->script_timeout == base::TimeDelta::Max())
     caps->SetPath({"timeouts", "script"}, base::Value());
   else
-    SetSafeInt(caps.get(), "timeouts.script",
+    SetSafeInt(caps->GetDict(), "timeouts.script",
                session->script_timeout.InMilliseconds());
-  SetSafeInt(caps.get(), "timeouts.pageLoad",
+  SetSafeInt(caps->GetDict(), "timeouts.pageLoad",
              session->page_load_timeout.InMilliseconds());
-  SetSafeInt(caps.get(), "timeouts.implicit",
+  SetSafeInt(caps->GetDict(), "timeouts.implicit",
              session->implicit_wait.InMilliseconds());
   caps->SetBoolKey("strictFileInteractability",
                    session->strict_file_interactability);
@@ -288,7 +284,7 @@
 
 Status InitSessionHelper(const InitSessionParams& bound_params,
                          Session* session,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value) {
   const base::DictionaryValue* desired_caps;
   base::DictionaryValue merged_caps;
@@ -432,11 +428,10 @@
       std::string handle = WebViewIdToWindowHandle(web_view_id);
 
       std::unique_ptr<base::Value> result;
-      base::Value body(base::Value::Type::DICTIONARY);
-      body.GetDict().Set("handle", handle);
+      base::Value::Dict body;
+      body.Set("handle", handle);
 
-      status = ExecuteSwitchToWindow(
-          session, base::Value::AsDictionaryValue(body), &result);
+      status = ExecuteSwitchToWindow(session, body, &result);
     }
   }
 
@@ -448,7 +443,7 @@
 namespace internal {
 
 Status ConfigureSession(Session* session,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         const base::DictionaryValue** desired_caps,
                         base::DictionaryValue* merged_caps,
                         Capabilities* capabilities) {
@@ -462,8 +457,8 @@
       return status;
     *desired_caps = merged_caps;
   } else {
-    const base::Value* caps = params.FindDictKey("desiredCapabilities");
-    if (!caps)
+    const base::Value* caps = params.Find("desiredCapabilities");
+    if (!caps || !caps->is_dict())
       return Status(kSessionNotCreated, "Missing or invalid capabilities");
 
     *desired_caps = static_cast<const base::DictionaryValue*>(caps);
@@ -558,7 +553,7 @@
 
   const base::DictionaryValue* chrome_options;
   const bool has_chrome_options =
-      GetChromeOptionsDictionary(*capabilities, &chrome_options);
+      GetChromeOptionsDictionaryDeprecated(*capabilities, &chrome_options);
 
   bool is_android = has_chrome_options &&
                     chrome_options->FindStringKey("androidPackage") != nullptr;
@@ -623,10 +618,11 @@
 // Implementation of "process capabilities", as defined in W3C spec at
 // https://www.w3.org/TR/webdriver/#processing-capabilities. Step numbers in
 // the comments correspond to the step numbers in the spec.
-Status ProcessCapabilities(const base::DictionaryValue& params,
+Status ProcessCapabilities(const base::Value::Dict& params,
                            base::DictionaryValue* result_capabilities) {
   // 1. Get the property "capabilities" from parameters.
-  const base::Value* capabilities_request = params.FindDictKey("capabilities");
+  const base::Value::Dict* capabilities_request =
+      params.FindDict("capabilities");
   if (!capabilities_request)
     return Status(kInvalidArgument, "'capabilities' must be a JSON object");
 
@@ -634,7 +630,7 @@
   const base::DictionaryValue empty_object;
   const base::DictionaryValue* required_capabilities;
   const base::Value* required_capabilities_value =
-      capabilities_request->FindKey("alwaysMatch");
+      capabilities_request->Find("alwaysMatch");
   if (required_capabilities_value == nullptr) {
     required_capabilities = &empty_object;
   } else if (required_capabilities_value->GetAsDictionary(
@@ -650,7 +646,7 @@
   // 3. Get the property "firstMatch" from capabilities request.
   base::Value default_list(base::Value::Type::LIST);
   const base::Value* all_first_match_capabilities =
-      capabilities_request->FindKey("firstMatch");
+      capabilities_request->Find("firstMatch");
   if (all_first_match_capabilities == nullptr) {
     default_list.Append(base::Value(base::Value::Type::DICTIONARY));
     all_first_match_capabilities = &default_list;
@@ -721,7 +717,7 @@
 
 Status ExecuteInitSession(const InitSessionParams& bound_params,
                           Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value) {
   Status status = InitSessionHelper(bound_params, session, params, value);
   if (status.IsError()) {
@@ -738,7 +734,7 @@
 
 Status ExecuteQuit(bool allow_detach,
                    Session* session,
-                   const base::DictionaryValue& params,
+                   const base::Value::Dict& params,
                    std::unique_ptr<base::Value>* value) {
   session->quit = true;
   if (allow_detach && session->detach)
@@ -748,14 +744,14 @@
 }
 
 Status ExecuteGetSessionCapabilities(Session* session,
-                                     const base::DictionaryValue& params,
+                                     const base::Value::Dict& params,
                                      std::unique_ptr<base::Value>* value) {
   *value = base::Value::ToUniquePtrValue(session->capabilities->Clone());
   return Status(kOk);
 }
 
 Status ExecuteGetCurrentWindowHandle(Session* session,
-                                     const base::DictionaryValue& params,
+                                     const base::Value::Dict& params,
                                      std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
@@ -770,7 +766,7 @@
 }
 
 Status ExecuteClose(Session* session,
-                    const base::DictionaryValue& params,
+                    const base::Value::Dict& params,
                     std::unique_ptr<base::Value>* value) {
   std::list<std::string> web_view_ids;
   Status status = session->chrome->GetWebViewIds(&web_view_ids,
@@ -834,7 +830,7 @@
     if (status.IsOk())
       *value = std::make_unique<base::Value>(base::Value::Type::LIST);
   } else {
-    status = ExecuteGetWindowHandles(session, base::DictionaryValue(), value);
+    status = ExecuteGetWindowHandles(session, base::Value::Dict(), value);
     if (status.IsError())
       return status;
   }
@@ -843,7 +839,7 @@
 }
 
 Status ExecuteGetWindowHandles(Session* session,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value) {
   std::list<std::string> web_view_ids;
   Status status = session->chrome->GetWebViewIds(&web_view_ids,
@@ -875,15 +871,15 @@
 }
 
 Status ExecuteSwitchToWindow(Session* session,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value) {
   const std::string* name;
   if (session->w3c_compliant) {
-    name = params.FindStringKey("handle");
+    name = params.FindString("handle");
     if (!name)
       return Status(kInvalidArgument, "'handle' must be a string");
   } else {
-    name = params.FindStringKey("name");
+    name = params.FindString("name");
     if (!name)
       return Status(kInvalidArgument, "'name' must be a string");
   }
@@ -982,13 +978,13 @@
 // TODO(crbug.com/chromedriver/2596): Remove when we stop supporting legacy
 // protocol.
 Status ExecuteSetTimeoutLegacy(Session* session,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value) {
-  absl::optional<double> maybe_ms = params.FindDoubleKey("ms");
+  absl::optional<double> maybe_ms = params.FindDouble("ms");
   if (!maybe_ms.has_value())
     return Status(kInvalidArgument, "'ms' must be a double");
 
-  const std::string* type = params.FindStringKey("type");
+  const std::string* type = params.FindString("type");
   if (!type)
     return Status(kInvalidArgument, "'type' must be a string");
 
@@ -1008,9 +1004,9 @@
 }
 
 Status ExecuteSetTimeoutsW3C(Session* session,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value) {
-  for (auto setting : params.DictItems()) {
+  for (auto setting : params) {
     int64_t timeout_ms_int64 = -1;
     base::TimeDelta timeout;
     const std::string& type = setting.first;
@@ -1020,12 +1016,11 @@
       else
         return Status(kInvalidArgument, "timeout can not be null");
     } else {
-        if (!GetOptionalSafeInt(&params, setting.first, &timeout_ms_int64)
-            || timeout_ms_int64 < 0)
-            return Status(kInvalidArgument,
-                          "value must be a non-negative integer");
-        else
-          timeout = base::Milliseconds(timeout_ms_int64);
+      if (!GetOptionalSafeInt(params, setting.first, &timeout_ms_int64) ||
+          timeout_ms_int64 < 0)
+        return Status(kInvalidArgument, "value must be a non-negative integer");
+      else
+        timeout = base::Milliseconds(timeout_ms_int64);
     }
     if (type == "script") {
       session->script_timeout = timeout;
@@ -1039,12 +1034,12 @@
 }
 
 Status ExecuteSetTimeouts(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value) {
   // TODO(crbug.com/chromedriver/2596): Remove legacy version support when we
   // stop supporting non-W3C protocol. At that time, we can delete the legacy
   // function and merge the W3C function into this function.
-  if (params.FindKey("ms")) {
+  if (params.contains("ms")) {
     return ExecuteSetTimeoutLegacy(session, params, value);
   } else {
     return ExecuteSetTimeoutsW3C(session, params, value);
@@ -1052,26 +1047,25 @@
 }
 
 Status ExecuteGetTimeouts(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value) {
-  base::DictionaryValue timeouts;
+  base::Value::Dict timeouts;
   if (session->script_timeout == base::TimeDelta::Max())
-    timeouts.SetKey("script", base::Value());
+    timeouts.Set("script", base::Value());
   else
-    SetSafeInt(&timeouts, "script", session->script_timeout.InMilliseconds());
+    SetSafeInt(timeouts, "script", session->script_timeout.InMilliseconds());
 
-  SetSafeInt(&timeouts, "pageLoad",
-                        session->page_load_timeout.InMilliseconds());
-  SetSafeInt(&timeouts, "implicit", session->implicit_wait.InMilliseconds());
+  SetSafeInt(timeouts, "pageLoad", session->page_load_timeout.InMilliseconds());
+  SetSafeInt(timeouts, "implicit", session->implicit_wait.InMilliseconds());
 
-  *value = base::Value::ToUniquePtrValue(timeouts.Clone());
+  *value = base::Value::ToUniquePtrValue(base::Value(std::move(timeouts)));
   return Status(kOk);
 }
 
 Status ExecuteSetScriptTimeout(Session* session,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value) {
-  absl::optional<double> maybe_ms = params.FindDoubleKey("ms");
+  absl::optional<double> maybe_ms = params.FindDouble("ms");
   if (!maybe_ms.has_value() || maybe_ms.value() < 0)
     return Status(kInvalidArgument, "'ms' must be a non-negative number");
   session->script_timeout =
@@ -1080,9 +1074,9 @@
 }
 
 Status ExecuteImplicitlyWait(Session* session,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value) {
-  absl::optional<double> maybe_ms = params.FindDoubleKey("ms");
+  absl::optional<double> maybe_ms = params.FindDouble("ms");
   if (!maybe_ms.has_value() || maybe_ms.value() < 0)
     return Status(kInvalidArgument, "'ms' must be a non-negative number");
   session->implicit_wait =
@@ -1091,7 +1085,7 @@
 }
 
 Status ExecuteIsLoading(Session* session,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
@@ -1111,7 +1105,7 @@
 }
 
 Status ExecuteGetLocation(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value) {
   if (!session->overridden_geoposition) {
     return Status(kUnknownError,
@@ -1130,7 +1124,7 @@
 }
 
 Status ExecuteGetNetworkConnection(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value) {
   ChromeDesktopImpl* desktop = nullptr;
   Status status = session->chrome->GetAsDesktop(&desktop);
@@ -1147,7 +1141,7 @@
 }
 
 Status ExecuteGetNetworkConditions(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value) {
   if (!session->overridden_network_conditions) {
     return Status(kUnknownError,
@@ -1169,7 +1163,7 @@
 }
 
 Status ExecuteSetNetworkConnection(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value) {
   ChromeDesktopImpl* desktop = nullptr;
   Status status = session->chrome->GetAsDesktop(&desktop);
@@ -1178,7 +1172,8 @@
   if (!desktop->IsNetworkConnectionEnabled())
     return Status(kUnknownError, "network connection must be enabled");
 
-  absl::optional<int> connection_type = params.FindIntPath("parameters.type");
+  absl::optional<int> connection_type =
+      params.FindIntByDottedPath("parameters.type");
   if (!connection_type)
     return Status(kInvalidArgument, "invalid connection_type");
 
@@ -1240,7 +1235,7 @@
 }
 
 Status ExecuteGetWindowPosition(Session* session,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value) {
   Chrome::WindowRect windowRect;
   Status status = session->chrome->GetWindowRect(session->window, &windowRect);
@@ -1256,10 +1251,10 @@
 }
 
 Status ExecuteSetWindowPosition(Session* session,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value) {
-  absl::optional<double> maybe_x = params.FindDoubleKey("x");
-  absl::optional<double> maybe_y = params.FindDoubleKey("y");
+  absl::optional<double> maybe_x = params.FindDouble("x");
+  absl::optional<double> maybe_y = params.FindDouble("y");
 
   if (!maybe_x.has_value() || !maybe_y.has_value())
     return Status(kInvalidArgument, "missing or invalid 'x' or 'y'");
@@ -1272,7 +1267,7 @@
 }
 
 Status ExecuteGetWindowSize(Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value) {
   Chrome::WindowRect windowRect;
   Status status = session->chrome->GetWindowRect(session->window, &windowRect);
@@ -1288,10 +1283,10 @@
 }
 
 Status ExecuteSetWindowSize(Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value) {
-  absl::optional<double> maybe_width = params.FindDoubleKey("width");
-  absl::optional<double> maybe_height = params.FindDoubleKey("height");
+  absl::optional<double> maybe_width = params.FindDouble("width");
+  absl::optional<double> maybe_height = params.FindDouble("height");
 
   if (!maybe_width.has_value() || !maybe_height.has_value())
     return Status(kInvalidArgument, "missing or invalid 'width' or 'height'");
@@ -1304,7 +1299,7 @@
 }
 
 Status ExecuteGetAvailableLogTypes(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value) {
   std::unique_ptr<base::Value::List> types(new base::Value::List());
   std::vector<WebDriverLog*> logs = session->GetAllLogs();
@@ -1318,9 +1313,9 @@
 }
 
 Status ExecuteGetLog(Session* session,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value) {
-  const std::string* log_type = params.FindStringKey("type");
+  const std::string* log_type = params.FindString("type");
   if (!log_type) {
     return Status(kInvalidArgument, "missing or invalid 'type'");
   }
@@ -1349,9 +1344,9 @@
 }
 
 Status ExecuteUploadFile(Session* session,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value) {
-  const std::string* base64_zip_data = params.FindStringKey("file");
+  const std::string* base64_zip_data = params.FindString("file");
   if (!base64_zip_data)
     return Status(kInvalidArgument, "missing or invalid 'file'");
   std::string zip_data;
@@ -1378,21 +1373,15 @@
   return Status(kOk);
 }
 
-Status ExecuteUnimplementedCommand(Session* session,
-                                   const base::DictionaryValue& params,
-                                   std::unique_ptr<base::Value>* value) {
-  return Status(kUnknownCommand);
-}
-
 Status ExecuteSetSPCTransactionMode(Session* session,
-                                    const base::DictionaryValue& params,
+                                    const base::Value::Dict& params,
                                     std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
   if (status.IsError())
     return status;
 
-  const std::string* mode = params.FindStringKey("mode");
+  const std::string* mode = params.FindString("mode");
   if (!mode)
     return Status(kInvalidArgument, "missing parameter 'mode'");
 
@@ -1405,17 +1394,17 @@
 }
 
 Status ExecuteGenerateTestReport(Session* session,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
   if (status.IsError())
     return status;
 
-  const std::string* message = params.FindStringKey("message");
+  const std::string* message = params.FindString("message");
   if (!message)
     return Status(kInvalidArgument, "missing parameter 'message'");
-  const std::string* group = params.FindStringKey("group");
+  const std::string* group = params.FindString("group");
 
   base::Value body(base::Value::Type::DICTIONARY);
   body.SetStringKey("message", *message);
@@ -1427,14 +1416,14 @@
 }
 
 Status ExecuteSetTimeZone(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
   if (status.IsError())
     return status;
 
-  const std::string* time_zone = params.FindStringKey("time_zone");
+  const std::string* time_zone = params.FindString("time_zone");
   if (!time_zone)
     return Status(kInvalidArgument, "missing parameter 'time_zone'");
 
@@ -1449,7 +1438,7 @@
 
 // Run a BiDi command
 Status ExecuteBidiCommand(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value) {
   // session == nullptr is a valid case: ExecuteQuit has already been handled
   // in the session thread but the following
@@ -1460,7 +1449,7 @@
     return Status{kNoSuchFrame, "session not found"};
   }
   std::string data;
-  params.GetString("bidiCommand", &data);
+  GetOptionalString(params, "bidiCommand", &data);
 
   WebView* web_view = nullptr;
   Status status = session->chrome->GetWebViewById(
diff --git a/chrome/test/chromedriver/session_commands.h b/chrome/test/chromedriver/session_commands.h
index 885c9a7..ef46dff 100644
--- a/chrome/test/chromedriver/session_commands.h
+++ b/chrome/test/chromedriver/session_commands.h
@@ -8,16 +8,12 @@
 #include <memory>
 
 #include "base/memory/raw_ptr.h"
+#include "base/values.h"
 #include "chrome/test/chromedriver/command.h"
 #include "chrome/test/chromedriver/net/sync_websocket_factory.h"
 #include "chrome/test/chromedriver/session_connection_map.h"
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 
-namespace base {
-class DictionaryValue;
-class Value;
-}
-
 struct Capabilities;
 class DeviceManager;
 struct Session;
@@ -40,7 +36,7 @@
   raw_ptr<SessionConnectionMap> session_map;
 };
 
-bool GetW3CSetting(const base::DictionaryValue& params);
+bool GetW3CSetting(const base::Value::Dict& params);
 
 bool MergeCapabilities(const base::DictionaryValue* always_match,
                        const base::DictionaryValue* first_match,
@@ -48,135 +44,131 @@
 
 bool MatchCapabilities(const base::DictionaryValue* capabilities);
 
-Status ProcessCapabilities(const base::DictionaryValue& params,
+Status ProcessCapabilities(const base::Value::Dict& params,
                            base::DictionaryValue* result_capabilities);
 
 // Initializes a session.
 Status ExecuteInitSession(const InitSessionParams& bound_params,
                           Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value);
 
 // Quits a session.
 Status ExecuteQuit(bool allow_detach,
                    Session* session,
-                   const base::DictionaryValue& params,
+                   const base::Value::Dict& params,
                    std::unique_ptr<base::Value>* value);
 
 // Gets the capabilities of a particular session.
 Status ExecuteGetSessionCapabilities(Session* session,
-                                     const base::DictionaryValue& params,
+                                     const base::Value::Dict& params,
                                      std::unique_ptr<base::Value>* value);
 
 // Retrieve the handle of the target window.
 Status ExecuteGetCurrentWindowHandle(Session* session,
-                                     const base::DictionaryValue& params,
+                                     const base::Value::Dict& params,
                                      std::unique_ptr<base::Value>* value);
 
 // Close the target window.
 Status ExecuteClose(Session* session,
-                    const base::DictionaryValue& params,
+                    const base::Value::Dict& params,
                     std::unique_ptr<base::Value>* value);
 
 // Retrieve the list of all window handles available to the session.
 Status ExecuteGetWindowHandles(Session* session,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value);
 
 // Change target window to another. The window to target at may be specified by
 // its server assigned window handle, or by the value of its name attribute.
 Status ExecuteSwitchToWindow(Session* session,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value);
 
 // Configure the amount of time that a particular type of operation can execute
 // for before they are aborted and a timeout error is returned to the client.
 Status ExecuteSetTimeouts(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value);
 
 // Get the implicit, script and page load timeouts in milliseconds.
 Status ExecuteGetTimeouts(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value);
 
 // Set the timeout for asynchronous scripts.
 Status ExecuteSetScriptTimeout(Session* session,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value);
 
 // Set the amount of time the driver should wait when searching for elements.
 Status ExecuteImplicitlyWait(Session* session,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value);
 
 Status ExecuteIsLoading(Session* session,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetLocation(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetNetworkConnection(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetNetworkConditions(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value);
 
 Status ExecuteSetNetworkConnection(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetWindowPosition(Session* session,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value);
 
 Status ExecuteSetWindowPosition(Session* session,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetWindowSize(Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value);
 
 Status ExecuteSetWindowSize(Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetAvailableLogTypes(Session* session,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value);
 
 Status ExecuteGetLog(Session* session,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value);
 
 Status ExecuteUploadFile(Session* session,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value);
 
-Status ExecuteUnimplementedCommand(Session* session,
-                                   const base::DictionaryValue& params,
-                                   std::unique_ptr<base::Value>* value);
-
 Status ExecuteSetSPCTransactionMode(Session* session,
-                                    const base::DictionaryValue& params,
+                                    const base::Value::Dict& params,
                                     std::unique_ptr<base::Value>* value);
 
 Status ExecuteGenerateTestReport(Session* session,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* value);
 
 Status ExecuteSetTimeZone(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value);
 
 // Run a BiDi command
 Status ExecuteBidiCommand(Session* session,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value);
 
 namespace internal {
@@ -184,7 +176,7 @@
                                 const Capabilities& capabilities);
 
 Status ConfigureSession(Session* session,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         const base::DictionaryValue** desired_caps,
                         base::DictionaryValue* merged_caps,
                         Capabilities* capabilities);
diff --git a/chrome/test/chromedriver/session_commands_unittest.cc b/chrome/test/chromedriver/session_commands_unittest.cc
index dc88ac9..ace9eb3 100644
--- a/chrome/test/chromedriver/session_commands_unittest.cc
+++ b/chrome/test/chromedriver/session_commands_unittest.cc
@@ -27,7 +27,7 @@
 
 TEST(SessionCommandsTest, ExecuteGetTimeouts) {
   Session session("id");
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> value;
 
   Status status = ExecuteGetTimeouts(&session, params, &value);
@@ -45,35 +45,35 @@
 
 TEST(SessionCommandsTest, ExecuteSetTimeouts) {
   Session session("id");
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> value;
 
   // W3C spec doesn't forbid passing in an empty object, so we should get kOk.
   Status status = ExecuteSetTimeouts(&session, params, &value);
   ASSERT_EQ(kOk, status.code());
 
-  params.GetDict().Set("pageLoad", 5000);
+  params.Set("pageLoad", 5000);
   status = ExecuteSetTimeouts(&session, params, &value);
   ASSERT_EQ(kOk, status.code());
 
-  params.GetDict().Set("script", 5000);
-  params.GetDict().Set("implicit", 5000);
+  params.Set("script", 5000);
+  params.Set("implicit", 5000);
   status = ExecuteSetTimeouts(&session, params, &value);
   ASSERT_EQ(kOk, status.code());
 
-  params.GetDict().Set("implicit", -5000);
+  params.Set("implicit", -5000);
   status = ExecuteSetTimeouts(&session, params, &value);
   ASSERT_EQ(kInvalidArgument, status.code());
 
-  params.DictClear();
-  params.GetDict().Set("unknown", 5000);
+  params.clear();
+  params.Set("unknown", 5000);
   status = ExecuteSetTimeouts(&session, params, &value);
   ASSERT_EQ(kOk, status.code());
 
   // Old pre-W3C format.
-  params.DictClear();
-  params.GetDict().Set("ms", 5000.0);
-  params.GetDict().Set("type", "page load");
+  params.clear();
+  params.Set("ms", 5000.0);
+  params.Set("type", "page load");
   status = ExecuteSetTimeouts(&session, params, &value);
   ASSERT_EQ(kOk, status.code());
 }
@@ -104,52 +104,46 @@
 
 TEST(SessionCommandsTest, ProcessCapabilities_Empty) {
   // "capabilities" is required
-  base::DictionaryValue params;
+  base::Value::Dict params;
   base::DictionaryValue result;
   Status status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // "capabilities" must be a JSON object
-  params.SetList("capabilities",
-                 base::ListValue::From(
-                     std::make_unique<base::Value>(base::Value::Type::LIST)));
+  params.Set("capabilities", base::Value::List());
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Empty "capabilities" is OK
-  params.GetDict().Set("capabilities",
-                       base::Value(base::Value::Type::DICTIONARY));
+  params.Set("capabilities", base::Value(base::Value::Type::DICTIONARY));
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_TRUE(result.DictEmpty());
 }
 
 TEST(SessionCommandsTest, ProcessCapabilities_AlwaysMatch) {
-  base::DictionaryValue params;
+  base::Value::Dict params;
   base::DictionaryValue result;
 
   // "alwaysMatch" must be a JSON object
-  params.SetList("capabilities.alwaysMatch",
-                 base::ListValue::From(
-                     std::make_unique<base::Value>(base::Value::Type::LIST)));
+  params.SetByDottedPath("capabilities.alwaysMatch", base::Value::List());
   Status status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Empty "alwaysMatch" is OK
-  params.GetDict().SetByDottedPath("capabilities.alwaysMatch",
-                                   base::Value(base::Value::Type::DICTIONARY));
+  params.SetByDottedPath("capabilities.alwaysMatch",
+                         base::Value(base::Value::Type::DICTIONARY));
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_TRUE(result.DictEmpty());
 
   // Invalid "alwaysMatch"
-  params.GetDict().SetByDottedPath("capabilities.alwaysMatch.browserName", 10);
+  params.SetByDottedPath("capabilities.alwaysMatch.browserName", 10);
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Valid "alwaysMatch"
-  params.GetDict().SetByDottedPath("capabilities.alwaysMatch.browserName",
-                                   "chrome");
+  params.SetByDottedPath("capabilities.alwaysMatch.browserName", "chrome");
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_EQ(result.DictSize(), 1u);
@@ -158,8 +152,7 @@
   ASSERT_EQ(result_string, "chrome");
 
   // Null "browserName" treated as not specifying "browserName"
-  params.GetDict().SetByDottedPath("capabilities.alwaysMatch.browserName",
-                                   base::Value());
+  params.SetByDottedPath("capabilities.alwaysMatch.browserName", base::Value());
   status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_FALSE(result.GetString("browserName", &result_string));
@@ -172,55 +165,37 @@
   // "firstMatch" must be a JSON list
   params.SetByDottedPath("capabilities.firstMatch",
                          base::Value(base::Value::Type::DICTIONARY));
-  Status status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  Status status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // "firstMatch" must have at least one entry
   params.SetByDottedPath("capabilities.firstMatch",
                          base::Value(base::Value::Type::LIST));
-  status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Each entry must be a JSON object
   base::Value::List* list =
       params.FindListByDottedPath("capabilities.firstMatch");
   list->Append(base::Value::List());
-  status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Empty JSON object allowed as an entry
   (*list)[0] = base::Value(base::Value::Type::DICT);
-  status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_TRUE(result.DictEmpty());
 
   // Invalid entry
   base::Value::Dict* entry = (*list)[0].GetIfDict();
   entry->Set("pageLoadStrategy", "invalid");
-  status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kInvalidArgument, status.code());
 
   // Valid entry
   entry->Set("pageLoadStrategy", "eager");
-  status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_EQ(result.DictSize(), 1u);
   std::string result_string;
@@ -232,10 +207,7 @@
   entry = (*list)[1].GetIfDict();
   entry->Set("pageLoadStrategy", "normal");
   entry->Set("browserName", "chrome");
-  status =
-      ProcessCapabilities(*base::DictionaryValue::From(
-                              std::make_unique<base::Value>(params.Clone())),
-                          &result);
+  status = ProcessCapabilities(params, &result);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_EQ(result.DictSize(), 1u);
   ASSERT_TRUE(result.GetString("pageLoadStrategy", &result_string));
@@ -250,9 +222,7 @@
       base::JSONReader::ReadDeprecated(paramsJson);
   if (!params || !params->is_dict())
     return Status(kUnknownError);
-  return ProcessCapabilities(
-      *static_cast<const base::DictionaryValue*>(params.get()),
-      result_capabilities);
+  return ProcessCapabilities(params->GetDict(), result_capabilities);
 }
 
 }  // namespace
@@ -349,7 +319,7 @@
 
 TEST(SessionCommandsTest, FileUpload) {
   Session session("id");
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> value;
   // Zip file entry that contains a single file with contents 'COW\n', base64
   // encoded following RFC 1521.
@@ -357,7 +327,7 @@
       "UEsDBBQAAAAAAMROi0K/wAzGBAAAAAQAAAADAAAAbW9vQ09XClBLAQIUAxQAAAAAAMROi0K/"
       "wAzG\nBAAAAAQAAAADAAAAAAAAAAAAAACggQAAAABtb29QSwUGAAAAAAEAAQAxAAAAJQAAAA"
       "AA\n";
-  params.GetDict().Set("file", kBase64ZipEntry);
+  params.Set("file", kBase64ZipEntry);
   Status status = ExecuteUploadFile(&session, params, &value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   ASSERT_TRUE(value->is_string());
@@ -437,7 +407,7 @@
   DetachChrome* chrome = new DetachChrome();
   Session session("id", std::unique_ptr<Chrome>(chrome));
 
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> value;
 
   ASSERT_EQ(kOk, ExecuteQuit(false, &session, params, &value).code());
@@ -453,7 +423,7 @@
   Session session("id", std::unique_ptr<Chrome>(chrome));
   session.detach = true;
 
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> value;
 
   ASSERT_EQ(kOk, ExecuteQuit(true, &session, params, &value).code());
@@ -478,7 +448,7 @@
 
 TEST(SessionCommandsTest, QuitFails) {
   Session session("id", std::unique_ptr<Chrome>(new FailsToQuitChrome()));
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> value;
   ASSERT_EQ(kUnknownError, ExecuteQuit(false, &session, params, &value).code());
 }
@@ -604,7 +574,6 @@
   MockChrome* chrome = new MockChrome(binfo);
   Session session("id", std::unique_ptr<Chrome>(chrome));
 
-  const base::DictionaryValue* params_in = nullptr;
   base::Value value = base::JSONReader::Read(
                           R"({
         "capabilities": {
@@ -629,7 +598,8 @@
         }
       })")
                           .value();
-  ASSERT_TRUE(value.GetAsDictionary(&params_in));
+  base::Value::Dict* params_in = value.GetIfDict();
+  ASSERT_TRUE(params_in);
 
   const base::DictionaryValue* desired_caps_out;
   base::DictionaryValue merged_out;
@@ -655,7 +625,6 @@
   MockChrome* chrome = new MockChrome(binfo);
   Session session("id", std::unique_ptr<Chrome>(chrome));
 
-  const base::DictionaryValue* params_in = nullptr;
   base::Value value = base::JSONReader::Read(
                           R"({
         "capabilities": {
@@ -664,7 +633,8 @@
         }
       })")
                           .value();
-  ASSERT_TRUE(value.GetAsDictionary(&params_in));
+  const base::Value::Dict* params_in = value.GetIfDict();
+  ASSERT_TRUE(params_in);
   const base::DictionaryValue* desired_caps_out;
   base::DictionaryValue merged_out;
   Capabilities capabilities_out;
@@ -689,7 +659,6 @@
   MockChrome* chrome = new MockChrome(binfo);
   Session session("id", std::unique_ptr<Chrome>(chrome));
 
-  const base::DictionaryValue* params_in = nullptr;
   base::Value value = base::JSONReader::Read(
                           R"({
         "desiredCapabilities": {
@@ -700,7 +669,8 @@
         }
       })")
                           .value();
-  ASSERT_TRUE(value.GetAsDictionary(&params_in));
+  const base::Value::Dict* params_in = value.GetIfDict();
+  ASSERT_TRUE(params_in);
   const base::DictionaryValue* desired_caps_out;
   base::DictionaryValue merged_out;
   Capabilities capabilities_out;
diff --git a/chrome/test/chromedriver/util.cc b/chrome/test/chromedriver/util.cc
index 918042a..561505a 100644
--- a/chrome/test/chromedriver/util.cc
+++ b/chrome/test/chromedriver/util.cc
@@ -447,29 +447,8 @@
 
 namespace {
 
-// Deprecated. Please use GetOptionalValue.
-// See crbug.com/1187001 for the migration details.
 template <typename T>
-bool GetOptionalValueDeprecated(const base::DictionaryValue* dict,
-                                base::StringPiece path,
-                                T* out_value,
-                                bool* has_value,
-                                bool (base::Value::*getter)(T*) const) {
-  if (has_value != nullptr)
-    *has_value = false;
-  const base::Value* value = dict->FindPath(path);
-  if (value == nullptr)
-    return true;
-  if ((value->*getter)(out_value)) {
-    if (has_value != nullptr)
-      *has_value = true;
-    return true;
-  }
-  return false;
-}
-
-template <typename T>
-bool GetOptionalValue(const base::Value* dict,
+bool GetOptionalValue(const base::Value::Dict& dict,
                       base::StringPiece path,
                       T* out_value,
                       bool* has_value,
@@ -477,10 +456,7 @@
   if (has_value != nullptr)
     *has_value = false;
 
-  if (!dict->is_dict())
-    return false;
-
-  const base::Value* value = dict->FindPath(path);
+  const base::Value* value = dict.FindByDottedPath(path);
   if (!value)
     return true;
   absl::optional<T> maybe_value = (value->*getter)();
@@ -495,7 +471,7 @@
 
 }  // namespace
 
-bool GetOptionalBool(const base::DictionaryValue* dict,
+bool GetOptionalBool(const base::Value::Dict& dict,
                      base::StringPiece path,
                      bool* out_value,
                      bool* has_value) {
@@ -503,7 +479,7 @@
                           &base::Value::GetIfBool);
 }
 
-bool GetOptionalInt(const base::DictionaryValue* dict,
+bool GetOptionalInt(const base::Value::Dict& dict,
                     base::StringPiece path,
                     int* out_value,
                     bool* has_value) {
@@ -512,7 +488,7 @@
     return true;
   }
   // See if we have a double that contains an int value.
-  absl::optional<double> maybe_decimal = dict->FindDoublePath(path);
+  absl::optional<double> maybe_decimal = dict.FindDoubleByDottedPath(path);
   if (!maybe_decimal.has_value())
     return false;
 
@@ -526,7 +502,7 @@
   return false;
 }
 
-bool GetOptionalDouble(const base::DictionaryValue* dict,
+bool GetOptionalDouble(const base::Value::Dict& dict,
                        base::StringPiece path,
                        double* out_value,
                        bool* has_value) {
@@ -534,17 +510,14 @@
                           &base::Value::GetIfDouble);
 }
 
-bool GetOptionalString(const base::DictionaryValue* dict,
+bool GetOptionalString(const base::Value::Dict& dict,
                        base::StringPiece path,
                        std::string* out_value,
                        bool* has_value) {
   if (has_value != nullptr)
     *has_value = false;
 
-  if (!dict->is_dict())
-    return false;
-
-  const base::Value* value = dict->FindPath(path);
+  const base::Value* value = dict.FindByDottedPath(path);
   if (!value)
     return true;
 
@@ -557,25 +530,32 @@
   return false;
 }
 
-bool GetOptionalDictionary(const base::DictionaryValue* dict,
+bool GetOptionalDictionary(const base::Value::Dict& dict,
                            base::StringPiece path,
-                           const base::DictionaryValue** out_value,
+                           const base::Value::Dict** out_value,
                            bool* has_value) {
-  return GetOptionalValueDeprecated(dict, path, out_value, has_value,
-                                    &base::Value::GetAsDictionary);
+  if (has_value != nullptr)
+    *has_value = false;
+  const base::Value* value = dict.FindByDottedPath(path);
+  if (value == nullptr)
+    return true;
+  if (value->is_dict()) {
+    *out_value = value->GetIfDict();
+    if (has_value != nullptr)
+      *has_value = true;
+    return true;
+  }
+  return false;
 }
 
-bool GetOptionalList(const base::DictionaryValue* dict,
+bool GetOptionalList(const base::Value::Dict& dict,
                      base::StringPiece path,
                      const base::Value::List** out_value,
                      bool* has_value) {
   if (has_value != nullptr)
     *has_value = false;
 
-  if (!dict->is_dict())
-    return false;
-
-  const base::Value* value = dict->FindPath(path);
+  const base::Value* value = dict.FindByDottedPath(path);
   if (!value)
     return true;
 
@@ -589,7 +569,7 @@
   return false;
 }
 
-bool GetOptionalSafeInt(const base::DictionaryValue* dict,
+bool GetOptionalSafeInt(const base::Value::Dict& dict,
                         base::StringPiece path,
                         int64_t* out_value,
                         bool* has_value) {
@@ -606,7 +586,7 @@
   }
 
   // Check if we have a double, which may or may not contain a safe int value.
-  absl::optional<double> maybe_decimal = dict->FindDoublePath(path);
+  absl::optional<double> maybe_decimal = dict.FindDoubleByDottedPath(path);
   if (!maybe_decimal.has_value())
     return false;
 
@@ -626,14 +606,14 @@
   return true;
 }
 
-bool SetSafeInt(base::DictionaryValue* dict,
+bool SetSafeInt(base::Value::Dict& dict,
                 const base::StringPiece path,
                 int64_t in_value_64) {
   int int_value = static_cast<int>(in_value_64);
   if (in_value_64 == int_value)
-    return dict->SetInteger(path, in_value_64);
+    return dict.SetByDottedPath(path, int_value);
   else
-    return dict->SetDoublePath(path, in_value_64);
+    return dict.SetByDottedPath(path, static_cast<double>(in_value_64));
 }
 
 std::string WebViewIdToWindowHandle(const std::string& web_view_id) {
diff --git a/chrome/test/chromedriver/util.h b/chrome/test/chromedriver/util.h
index 46d574e3..3e78512 100644
--- a/chrome/test/chromedriver/util.h
+++ b/chrome/test/chromedriver/util.h
@@ -65,38 +65,38 @@
 //   thus 2.0 is an integer. Also, the spec sometimes uses "safe integer"
 //   (https://www.w3.org/TR/webdriver/#dfn-maximum-safe-integer), whose
 //   absolute value can occupy up to 53 bits.
-bool GetOptionalBool(const base::DictionaryValue* dict,
+bool GetOptionalBool(const base::Value::Dict& dict,
                      base::StringPiece path,
                      bool* out_value,
                      bool* has_value = nullptr);
-bool GetOptionalInt(const base::DictionaryValue* dict,
+bool GetOptionalInt(const base::Value::Dict& dict,
                     base::StringPiece path,
                     int* out_value,
                     bool* has_value = nullptr);
-bool GetOptionalDouble(const base::DictionaryValue* dict,
+bool GetOptionalDouble(const base::Value::Dict& dict,
                        base::StringPiece path,
                        double* out_value,
                        bool* has_value = nullptr);
-bool GetOptionalString(const base::DictionaryValue* dict,
+bool GetOptionalString(const base::Value::Dict& dict,
                        base::StringPiece path,
                        std::string* out_value,
                        bool* has_value = nullptr);
-bool GetOptionalDictionary(const base::DictionaryValue* dict,
+bool GetOptionalDictionary(const base::Value::Dict& dict,
                            base::StringPiece path,
-                           const base::DictionaryValue** out_value,
+                           const base::Value::Dict** out_value,
                            bool* has_value = nullptr);
-bool GetOptionalList(const base::DictionaryValue* dict,
+bool GetOptionalList(const base::Value::Dict& dict,
                      base::StringPiece path,
                      const base::Value::List** out_value,
                      bool* has_value = nullptr);
 // Handles "safe integer" mentioned in W3C spec,
 // https://www.w3.org/TR/webdriver/#dfn-maximum-safe-integer.
-bool GetOptionalSafeInt(const base::DictionaryValue* dict,
+bool GetOptionalSafeInt(const base::Value::Dict& dict,
                         base::StringPiece path,
                         int64_t* out_value,
                         bool* has_value = nullptr);
 
-bool SetSafeInt(base::DictionaryValue* dict,
+bool SetSafeInt(base::Value::Dict& dict,
                 const base::StringPiece path,
                 int64_t in_value_64);
 
diff --git a/chrome/test/chromedriver/util_unittest.cc b/chrome/test/chromedriver/util_unittest.cc
index 91cbce8..7145f6a 100644
--- a/chrome/test/chromedriver/util_unittest.cc
+++ b/chrome/test/chromedriver/util_unittest.cc
@@ -56,10 +56,10 @@
 const base::StringPiece key = "key";
 const int64_t max_safe_int = (1ll << 53) - 1;
 
-void DictNoInit(base::DictionaryValue* dict) {}
+void DictNoInit(base::Value::Dict* dict) {}
 
-void DictInitNull(base::DictionaryValue* dict) {
-  dict->Set(key, std::make_unique<base::Value>());
+void DictInitNull(base::Value::Dict* dict) {
+  dict->Set(key, base::Value());
 }
 
 class DictInitBool {
@@ -67,9 +67,7 @@
 
  public:
   explicit DictInitBool(bool v) : init_value(v) {}
-  void operator()(base::DictionaryValue* dict) {
-    dict->GetDict().Set(key, init_value);
-  }
+  void operator()(base::Value::Dict* dict) { dict->Set(key, init_value); }
 };
 
 class DictInitInt {
@@ -77,9 +75,7 @@
 
  public:
   explicit DictInitInt(int v) : init_value(v) {}
-  void operator()(base::DictionaryValue* dict) {
-    dict->GetDict().Set(key, init_value);
-  }
+  void operator()(base::Value::Dict* dict) { dict->Set(key, init_value); }
 };
 
 class DictInitDouble {
@@ -87,9 +83,7 @@
 
  public:
   explicit DictInitDouble(double v) : init_value(v) {}
-  void operator()(base::DictionaryValue* dict) {
-    dict->GetDict().Set(key, init_value);
-  }
+  void operator()(base::Value::Dict* dict) { dict->Set(key, init_value); }
 };
 
 class DictInitString {
@@ -97,13 +91,11 @@
 
  public:
   explicit DictInitString(const std::string& v) : init_value(v) {}
-  void operator()(base::DictionaryValue* dict) {
-    dict->GetDict().Set(key, init_value);
-  }
+  void operator()(base::Value::Dict* dict) { dict->Set(key, init_value); }
 };
 
 template <typename ResultType, typename DictInitFunc>
-void TestGetOptionalValue(bool (*func_to_test)(const base::DictionaryValue*,
+void TestGetOptionalValue(bool (*func_to_test)(const base::Value::Dict&,
                                                base::StringPiece,
                                                ResultType*,
                                                bool*),
@@ -112,19 +104,19 @@
                           const ResultType& expected_result_value,
                           bool expected_return_value,
                           bool expected_has_value) {
-  base::DictionaryValue dict;
+  base::Value::Dict dict;
   dict_init_func(&dict);
 
   ResultType result_value = init_result_value;
   bool has_value;
-  bool return_value = func_to_test(&dict, key, &result_value, &has_value);
+  bool return_value = func_to_test(dict, key, &result_value, &has_value);
   ASSERT_EQ(return_value, expected_return_value);
   ASSERT_EQ(result_value, expected_result_value);
   if (return_value)
     ASSERT_EQ(has_value, expected_has_value);
 
   result_value = init_result_value;
-  return_value = func_to_test(&dict, key, &result_value, nullptr);
+  return_value = func_to_test(dict, key, &result_value, nullptr);
   ASSERT_EQ(return_value, expected_return_value);
   ASSERT_EQ(result_value, expected_result_value);
 }
@@ -152,9 +144,9 @@
 }
 
 TEST(GetOptionalValue, DictionaryNone) {
-  base::DictionaryValue dv;
-  const base::DictionaryValue* tmp = &dv;
-  TestGetOptionalValue<const base::DictionaryValue*>(
+  base::Value::Dict dv;
+  const base::Value::Dict* tmp = &dv;
+  TestGetOptionalValue<const base::Value::Dict*>(
       GetOptionalDictionary, DictNoInit, tmp, tmp, true, false);
 }
 
@@ -191,9 +183,9 @@
 }
 
 TEST(GetOptionalValue, DictionaryNull) {
-  base::DictionaryValue dv;
-  const base::DictionaryValue* tmp = &dv;
-  TestGetOptionalValue<const base::DictionaryValue*>(
+  base::Value::Dict dv;
+  const base::Value::Dict* tmp = &dv;
+  TestGetOptionalValue<const base::Value::Dict*>(
       GetOptionalDictionary, DictInitNull, tmp, tmp, false, false);
 }
 
@@ -230,9 +222,9 @@
 }
 
 TEST(GetOptionalValue, DictionaryWrongType) {
-  base::DictionaryValue dv;
-  const base::DictionaryValue* tmp = &dv;
-  TestGetOptionalValue<const base::DictionaryValue*>(
+  base::Value::Dict dv;
+  const base::Value::Dict* tmp = &dv;
+  TestGetOptionalValue<const base::Value::Dict*>(
       GetOptionalDictionary, DictInitString("test"), tmp, tmp, false, false);
 }
 
@@ -269,21 +261,19 @@
 }
 
 TEST(GetOptionalValue, DictionaryNoConversion) {
-  base::DictionaryValue dv1;
-  dv1.GetDict().Set("dv", "1");
-  base::DictionaryValue dv2;
-  dv2.GetDict().Set("dv", "2");
+  base::Value::Dict dv1;
+  dv1.Set("dv", "1");
+  base::Value::Dict dv2;
+  dv2.Set("dv", "2");
 
-  base::DictionaryValue dict;
-  dict.GetDict().Set(key, dv1.Clone());
-  const base::DictionaryValue* res = &dv2;
+  base::Value::Dict dict;
+  dict.Set(key, dv1.Clone());
+  const base::Value::Dict* res = &dv2;
   bool has_value;
-  bool has_dict = GetOptionalDictionary(&dict, key, &res, &has_value);
+  bool has_dict = GetOptionalDictionary(dict, key, &res, &has_value);
   ASSERT_EQ(has_value, true);
   ASSERT_EQ(has_dict, true);
-  // Cast to base class to ensure print properly if different
-  ASSERT_EQ(static_cast<const base::Value&>(*res),
-            static_cast<const base::Value&>(dv1));
+  ASSERT_EQ(*res, dv1);
 }
 
 TEST(GetOptionalValue, ListNoConversion) {
@@ -298,8 +288,7 @@
   dict.GetDict().SetByDottedPath(key, std::move(params));
   const base::Value::List* res = &lv2;
   bool has_value;
-  bool has_dict = GetOptionalList(&base::Value::AsDictionaryValue(dict), key,
-                                  &res, &has_value);
+  bool has_dict = GetOptionalList(dict.GetDict(), key, &res, &has_value);
   ASSERT_EQ(has_value, true);
   ASSERT_EQ(has_dict, true);
   ASSERT_EQ(*res, lv1);
diff --git a/chrome/test/chromedriver/webauthn_commands.cc b/chrome/test/chromedriver/webauthn_commands.cc
index 1ea043c8..b9af1e63 100644
--- a/chrome/test/chromedriver/webauthn_commands.cc
+++ b/chrome/test/chromedriver/webauthn_commands.cc
@@ -89,7 +89,7 @@
 
 Status ExecuteWebAuthnCommand(const WebAuthnCommand& command,
                               Session* session,
-                              const base::DictionaryValue& params,
+                              const base::Value::Dict& params,
                               std::unique_ptr<base::Value>* value) {
   WebView* web_view = nullptr;
   Status status = session->GetTargetWindow(&web_view);
@@ -104,7 +104,7 @@
   if (status.IsError())
     return status;
 
-  return command.Run(web_view, params, value);
+  return command.Run(web_view, base::Value(params.Clone()), value);
 }
 
 Status ExecuteAddVirtualAuthenticator(WebView* web_view,
diff --git a/chrome/test/chromedriver/webauthn_commands.h b/chrome/test/chromedriver/webauthn_commands.h
index 96e9344..abe5f19 100644
--- a/chrome/test/chromedriver/webauthn_commands.h
+++ b/chrome/test/chromedriver/webauthn_commands.h
@@ -8,11 +8,7 @@
 #include <memory>
 
 #include "base/callback_forward.h"
-
-namespace base {
-class DictionaryValue;
-class Value;
-}  // namespace base
+#include "base/values.h"
 
 struct Session;
 class Status;
@@ -26,7 +22,7 @@
 // Executes a WebAuthn command.
 Status ExecuteWebAuthnCommand(const WebAuthnCommand& command,
                               Session* session,
-                              const base::DictionaryValue& params,
+                              const base::Value::Dict& params,
                               std::unique_ptr<base::Value>* value);
 
 // Add a virtual authenticator.
diff --git a/chrome/test/chromedriver/window_commands.cc b/chrome/test/chromedriver/window_commands.cc
index 1288b52b..31c6cbf 100644
--- a/chrome/test/chromedriver/window_commands.cc
+++ b/chrome/test/chromedriver/window_commands.cc
@@ -71,10 +71,9 @@
 // for pointer actions
 enum class PointerActionType { NOT_INITIALIZED, PRESS, MOVE, RELEASE, IDLE };
 
-Status GetMouseButton(const base::DictionaryValue& params,
-                      MouseButton* button) {
+Status GetMouseButton(const base::Value::Dict& params, MouseButton* button) {
   // Default to left mouse button.
-  int button_num = params.GetDict().FindInt("button").value_or(0);
+  int button_num = params.FindInt("button").value_or(0);
   if (button_num < 0 || button_num > 2) {
     return Status(kInvalidArgument,
                   base::StringPrintf("invalid button: %d", button_num));
@@ -244,21 +243,20 @@
   bool session;
 };
 
-std::unique_ptr<base::DictionaryValue> CreateDictionaryFrom(
-    const Cookie& cookie) {
-  std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
-  dict->GetDict().Set("name", cookie.name);
-  dict->GetDict().Set("value", cookie.value);
+base::Value::Dict CreateDictionaryFrom(const Cookie& cookie) {
+  base::Value::Dict dict;
+  dict.Set("name", cookie.name);
+  dict.Set("value", cookie.value);
   if (!cookie.domain.empty())
-    dict->GetDict().Set("domain", cookie.domain);
+    dict.Set("domain", cookie.domain);
   if (!cookie.path.empty())
-    dict->GetDict().Set("path", cookie.path);
+    dict.Set("path", cookie.path);
   if (!cookie.session)
-    SetSafeInt(dict.get(), "expiry", cookie.expiry);
-  dict->GetDict().Set("httpOnly", cookie.http_only);
-  dict->GetDict().Set("secure", cookie.secure);
+    SetSafeInt(dict, "expiry", cookie.expiry);
+  dict.Set("httpOnly", cookie.http_only);
+  dict.Set("secure", cookie.secure);
   if (!cookie.samesite.empty())
-    dict->GetDict().Set("sameSite", cookie.samesite);
+    dict.Set("sameSite", cookie.samesite);
   return dict;
 }
 
@@ -286,8 +284,7 @@
     const std::string* domain = cookie_dict.FindString("domain");
     const std::string* path = cookie_dict.FindString("path");
     std::string samesite;
-    GetOptionalString(&base::Value::AsDictionaryValue(cookie_value), "sameSite",
-                      &samesite);
+    GetOptionalString(cookie_dict, "sameSite", &samesite);
     int64_t expiry =
         static_cast<int64_t>(cookie_dict.FindDouble("expires").value_or(0));
     // Truncate & convert the value to an integer as required by W3C spec.
@@ -330,12 +327,11 @@
       &value);
   if (!status.IsOk())
     return status;
-  base::DictionaryValue* view_attrib;
-  value->GetAsDictionary(&view_attrib);
-  int view_x = view_attrib->GetDict().FindInt("view_x").value_or(0);
-  int view_y = view_attrib->GetDict().FindInt("view_y").value_or(0);
-  int view_width = view_attrib->GetDict().FindInt("view_width").value_or(0);
-  int view_height = view_attrib->GetDict().FindInt("view_height").value_or(0);
+  const base::Value::Dict& view_attrib = value->GetDict();
+  int view_x = view_attrib.FindInt("view_x").value_or(0);
+  int view_y = view_attrib.FindInt("view_y").value_or(0);
+  int view_width = view_attrib.FindInt("view_width").value_or(0);
+  int view_height = view_attrib.FindInt("view_height").value_or(0);
   *offset_x = x - view_x;
   *offset_y = y - view_y;
   if (*offset_x < 0 || *offset_x >= view_width || *offset_y < 0 ||
@@ -344,11 +340,12 @@
   return Status(kOk);
 }
 
-Status ExecuteTouchEvent(
-    Session* session, WebView* web_view, TouchEventType type,
-    const base::DictionaryValue& params) {
-  absl::optional<int> x = params.GetDict().FindInt("x");
-  absl::optional<int> y = params.GetDict().FindInt("y");
+Status ExecuteTouchEvent(Session* session,
+                         WebView* web_view,
+                         TouchEventType type,
+                         const base::Value::Dict& params) {
+  absl::optional<int> x = params.FindInt("x");
+  absl::optional<int> y = params.FindInt("y");
   if (!x)
     return Status(kInvalidArgument, "'x' must be an integer");
   if (!y)
@@ -383,29 +380,26 @@
                              args, &value);
   if (!status.IsOk())
     return status;
-  base::DictionaryValue* view_attrib;
-  value->GetAsDictionary(&view_attrib);
-  absl::optional<int> maybe_inner_width =
-      view_attrib->GetDict().FindInt("view_width");
+  const base::Value::Dict& view_attrib = value->GetDict();
+  absl::optional<int> maybe_inner_width = view_attrib.FindInt("view_width");
   if (maybe_inner_width)
     *innerWidth = *maybe_inner_width;
 
-  absl::optional<int> maybe_inner_height =
-      view_attrib->GetDict().FindInt("view_height");
+  absl::optional<int> maybe_inner_height = view_attrib.FindInt("view_height");
   if (maybe_inner_height)
     *innerHeight = *maybe_inner_height;
   return Status(kOk);
 }
 
-Status ProcessPauseAction(const base::DictionaryValue* action_item,
-                          base::DictionaryValue* action) {
+Status ProcessPauseAction(const base::Value::Dict& action_item,
+                          base::Value::Dict* action) {
   int duration = 0;
   bool has_value = false;
   if (!GetOptionalInt(action_item, "duration", &duration, &has_value) ||
       duration < 0)
     return Status(kInvalidArgument, "'duration' must be a non-negative int");
   if (has_value)
-    action->GetDict().Set("duration", duration);
+    action->Set("duration", duration);
   return Status(kOk);
 }
 
@@ -464,10 +458,10 @@
 const char kLandscape[] = "landscape";
 const char kPortrait[] = "portrait";
 
-Status ParseOrientation(const base::DictionaryValue& params,
+Status ParseOrientation(const base::Value::Dict& params,
                         std::string* orientation) {
   bool has_value;
-  if (!GetOptionalString(&params, "orientation", orientation, &has_value)) {
+  if (!GetOptionalString(params, "orientation", orientation, &has_value)) {
     return Status(kInvalidArgument, "'orientation' must be a string");
   }
 
@@ -481,9 +475,9 @@
   return Status(kOk);
 }
 
-Status ParseScale(const base::DictionaryValue& params, double* scale) {
+Status ParseScale(const base::Value::Dict& params, double* scale) {
   bool has_value;
-  if (!GetOptionalDouble(&params, "scale", scale, &has_value)) {
+  if (!GetOptionalDouble(params, "scale", scale, &has_value)) {
     return Status(kInvalidArgument, "'scale' must be a double");
   }
 
@@ -495,18 +489,18 @@
   return Status(kOk);
 }
 
-Status ParseBoolean(const base::DictionaryValue& params,
+Status ParseBoolean(const base::Value::Dict& params,
                     const std::string& name,
                     bool default_value,
                     bool* b) {
   *b = default_value;
-  if (!GetOptionalBool(&params, name, b)) {
+  if (!GetOptionalBool(params, name, b)) {
     return Status(kInvalidArgument, "'" + name + "' must be a boolean");
   }
   return Status(kOk);
 }
 
-Status GetNonNegativeDouble(const base::DictionaryValue* dict,
+Status GetNonNegativeDouble(const base::Value::Dict& dict,
                             const std::string& parent,
                             const std::string& child,
                             double* attribute) {
@@ -531,10 +525,10 @@
   double height;
 };
 
-Status ParsePage(const base::DictionaryValue& params, Page* page) {
+Status ParsePage(const base::Value::Dict& params, Page* page) {
   bool has_value;
-  const base::DictionaryValue* page_dict;
-  if (!GetOptionalDictionary(&params, "page", &page_dict, &has_value)) {
+  const base::Value::Dict* page_dict = nullptr;
+  if (!GetOptionalDictionary(params, "page", &page_dict, &has_value)) {
     return Status(kInvalidArgument, "'page' must be an object");
   }
   page->width = ConvertCentimeterToInch(21.59);
@@ -543,11 +537,11 @@
     return Status(kOk);
 
   Status status =
-      GetNonNegativeDouble(page_dict, "page", "width", &page->width);
+      GetNonNegativeDouble(*page_dict, "page", "width", &page->width);
   if (status.IsError())
     return status;
 
-  status = GetNonNegativeDouble(page_dict, "page", "height", &page->height);
+  status = GetNonNegativeDouble(*page_dict, "page", "height", &page->height);
   if (status.IsError())
     return status;
 
@@ -561,10 +555,10 @@
   double right;
 };
 
-Status ParseMargin(const base::DictionaryValue& params, Margin* margin) {
+Status ParseMargin(const base::Value::Dict& params, Margin* margin) {
   bool has_value;
-  const base::DictionaryValue* margin_dict;
-  if (!GetOptionalDictionary(&params, "margin", &margin_dict, &has_value)) {
+  const base::Value::Dict* margin_dict = nullptr;
+  if (!GetOptionalDictionary(params, "margin", &margin_dict, &has_value)) {
     return Status(kInvalidArgument, "'margin' must be an object");
   }
 
@@ -577,31 +571,32 @@
     return Status(kOk);
 
   Status status =
-      GetNonNegativeDouble(margin_dict, "margin", "top", &margin->top);
+      GetNonNegativeDouble(*margin_dict, "margin", "top", &margin->top);
   if (status.IsError())
     return status;
 
   status =
-      GetNonNegativeDouble(margin_dict, "margin", "bottom", &margin->bottom);
+      GetNonNegativeDouble(*margin_dict, "margin", "bottom", &margin->bottom);
   if (status.IsError())
     return status;
 
-  status = GetNonNegativeDouble(margin_dict, "margin", "left", &margin->left);
+  status = GetNonNegativeDouble(*margin_dict, "margin", "left", &margin->left);
   if (status.IsError())
     return status;
 
-  status = GetNonNegativeDouble(margin_dict, "margin", "right", &margin->right);
+  status =
+      GetNonNegativeDouble(*margin_dict, "margin", "right", &margin->right);
   if (status.IsError())
     return status;
 
   return Status(kOk);
 }
 
-Status ParsePageRanges(const base::DictionaryValue& params,
+Status ParsePageRanges(const base::Value::Dict& params,
                        std::string* pageRanges) {
   bool has_value;
   const base::Value::List* page_range_list = nullptr;
-  if (!GetOptionalList(&params, "pageRanges", &page_range_list, &has_value)) {
+  if (!GetOptionalList(params, "pageRanges", &page_range_list, &has_value)) {
     return Status(kInvalidArgument, "'pageRanges' must be an array");
   }
 
@@ -637,25 +632,24 @@
 // 3. Optional with value from dictionary.
 template <typename T>
 absl::optional<T> ParseIfInDictionary(
-    const base::DictionaryValue* dict,
+    const base::Value::Dict& dict,
     base::StringPiece key,
     T default_value,
     absl::optional<T> (base::Value::*getterIfType)() const) {
-  const auto* val = dict->GetDict().Find(key);
+  const auto* val = dict.Find(key);
   if (!val)
     return absl::make_optional(default_value);
   return (val->*getterIfType)();
 }
 
-absl::optional<double> ParseDoubleIfInDictionary(
-    const base::DictionaryValue* dict,
-    base::StringPiece key,
-    double default_value) {
+absl::optional<double> ParseDoubleIfInDictionary(const base::Value::Dict& dict,
+                                                 base::StringPiece key,
+                                                 double default_value) {
   return ParseIfInDictionary(dict, key, default_value,
                              &base::Value::GetIfDouble);
 }
 
-absl::optional<int> ParseIntIfInDictionary(const base::DictionaryValue* dict,
+absl::optional<int> ParseIntIfInDictionary(const base::Value::Dict& dict,
                                            base::StringPiece key,
                                            int default_value) {
   return ParseIfInDictionary(dict, key, default_value, &base::Value::GetIfInt);
@@ -664,7 +658,7 @@
 
 Status ExecuteWindowCommand(const WindowCommand& command,
                             Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value) {
   Timeout timeout;
   WebView* web_view = nullptr;
@@ -759,14 +753,14 @@
 
 Status ExecuteGet(Session* session,
                   WebView* web_view,
-                  const base::DictionaryValue& params,
+                  const base::Value::Dict& params,
                   std::unique_ptr<base::Value>* value,
                   Timeout* timeout) {
   timeout->SetDuration(session->page_load_timeout);
-  std::string url;
-  if (!params.GetString("url", &url))
+  const std::string* url = params.FindString("url");
+  if (!url)
     return Status(kInvalidArgument, "'url' must be a string");
-  Status status = web_view->Load(url, timeout);
+  Status status = web_view->Load(*url, timeout);
   if (status.IsError())
     return status;
   session->SwitchToTopFrame();
@@ -775,12 +769,13 @@
 
 Status ExecuteExecuteScript(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
-  std::string script;
-  if (!params.GetString("script", &script))
+  const std::string* maybe_script = params.FindString("script");
+  if (!maybe_script)
     return Status(kInvalidArgument, "'script' must be a string");
+  std::string script = *maybe_script;
   if (script == ":takeHeapSnapshot") {
     return web_view->TakeHeapSnapshot(value);
   } else if (script == ":startProfile") {
@@ -788,7 +783,7 @@
   } else if (script == ":endProfile") {
     return web_view->EndProfile(value);
   } else {
-    const base::Value::List* args = params.GetDict().FindList("args");
+    const base::Value::List* args = params.FindList("args");
     // Need to support line oriented comment
     if (script.find("//") != std::string::npos)
       script = script + "\n";
@@ -804,13 +799,14 @@
 
 Status ExecuteExecuteAsyncScript(Session* session,
                                  WebView* web_view,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* value,
                                  Timeout* timeout) {
-  std::string script;
-  if (!params.GetString("script", &script))
+  const std::string* maybe_script = params.FindString("script");
+  if (!maybe_script)
     return Status(kInvalidArgument, "'script' must be a string");
-  const base::Value::List* args = params.GetDict().FindList("args");
+  std::string script = *maybe_script;
+  const base::Value::List* args = params.FindList("args");
 
   // Need to support line oriented comment
   if (script.find("//") != std::string::npos)
@@ -826,15 +822,19 @@
 
 Status ExecuteNewWindow(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout) {
   std::string type;
   // "type" can either be None or a string.
-  auto* type_param = params.GetDict().Find("type");
-  if (!(!type_param || type_param->is_none() ||
-        params.GetString("type", &type)))
+  auto* type_param = params.Find("type");
+  if (!type_param || type_param->is_none()) {
+    // Nothing more to do
+  } else if (type_param->is_string()) {
+    type = type_param->GetString();
+  } else {
     return Status(kInvalidArgument, "missing or invalid 'type'");
+  }
 
   // By default, creates new tab.
   Chrome::WindowType window_type = (type == "window")
@@ -858,10 +858,10 @@
 
 Status ExecuteSwitchToFrame(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
-  const base::Value* id = params.GetDict().Find("id");
+  const base::Value* id = params.Find("id");
   if (id == nullptr)
     return Status(kInvalidArgument, "missing 'id'");
 
@@ -872,14 +872,14 @@
 
   std::string script;
   base::Value::List args;
-  const base::DictionaryValue* id_dict;
-  if (id->GetAsDictionary(&id_dict)) {
-    std::string element_id;
-    if (!id_dict->GetString(GetElementKey(), &element_id))
+  const base::Value::Dict* id_dict = id->GetIfDict();
+  if (id_dict) {
+    const std::string* element_id = id_dict->FindString(GetElementKey());
+    if (!element_id)
       return Status(kInvalidArgument, "missing 'ELEMENT'");
     bool is_displayed = false;
-    Status status = IsElementDisplayed(
-          session, web_view, element_id, true, &is_displayed);
+    Status status =
+        IsElementDisplayed(session, web_view, *element_id, true, &is_displayed);
     if (status.IsError())
       return status;
     script = "function(elem) { return elem; }";
@@ -944,7 +944,7 @@
 
 Status ExecuteSwitchToParentFrame(Session* session,
                                   WebView* web_view,
-                                  const base::DictionaryValue& params,
+                                  const base::Value::Dict& params,
                                   std::unique_ptr<base::Value>* value,
                                   Timeout* timeout) {
   session->SwitchToParentFrame();
@@ -953,7 +953,7 @@
 
 Status ExecuteGetTitle(Session* session,
                        WebView* web_view,
-                       const base::DictionaryValue& params,
+                       const base::Value::Dict& params,
                        std::unique_ptr<base::Value>* value,
                        Timeout* timeout) {
   const char kGetTitleScript[] = "function() {  return document.title;}";
@@ -963,7 +963,7 @@
 
 Status ExecuteGetPageSource(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
   const char kGetPageSource[] =
@@ -977,26 +977,28 @@
 Status ExecuteFindElement(int interval_ms,
                           Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout) {
-  return FindElement(interval_ms, true, nullptr, session, web_view, params,
-                     value);
+  return FindElement(
+      interval_ms, true, nullptr, session, web_view,
+      base::Value::AsDictionaryValue(base::Value(params.Clone())), value);
 }
 
 Status ExecuteFindElements(int interval_ms,
                            Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout) {
-  return FindElement(interval_ms, false, nullptr, session, web_view, params,
-                     value);
+  return FindElement(
+      interval_ms, false, nullptr, session, web_view,
+      base::Value::AsDictionaryValue(base::Value(params.Clone())), value);
 }
 
 Status ExecuteGetCurrentUrl(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
   std::string url;
@@ -1015,7 +1017,7 @@
 
 Status ExecuteGoBack(Session* session,
                      WebView* web_view,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value,
                      Timeout* timeout) {
   timeout->SetDuration(session->page_load_timeout);
@@ -1028,7 +1030,7 @@
 
 Status ExecuteGoForward(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout) {
   timeout->SetDuration(session->page_load_timeout);
@@ -1041,7 +1043,7 @@
 
 Status ExecuteRefresh(Session* session,
                       WebView* web_view,
-                      const base::DictionaryValue& params,
+                      const base::Value::Dict& params,
                       std::unique_ptr<base::Value>* value,
                       Timeout* timeout) {
   timeout->SetDuration(session->page_load_timeout);
@@ -1054,7 +1056,7 @@
 
 Status ExecuteFreeze(Session* session,
                      WebView* web_view,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value,
                      Timeout* timeout) {
   timeout->SetDuration(session->page_load_timeout);
@@ -1064,7 +1066,7 @@
 
 Status ExecuteResume(Session* session,
                      WebView* web_view,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value,
                      Timeout* timeout) {
   timeout->SetDuration(session->page_load_timeout);
@@ -1076,13 +1078,18 @@
 
 Status ExecuteMouseMoveTo(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout) {
   std::string element_id;
-  bool has_element = params.GetString("element", &element_id);
-  absl::optional<int> x_offset = params.GetDict().FindInt("xoffset");
-  absl::optional<int> y_offset = params.GetDict().FindInt("yoffset");
+  bool has_element = false;
+  const std::string* maybe_element_id = params.FindString("element");
+  if (maybe_element_id) {
+    element_id = *maybe_element_id;
+    has_element = true;
+  }
+  absl::optional<int> x_offset = params.FindInt("xoffset");
+  absl::optional<int> y_offset = params.FindInt("yoffset");
   bool has_offset = x_offset.has_value() && y_offset.has_value();
   if (!has_element && !has_offset)
     return Status(kInvalidArgument,
@@ -1116,7 +1123,7 @@
 
 Status ExecuteMouseClick(Session* session,
                          WebView* web_view,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value,
                          Timeout* timeout) {
   MouseButton button;
@@ -1138,7 +1145,7 @@
 
 Status ExecuteMouseButtonDown(Session* session,
                               WebView* web_view,
-                              const base::DictionaryValue& params,
+                              const base::Value::Dict& params,
                               std::unique_ptr<base::Value>* value,
                               Timeout* timeout) {
   MouseButton button;
@@ -1156,7 +1163,7 @@
 
 Status ExecuteMouseButtonUp(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
   MouseButton button;
@@ -1175,7 +1182,7 @@
 
 Status ExecuteMouseDoubleClick(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout) {
   MouseButton button;
@@ -1204,7 +1211,7 @@
 
 Status ExecuteTouchDown(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout) {
   return ExecuteTouchEvent(session, web_view, kTouchStart, params);
@@ -1212,7 +1219,7 @@
 
 Status ExecuteTouchUp(Session* session,
                       WebView* web_view,
-                      const base::DictionaryValue& params,
+                      const base::Value::Dict& params,
                       std::unique_ptr<base::Value>* value,
                       Timeout* timeout) {
   return ExecuteTouchEvent(session, web_view, kTouchEnd, params);
@@ -1220,7 +1227,7 @@
 
 Status ExecuteTouchMove(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout) {
   return ExecuteTouchEvent(session, web_view, kTouchMove, params);
@@ -1228,21 +1235,21 @@
 
 Status ExecuteTouchScroll(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout) {
   WebPoint location = session->mouse_position;
-  std::string element;
-  if (params.GetString("element", &element)) {
-    Status status = GetElementClickableLocation(
-        session, web_view, element, &location);
+  const std::string* element = params.FindString("element");
+  if (element) {
+    Status status =
+        GetElementClickableLocation(session, web_view, *element, &location);
     if (status.IsError())
       return status;
   }
-  absl::optional<int> xoffset = params.GetDict().FindInt("xoffset");
+  absl::optional<int> xoffset = params.FindInt("xoffset");
   if (!xoffset)
     return Status(kInvalidArgument, "'xoffset' must be an integer");
-  absl::optional<int> yoffset = params.GetDict().FindInt("yoffset");
+  absl::optional<int> yoffset = params.FindInt("yoffset");
   if (!yoffset)
     return Status(kInvalidArgument, "'yoffset' must be an integer");
   return web_view->SynthesizeScrollGesture(location.x, location.y, *xoffset,
@@ -1251,32 +1258,38 @@
 
 Status ProcessInputActionSequence(
     Session* session,
-    const base::DictionaryValue* action_sequence,
+    const base::Value::Dict& action_sequence,
     std::vector<std::unique_ptr<base::DictionaryValue>>* action_list) {
-  std::string id;
-  std::string type;
-  const base::DictionaryValue* parameters;
+  const std::string* maybe_type = action_sequence.FindString("type");
   std::string pointer_type;
-  if (!action_sequence->GetString("type", &type) ||
-      ((type != "key") && (type != "pointer") && (type != "wheel") &&
-       (type != "none"))) {
+  if (!maybe_type || ((*maybe_type != "key") && (*maybe_type != "pointer") &&
+                      (*maybe_type != "wheel") && (*maybe_type != "none"))) {
     return Status(kInvalidArgument,
                   "'type' must be one of the strings 'key', 'pointer', 'wheel' "
                   "or 'none'");
   }
+  const std::string& type = *maybe_type;
 
-  if (!action_sequence->GetString("id", &id))
+  const std::string* maybe_id = action_sequence.FindString("id");
+  if (!maybe_id)
     return Status(kInvalidArgument, "'id' must be a string");
+  const std::string& id = *maybe_id;
 
   if (type == "pointer") {
-    if (action_sequence->GetDictionary("parameters", &parameters)) {
+    const base::Value::Dict* parameters =
+        action_sequence.FindDict("parameters");
+    if (parameters) {
+      const std::string* maybe_pointer_type =
+          parameters->FindString("pointerType");
       // error check arguments
-      if (!parameters->GetString("pointerType", &pointer_type) ||
-          (pointer_type != "mouse" && pointer_type != "pen" &&
-           pointer_type != "touch"))
+      if (!maybe_pointer_type ||
+          (*maybe_pointer_type != "mouse" && *maybe_pointer_type != "pen" &&
+           *maybe_pointer_type != "touch")) {
         return Status(
             kInvalidArgument,
             "'pointerType' must be a string and one of mouse, pen or touch");
+      }
+      pointer_type = *maybe_pointer_type;
     } else {
       pointer_type = "mouse";
     }
@@ -1286,19 +1299,22 @@
   for (const base::Value& source_value :
        session->active_input_sources.GetList()) {
     DCHECK(source_value.is_dict());
-    const base::DictionaryValue& source =
-        base::Value::AsDictionaryValue(source_value);
+    const base::Value::Dict& source = source_value.GetDict();
 
     std::string source_id;
     std::string source_type;
-    source.GetString("id", &source_id);
-    source.GetString("type", &source_type);
+    const std::string* maybe_source_id = source.FindString("id");
+    const std::string* maybe_source_type = source.FindString("type");
+    if (maybe_source_id)
+      source_id = *maybe_source_id;
+    if (maybe_source_type)
+      source_type = *maybe_source_type;
     if (source_id == id && source_type == type) {
       found = true;
       if (type == "pointer") {
-        std::string source_pointer_type;
-        if (!source.GetString("pointerType", &source_pointer_type) ||
-            pointer_type != source_pointer_type) {
+        const std::string* source_pointer_type =
+            source.FindString("pointerType");
+        if (!source_pointer_type || pointer_type != *source_pointer_type) {
           return Status(kInvalidArgument,
                         "'pointerType' must be a string that matches sources "
                         "pointer type");
@@ -1345,8 +1361,7 @@
     }
   }
 
-  const base::Value::List* actions =
-      action_sequence->GetDict().FindList("actions");
+  const base::Value::List* actions = action_sequence.FindList("actions");
 
   std::unique_ptr<base::Value::List> actions_result(new base::Value::List);
   for (const base::Value& action_item_value : *actions) {
@@ -1359,81 +1374,78 @@
           "each argument in the action sequence must be a dictionary");
     }
 
-    const base::DictionaryValue* action_item =
-        &base::Value::AsDictionaryValue(action_item_value);
+    const base::Value::Dict& action_item = action_item_value.GetDict();
 
     action_dict.Set("id", id);
     action_dict.Set("type", type);
 
     if (type == "none") {
       // process none action
-      std::string subtype;
-      if (!action_item->GetString("type", &subtype) || subtype != "pause")
+      const std::string* subtype = action_item.FindString("type");
+      if (!subtype || *subtype != "pause")
         return Status(kInvalidArgument,
                       "type of action must be the  string 'pause'");
 
-      action_dict.Set("subtype", subtype);
+      action_dict.Set("subtype", *subtype);
 
-      Status status = ProcessPauseAction(action_item, action.get());
+      Status status = ProcessPauseAction(action_item, &action_dict);
       if (status.IsError())
         return status;
     } else if (type == "key") {
       // process key action
-      std::string subtype;
-      if (!action_item->GetString("type", &subtype) ||
-          (subtype != "keyUp" && subtype != "keyDown" && subtype != "pause"))
+      const std::string* subtype = action_item.FindString("type");
+      if (!subtype ||
+          (*subtype != "keyUp" && *subtype != "keyDown" && *subtype != "pause"))
         return Status(
             kInvalidArgument,
             "type of action must be the string 'keyUp', 'keyDown' or 'pause'");
 
-      action_dict.Set("subtype", subtype);
-      if (subtype == "pause") {
-        Status status = ProcessPauseAction(action_item, action.get());
+      action_dict.Set("subtype", *subtype);
+      if (*subtype == "pause") {
+        Status status = ProcessPauseAction(action_item, &action_dict);
         if (status.IsError())
           return status;
       } else {
-        std::string key;
-        bool valid = action_item->GetString("value", &key);
+        const std::string* key = action_item.FindString("value");
+        bool valid = (key != nullptr);
         if (valid) {
           // check if key is a single unicode code point
           size_t char_index = 0;
           base_icu::UChar32 code_point;
-          valid = base::ReadUnicodeCharacter(key.c_str(), key.size(),
+          valid = base::ReadUnicodeCharacter(key->c_str(), key->size(),
                                              &char_index, &code_point) &&
-                  char_index + 1 == key.size();
+                  char_index + 1 == key->size();
         }
         if (!valid)
           return Status(kInvalidArgument,
                         "'value' must be a single Unicode code point");
-        action_dict.Set("value", key);
+        action_dict.Set("value", *key);
       }
     } else if (type == "pointer" || type == "wheel") {
-      std::string subtype;
+      const std::string* subtype = action_item.FindString("type");
       if (type == "pointer") {
-        if (!action_item->GetString("type", &subtype) ||
-            (subtype != "pointerUp" && subtype != "pointerDown" &&
-             subtype != "pointerMove" && subtype != "pointerCancel" &&
-             subtype != "pause")) {
+        if (!subtype || (*subtype != "pointerUp" && *subtype != "pointerDown" &&
+                         *subtype != "pointerMove" &&
+                         *subtype != "pointerCancel" && *subtype != "pause")) {
           return Status(kInvalidArgument,
                         "type of pointer action must be the string "
                         "'pointerUp', 'pointerDown', 'pointerMove' or "
                         "'pause'");
         }
       } else {
-        if (!action_item->GetString("type", &subtype) ||
-            (subtype != "scroll" && subtype != "pause")) {
+        if (!subtype || (*subtype != "scroll" && *subtype != "pause")) {
           return Status(
               kInvalidArgument,
               "type of action must be the string 'scroll' or 'pause'");
         }
       }
 
-      action_dict.Set("subtype", subtype);
+      action_dict.Set("subtype", *subtype);
       action_dict.Set("pointerType", pointer_type);
 
-      if (subtype == "pointerDown" || subtype == "pointerUp") {
+      if (*subtype == "pointerDown" || *subtype == "pointerUp") {
         if (pointer_type == "mouse" || pointer_type == "pen") {
-          int button = action_item->GetDict().FindInt("button").value_or(-1);
+          int button = action_item.FindInt("button").value_or(-1);
           if (button < 0 || button > 4) {
             return Status(
                 kInvalidArgument,
@@ -1445,31 +1457,33 @@
             return status;
           action_dict.Set("button", button_str);
         }
-      } else if (subtype == "pointerMove" || subtype == "scroll") {
-        absl::optional<int> x = action_item->GetDict().FindInt("x");
+      } else if (*subtype == "pointerMove" || *subtype == "scroll") {
+        absl::optional<int> x = action_item.FindInt("x");
         if (!x.has_value())
           return Status(kInvalidArgument, "'x' must be an int");
-        absl::optional<int> y = action_item->GetDict().FindInt("y");
+        absl::optional<int> y = action_item.FindInt("y");
         if (!y.has_value())
           return Status(kInvalidArgument, "'y' must be an int");
         action_dict.Set("x", *x);
         action_dict.Set("y", *y);
 
-        std::string origin;
-        if (action_item->GetDict().Find("origin")) {
-          if (!action_item->GetString("origin", &origin)) {
-            const base::DictionaryValue* origin_dict;
-            if (!action_item->GetDictionary("origin", &origin_dict))
+        const base::Value* origin_val = action_item.Find("origin");
+        if (origin_val) {
+          if (!origin_val->is_string()) {
+            const base::Value::Dict* origin_dict = origin_val->GetIfDict();
+            if (!origin_dict)
               return Status(kInvalidArgument,
                             "'origin' must be either a string or a dictionary");
-            std::string element_id;
-            if (!origin_dict->GetString(GetElementKey(), &element_id))
+            const std::string* element_id =
+                origin_dict->FindString(GetElementKey());
+            if (!element_id)
               return Status(kInvalidArgument, "'element' is missing");
             base::Value* origin_result = action_dict.Set(
                 "origin", base::Value(base::Value::Type::DICTIONARY));
             origin_result->GetDict().SetByDottedPath(GetElementKey(),
-                                                     element_id);
+                                                     *element_id);
           } else {
+            const std::string& origin = origin_val->GetString();
             if (origin != "viewport" && origin != "pointer")
               return Status(kInvalidArgument,
                             "if 'origin' is a string, it must be either "
@@ -1480,24 +1494,22 @@
           action_dict.Set("origin", "viewport");
         }
 
-        Status status = ProcessPauseAction(action_item, action.get());
+        Status status = ProcessPauseAction(action_item, &action_dict);
         if (status.IsError())
           return status;
 
-        if (subtype == "scroll") {
-          absl::optional<int> delta_x =
-              action_item->GetDict().FindInt("deltaX");
+        if (*subtype == "scroll") {
+          absl::optional<int> delta_x = action_item.FindInt("deltaX");
           if (!delta_x)
             return Status(kInvalidArgument, "'delta x' must be an int");
-          absl::optional<int> delta_y =
-              action_item->GetDict().FindInt("deltaY");
+          absl::optional<int> delta_y = action_item.FindInt("deltaY");
           if (!delta_y)
             return Status(kInvalidArgument, "'delta y' must be an int");
           action_dict.Set("deltaX", *delta_x);
           action_dict.Set("deltaY", *delta_y);
         }
-      } else if (subtype == "pause") {
-        Status status = ProcessPauseAction(action_item, action.get());
+      } else if (*subtype == "pause") {
+        Status status = ProcessPauseAction(action_item, &action_dict);
         if (status.IsError())
           return status;
       }
@@ -1564,11 +1576,11 @@
 
 Status ExecutePerformActions(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
   // extract action sequence
-  const base::Value::List* actions_input = params.GetDict().FindList("actions");
+  const base::Value::List* actions_input = params.FindList("actions");
 
   // the processed actions
   std::vector<std::vector<std::unique_ptr<base::DictionaryValue>>> actions_list;
@@ -1579,8 +1591,7 @@
 
     std::vector<std::unique_ptr<base::DictionaryValue>> action_list;
     Status status = ProcessInputActionSequence(
-        session, &base::Value::AsDictionaryValue(action_sequence),
-        &action_list);
+        session, action_sequence.GetDict(), &action_list);
     actions_list.push_back(std::move(action_list));
 
     if (status.IsError())
@@ -1610,17 +1621,17 @@
     size_t last_touch_index = 0;
     for (size_t j = 0; j < actions_list.size(); j++) {
       if (actions_list[j].size() > i) {
-        const base::DictionaryValue* action = actions_list[j][i].get();
+        const base::Value::Dict& action = actions_list[j][i]->GetDict();
         std::string type;
         std::string action_type;
-        action->GetString("type", &type);
-        action->GetString("subtype", &action_type);
+        GetOptionalString(action, "type", &type);
+        GetOptionalString(action, "subtype", &action_type);
         if (type != "none" && action_type != "pause")
           last_action_index = j;
 
         if (type == "pointer") {
           std::string pointer_type;
-          action->GetString("pointerType", &pointer_type);
+          GetOptionalString(action, "pointerType", &pointer_type);
           if (pointer_type == "touch")
             last_touch_index = j;
         }
@@ -1634,16 +1645,17 @@
     std::vector<TouchEvent> dispatch_touch_events;
     for (size_t j = 0; j < actions_list.size(); j++) {
       if (actions_list[j].size() > i) {
-        const base::DictionaryValue* action = actions_list[j][i].get();
+        const base::Value::Dict& action = actions_list[j][i]->GetDict();
         std::string id;
         std::string type;
         std::string action_type;
-        action->GetString("id", &id);
+        GetOptionalString(action, "id", &id);
+
         base::DictionaryValue* input_state;
         if (!session->input_state_table.GetDictionary(id, &input_state))
           return Status(kUnknownError, "missing input state");
 
-        action->GetString("type", &type);
+        GetOptionalString(action, "type", &type);
         if (i == 0) {
           if (pointer_id_set.find(id) != pointer_id_set.end())
             return Status(kInvalidArgument, "'id' already exists");
@@ -1668,7 +1680,7 @@
                 std::make_pair(id, gfx::Point(init_x, init_y)));
 
             std::string pointer_type;
-            action->GetString("pointerType", &pointer_type);
+            GetOptionalString(action, "pointerType", &pointer_type);
             if (pointer_type == "mouse" || pointer_type == "pen") {
               buttons[id] = input_state->GetDict().Find("pressed")->GetInt();
               last_pressed_buttons[id] = buttons[id];
@@ -1678,7 +1690,7 @@
           }
         }
 
-        action->GetString("subtype", &action_type);
+        GetOptionalString(action, "subtype", &action_type);
         int duration = 0;
         if (action_type == "pause") {
           GetOptionalInt(action, "duration", &duration);
@@ -1721,12 +1733,12 @@
           } else if (type == "pointer" || type == "wheel") {
             std::string element_id;
             if (action_type == "pointerMove" || action_type == "scroll") {
-              double x = action->GetDict().FindDouble("x").value_or(0);
-              double y = action->GetDict().FindDouble("y").value_or(0);
-              const base::DictionaryValue* origin_dict;
-              if (action->GetDict().Find("origin")) {
-                if (action->GetDictionary("origin", &origin_dict)) {
-                  origin_dict->GetString(GetElementKey(), &element_id);
+              double x = action.FindDouble("x").value_or(0);
+              double y = action.FindDouble("y").value_or(0);
+              if (const base::Value* origin_val = action.Find("origin")) {
+                if (const base::Value::Dict* origin_dict =
+                        origin_val->GetIfDict()) {
+                  GetOptionalString(*origin_dict, GetElementKey(), &element_id);
                   if (!element_id.empty()) {
                     int center_x = 0, center_y = 0;
                     Status status = ElementInViewCenter(
@@ -1738,7 +1750,7 @@
                   }
                 } else {
                   std::string origin_str;
-                  action->GetString("origin", &origin_str);
+                  GetOptionalString(action, "origin", &origin_str);
                   if (origin_str == "pointer") {
                     x += action_locations[id].x();
                     y += action_locations[id].y();
@@ -1755,8 +1767,8 @@
               tick_duration = std::max(tick_duration, duration);
 
               if (action_type == "scroll") {
-                int delta_x = action->GetDict().FindInt("deltaX").value_or(0);
-                int delta_y = action->GetDict().FindInt("deltaY").value_or(0);
+                int delta_x = action.FindInt("deltaX").value_or(0);
+                int delta_y = action.FindInt("deltaY").value_or(0);
                 std::vector<MouseEvent> dispatch_wheel_events;
                 MouseEvent event(StringToMouseEventType(action_type),
                                  StringToMouseButton(button_type[id]),
@@ -1778,18 +1790,17 @@
               }
             }
 
-            double width = action->GetDict().FindDouble("width").value_or(1);
-            double height = action->GetDict().FindDouble("height").value_or(1);
-            double pressure =
-                action->GetDict().FindDouble("pressure").value_or(0.5);
+            double width = action.FindDouble("width").value_or(1);
+            double height = action.FindDouble("height").value_or(1);
+            double pressure = action.FindDouble("pressure").value_or(0.5);
             double tangential_pressure =
-                action->GetDict().FindDouble("tangentialPressure").value_or(0);
-            int tilt_x = action->GetDict().FindInt("tiltX").value_or(0);
-            int tilt_y = action->GetDict().FindInt("tiltY").value_or(0);
-            int twist = action->GetDict().FindInt("twist").value_or(0);
+                action.FindDouble("tangentialPressure").value_or(0);
+            int tilt_x = action.FindInt("tiltX").value_or(0);
+            int tilt_y = action.FindInt("tiltY").value_or(0);
+            int twist = action.FindInt("twist").value_or(0);
 
             std::string pointer_type;
-            action->GetString("pointerType", &pointer_type);
+            GetOptionalString(action, "pointerType", &pointer_type);
             if (pointer_type == "mouse" || pointer_type == "pen") {
               if (action_type != "pause") {
                 std::vector<MouseEvent> dispatch_mouse_events;
@@ -1797,7 +1808,7 @@
                 if (action_type == "pointerDown" ||
                     action_type == "pointerUp") {
                   std::string button;
-                  action->GetString("button", &button);
+                  GetOptionalString(action, "button", &button);
                   button_type[id] = button;
                   click_count = 1;
                 } else if (buttons[id] == 0) {
@@ -1918,7 +1929,7 @@
 
 Status ExecuteReleaseActions(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
   for (const InputCancelListEntry& entry :
@@ -1960,60 +1971,65 @@
 
 Status ExecuteSendCommand(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout) {
-  std::string cmd;
-  if (!params.GetString("cmd", &cmd)) {
+  const std::string* cmd = params.FindString("cmd");
+  if (!cmd) {
     return Status(kInvalidArgument, "command not passed");
   }
-  const base::DictionaryValue* cmdParams;
-  if (!params.GetDictionary("params", &cmdParams)) {
+  const base::Value::Dict* cmdParams = params.FindDict("params");
+  if (!cmdParams) {
     return Status(kInvalidArgument, "params not passed");
   }
-  return web_view->SendCommand(cmd, *cmdParams);
+  return web_view->SendCommand(
+      *cmd, base::Value::AsDictionaryValue(base::Value(cmdParams->Clone())));
 }
 
 Status ExecuteSendCommandFromWebSocket(Session* session,
                                        WebView* web_view,
-                                       const base::DictionaryValue& params,
+                                       const base::Value::Dict& params,
                                        std::unique_ptr<base::Value>* value,
                                        Timeout* timeout) {
-  std::string cmd;
-  if (!params.GetString("method", &cmd)) {
+  const std::string* cmd = params.FindString("method");
+  if (!cmd) {
     return Status(kInvalidArgument, "command not passed");
   }
-  const base::DictionaryValue* cmdParams;
-  if (!params.GetDictionary("params", &cmdParams)) {
+  const base::Value::Dict* cmdParams = params.FindDict("params");
+  if (!cmdParams) {
     return Status(kInvalidArgument, "params not passed");
   }
-  absl::optional<int> client_cmd_id = params.GetDict().FindInt("id");
+  absl::optional<int> client_cmd_id = params.FindInt("id");
   if (!client_cmd_id || !CommandId::IsClientCommandId(*client_cmd_id)) {
     return Status(kInvalidArgument, "command id must be negative");
   }
 
-  return web_view->SendCommandFromWebSocket(cmd, *cmdParams, *client_cmd_id);
+  return web_view->SendCommandFromWebSocket(
+      *cmd, base::Value::AsDictionaryValue(base::Value(cmdParams->Clone())),
+      *client_cmd_id);
 }
 
 Status ExecuteSendCommandAndGetResult(Session* session,
                                       WebView* web_view,
-                                      const base::DictionaryValue& params,
+                                      const base::Value::Dict& params,
                                       std::unique_ptr<base::Value>* value,
                                       Timeout* timeout) {
-  std::string cmd;
-  if (!params.GetString("cmd", &cmd)) {
+  const std::string* cmd = params.FindString("cmd");
+  if (!cmd) {
     return Status(kInvalidArgument, "command not passed");
   }
-  const base::DictionaryValue* cmdParams;
-  if (!params.GetDictionary("params", &cmdParams)) {
+  const base::Value::Dict* cmdParams = params.FindDict("params");
+  if (!cmdParams) {
     return Status(kInvalidArgument, "params not passed");
   }
-  return web_view->SendCommandAndGetResult(cmd, *cmdParams, value);
+  return web_view->SendCommandAndGetResult(
+      *cmd, base::Value::AsDictionaryValue(base::Value(cmdParams->Clone())),
+      value);
 }
 
 Status ExecuteGetActiveElement(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout) {
   return GetActiveElement(session, web_view, value);
@@ -2021,11 +2037,10 @@
 
 Status ExecuteSendKeysToActiveElement(Session* session,
                                       WebView* web_view,
-                                      const base::DictionaryValue& params,
+                                      const base::Value::Dict& params,
                                       std::unique_ptr<base::Value>* value,
                                       Timeout* timeout) {
-  const base::Value::List* key_list;
-  key_list = params.GetDict().FindList("value");
+  const base::Value::List* key_list = params.FindList("value");
   return SendKeysOnWindow(
       web_view, key_list, false, &session->sticky_modifiers);
 }
@@ -2033,14 +2048,14 @@
 Status ExecuteGetStorageItem(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
-  std::string key;
-  if (!params.GetString("key", &key))
+  const std::string* key = params.FindString("key");
+  if (!key)
     return Status(kInvalidArgument, "'key' must be a string");
   base::Value::List args;
-  args.Append(key);
+  args.Append(*key);
   return web_view->CallFunction(
       session->GetCurrentFrameId(),
       base::StringPrintf("function(key) { return %s[key]; }", storage),
@@ -2050,7 +2065,7 @@
 Status ExecuteGetStorageKeys(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
   const char script[] =
@@ -2068,18 +2083,18 @@
 Status ExecuteSetStorageItem(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
-  std::string key;
-  if (!params.GetString("key", &key))
+  const std::string* key = params.FindString("key");
+  if (!key)
     return Status(kInvalidArgument, "'key' must be a string");
-  std::string storage_value;
-  if (!params.GetString("value", &storage_value))
+  const std::string* storage_value = params.FindString("value");
+  if (!storage_value)
     return Status(kInvalidArgument, "'value' must be a string");
   base::Value::List args;
-  args.Append(key);
-  args.Append(storage_value);
+  args.Append(*key);
+  args.Append(*storage_value);
   return web_view->CallFunction(
       session->GetCurrentFrameId(),
       base::StringPrintf("function(key, value) { %s[key] = value; }", storage),
@@ -2090,14 +2105,14 @@
 Status ExecuteRemoveStorageItem(const char* storage,
                                 Session* session,
                                 WebView* web_view,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value,
                                 Timeout* timeout) {
-  std::string key;
-  if (!params.GetString("key", &key))
+  const std::string* key = params.FindString("key");
+  if (!key)
     return Status(kInvalidArgument, "'key' must be a string");
   base::Value::List args;
-  args.Append(key);
+  args.Append(*key);
   return web_view->CallFunction(
       session->GetCurrentFrameId(),
       base::StringPrintf("function(key) { %s.removeItem(key) }", storage),
@@ -2108,7 +2123,7 @@
 Status ExecuteClearStorage(const char* storage,
                            Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout) {
   return web_view->EvaluateScript(session->GetCurrentFrameId(),
@@ -2119,7 +2134,7 @@
 Status ExecuteGetStorageSize(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
   return web_view->EvaluateScript(session->GetCurrentFrameId(),
@@ -2129,7 +2144,7 @@
 
 Status ExecuteScreenshot(Session* session,
                          WebView* web_view,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value,
                          Timeout* timeout) {
   Status status = session->chrome->ActivateWebView(web_view->GetId());
@@ -2158,7 +2173,7 @@
 
 Status ExecuteFullPageScreenshot(Session* session,
                                  WebView* web_view,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* value,
                                  Timeout* timeout) {
   Status status = session->chrome->ActivateWebView(web_view->GetId());
@@ -2242,7 +2257,7 @@
 
 Status ExecutePrint(Session* session,
                     WebView* web_view,
-                    const base::DictionaryValue& params,
+                    const base::Value::Dict& params,
                     std::unique_ptr<base::Value>* value,
                     Timeout* timeout) {
   std::string orientation;
@@ -2306,7 +2321,7 @@
 
 Status ExecuteGetCookies(Session* session,
                          WebView* web_view,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value,
                          Timeout* timeout) {
   std::list<Cookie> cookies;
@@ -2316,8 +2331,7 @@
   auto cookie_list = std::make_unique<base::Value>(base::Value::Type::LIST);
   for (std::list<Cookie>::const_iterator it = cookies.begin();
        it != cookies.end(); ++it) {
-    cookie_list->GetList().Append(
-        base::Value::FromUniquePtrValue(CreateDictionaryFrom(*it)));
+    cookie_list->GetList().Append(CreateDictionaryFrom(*it));
   }
   *value = std::move(cookie_list);
   return Status(kOk);
@@ -2325,11 +2339,11 @@
 
 Status ExecuteGetNamedCookie(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
-  std::string name;
-  if (!params.GetString("name", &name))
+  const std::string* name = params.FindString("name");
+  if (!name)
     return Status(kInvalidArgument, "missing 'cookie name'");
 
   std::list<Cookie> cookies;
@@ -2339,9 +2353,9 @@
 
   for (std::list<Cookie>::const_iterator it = cookies.begin();
        it != cookies.end(); ++it) {
-    if (name == it->name) {
+    if (*name == it->name) {
       *value =
-          base::Value::ToUniquePtrValue(CreateDictionaryFrom(*it)->Clone());
+          base::Value::ToUniquePtrValue(base::Value(CreateDictionaryFrom(*it)));
       return Status(kOk);
     }
   }
@@ -2350,17 +2364,17 @@
 
 Status ExecuteAddCookie(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout) {
-  const base::DictionaryValue* cookie;
-  if (!params.GetDictionary("cookie", &cookie))
+  const base::Value::Dict* cookie = params.FindDict("cookie");
+  if (!cookie)
     return Status(kInvalidArgument, "missing 'cookie'");
-  std::string name;
-  std::string cookie_value;
-  if (!cookie->GetString("name", &name))
+  const std::string* name = cookie->FindString("name");
+  const std::string* cookie_value = cookie->FindString("value");
+  if (!name)
     return Status(kInvalidArgument, "missing 'name'");
-  if (!cookie->GetString("value", &cookie_value))
+  if (!cookie_value)
     return Status(kInvalidArgument, "missing 'value'");
   std::string url;
   Status status = GetUrl(web_view, session->GetCurrentFrameId(), &url);
@@ -2372,7 +2386,7 @@
       !base::StartsWith(url, "ftp://", base::CompareCase::INSENSITIVE_ASCII))
     return Status(kInvalidCookieDomain);
   std::string domain;
-  if (!GetOptionalString(cookie, "domain", &domain))
+  if (!GetOptionalString(*cookie, "domain", &domain))
     return Status(kInvalidArgument, "invalid 'domain'");
   if (session->w3c_compliant && !domain.empty() &&
       !url::HostIsIPAddress(domain)) {
@@ -2388,26 +2402,26 @@
     domain.insert(0, 1, '.');
   }
   std::string path("/");
-  if (!GetOptionalString(cookie, "path", &path))
+  if (!GetOptionalString(*cookie, "path", &path))
     return Status(kInvalidArgument, "invalid 'path'");
   std::string samesite("");
-  if (!GetOptionalString(cookie, "sameSite", &samesite))
+  if (!GetOptionalString(*cookie, "sameSite", &samesite))
     return Status(kInvalidArgument, "invalid 'sameSite'");
   if (!samesite.empty() && samesite != "Strict" && samesite != "Lax" &&
       samesite != "None")
     return Status(kInvalidArgument, "invalid 'sameSite'");
   bool secure = false;
-  if (!GetOptionalBool(cookie, "secure", &secure))
+  if (!GetOptionalBool(*cookie, "secure", &secure))
     return Status(kInvalidArgument, "invalid 'secure'");
   bool httpOnly = false;
-  if (!GetOptionalBool(cookie, "httpOnly", &httpOnly))
+  if (!GetOptionalBool(*cookie, "httpOnly", &httpOnly))
     return Status(kInvalidArgument, "invalid 'httpOnly'");
   double expiry;
   bool has_value;
   if (session->w3c_compliant) {
     // W3C spec says expiry is a safe integer.
     int64_t expiry_int64;
-    if (!GetOptionalSafeInt(cookie, "expiry", &expiry_int64, &has_value) ||
+    if (!GetOptionalSafeInt(*cookie, "expiry", &expiry_int64, &has_value) ||
         (has_value && expiry_int64 < 0))
       return Status(kInvalidArgument, "invalid 'expiry'");
     // Use negative value to indicate expiry not specified.
@@ -2415,24 +2429,24 @@
   } else {
     // JSON wire protocol didn't specify the type of expiry, but ChromeDriver
     // has always accepted double, so we keep that in legacy mode.
-    if (!GetOptionalDouble(cookie, "expiry", &expiry, &has_value) ||
+    if (!GetOptionalDouble(*cookie, "expiry", &expiry, &has_value) ||
         (has_value && expiry < 0))
       return Status(kInvalidArgument, "invalid 'expiry'");
     if (!has_value)
       expiry = (base::Time::Now() - base::Time::UnixEpoch()).InSeconds() +
                kDefaultCookieExpiryTime;
   }
-  return web_view->AddCookie(name, url, cookie_value, domain, path, samesite,
+  return web_view->AddCookie(*name, url, *cookie_value, domain, path, samesite,
                              secure, httpOnly, expiry);
 }
 
 Status ExecuteDeleteCookie(Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout) {
-  std::string name;
-  if (!params.GetString("name", &name))
+  const std::string* name = params.FindString("name");
+  if (!name)
     return Status(kInvalidArgument, "missing 'name'");
   base::DictionaryValue params_url;
   std::unique_ptr<base::Value> value_url;
@@ -2448,7 +2462,7 @@
 
   for (std::list<Cookie>::const_iterator it = cookies.begin();
        it != cookies.end(); ++it) {
-    if (name == it->name) {
+    if (*name == it->name) {
       status = web_view->DeleteCookie(it->name, url, it->domain, it->path);
       if (status.IsError())
         return status;
@@ -2459,7 +2473,7 @@
 
 Status ExecuteDeleteAllCookies(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout) {
   std::list<Cookie> cookies;
@@ -2487,22 +2501,20 @@
 
 Status ExecuteSetLocation(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout) {
-  const base::DictionaryValue* location = nullptr;
+  const base::Value::Dict* location = params.FindDict("location");
   Geoposition geoposition;
-  if (!params.GetDictionary("location", &location))
+  if (!location)
     return Status(kInvalidArgument, "missing or invalid 'location'");
 
-  absl::optional<double> maybe_latitude =
-      location->GetDict().FindDouble("latitude");
+  absl::optional<double> maybe_latitude = location->FindDouble("latitude");
   if (!maybe_latitude.has_value())
     return Status(kInvalidArgument, "missing or invalid 'location.latitude'");
   geoposition.latitude = maybe_latitude.value();
 
-  absl::optional<double> maybe_longitude =
-      location->GetDict().FindDouble("longitude");
+  absl::optional<double> maybe_longitude = location->FindDouble("longitude");
   if (!maybe_longitude.has_value())
     return Status(kInvalidArgument, "missing or invalid 'location.longitude'");
   geoposition.longitude = maybe_longitude.value();
@@ -2510,7 +2522,7 @@
   // |accuracy| is not part of the WebDriver spec yet, so if it is not given
   // default to 100 meters accuracy.
   absl::optional<double> maybe_accuracy =
-      ParseDoubleIfInDictionary(location, "accuracy", 100);
+      ParseDoubleIfInDictionary(*location, "accuracy", 100);
   if (!maybe_accuracy.has_value())
     return Status(kInvalidArgument, "invalid 'accuracy'");
   geoposition.accuracy = maybe_accuracy.value();
@@ -2525,22 +2537,21 @@
 
 Status ExecuteSetNetworkConditions(Session* session,
                                    WebView* web_view,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value,
                                    Timeout* timeout) {
-  std::string network_name;
-  const base::DictionaryValue* conditions = nullptr;
+  const std::string* network_name = params.FindString("network_name");
   std::unique_ptr<NetworkConditions> network_conditions(
       new NetworkConditions());
-  if (params.GetString("network_name", &network_name)) {
+  if (network_name) {
     // Get conditions from preset list.
-    Status status = FindPresetNetwork(network_name, network_conditions.get());
+    Status status = FindPresetNetwork(*network_name, network_conditions.get());
     if (status.IsError())
       return status;
-  } else if (params.GetDictionary("network_conditions", &conditions)) {
+  } else if (const base::Value::Dict* conditions =
+                 params.FindDict("network_conditions")) {
     // |latency| is required.
-    absl::optional<double> maybe_latency =
-        conditions->GetDict().FindDouble("latency");
+    absl::optional<double> maybe_latency = conditions->FindDouble("latency");
     if (!maybe_latency.has_value())
       return Status(kInvalidArgument,
                     "invalid 'network_conditions' is missing 'latency'");
@@ -2548,19 +2559,19 @@
 
     // Either |throughput| or the pair |download_throughput| and
     // |upload_throughput| is required.
-    if (conditions->GetDict().Find("throughput")) {
+    if (conditions->Find("throughput")) {
       absl::optional<double> maybe_throughput =
-          conditions->GetDict().FindDouble("throughput");
+          conditions->FindDouble("throughput");
       if (!maybe_throughput.has_value())
         return Status(kInvalidArgument, "invalid 'throughput'");
       network_conditions->upload_throughput = maybe_throughput.value();
       network_conditions->download_throughput = maybe_throughput.value();
-    } else if (conditions->GetDict().Find("download_throughput") &&
-               conditions->GetDict().Find("upload_throughput")) {
+    } else if (conditions->Find("download_throughput") &&
+               conditions->Find("upload_throughput")) {
       absl::optional<double> maybe_download_throughput =
-          conditions->GetDict().FindDouble("download_throughput");
+          conditions->FindDouble("download_throughput");
       absl::optional<double> maybe_upload_throughput =
-          conditions->GetDict().FindDouble("upload_throughput");
+          conditions->FindDouble("upload_throughput");
 
       if (!maybe_download_throughput.has_value() ||
           !maybe_upload_throughput.has_value())
@@ -2576,7 +2587,7 @@
     }
 
     // |offline| is optional.
-    if (const base::Value* offline = conditions->GetDict().Find("offline")) {
+    if (const base::Value* offline = conditions->Find("offline")) {
       if (!offline->is_bool())
         return Status(kInvalidArgument, "invalid 'offline'");
       network_conditions->offline = offline->GetBool();
@@ -2597,7 +2608,7 @@
 
 Status ExecuteDeleteNetworkConditions(Session* session,
                                       WebView* web_view,
-                                      const base::DictionaryValue& params,
+                                      const base::Value::Dict& params,
                                       std::unique_ptr<base::Value>* value,
                                       Timeout* timeout) {
   // Chrome does not have any command to stop overriding network conditions, so
@@ -2620,7 +2631,7 @@
 
 Status ExecuteTakeHeapSnapshot(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout) {
   return web_view->TakeHeapSnapshot(value);
@@ -2628,7 +2639,7 @@
 
 Status ExecuteGetWindowRect(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
   Chrome::WindowRect windowRect;
@@ -2647,7 +2658,7 @@
 
 Status ExecuteSetWindowRect(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
   const double max_range = 2147483647;   // 2^31 - 1
@@ -2658,7 +2669,7 @@
   double x = 0;
   double y = 0;
 
-  temp = params.GetDict().Find("x");
+  temp = params.Find("x");
   bool has_x = temp && !temp->is_none();
   if (has_x) {
     if (!temp->is_double() && !temp->is_int())
@@ -2668,7 +2679,7 @@
       return Status(kInvalidArgument, "'x' out of range");
   }
 
-  temp = params.GetDict().Find("y");
+  temp = params.Find("y");
   bool has_y = temp && !temp->is_none();
   if (has_y) {
     if (!temp->is_double() && !temp->is_int())
@@ -2678,7 +2689,7 @@
       return Status(kInvalidArgument, "'y' out of range");
   }
 
-  temp = params.GetDict().Find("width");
+  temp = params.Find("width");
   bool has_width = temp && !temp->is_none();
   if (has_width) {
     if (!temp->is_double() && !temp->is_int())
@@ -2688,7 +2699,7 @@
       return Status(kInvalidArgument, "'width' out of range");
   }
 
-  temp = params.GetDict().Find("height");
+  temp = params.Find("height");
   bool has_height = temp && !temp->is_none();
   if (has_height) {
     if (!temp->is_double() && !temp->is_int())
@@ -2719,7 +2730,7 @@
 
 Status ExecuteMaximizeWindow(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
   Status status = session->chrome->MaximizeWindow(session->window);
@@ -2731,7 +2742,7 @@
 
 Status ExecuteMinimizeWindow(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout) {
   Status status = session->chrome->MinimizeWindow(session->window);
@@ -2743,7 +2754,7 @@
 
 Status ExecuteFullScreenWindow(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout) {
   Status status = session->chrome->FullScreenWindow(session->window);
@@ -2755,39 +2766,47 @@
 
 Status ExecuteSetSinkToUse(Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout) {
-  return web_view->SendCommand("Cast.setSinkToUse", params);
+  return web_view->SendCommand(
+      "Cast.setSinkToUse",
+      base::Value::AsDictionaryValue(base::Value(params.Clone())));
 }
 
 Status ExecuteStartDesktopMirroring(Session* session,
                                     WebView* web_view,
-                                    const base::DictionaryValue& params,
+                                    const base::Value::Dict& params,
                                     std::unique_ptr<base::Value>* value,
                                     Timeout* timeout) {
-  return web_view->SendCommand("Cast.startDesktopMirroring", params);
+  return web_view->SendCommand(
+      "Cast.startDesktopMirroring",
+      base::Value::AsDictionaryValue(base::Value(params.Clone())));
 }
 
 Status ExecuteStartTabMirroring(Session* session,
                                 WebView* web_view,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value,
                                 Timeout* timeout) {
-  return web_view->SendCommand("Cast.startTabMirroring", params);
+  return web_view->SendCommand(
+      "Cast.startTabMirroring",
+      base::Value::AsDictionaryValue(base::Value(params.Clone())));
 }
 
 Status ExecuteStopCasting(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout) {
-  return web_view->SendCommand("Cast.stopCasting", params);
+  return web_view->SendCommand(
+      "Cast.stopCasting",
+      base::Value::AsDictionaryValue(base::Value(params.Clone())));
 }
 
 Status ExecuteGetSinks(Session* session,
                        WebView* web_view,
-                       const base::DictionaryValue& params,
+                       const base::Value::Dict& params,
                        std::unique_ptr<base::Value>* value,
                        Timeout* timeout) {
   *value = web_view->GetCastSinks();
@@ -2796,7 +2815,7 @@
 
 Status ExecuteGetIssueMessage(Session* session,
                               WebView* web_view,
-                              const base::DictionaryValue& params,
+                              const base::Value::Dict& params,
                               std::unique_ptr<base::Value>* value,
                               Timeout* timeout) {
   *value = web_view->GetCastIssueMessage();
@@ -2805,36 +2824,36 @@
 
 Status ExecuteSetPermission(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout) {
-  const base::DictionaryValue* descriptor;
-  if (!params.GetDictionary("descriptor", &descriptor))
+  const base::Value::Dict* descriptor = params.FindDict("descriptor");
+  if (!descriptor)
     return Status(kInvalidArgument, "no descriptor dictionary");
 
-  std::string name;
-  if (!descriptor->GetString("name", &name))
+  const std::string* name = descriptor->FindString("name");
+  if (!name)
     return Status(kInvalidArgument, "no name in descriptor");
 
-  std::string permission_state;
-  if (!params.GetString("state", &permission_state))
+  const std::string* permission_state = params.FindString("state");
+  if (!permission_state)
     return Status(kInvalidArgument, "no permission state");
 
   bool one_realm = false;
-  if (!GetOptionalBool(&params, "oneRealm", &one_realm, nullptr))
+  if (!GetOptionalBool(params, "oneRealm", &one_realm, nullptr))
     return Status(kInvalidArgument, "oneRealm defined but not a boolean");
 
   Chrome::PermissionState valid_state;
-  if (permission_state == "granted")
+  if (*permission_state == "granted")
     valid_state = Chrome::PermissionState::kGranted;
-  else if (permission_state == "denied")
+  else if (*permission_state == "denied")
     valid_state = Chrome::PermissionState::kDenied;
-  else if (permission_state == "prompt")
+  else if (*permission_state == "prompt")
     valid_state = Chrome::PermissionState::kPrompt;
   else
     return Status(kInvalidArgument, "unrecognized permission state");
 
-  auto val = base::Value::ToUniquePtrValue(descriptor->Clone());
+  auto val = base::Value::ToUniquePtrValue(base::Value(descriptor->Clone()));
   auto dict = base::DictionaryValue::From(std::move(val));
 
   return session->chrome->SetPermission(std::move(dict), valid_state, one_realm,
diff --git a/chrome/test/chromedriver/window_commands.h b/chrome/test/chromedriver/window_commands.h
index 178eeae..add9dab 100644
--- a/chrome/test/chromedriver/window_commands.h
+++ b/chrome/test/chromedriver/window_commands.h
@@ -24,69 +24,69 @@
 using WindowCommand =
     base::RepeatingCallback<Status(Session* session,
                                    WebView* web_view,
-                                   const base::DictionaryValue&,
+                                   const base::Value::Dict&,
                                    std::unique_ptr<base::Value>*,
                                    Timeout*)>;
 
 // Execute a Window Command on the target window.
 Status ExecuteWindowCommand(const WindowCommand& command,
                             Session* session,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value);
 
 // Loads a URL.
 Status ExecuteGet(Session* session,
                   WebView* web_view,
-                  const base::DictionaryValue& params,
+                  const base::Value::Dict& params,
                   std::unique_ptr<base::Value>* value,
                   Timeout* timeout);
 
 // Evaluates a given synchronous script with arguments.
 Status ExecuteExecuteScript(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
 // Evaluates a given asynchronous script with arguments.
 Status ExecuteExecuteAsyncScript(Session* session,
                                  WebView* web_view,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* value,
                                  Timeout* timeout);
 
 // Creates a new window/tab.
 Status ExecuteNewWindow(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout);
 
 // Changes the targeted frame for the given session.
 Status ExecuteSwitchToFrame(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
 // Change focus to the parent frame.
 Status ExecuteSwitchToParentFrame(Session* session,
                                   WebView* web_view,
-                                  const base::DictionaryValue& params,
+                                  const base::Value::Dict& params,
                                   std::unique_ptr<base::Value>* value,
                                   Timeout* timeout);
 
 // Get the current page title.
 Status ExecuteGetTitle(Session* session,
                        WebView* web_view,
-                       const base::DictionaryValue& params,
+                       const base::Value::Dict& params,
                        std::unique_ptr<base::Value>* value,
                        Timeout* timeout);
 
 // Get the current page source.
 Status ExecuteGetPageSource(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
@@ -94,7 +94,7 @@
 Status ExecuteFindElement(int interval_ms,
                           Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
@@ -102,217 +102,217 @@
 Status ExecuteFindElements(int interval_ms,
                            Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout);
 
 // Get the current page url.
 Status ExecuteGetCurrentUrl(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
 // Navigate backward in the browser history.
 Status ExecuteGoBack(Session* session,
                      WebView* web_view,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value,
                      Timeout* timeout);
 
 // Navigate forward in the browser history.
 Status ExecuteGoForward(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout);
 
 // Refresh the current page.
 Status ExecuteRefresh(Session* session,
                       WebView* web_view,
-                      const base::DictionaryValue& params,
+                      const base::Value::Dict& params,
                       std::unique_ptr<base::Value>* value,
                       Timeout* timeout);
 
 // Freeze the current page.
 Status ExecuteFreeze(Session* session,
                      WebView* web_view,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value,
                      Timeout* timeout);
 
 // Resume the current page.
 Status ExecuteResume(Session* session,
                      WebView* web_view,
-                     const base::DictionaryValue& params,
+                     const base::Value::Dict& params,
                      std::unique_ptr<base::Value>* value,
                      Timeout* timeout);
 
 // Move the mouse by an offset of the element if specified .
 Status ExecuteMouseMoveTo(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
 // Click a mouse button at the coordinates set by the last moveto.
 Status ExecuteMouseClick(Session* session,
                          WebView* web_view,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value,
                          Timeout* timeout);
 
 // Click and hold a mouse button at the coordinates set by the last moveto.
 Status ExecuteMouseButtonDown(Session* session,
                               WebView* web_view,
-                              const base::DictionaryValue& params,
+                              const base::Value::Dict& params,
                               std::unique_ptr<base::Value>* value,
                               Timeout* timeout);
 
 // Releases the mouse button previously held (where the mouse is currently at).
 Status ExecuteMouseButtonUp(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
 // Double-clicks at the current mouse coordinates (set by last moveto).
 Status ExecuteMouseDoubleClick(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout);
 
 // Touch press at a given coordinate.
 Status ExecuteTouchDown(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout);
 
 // Touch release at a given coordinate.
 Status ExecuteTouchUp(Session* session,
                       WebView* web_view,
-                      const base::DictionaryValue& params,
+                      const base::Value::Dict& params,
                       std::unique_ptr<base::Value>* value,
                       Timeout* timeout);
 
 // Touch move at a given coordinate.
 Status ExecuteTouchMove(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout);
 
 // Do a swipe (scroll) gesture beginning at the element.
 Status ExecuteTouchScroll(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
 Status ExecuteSendCommand(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
 Status ExecuteSendCommandFromWebSocket(Session* session,
                                        WebView* web_view,
-                                       const base::DictionaryValue& params,
+                                       const base::Value::Dict& params,
                                        std::unique_ptr<base::Value>* value,
                                        Timeout* timeout);
 
 Status ExecuteSendCommandAndGetResult(Session* session,
                                       WebView* web_view,
-                                      const base::DictionaryValue& params,
+                                      const base::Value::Dict& params,
                                       std::unique_ptr<base::Value>* value,
                                       Timeout* timeout);
 
 Status ExecuteGetActiveElement(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout);
 
 // Send a sequence of key strokes to the active element.
 Status ExecuteSendKeysToActiveElement(Session* session,
                                       WebView* web_view,
-                                      const base::DictionaryValue& params,
+                                      const base::Value::Dict& params,
                                       std::unique_ptr<base::Value>* value,
                                       Timeout* timeout);
 
 Status ExecuteGetStorageItem(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteGetStorageKeys(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteSetStorageItem(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteRemoveStorageItem(const char* storage,
                                 Session* session,
                                 WebView* web_view,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value,
                                 Timeout* timeout);
 
 Status ExecuteClearStorage(const char* storage,
                            Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout);
 
 Status ExecuteGetStorageSize(const char* storage,
                              Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteScreenshot(Session* session,
                          WebView* web_view,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value,
                          Timeout* timeout);
 
 Status ExecuteFullPageScreenshot(Session* session,
                                  WebView* web_view,
-                                 const base::DictionaryValue& params,
+                                 const base::Value::Dict& params,
                                  std::unique_ptr<base::Value>* value,
                                  Timeout* timeout);
 
 Status ExecutePrint(Session* session,
                     WebView* web_view,
-                    const base::DictionaryValue& params,
+                    const base::Value::Dict& params,
                     std::unique_ptr<base::Value>* value,
                     Timeout* timeout);
 
 // Retrieve all cookies visible to the current page.
 Status ExecuteGetCookies(Session* session,
                          WebView* web_view,
-                         const base::DictionaryValue& params,
+                         const base::Value::Dict& params,
                          std::unique_ptr<base::Value>* value,
                          Timeout* timeout);
 
 // Retrieve a single cookie with the requested name.
 Status ExecuteGetNamedCookie(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
@@ -320,92 +320,92 @@
 // If the domain is omitted, it should default to the current page's domain.
 Status ExecuteAddCookie(Session* session,
                         WebView* web_view,
-                        const base::DictionaryValue& params,
+                        const base::Value::Dict& params,
                         std::unique_ptr<base::Value>* value,
                         Timeout* timeout);
 
 // Delete the cookie with the given name if it exists in the current page.
 Status ExecuteDeleteCookie(Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout);
 
 // Delete all cookies visible to the current page.
 Status ExecuteDeleteAllCookies(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout);
 
 Status ExecuteSetLocation(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
 Status ExecuteSetNetworkConditions(Session* session,
                                    WebView* web_view,
-                                   const base::DictionaryValue& params,
+                                   const base::Value::Dict& params,
                                    std::unique_ptr<base::Value>* value,
                                    Timeout* timeout);
 
 Status ExecuteDeleteNetworkConditions(Session* session,
                                       WebView* web_view,
-                                      const base::DictionaryValue& params,
+                                      const base::Value::Dict& params,
                                       std::unique_ptr<base::Value>* value,
                                       Timeout* timeout);
 
 Status ExecuteTakeHeapSnapshot(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout);
 
 Status ExecutePerformActions(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ProcessInputActionSequence(
     Session* session,
-    const base::DictionaryValue* action_sequence,
+    const base::Value::Dict& action_sequence,
     std::vector<std::unique_ptr<base::DictionaryValue>>* action_list);
 
 Status ExecuteReleaseActions(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteGetWindowRect(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
 Status ExecuteSetWindowRect(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
 Status ExecuteMaximizeWindow(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteMinimizeWindow(Session* session,
                              WebView* web_view,
-                             const base::DictionaryValue& params,
+                             const base::Value::Dict& params,
                              std::unique_ptr<base::Value>* value,
                              Timeout* timeout);
 
 Status ExecuteFullScreenWindow(Session* session,
                                WebView* web_view,
-                               const base::DictionaryValue& params,
+                               const base::Value::Dict& params,
                                std::unique_ptr<base::Value>* value,
                                Timeout* timeout);
 
@@ -413,7 +413,7 @@
 // Playback API. Uses the "sinkName" value in |params|.
 Status ExecuteSetSinkToUse(Session* session,
                            WebView* web_view,
-                           const base::DictionaryValue& params,
+                           const base::Value::Dict& params,
                            std::unique_ptr<base::Value>* value,
                            Timeout* timeout);
 
@@ -421,7 +421,7 @@
 // |params|.
 Status ExecuteStartDesktopMirroring(Session* session,
                                     WebView* web_view,
-                                    const base::DictionaryValue& params,
+                                    const base::Value::Dict& params,
                                     std::unique_ptr<base::Value>* value,
                                     Timeout* timeout);
 
@@ -429,35 +429,35 @@
 // |params|.
 Status ExecuteStartTabMirroring(Session* session,
                                 WebView* web_view,
-                                const base::DictionaryValue& params,
+                                const base::Value::Dict& params,
                                 std::unique_ptr<base::Value>* value,
                                 Timeout* timeout);
 
 // Stops casting to the sink specified by the "sinkName" value in |params|.
 Status ExecuteStopCasting(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
 // Returns a list of Cast sinks that are available.
 Status ExecuteGetSinks(Session* session,
                        WebView* web_view,
-                       const base::DictionaryValue& params,
+                       const base::Value::Dict& params,
                        std::unique_ptr<base::Value>* value,
                        Timeout* timeout);
 
 // Returns the outstanding issue in the Cast UI.
 Status ExecuteGetIssueMessage(Session* session,
                               WebView* web_view,
-                              const base::DictionaryValue& params,
+                              const base::Value::Dict& params,
                               std::unique_ptr<base::Value>* value,
                               Timeout* timeout);
 
 // Sets permissions.
 Status ExecuteSetPermission(Session* session,
                             WebView* web_view,
-                            const base::DictionaryValue& params,
+                            const base::Value::Dict& params,
                             std::unique_ptr<base::Value>* value,
                             Timeout* timeout);
 
diff --git a/chrome/test/chromedriver/window_commands_unittest.cc b/chrome/test/chromedriver/window_commands_unittest.cc
index 42a9211f..1208be7 100644
--- a/chrome/test/chromedriver/window_commands_unittest.cc
+++ b/chrome/test/chromedriver/window_commands_unittest.cc
@@ -43,12 +43,12 @@
 
 typedef Status (*Command)(Session* session,
                           WebView* web_view,
-                          const base::DictionaryValue& params,
+                          const base::Value::Dict& params,
                           std::unique_ptr<base::Value>* value,
                           Timeout* timeout);
 
 Status CallWindowCommand(Command command,
-                         const base::DictionaryValue& params = {},
+                         const base::Value::Dict& params = {},
                          std::unique_ptr<base::Value>* value = nullptr) {
   MockChrome* chrome = new MockChrome();
   Session session("id", std::unique_ptr<Chrome>(chrome));
@@ -65,7 +65,7 @@
 
 Status CallWindowCommand(Command command,
                          StubWebView* web_view,
-                         const base::DictionaryValue& params = {},
+                         const base::Value::Dict& params = {},
                          std::unique_ptr<base::Value>* value = nullptr) {
   MockChrome* chrome = new MockChrome();
   Session session("id", std::unique_ptr<Chrome>(chrome));
@@ -89,16 +89,16 @@
 }
 
 TEST(WindowCommandsTest, ExecuteSendCommandAndGetResult_NoCmd) {
-  base::DictionaryValue params;
-  params.GetDict().Set("params", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  params.Set("params", base::Value(base::Value::Type::DICTIONARY));
   Status status = CallWindowCommand(ExecuteSendCommandAndGetResult, params);
   ASSERT_EQ(kInvalidArgument, status.code());
   ASSERT_NE(status.message().find("command not passed"), std::string::npos);
 }
 
 TEST(WindowCommandsTest, ExecuteSendCommandAndGetResult_NoParams) {
-  base::DictionaryValue params;
-  params.GetDict().Set("cmd", "CSS.enable");
+  base::Value::Dict params;
+  params.Set("cmd", "CSS.enable");
   Status status = CallWindowCommand(ExecuteSendCommandAndGetResult, params);
   ASSERT_EQ(kInvalidArgument, status.code());
   ASSERT_NE(status.message().find("params not passed"), std::string::npos);
@@ -107,11 +107,10 @@
 TEST(WindowCommandsTest, ProcessInputActionSequencePointerMouse) {
   Session session("1");
   std::vector<std::unique_ptr<base::DictionaryValue>> action_list;
-  std::unique_ptr<base::DictionaryValue> action_sequence(
-      new base::DictionaryValue());
+  base::Value::Dict action_sequence;
   base::Value::List actions;
   base::Value action(base::Value::Type::DICTIONARY);
-  base::Value* parameters = action_sequence->GetDict().Set(
+  base::Value* parameters = action_sequence.Set(
       "parameters", base::Value(base::Value::Type::DICTIONARY));
   parameters->GetDict().Set("pointerType", "mouse");
   base::Value::Dict& action_dict = action.GetDict();
@@ -129,14 +128,11 @@
   actions.Append(std::move(action));
 
   // pointer properties
-  action_sequence->SetString("type", "pointer");
-  action_sequence->SetString("id", "pointer1");
-  action_sequence->SetList(
-      "actions",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(actions))));
-  const base::DictionaryValue* input_action_sequence = action_sequence.get();
+  action_sequence.Set("type", "pointer");
+  action_sequence.Set("id", "pointer1");
+  action_sequence.Set("actions", std::move(actions));
   Status status =
-      ProcessInputActionSequence(&session, input_action_sequence, &action_list);
+      ProcessInputActionSequence(&session, action_sequence, &action_list);
   ASSERT_TRUE(status.IsOk());
 
   // check resulting action dictionary
@@ -190,12 +186,11 @@
 TEST(WindowCommandsTest, ProcessInputActionSequencePointerTouch) {
   Session session("1");
   std::vector<std::unique_ptr<base::DictionaryValue>> action_list;
-  std::unique_ptr<base::DictionaryValue> action_sequence(
-      new base::DictionaryValue());
+  base::Value::Dict action_sequence;
   base::Value::List actions;
   base::Value action(base::Value::Type::DICTIONARY);
   base::Value::Dict& action_dict = action.GetDict();
-  base::Value* parameters = action_sequence->GetDict().Set(
+  base::Value* parameters = action_sequence.Set(
       "parameters", base::Value(base::Value::Type::DICTIONARY));
   parameters->GetDict().Set("pointerType", "touch");
   action_dict.Set("type", "pointerMove");
@@ -210,14 +205,11 @@
   actions.Append(std::move(action));
 
   // pointer properties
-  action_sequence->SetString("type", "pointer");
-  action_sequence->SetString("id", "pointer1");
-  action_sequence->SetList(
-      "actions",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(actions))));
-  const base::DictionaryValue* input_action_sequence = action_sequence.get();
+  action_sequence.Set("type", "pointer");
+  action_sequence.Set("id", "pointer1");
+  action_sequence.Set("actions", std::move(actions));
   Status status =
-      ProcessInputActionSequence(&session, input_action_sequence, &action_list);
+      ProcessInputActionSequence(&session, action_sequence, &action_list);
   ASSERT_TRUE(status.IsOk());
 
   // check resulting action dictionary
@@ -289,9 +281,9 @@
 
 TEST(WindowCommandsTest, ExecuteAddCookie_Valid) {
   AddCookieWebView webview = AddCookieWebView("http://chromium.org");
-  base::DictionaryValue params;
-  base::Value* cookie_params = params.GetDict().Set(
-      "cookie", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  base::Value* cookie_params =
+      params.Set("cookie", base::Value(base::Value::Type::DICTIONARY));
   cookie_params->GetDict().Set("name", "testcookie");
   cookie_params->GetDict().Set("value", "cookievalue");
   cookie_params->GetDict().Set("sameSite", "Strict");
@@ -303,9 +295,9 @@
 
 TEST(WindowCommandsTest, ExecuteAddCookie_NameMissing) {
   AddCookieWebView webview = AddCookieWebView("http://chromium.org");
-  base::DictionaryValue params;
-  base::Value* cookie_params = params.GetDict().Set(
-      "cookie", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  base::Value* cookie_params =
+      params.Set("cookie", base::Value(base::Value::Type::DICTIONARY));
   cookie_params->GetDict().Set("value", "cookievalue");
   cookie_params->GetDict().Set("sameSite", "invalid");
   std::unique_ptr<base::Value> result_value;
@@ -318,9 +310,9 @@
 
 TEST(WindowCommandsTest, ExecuteAddCookie_MissingValue) {
   AddCookieWebView webview = AddCookieWebView("http://chromium.org");
-  base::DictionaryValue params;
-  base::Value* cookie_params = params.GetDict().Set(
-      "cookie", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  base::Value* cookie_params =
+      params.Set("cookie", base::Value(base::Value::Type::DICTIONARY));
   cookie_params->GetDict().Set("name", "testcookie");
   cookie_params->GetDict().Set("sameSite", "Strict");
   std::unique_ptr<base::Value> result_value;
@@ -333,9 +325,9 @@
 
 TEST(WindowCommandsTest, ExecuteAddCookie_DomainInvalid) {
   AddCookieWebView webview = AddCookieWebView("file://chromium.org");
-  base::DictionaryValue params;
-  base::Value* cookie_params = params.GetDict().Set(
-      "cookie", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  base::Value* cookie_params =
+      params.Set("cookie", base::Value(base::Value::Type::DICTIONARY));
   cookie_params->GetDict().Set("name", "testcookie");
   cookie_params->GetDict().Set("value", "cookievalue");
   cookie_params->GetDict().Set("sameSite", "Strict");
@@ -347,9 +339,9 @@
 
 TEST(WindowCommandsTest, ExecuteAddCookie_SameSiteEmpty) {
   AddCookieWebView webview = AddCookieWebView("https://chromium.org");
-  base::DictionaryValue params;
-  base::Value* cookie_params = params.GetDict().Set(
-      "cookie", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  base::Value* cookie_params =
+      params.Set("cookie", base::Value(base::Value::Type::DICTIONARY));
   cookie_params->GetDict().Set("name", "testcookie");
   cookie_params->GetDict().Set("value", "cookievalue");
   cookie_params->GetDict().Set("sameSite", "");
@@ -361,9 +353,9 @@
 
 TEST(WindowCommandsTest, ExecuteAddCookie_SameSiteNotSet) {
   AddCookieWebView webview = AddCookieWebView("ftp://chromium.org");
-  base::DictionaryValue params;
-  base::Value* cookie_params = params.GetDict().Set(
-      "cookie", base::Value(base::Value::Type::DICTIONARY));
+  base::Value::Dict params;
+  base::Value* cookie_params =
+      params.Set("cookie", base::Value(base::Value::Type::DICTIONARY));
   cookie_params->GetDict().Set("name", "testcookie");
   cookie_params->GetDict().Set("value", "cookievalue");
   std::unique_ptr<base::Value> result_value;
@@ -412,7 +404,7 @@
 
 TEST(WindowCommandsTest, ExecutePrintDefaultParams) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
@@ -423,129 +415,127 @@
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyOrientation) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
-  params.SetString("orientation", "portrait");
+  params.Set("orientation", "portrait");
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue printParams = getDefaultPrintParams();
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.SetString("orientation", "landscape");
+  params.Set("orientation", "landscape");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   printParams = getDefaultPrintParams();
   printParams.GetDict().Set("landscape", true);
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.SetString("orientation", "Invalid");
+  params.Set("orientation", "Invalid");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  params.GetDict().Set("orientation", true);
+  params.Set("orientation", true);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 }
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyScale) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
-  params.GetDict().Set("scale", 1.0);
+  params.Set("scale", 1.0);
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue printParams = getDefaultPrintParams();
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.GetDict().Set("scale", 2.0);
+  params.Set("scale", 2.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   printParams = getDefaultPrintParams();
   printParams.GetDict().Set("scale", 2.0);
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.GetDict().Set("scale", 0.05);
+  params.Set("scale", 0.05);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  params.GetDict().Set("scale", 2.1);
+  params.Set("scale", 2.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  params.SetString("scale", "1.3");
+  params.Set("scale", "1.3");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 }
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyBackground) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
-  params.GetDict().Set("background", false);
+  params.Set("background", false);
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue printParams = getDefaultPrintParams();
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.GetDict().Set("background", true);
+  params.Set("background", true);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   printParams = getDefaultPrintParams();
   printParams.GetDict().Set("printBackground", true);
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.SetString("background", "true");
+  params.Set("background", "true");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  params.GetDict().Set("background", 2);
+  params.Set("background", 2);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 }
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyShrinkToFit) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
-  params.GetDict().Set("shrinkToFit", true);
+  params.Set("shrinkToFit", true);
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue printParams = getDefaultPrintParams();
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.GetDict().Set("shrinkToFit", false);
+  params.Set("shrinkToFit", false);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   printParams = getDefaultPrintParams();
   printParams.GetDict().Set("preferCSSPageSize", true);
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  params.SetString("shrinkToFit", "False");
+  params.Set("shrinkToFit", "False");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  params.GetDict().Set("shrinkToFit", 2);
+  params.Set("shrinkToFit", 2);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 }
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyPageRanges) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
   base::Value::List lv;
-  params.SetList(
-      "pageRanges",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(lv))));
+  params.Set("pageRanges", std::move(lv));
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -559,9 +549,7 @@
   lv.Append("4-4");
   lv.Append("4-");
   lv.Append("-5");
-  params.SetList(
-      "pageRanges",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(lv))));
+  params.Set("pageRanges", std::move(lv));
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   printParams = getDefaultPrintParams();
@@ -570,25 +558,19 @@
 
   lv = base::Value::List();
   lv.Append(-1);
-  params.SetList(
-      "pageRanges",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(lv))));
+  params.Set("pageRanges", std::move(lv));
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
   lv = base::Value::List();
   lv.Append(3.0);
-  params.SetList(
-      "pageRanges",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(lv))));
+  params.Set("pageRanges", std::move(lv));
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
   lv = base::Value::List();
   lv.Append(true);
-  params.SetList(
-      "pageRanges",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(lv))));
+  params.Set("pageRanges", std::move(lv));
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
@@ -599,9 +581,7 @@
   lv.Append("  ");
   lv.Append(" 1-3 ");
   lv.Append("Invalid");
-  params.SetList(
-      "pageRanges",
-      base::ListValue::From(std::make_unique<base::Value>(std::move(lv))));
+  params.Set("pageRanges", std::move(lv));
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   printParams = getDefaultPrintParams();
@@ -611,18 +591,18 @@
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyPage) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
   base::Value* dv =
-      params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+      params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue printParams = getDefaultPrintParams();
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("width", 21.59);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -630,7 +610,7 @@
   printParams.GetDict().Set("paperWidth", ConvertCentimeterToInch(21.59));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("width", 33);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -638,17 +618,17 @@
   printParams.GetDict().Set("paperWidth", ConvertCentimeterToInch(33));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("width", "10");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("width", -3.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("height", 20);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -656,7 +636,7 @@
   printParams.GetDict().Set("paperHeight", ConvertCentimeterToInch(20));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("height", 27.94);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -664,12 +644,12 @@
   printParams.GetDict().Set("paperHeight", ConvertCentimeterToInch(27.94));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("height", "10");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("page", base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("page", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("height", -3.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
@@ -677,19 +657,18 @@
 
 TEST(WindowCommandsTest, ExecutePrintSpecifyMargin) {
   StorePrintParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
 
-  base::Value* dv = params.GetDict().Set(
-      "margin", base::Value(base::Value::Type::DICTIONARY));
+  base::Value* dv =
+      params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   Status status =
       CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
   base::DictionaryValue printParams = getDefaultPrintParams();
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("top", 1.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -697,8 +676,7 @@
   printParams.GetDict().Set("marginTop", ConvertCentimeterToInch(1.0));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("top", 10.2);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -706,20 +684,17 @@
   printParams.GetDict().Set("marginTop", ConvertCentimeterToInch(10.2));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("top", "10.2");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("top", -0.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("bottom", 1.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -727,8 +702,7 @@
   printParams.GetDict().Set("marginBottom", ConvertCentimeterToInch(1.0));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("bottom", 5.3);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -736,20 +710,17 @@
   printParams.GetDict().Set("marginBottom", ConvertCentimeterToInch(5.3));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("bottom", "10.2");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("bottom", -0.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("left", 1.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -757,8 +728,7 @@
   printParams.GetDict().Set("marginLeft", ConvertCentimeterToInch(1.0));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("left", 9.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -766,20 +736,17 @@
   printParams.GetDict().Set("marginLeft", ConvertCentimeterToInch(9.1));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("left", "10.2");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("left", -0.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("right", 1.0);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -787,8 +754,7 @@
   printParams.GetDict().Set("marginRight", ConvertCentimeterToInch(1.0));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("right", 8.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kOk, status.code()) << status.message();
@@ -796,14 +762,12 @@
   printParams.GetDict().Set("marginRight", ConvertCentimeterToInch(8.1));
   ASSERT_EQ(static_cast<const base::Value&>(printParams), webview.getParams());
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("right", "10.2");
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
 
-  dv = params.GetDict().Set("margin",
-                            base::Value(base::Value::Type::DICTIONARY));
+  dv = params.Set("margin", base::Value(base::Value::Type::DICTIONARY));
   dv->GetDict().Set("right", -0.1);
   status = CallWindowCommand(ExecutePrint, &webview, params, &result_value);
   ASSERT_EQ(kInvalidArgument, status.code()) << status.message();
@@ -879,7 +843,7 @@
 
 TEST(WindowCommandsTest, ExecuteScreenCapture) {
   StoreScreenshotParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
   Status status =
       CallWindowCommand(ExecuteScreenshot, &webview, params, &result_value);
@@ -891,7 +855,7 @@
 
 TEST(WindowCommandsTest, ExecuteFullPageScreenCapture) {
   StoreScreenshotParamsWebView webview;
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
   Status status = CallWindowCommand(ExecuteFullPageScreenshot, &webview, params,
                                     &result_value);
@@ -906,7 +870,7 @@
   StoreScreenshotParamsWebView webview(&sdtc, &dm);
   ASSERT_EQ(webview.GetMobileEmulationOverrideManager()->HasOverrideMetrics(),
             true);
-  base::DictionaryValue params;
+  base::Value::Dict params;
   std::unique_ptr<base::Value> result_value;
   Status status = CallWindowCommand(ExecuteFullPageScreenshot, &webview, params,
                                     &result_value);
diff --git a/chrome/test/data/webui/chromeos/BUILD.gn b/chrome/test/data/webui/chromeos/BUILD.gn
index 29b91eb..4b573708 100644
--- a/chrome/test/data/webui/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/BUILD.gn
@@ -9,7 +9,7 @@
 
 js_type_check("closure_compile_local") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args + [
+  closure_flags = default_closure_args + [
                     "js_module_root=" + rebase_path("//chrome/test/data/webui/",
                                                     root_build_dir),
                     "js_module_root=./gen/chrome/test/data/webui/",
diff --git a/chrome/test/data/webui/chromeos/chromebox_for_meetings/cfm_network_settings_test.js b/chrome/test/data/webui/chromeos/chromebox_for_meetings/cfm_network_settings_test.js
index dc884a88..a5346f2 100644
--- a/chrome/test/data/webui/chromeos/chromebox_for_meetings/cfm_network_settings_test.js
+++ b/chrome/test/data/webui/chromeos/chromebox_for_meetings/cfm_network_settings_test.js
@@ -7,10 +7,9 @@
 import {CfmNetworkSettingsBrowserProxyImpl} from 'chrome://cfm-network-settings/cfm_network_settings_browser_proxy.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 /** @implements {CfmNetworkSettingsBrowserProxy} */
 export class TestCfmNetworkSettingsBrowserProxy extends TestBrowserProxy {
@@ -45,6 +44,7 @@
 }
 
 suite('cfm-network-settings', () => {
+  const mojom = chromeos.networkConfig.mojom;
   const wiFiId = 'WiFi 1';
   const disconnectedWiFiId = 'WiFi 2';
   const configuredWiFiId = 'Configured WiFi';
@@ -71,23 +71,23 @@
     mojoApi.resetForTest();
 
     const connectedWiFi =
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, wiFiId);
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, wiFiId);
     connectedWiFi.connectable = true;
-    connectedWiFi.connectionState = ConnectionStateType.kConnected;
+    connectedWiFi.connectionState = mojom.ConnectionStateType.kConnected;
 
-    const disconnectedWiFi =
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, disconnectedWiFiId);
+    const disconnectedWiFi = OncMojo.getDefaultNetworkState(
+        mojom.NetworkType.kWiFi, disconnectedWiFiId);
 
-    const configuredWiFi =
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, configuredWiFiId);
+    const configuredWiFi = OncMojo.getDefaultNetworkState(
+        mojom.NetworkType.kWiFi, configuredWiFiId);
     configuredWiFi.connectable = true;
 
     mojoApi.addNetworksForTest(
         [connectedWiFi, disconnectedWiFi, configuredWiFi]);
     mojoApi.removeNetworkForTest({guid: 'eth0_guid'});
     mojoApi.setDeviceStateForTest({
-      type: NetworkType.kWiFi,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kWiFi,
+      deviceState: mojom.DeviceStateType.kEnabled,
     });
 
     networkSettings = document.createElement('cfm-network-settings');
diff --git a/chrome/test/data/webui/chromeos/crostini_installer_app_test.js b/chrome/test/data/webui/chromeos/crostini_installer_app_test.js
index 0389cf1..b5f3dcc 100644
--- a/chrome/test/data/webui/chromeos/crostini_installer_app_test.js
+++ b/chrome/test/data/webui/chromeos/crostini_installer_app_test.js
@@ -5,8 +5,8 @@
 import 'chrome://crostini-installer/app.js';
 
 import {BrowserProxy} from 'chrome://crostini-installer/browser_proxy.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 const InstallerState = crostini.mojom.InstallerState;
 const InstallerError = crostini.mojom.InstallerError;
diff --git a/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js b/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js
index e62e4534..8b18789 100644
--- a/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js
+++ b/chrome/test/data/webui/chromeos/crostini_upgrader_app_test.js
@@ -5,8 +5,8 @@
 import 'chrome://crostini-upgrader/app.js';
 
 import {BrowserProxy} from 'chrome://crostini-upgrader/browser_proxy.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 class FakePageHandler extends TestBrowserProxy {
   constructor() {
diff --git a/chrome/test/data/webui/chromeos/diagnostics/BUILD.gn b/chrome/test/data/webui/chromeos/diagnostics/BUILD.gn
index 037f0a0..57ed0813 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/diagnostics/BUILD.gn
@@ -7,7 +7,7 @@
 js_type_check("closure_compile") {
   is_polymer3 = true
   closure_flags =
-      default_closure_args + mojom_js_args + [
+      default_closure_args + [
         "browser_resolver_prefix_replacements=\"chrome://diagnostics/=" +
             rebase_path("//ash/webui/diagnostics_ui/resources/",
                         root_build_dir) + "\"",
diff --git a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
index d62ac4f0..fd94bf5 100644
--- a/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
+++ b/chrome/test/data/webui/chromeos/fake_network_config_mojom.js
@@ -9,9 +9,6 @@
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
-import {AlwaysOnVpnMode, AlwaysOnVpnProperties, CellularSimState, ConfigProperties, CrosNetworkConfigObserverRemote, DeviceStateProperties, FilterType, GlobalPolicy, InhibitReason, ManagedProperties, NetworkCertificate, NetworkFilter, NetworkStateProperties, NO_LIMIT, StartConnectResult, UInt32Value, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 
 // Default cellular pin, used when locking/unlocking cellular profiles.
 export const DEFAULT_CELLULAR_PIN = '1111';
@@ -24,37 +21,38 @@
     this.resolverMap_ = new Map();
 
     /**
-     * @private {!Map<NetworkType,
-     *     !DeviceStateProperties>}
+     * @private {!Map<chromeos.networkConfig.mojom.NetworkType,
+     *     !chromeos.networkConfig.mojom.DeviceStateProperties>}
      */
     this.deviceStates_ = new Map();
 
     /**
-     * @private {!Array<!NetworkStateProperties>}
+     * @private {!Array<!chromeos.networkConfig.mojom.NetworkStateProperties>}
      */
     this.networkStates_ = [];
 
     /**
-     * @private {!Map<string, !ManagedProperties>}
+     * @private {!Map<string, !chromeos.networkConfig.mojom.ManagedProperties>}
      */
     this.managedProperties_ = new Map();
 
     /**
-     * @private {!ConfigProperties|undefined}
+     * @private {!chromeos.networkConfig.mojom.ConfigProperties|undefined}
      */
     this.propertiesToSet_ = undefined;
 
-    /** @private {!GlobalPolicy|undefined} */
+    /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     this.globalPolicy_ = undefined;
 
-    /** @private {!Array<!NetworkCertificate>} */
+    /** @private {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} */
     this.serverCas_ = [];
 
-    /** @private {!Array<!NetworkCertificate>} */
+    /** @private {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} */
     this.userCerts_ = [];
 
     /**
-     * @private {!Array<!CrosNetworkConfigObserverRemote>}
+     * @private {!Array<
+     *     !chromeos.networkConfig.mojom.CrosNetworkConfigObserverRemote>}
      */
     this.observers_ = [];
 
@@ -67,17 +65,17 @@
     this.testPin = '';
 
     /**
-     * @private {AlwaysOnVpnProperties}
+     * @private {chromeos.networkConfig.mojom.AlwaysOnVpnProperties}
      */
     this.alwaysOnVpnProperties_ = {
-      mode: AlwaysOnVpnMode.kOff,
+      mode: chromeos.networkConfig.mojom.AlwaysOnVpnMode.kOff,
       serviceGuid: '',
     };
 
     /** @type {Function} */
     this.beforeGetDeviceStateList = null;
 
-    /** @private {!Array<VpnProvider>} */
+    /** @private {!Array<chromeos.networkConfig.mojom.VpnProvider>} */
     this.vpnProviders_ = [];
 
     /** @private {!Map<string, !Array<!Object>>} */
@@ -90,33 +88,37 @@
   }
 
   /**
-   * @param {NetworkType} type
-   * @return {DeviceStateProperties}
+   * @param {chromeos.networkConfig.mojom.NetworkType} type
+   * @return {chromeos.networkConfig.mojom.DeviceStateProperties}
    * @private
    */
   addDeviceState_(type) {
     assert(type !== undefined);
     const deviceState =
-        /** @type {!DeviceStateProperties} */ ({
+        /** @type {!chromeos.networkConfig.mojom.DeviceStateProperties} */ ({
           type: type,
-          deviceState: DeviceStateType.kUninitialized,
-          inhibitReason: InhibitReason.kNotInhibited,
+          deviceState:
+              chromeos.networkConfig.mojom.DeviceStateType.kUninitialized,
+          inhibitReason:
+              chromeos.networkConfig.mojom.InhibitReason.kNotInhibited,
         });
     this.deviceStates_.set(type, deviceState);
     return deviceState;
   }
 
   resetForTest() {
+    const mojom = chromeos.networkConfig.mojom;
+
     this.deviceStates_ = new Map();
-    this.addDeviceState_(NetworkType.kEthernet).deviceState =
-        DeviceStateType.kEnabled;
-    this.addDeviceState_(NetworkType.kWiFi);
-    this.addDeviceState_(NetworkType.kCellular);
-    this.addDeviceState_(NetworkType.kTether);
-    this.addDeviceState_(NetworkType.kVPN);
+    this.addDeviceState_(mojom.NetworkType.kEthernet).deviceState =
+        chromeos.networkConfig.mojom.DeviceStateType.kEnabled;
+    this.addDeviceState_(mojom.NetworkType.kWiFi);
+    this.addDeviceState_(mojom.NetworkType.kCellular);
+    this.addDeviceState_(mojom.NetworkType.kTether);
+    this.addDeviceState_(mojom.NetworkType.kVPN);
 
     this.globalPolicy_ =
-        /** @type {!GlobalPolicy} */ ({
+        /** @type {!chromeos.networkConfig.mojom.GlobalPolicy} */ ({
           allow_cellular_sim_lock: true,
           allow_only_policy_cellular_networks: false,
           allow_only_policy_networks_to_autoconnect: false,
@@ -125,7 +127,8 @@
           blocked_hex_ssids: [],
         });
 
-    const eth0 = OncMojo.getDefaultNetworkState(NetworkType.kEthernet, 'eth0');
+    const eth0 =
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kEthernet, 'eth0');
     this.networkStates_ = [eth0];
 
     this.managedProperties_ = new Map();
@@ -191,7 +194,7 @@
   }
 
   /**
-   * @param {!Array<!NetworkStateProperties>}
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     networks
    */
   addNetworksForTest(networks) {
@@ -200,7 +203,7 @@
   }
 
   /**
-   * @param {!NetworkStateProperties} network
+   * @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network
    */
   removeNetworkForTest(network) {
     this.networkStates_ = this.networkStates_.filter((state) => {
@@ -210,7 +213,7 @@
   }
 
   /**
-   * @param {!ManagedProperties} network
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} network
    */
   setManagedPropertiesForTest(network) {
     assert(network.guid);
@@ -231,7 +234,7 @@
 
   /**
    * @param {string} guid
-   * @param {ConnectionStateType} state
+   * @param {chromeos.networkConfig.mojom.ConnectionStateType} state
    */
   setNetworkConnectionStateForTest(guid, state) {
     const network = this.networkStates_.find(state => {
@@ -262,7 +265,7 @@
 
   /**
    * @param {string} guid
-   * @param {?Time} lastResetTime last reset
+   * @param {?mojoBase.mojom.Time} lastResetTime last reset
    * time for network with guid
    */
   setLastResetTimeForTest(guid, lastResetTime) {
@@ -304,12 +307,13 @@
   /**
    * @param {string} guid
    * @return {!Promise<{result:
-   *     !StartConnectResult}>}
+   *     !chromeos.networkConfig.mojom.StartConnectResult}>}
    */
   startConnect(guid) {
     return new Promise(resolve => {
       this.methodCalled('startConnect');
-      resolve({result: StartConnectResult.kCanceled});
+      resolve(
+          {result: chromeos.networkConfig.mojom.StartConnectResult.kCanceled});
     });
   }
 
@@ -324,21 +328,22 @@
       const network = this.networkStates_.find(state => {
         return state.guid === guid;
       });
-      network.connectionState = ConnectionStateType.kNotConnected;
+      network.connectionState =
+          chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
       this.methodCalled('startDisconnect');
       resolve({success: true});
     });
   }
 
   /**
-   * @param {ConfigProperties} properties
+   * @param {chromeos.networkConfig.mojom.ConfigProperties} properties
    * @param {boolean} shared
    * @return {!Promise<{guid: string, errorMessage: string}>}
    */
   configureNetwork(properties, shared) {
     return new Promise(resolve => {
       this.propertiesToSet_ =
-          /** @type(!ConfigProperties)*/
+          /** @type(!chromeos.networkConfig.mojom.ConfigProperties)*/
           (Object.assign({}, properties));
       this.methodCalled('configureNetwork');
       resolve({guid: 'test_guid', errorMessage: ''});
@@ -347,20 +352,21 @@
 
   /**
    * @param {string} guid
-   * @param {ConfigProperties} properties
+   * @param {chromeos.networkConfig.mojom.ConfigProperties} properties
    * @return {!Promise<{success: boolean, errorMessage: string}>}
    */
   setProperties(guid, properties) {
     return new Promise(resolve => {
       this.propertiesToSet_ =
-          /** @type(!ConfigProperties)*/ (Object.assign({}, properties));
+          /** @type(!chromeos.networkConfig.mojom.ConfigProperties)*/ (
+              Object.assign({}, properties));
       this.methodCalled('setProperties');
       resolve({success: true, errorMessage: ''});
     });
   }
 
   /**
-   * @param {DeviceStateProperties} deviceState
+   * @param {chromeos.networkConfig.mojom.DeviceStateProperties} deviceState
    * @private
    */
   setDeviceStateForTest(deviceState) {
@@ -370,27 +376,27 @@
   }
 
   /**
-   * @param {NetworkType} type
-   * @return {?DeviceStateProperties}
+   * @param {chromeos.networkConfig.mojom.NetworkType} type
+   * @return {?chromeos.networkConfig.mojom.DeviceStateProperties}
    */
   getDeviceStateForTest(type) {
     return this.deviceStates_.get(type) || null;
   }
 
-  /** @return {!ConfigProperties|undefined} */
+  /** @return {!chromeos.networkConfig.mojom.ConfigProperties|undefined} */
   getPropertiesToSetForTest() {
     return this.propertiesToSet_;
   }
 
-  /** @param {!Array<!VpnProvider>} providers */
+  /** @param {!Array<!chromeos.networkConfig.mojom.VpnProvider>} providers */
   setVpnProvidersForTest(providers) {
     this.vpnProviders_ = providers;
     this.onVpnProvidersChanged();
   }
 
   /**
-   * @param {!Array<!NetworkCertificate>} serverCas
-   * @param {!Array<!NetworkCertificate>} userCerts
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} serverCas
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} userCerts
    */
   setCertificatesForTest(serverCas, userCerts) {
     this.serverCas_ = serverCas;
@@ -408,7 +414,8 @@
           state.connectRequested === undefined) {
         console.error('BAD STATE: ' + JSON.stringify(state));
       }
-      return state.connectionState !== ConnectionStateType.kNotConnected;
+      return state.connectionState !==
+          chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
     });
     this.observers_.forEach(o => o.onActiveNetworksChanged(activeNetworks));
   }
@@ -446,7 +453,7 @@
   // networkConfig methods
 
   /**
-   * @param {!CrosNetworkConfigObserverRemote}
+   * @param {!chromeos.networkConfig.mojom.CrosNetworkConfigObserverRemote}
    *     observer
    */
   addObserver(observer) {
@@ -456,7 +463,7 @@
   /**
    * @param {string} guid
    * @return {!Promise<{result:
-   *     !NetworkStateProperties}>}
+   *     !chromeos.networkConfig.mojom.NetworkStateProperties}>}
    */
   getNetworkState(guid) {
     return new Promise(resolve => {
@@ -469,28 +476,29 @@
   }
 
   /**
-   * @param {!ConnectionStateType} connectionState
-   * @param {!FilterType} filterType
+   * @param {!chromeos.networkConfig.mojom.ConnectionStateType} connectionState
+   * @param {!chromeos.networkConfig.mojom.FilterType} filterType
    * @return {boolean} Whether the connectionState type is not filtered out.
    */
   passFilter(connectionState, filterType) {
     switch (filterType) {
-      case FilterType.kActive:
-        return connectionState !== ConnectionStateType.kNotConnected;
-      case FilterType.kVisible:
+      case chromeos.networkConfig.mojom.FilterType.kActive:
+        return connectionState !==
+            chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
+      case chromeos.networkConfig.mojom.FilterType.kVisible:
         return true;
-      case FilterType.kConfigured:
+      case chromeos.networkConfig.mojom.FilterType.kConfigured:
         return true;
-      case FilterType.kAll:
+      case chromeos.networkConfig.mojom.FilterType.kAll:
         return true;
     }
     assertNotReached('Failed to find filterType: ' + filterType.toString());
   }
 
   /**
-   * @param {!NetworkFilter} filter
+   * @param {!chromeos.networkConfig.mojom.NetworkFilter} filter
    * @return {!Promise<{result:
-   *     !Array<!NetworkStateProperties>}>}
+   *     !Array<!chromeos.networkConfig.mojom.NetworkStateProperties>}>}
    */
   getNetworkStateList(filter) {
     return new Promise(resolve => {
@@ -498,7 +506,7 @@
       const filterType = filter.filter;
       const limit = filter.limit;
       let result;
-      if (networkType === NetworkType.kAll) {
+      if (networkType === chromeos.networkConfig.mojom.NetworkType.kAll) {
         result = this.networkStates_.filter(
             state => this.passFilter(state.connectionState, filterType));
       } else {
@@ -508,7 +516,7 @@
                  this.passFilter(state.connectionState, filterType)));
       }
 
-      if (limit !== NO_LIMIT) {
+      if (limit !== chromeos.networkConfig.mojom.NO_LIMIT) {
         result = result.slice(0, limit);
       }
       this.methodCalled('getNetworkStateList');
@@ -518,13 +526,14 @@
 
   /**
    * @return {!Promise<{result:
-   *     !Array<!DeviceStateProperties>}>}
+   *     !Array<!chromeos.networkConfig.mojom.DeviceStateProperties>}>}
    */
   getDeviceStateList() {
     return new Promise(resolve => {
       const devices = [];
       this.deviceStates_.forEach((state, type) => {
-        if (state.deviceState !== DeviceStateType.kUninitialized) {
+        if (state.deviceState !==
+            chromeos.networkConfig.mojom.DeviceStateType.kUninitialized) {
           devices.push(state);
         }
       });
@@ -540,7 +549,7 @@
   /**
    * @param {string} guid
    * @return {!Promise<{result:
-   *     !ManagedProperties}>}
+   *     !chromeos.networkConfig.mojom.ManagedProperties}>}
    */
   getManagedProperties(guid) {
     return new Promise(resolve => {
@@ -562,7 +571,7 @@
   }
 
   /**
-   * @param {!CellularSimState} cellularSimState
+   * @param {!chromeos.networkConfig.mojom.CellularSimState} cellularSimState
    * @return {!Promise<{success: boolean}>}
    */
   setCellularSimState(cellularSimState) {
@@ -574,7 +583,7 @@
       };
 
       // This is only called by cellular networks.
-      const type = NetworkType.kCellular;
+      const type = chromeos.networkConfig.mojom.NetworkType.kCellular;
       const deviceState = this.deviceStates_.get(type);
       let simLockStatus = deviceState.simLockStatus;
       const pin = this.testPin ? this.testPin : DEFAULT_CELLULAR_PIN;
@@ -615,7 +624,7 @@
   }
 
   /**
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @param {boolean} enabled
    * @return {!Promise<{success: boolean}>}
    */
@@ -623,21 +632,22 @@
     return new Promise(resolve => {
       const deviceState = this.deviceStates_.get(type);
       assert(!!deviceState, 'Unrecognized device type: ' + type);
-      deviceState.deviceState =
-          enabled ? DeviceStateType.kEnabled : DeviceStateType.kDisabled;
+      deviceState.deviceState = enabled ?
+          chromeos.networkConfig.mojom.DeviceStateType.kEnabled :
+          chromeos.networkConfig.mojom.DeviceStateType.kDisabled;
       this.methodCalled('setNetworkTypeEnabledState');
       this.onDeviceStateListChanged();
       resolve(true);
     });
   }
 
-  /** @param {!NetworkType } type */
+  /** @param {!chromeos.networkConfig.mojom.NetworkType } type */
   requestNetworkScan(type) {
     this.methodCalled('requestNetworkScan');
   }
 
   /**
-   * @return {!Promise<{result: !GlobalPolicy}>}
+   * @return {!Promise<{result: !chromeos.networkConfig.mojom.GlobalPolicy}>}
    */
   getGlobalPolicy() {
     return new Promise(resolve => {
@@ -646,7 +656,7 @@
     });
   }
 
-  /** @param {!GlobalPolicy} globalPolicy */
+  /** @param {!chromeos.networkConfig.mojom.GlobalPolicy} globalPolicy */
   setGlobalPolicy(globalPolicy) {
     this.globalPolicy_ = globalPolicy;
     this.onPoliciesApplied(/*userhash=*/ '');
@@ -654,7 +664,7 @@
 
   /**
    * @return {!Promise<{
-   *     result: !Array<!VpnProvider>}>}
+   *     result: !Array<!chromeos.networkConfig.mojom.VpnProvider>}>}
    */
   getVpnProviders() {
     return new Promise(resolve => {
@@ -684,8 +694,8 @@
 
   /**
    * @return {!Promise<{
-   *     serverCas: !Array<!NetworkCertificate>,
-   *     userCerts: !Array<!NetworkCertificate>}>}
+   *     serverCas: !Array<!chromeos.networkConfig.mojom.NetworkCertificate>,
+   *     userCerts: !Array<!chromeos.networkConfig.mojom.NetworkCertificate>}>}
    */
   getNetworkCertificates() {
     return new Promise(resolve => {
@@ -696,7 +706,7 @@
 
   /**
    * @return {!Promise<{
-   *      result: !AlwaysOnVpnProperties}>}
+   *      result: !chromeos.networkConfig.mojom.AlwaysOnVpnProperties}>}
    */
   getAlwaysOnVpn() {
     return new Promise(resolve => {
@@ -706,7 +716,7 @@
   }
 
   /**
-   * @param {!AlwaysOnVpnProperties} properties
+   * @param {!chromeos.networkConfig.mojom.AlwaysOnVpnProperties} properties
    */
   setAlwaysOnVpn(properties) {
     this.alwaysOnVpnProperties_ = properties;
@@ -739,7 +749,7 @@
   /**
    * @param {string} guid
    * @param {boolean} autoReset
-   * @param {?UInt32Value} resetDay
+   * @param {?chromeos.networkConfig.mojom.UInt32Value} resetDay
    */
   setAutoResetValues_(guid, autoReset, resetDay) {
     const network = this.networkStates_.find(state => {
@@ -758,7 +768,7 @@
   /**
    * @param {string} guid
    * @param {boolean} autoReset
-   * @param {?UInt32Value} resetDay
+   * @param {?chromeos.networkConfig.mojom.UInt32Value} resetDay
    */
   setTrafficCountersAutoReset(guid, autoReset, resetDay) {
     return new Promise(resolve => {
diff --git a/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js b/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js
index 964b51aa..9b391fa 100644
--- a/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js
+++ b/chrome/test/data/webui/chromeos/internet_detail_dialog_test.js
@@ -7,11 +7,9 @@
 import {InternetDetailDialogBrowserProxyImpl} from 'chrome://internet-detail-dialog/internet_detail_dialog_container.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote, InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 /** @implements {InternetDetailDialogBrowserProxy} */
 export class TestInternetDetailDialogBrowserProxy extends TestBrowserProxy {
@@ -36,7 +34,7 @@
   const test_iccid = '11111111111111111';
   let internetDetailDialog = null;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_;
 
   suiteSetup(function() {
@@ -72,25 +70,27 @@
   }
 
   async function setupCellularNetwork(isPrimary, isInhibited) {
-    await mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+    const mojom = chromeos.networkConfig.mojom;
+    await mojoApi_.setNetworkTypeEnabledState(
+        mojom.NetworkType.kCellular, true);
 
-    const cellularNetwork =
-        getManagedProperties(NetworkType.kCellular, OncSource.kDevice);
+    const cellularNetwork = getManagedProperties(
+        mojom.NetworkType.kCellular, mojom.OncSource.kDevice);
     cellularNetwork.typeProperties.cellular.iccid = test_iccid;
     // Required for connectDisconnectButton to be rendered.
     cellularNetwork.connectionState = isPrimary ?
-        ConnectionStateType.kConnected :
-        ConnectionStateType.kNotConnected;
+        mojom.ConnectionStateType.kConnected :
+        mojom.ConnectionStateType.kNotConnected;
     // Required for networkChooseMobile to be rendered.
     cellularNetwork.typeProperties.cellular.supportNetworkScan = true;
 
     mojoApi_.setManagedPropertiesForTest(cellularNetwork);
     mojoApi_.setDeviceStateForTest({
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
       inhibitReason:
-          (isInhibited ? InhibitReason.kInstallingProfile :
-                         InhibitReason.kNotInhibited),
+          (isInhibited ? mojom.InhibitReason.kInstallingProfile :
+                         mojom.InhibitReason.kNotInhibited),
       simInfos: [{
         iccid: test_iccid,
         isPrimary: isPrimary,
@@ -153,10 +153,11 @@
     assertFalse(infoFields.disabled);
 
     // Mock device being inhibited.
+    const mojom = chromeos.networkConfig.mojom;
     mojoApi_.setDeviceStateForTest({
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kInstallingProfile,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kInstallingProfile,
       simInfos: [{
         iccid: test_iccid,
         isPrimary: true,
@@ -175,9 +176,9 @@
 
     // Uninhibit.
     mojoApi_.setDeviceStateForTest({
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
       simInfos: [{
         iccid: test_iccid,
         isPrimary: true,
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn b/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
index 8997ae78..d616713 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/shimless_rma/BUILD.gn
@@ -7,7 +7,7 @@
 js_type_check("closure_compile") {
   is_polymer3 = true
   closure_flags =
-      default_closure_args + mojom_js_args + [
+      default_closure_args + [
         "browser_resolver_prefix_replacements=\"chrome://shimless-rma/=" +
             rebase_path("//ash/webui/shimless_rma/resources/", root_build_dir) +
             "\"",
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_network_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_network_page_test.js
index 5e48d19..83134c2 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/onboarding_network_page_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/onboarding_network_page_test.js
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {fakeNetworks} from 'chrome://shimless-rma/fake_data.js';
 import {FakeShimlessRmaService} from 'chrome://shimless-rma/fake_shimless_rma_service.js';
 import {setNetworkConfigServiceForTesting, setShimlessRmaServiceForTesting} from 'chrome://shimless-rma/mojo_interface_provider.js';
@@ -146,8 +145,10 @@
     const networkList = component.shadowRoot.querySelector('#networkList');
 
     // Add fake unconnected wifi.
-    const fakeWiFi = OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi');
-    fakeWiFi.connectionState = ConnectionStateType.kNotConnected;
+    const fakeWiFi = OncMojo.getDefaultNetworkState(
+        chromeos.networkConfig.mojom.NetworkType.kWiFi, 'wifi');
+    fakeWiFi.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
     networkConfigService.addNetworksForTest(fakeWiFi);
     component.refreshNetworks();
     await flushTasks();
@@ -186,8 +187,10 @@
     const networkList = component.shadowRoot.querySelector('#networkList');
 
     // Add fake connected wifi.
-    const fakeWiFi = OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi');
-    fakeWiFi.connectionState = ConnectionStateType.kConnected;
+    const fakeWiFi = OncMojo.getDefaultNetworkState(
+        chromeos.networkConfig.mojom.NetworkType.kWiFi, 'wifi');
+    fakeWiFi.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     networkConfigService.addNetworksForTest(fakeWiFi);
     component.refreshNetworks();
     await flushTasks();
@@ -195,7 +198,9 @@
     // fake WiFi connectionState should be 'Connected'.
     const length = networkList.networks.length;
     const network = networkList.networks[length - 1];
-    assertEquals(network.connectionState, ConnectionStateType.kConnected);
+    assertEquals(
+        network.connectionState,
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected);
 
     // Show the 'disconnect' button instead of 'connect'.
     component.onNetworkSelected_({detail: network});
@@ -209,7 +214,9 @@
     disconnectButton.click();
     component.refreshNetworks();
     await flushTasks();
-    assertEquals(network.connectionState, ConnectionStateType.kNotConnected);
+    assertEquals(
+        network.connectionState,
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected);
   });
 
   test('SetSkipButtonWhenNotConnected', async () => {
@@ -226,9 +233,10 @@
     await flushTasks();
     assertEquals('skipButtonLabel', buttonLabelKey);
 
-    const ethernetConnected =
-        OncMojo.getDefaultNetworkState(NetworkType.kEthernet, 'ethernet');
-    ethernetConnected.connectionState = ConnectionStateType.kOnline;
+    const ethernetConnected = OncMojo.getDefaultNetworkState(
+        chromeos.networkConfig.mojom.NetworkType.kEthernet, 'ethernet');
+    ethernetConnected.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kOnline;
     networkConfigService.addNetworksForTest([ethernetConnected]);
 
     component.refreshNetworks();
diff --git a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/activation_code_page_test.js b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/activation_code_page_test.js
index fe79f8f7..cb287010 100644
--- a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/activation_code_page_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/activation_code_page_test.js
@@ -6,7 +6,7 @@
 import 'chrome://resources/cr_components/chromeos/cellular_setup/activation_code_page.js';
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/cellular_setup_test.js b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/cellular_setup_test.js
index 7d1e5dc..c712aef 100644
--- a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/cellular_setup_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/cellular_setup_test.js
@@ -9,7 +9,6 @@
 import {CellularSetupPageName} from 'chrome://resources/cr_components/chromeos/cellular_setup/cellular_types.js';
 import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
@@ -38,9 +37,10 @@
   }
 
   function init() {
+    const mojom = chromeos.networkConfig.mojom;
     networkConfigRemote.setDeviceStateForTest({
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simInfos: [{slot_id: 0, iccid: '1111111111111111'}],
     });
     eSimManagerRemote.addEuiccForTest(2);
diff --git a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js
index f9d961e9..6c0970f 100644
--- a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/esim_flow_ui_test.js
@@ -10,7 +10,6 @@
 import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 
@@ -76,9 +75,10 @@
 
   /** Adds an actively online wifi network and esim network. */
   function addOnlineWifiNetwork() {
-    const onlineNetwork =
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, wifiGuidPrefix);
-    onlineNetwork.connectionState = ConnectionStateType.kOnline;
+    const onlineNetwork = OncMojo.getDefaultNetworkState(
+        chromeos.networkConfig.mojom.NetworkType.kWiFi, wifiGuidPrefix);
+    onlineNetwork.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kOnline;
     networkConfigRemote.addNetworksForTest([onlineNetwork]);
     MojoInterfaceProviderImpl.getInstance().remote_ = networkConfigRemote;
   }
@@ -86,7 +86,8 @@
   /** Takes actively online network offline. */
   function takeWifiNetworkOffline() {
     networkConfigRemote.setNetworkConnectionStateForTest(
-        wifiGuidPrefix + '_guid', ConnectionStateType.kNotConnected);
+        wifiGuidPrefix + '_guid',
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected);
   }
 
   test('Error fetching profiles', async function() {
@@ -746,9 +747,10 @@
             profileLoadingPage.loadingMessage,
             eSimPage.i18n('eSimProfileDetectMessage'));
 
-        const pSimNetwork =
-            OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular');
-        pSimNetwork.connectionState = ConnectionStateType.kConnected;
+        const pSimNetwork = OncMojo.getDefaultNetworkState(
+            chromeos.networkConfig.mojom.NetworkType.kCellular, 'cellular');
+        pSimNetwork.connectionState =
+            chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
         networkConfigRemote.addNetworksForTest([pSimNetwork]);
         MojoInterfaceProviderImpl.getInstance().remote_ = networkConfigRemote;
         await flushAsync();
diff --git a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/psim_flow_ui_test.js b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/psim_flow_ui_test.js
index f55dfc51..a1235c8 100644
--- a/chrome/test/data/webui/cr_components/chromeos/cellular_setup/psim_flow_ui_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/cellular_setup/psim_flow_ui_test.js
@@ -9,7 +9,7 @@
 import {setCellularSetupRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js';
 import {FAILED_PSIM_SETUP_DURATION_METRIC_NAME, PSimPageName, PSimSetupFlowResult, PSimUIState, SUCCESSFUL_PSIM_SETUP_DURATION_METRIC_NAME} from 'chrome://resources/cr_components/chromeos/cellular_setup/psim_flow_ui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
index 68cec7a..f72a984 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
@@ -4,9 +4,11 @@
 
 /** @fileoverview Suite of tests for CrPolicyIndicatorBehavior. */
 
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+
 import {CrPolicyNetworkBehaviorMojo} from 'chrome://resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js';
 import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
-import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('CrPolicyNetworkBehaviorMojo', function() {
@@ -18,9 +20,11 @@
     });
   });
 
+  let mojom;
   let testBehavior;
 
   setup(function() {
+    mojom = chromeos.networkConfig.mojom;
     PolymerTest.clearBody();
     testBehavior = document.createElement('test-behavior');
     document.body.appendChild(testBehavior);
@@ -29,7 +33,7 @@
   test('active', function() {
     const property = {
       activeValue: 'foo',
-      policySource: PolicySource.kNone,
+      policySource: mojom.PolicySource.kNone,
     };
     assertFalse(testBehavior.isNetworkPolicyControlled(property));
     assertFalse(testBehavior.isControlled(property));
@@ -42,7 +46,7 @@
   test('user_recommended', function() {
     const property = {
       activeValue: 'foo',
-      policySource: PolicySource.kUserPolicyRecommended,
+      policySource: mojom.PolicySource.kUserPolicyRecommended,
       policyValue: 'bar',
     };
     assertTrue(testBehavior.isNetworkPolicyControlled(property));
@@ -59,7 +63,7 @@
   test('device_recommended', function() {
     const property = {
       activeValue: 'foo',
-      policySource: PolicySource.kDevicePolicyRecommended,
+      policySource: mojom.PolicySource.kDevicePolicyRecommended,
       policyValue: 'bar',
     };
     assertTrue(testBehavior.isNetworkPolicyControlled(property));
@@ -76,7 +80,7 @@
   test('user_enforced', function() {
     const property = {
       activeValue: 'foo',
-      policySource: PolicySource.kUserPolicyEnforced,
+      policySource: mojom.PolicySource.kUserPolicyEnforced,
       policyValue: 'foo',
     };
     assertTrue(testBehavior.isNetworkPolicyControlled(property));
@@ -93,7 +97,7 @@
   test('device_enforced', function() {
     const property = {
       activeValue: 'foo',
-      policySource: PolicySource.kDevicePolicyEnforced,
+      policySource: mojom.PolicySource.kDevicePolicyEnforced,
       policyValue: 'foo',
     };
     assertTrue(testBehavior.isNetworkPolicyControlled(property));
@@ -110,7 +114,7 @@
   test('extension_controlled', function() {
     const property = {
       activeValue: 'foo',
-      policySource: PolicySource.kActiveExtension,
+      policySource: mojom.PolicySource.kActiveExtension,
     };
     assertFalse(testBehavior.isNetworkPolicyControlled(property));
     assertTrue(testBehavior.isControlled(property));
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_indicator_mojo_tests.js b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_indicator_mojo_tests.js
index fbac2ef..395852b 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_indicator_mojo_tests.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_indicator_mojo_tests.js
@@ -7,7 +7,6 @@
 import 'chrome://resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js';
 import 'chrome://test/cr_components/chromeos/network/cr_policy_strings.js';
 
-import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('cr-policy-network-indicator-mojo', function() {
@@ -49,7 +48,8 @@
   test('recommended', function() {
     indicator.property = {
       activeValue: 'foo',
-      policySource: PolicySource.kUserPolicyRecommended,
+      policySource:
+          chromeos.networkConfig.mojom.PolicySource.kUserPolicyRecommended,
       policyValue: 'bar',
     };
     return flushAsync()
@@ -75,7 +75,8 @@
   test('policy', function() {
     indicator.property = {
       activeValue: 'foo',
-      policySource: PolicySource.kDevicePolicyEnforced,
+      policySource:
+          chromeos.networkConfig.mojom.PolicySource.kDevicePolicyEnforced,
       policyValue: 'foo',
     };
     return flushAsync().then(() => {
@@ -89,7 +90,7 @@
   test('extension', function() {
     indicator.property = {
       activeValue: 'foo',
-      policySource: PolicySource.kActiveExtension,
+      policySource: chromeos.networkConfig.mojom.PolicySource.kActiveExtension,
     };
     return flushAsync().then(() => {
       const icon = indicator.$$('cr-tooltip-icon');
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_choose_mobile_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_choose_mobile_test.js
index ff7c1ed..83d8f41a 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_choose_mobile_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_choose_mobile_test.js
@@ -5,14 +5,17 @@
 import 'chrome://os-settings/strings.m.js';
 import 'chrome://resources/cr_components/chromeos/network/network_choose_mobile.js';
 
-import {ConnectionStateType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkChooseMobileTest', function() {
   /** @type {!NetworkChooseMobile|undefined} */
   let chooseMobile;
 
+  let mojom;
+
   setup(function() {
+    mojom = chromeos.networkConfig.mojom;
+
     chooseMobile = document.createElement('network-choose-mobile');
     chooseMobile.managedProperties = {
       typeProperties: {
@@ -31,7 +34,7 @@
     // A scan requires the connection state to be disconnected and the current
     // scan state to be 'not scanning'.
     chooseMobile.managedProperties = {
-      connectionState: ConnectionStateType.kNotConnected,
+      connectionState: mojom.ConnectionStateType.kNotConnected,
       typeProperties: {
         cellular: {},
       },
@@ -60,10 +63,8 @@
     };
 
     // Every connection state but kNotConnected prevents scanning.
-    for (const state in ConnectionStateType) {
-      if (state === ConnectionStateType.kNotConnected) {
-        continue;
-      }
+    for (const state in mojom.ConnectionStateType) {
+      if (state === mojom.ConnectionStateType.kNotConnected) continue;
 
       chooseMobile.managedProperties = {
         connectionState: state,
@@ -79,7 +80,7 @@
 
   test('Disabled UI state', function() {
     chooseMobile.managedProperties = {
-      connectionState: ConnectionStateType.kNotConnected,
+      connectionState: mojom.ConnectionStateType.kNotConnected,
       typeProperties: {
         cellular: {
           foundNetworks: [{
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_config_element_behavior_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_config_element_behavior_test.js
index 1292767..f997296 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_config_element_behavior_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_config_element_behavior_test.js
@@ -2,6 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
+
 import {NetworkConfigElementBehavior} from 'chrome://resources/cr_components/chromeos/network/network_config_element_behavior.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {flush, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_config_select_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_config_select_test.js
index 73bd5ac..f9ef742 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_config_select_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_config_select_test.js
@@ -42,7 +42,7 @@
     // Set the select to contain certs.
     configSelect.certList = true;
 
-    // NetworkCertificate
+    // chromeos.networkConfig.mojom.NetworkCertificate
     configSelect.items = [
       {deviceWide: true, hash: 'hash', issuedBy: 'me'},
     ];
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js
index 525a9ea..5ff73ce 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_config_test.js
@@ -7,15 +7,13 @@
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote, HiddenSsidMode, SecurityType, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 
 suite('network-config', function() {
   let networkConfig;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   const kCaHash = 'CAHASH';
@@ -104,7 +102,7 @@
   suite('New WiFi Config', function() {
     setup(function() {
       mojoApi_.resetForTest();
-      setNetworkType(NetworkType.kWiFi);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kWiFi);
       initNetworkConfig();
     });
 
@@ -121,7 +119,8 @@
 
     test('Passphrase field shows', function() {
       assertFalse(!!networkConfig.$$('#wifi-passphrase'));
-      networkConfig.$$('#security').value = SecurityType.kWpaPsk;
+      networkConfig.$$('#security').value =
+          chromeos.networkConfig.mojom.SecurityType.kWpaPsk;
       return flushAsync().then(() => {
         assertTrue(!!networkConfig.$$('#wifi-passphrase'));
       });
@@ -143,10 +142,12 @@
         const props = mojoApi_.getPropertiesToSetForTest();
         if (isHiddenNetworkMigrationEnabled) {
           assertEquals(
-              props.typeConfig.wifi.hiddenSsid, HiddenSsidMode.kDisabled);
+              props.typeConfig.wifi.hiddenSsid,
+              chromeos.networkConfig.mojom.HiddenSsidMode.kDisabled);
         } else {
           assertEquals(
-              props.typeConfig.wifi.hiddenSsid, HiddenSsidMode.kAutomatic);
+              props.typeConfig.wifi.hiddenSsid,
+              chromeos.networkConfig.mojom.HiddenSsidMode.kAutomatic);
         }
       });
     });
@@ -156,10 +157,11 @@
     setup(function() {
       mojoApi_.resetForTest();
       const wifi1 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kWiFi, 'someguid', '');
+          chromeos.networkConfig.mojom.NetworkType.kWiFi, 'someguid', '');
       wifi1.name = OncMojo.createManagedString('somename');
-      wifi1.source = OncSource.kDevice;
-      wifi1.typeProperties.wifi.security = SecurityType.kWepPsk;
+      wifi1.source = chromeos.networkConfig.mojom.OncSource.kDevice;
+      wifi1.typeProperties.wifi.security =
+          chromeos.networkConfig.mojom.SecurityType.kWepPsk;
       wifi1.typeProperties.wifi.ssid.activeValue = '11111111111';
       wifi1.typeProperties.wifi.passphrase = {activeValue: 'test_passphrase'};
       setNetworkConfig(wifi1);
@@ -218,7 +220,8 @@
 
         const props = mojoApi_.getPropertiesToSetForTest();
         assertEquals(
-            props.typeConfig.wifi.hiddenSsid, HiddenSsidMode.kAutomatic);
+            props.typeConfig.wifi.hiddenSsid,
+            chromeos.networkConfig.mojom.HiddenSsidMode.kAutomatic);
       });
     });
   });
@@ -226,7 +229,7 @@
   suite('IKEv2', function() {
     setup(function() {
       mojoApi_.resetForTest();
-      setNetworkType(NetworkType.kVPN);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kVPN);
     });
 
     teardown(function() {
@@ -350,9 +353,10 @@
       assertTrue(networkConfig.vpnIsConfigured_());
 
       let props = networkConfig.getPropertiesToSet_();
+      const mojom = chromeos.networkConfig.mojom;
       assertEquals(kTestVpnName, props.name);
       assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-      assertEquals(VpnType.kIKEv2, props.typeConfig.vpn.type.value);
+      assertEquals(mojom.VpnType.kIKEv2, props.typeConfig.vpn.type.value);
       assertEquals('PSK', props.typeConfig.vpn.ipSec.authenticationType);
       assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
       assertFalse(props.typeConfig.vpn.ipSec.saveCredentials);
@@ -374,9 +378,10 @@
     // Checks if values are read correctly for an existing service of PSK
     // authentication.
     test('Existing PSK', function() {
+      const mojom = chromeos.networkConfig.mojom;
       const ikev2 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'someguid', kTestVpnName);
-      ikev2.typeProperties.vpn.type = VpnType.kIKEv2;
+          mojom.NetworkType.kVPN, 'someguid', kTestVpnName);
+      ikev2.typeProperties.vpn.type = mojom.VpnType.kIKEv2;
       ikev2.typeProperties.vpn.host = {activeValue: kTestVpnHost};
       ikev2.typeProperties.vpn.ipSec = {
         authenticationType: {activeValue: 'PSK'},
@@ -398,7 +403,7 @@
         assertEquals('someguid', props.guid);
         assertEquals(kTestVpnName, props.name);
         assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-        assertEquals(VpnType.kIKEv2, props.typeConfig.vpn.type.value);
+        assertEquals(mojom.VpnType.kIKEv2, props.typeConfig.vpn.type.value);
         assertEquals('PSK', props.typeConfig.vpn.ipSec.authenticationType);
         assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
         assertEquals('local-id', props.typeConfig.vpn.ipSec.localIdentity);
@@ -425,9 +430,10 @@
           assertTrue(networkConfig.vpnIsConfigured_());
 
           const props = networkConfig.getPropertiesToSet_();
+          const mojom = chromeos.networkConfig.mojom;
           assertEquals(kTestVpnName, props.name);
           assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-          assertEquals(VpnType.kIKEv2, props.typeConfig.vpn.type.value);
+          assertEquals(mojom.VpnType.kIKEv2, props.typeConfig.vpn.type.value);
           assertEquals('Cert', props.typeConfig.vpn.ipSec.authenticationType);
           assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
           assertEquals(1, props.typeConfig.vpn.ipSec.serverCaPems.length);
@@ -443,9 +449,10 @@
     // Checks if values are read correctly for an existing service of
     // certificate authentication.
     test('Existing Cert', function() {
+      const mojom = chromeos.networkConfig.mojom;
       const ikev2 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'someguid', kTestVpnName);
-      ikev2.typeProperties.vpn.type = VpnType.kIKEv2;
+          mojom.NetworkType.kVPN, 'someguid', kTestVpnName);
+      ikev2.typeProperties.vpn.type = mojom.VpnType.kIKEv2;
       ikev2.typeProperties.vpn.host = {activeValue: kTestVpnHost};
       ikev2.typeProperties.vpn.ipSec = {
         authenticationType: {activeValue: 'Cert'},
@@ -466,10 +473,11 @@
           assertEquals(kUserHash1, networkConfig.selectedUserCertHash_);
 
           const props = networkConfig.getPropertiesToSet_();
+          const mojom = chromeos.networkConfig.mojom;
           assertEquals('someguid', props.guid);
           assertEquals(kTestVpnName, props.name);
           assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-          assertEquals(VpnType.kIKEv2, props.typeConfig.vpn.type.value);
+          assertEquals(mojom.VpnType.kIKEv2, props.typeConfig.vpn.type.value);
           assertEquals('Cert', props.typeConfig.vpn.ipSec.authenticationType);
           assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
           assertEquals(1, props.typeConfig.vpn.ipSec.serverCaPems.length);
@@ -505,9 +513,10 @@
           networkConfig.set('selectedServerCaHash_', kCaHash);
 
           let props = networkConfig.getPropertiesToSet_();
+          const mojom = chromeos.networkConfig.mojom;
           assertEquals(kTestVpnName, props.name);
           assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-          assertEquals(VpnType.kIKEv2, props.typeConfig.vpn.type.value);
+          assertEquals(mojom.VpnType.kIKEv2, props.typeConfig.vpn.type.value);
           assertEquals('EAP', props.typeConfig.vpn.ipSec.authenticationType);
           assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
           assertEquals(1, props.typeConfig.vpn.ipSec.serverCaPems.length);
@@ -527,9 +536,10 @@
     });
 
     test('Existing EAP', function() {
+      const mojom = chromeos.networkConfig.mojom;
       const ikev2 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'someguid', kTestVpnName);
-      ikev2.typeProperties.vpn.type = VpnType.kIKEv2;
+          mojom.NetworkType.kVPN, 'someguid', kTestVpnName);
+      ikev2.typeProperties.vpn.type = mojom.VpnType.kIKEv2;
       ikev2.typeProperties.vpn.host = {activeValue: kTestVpnHost};
       ikev2.typeProperties.vpn.ipSec = {
         authenticationType: {activeValue: 'EAP'},
@@ -555,10 +565,11 @@
           assertEquals(kCaHash, networkConfig.selectedServerCaHash_);
 
           const props = networkConfig.getPropertiesToSet_();
+          const mojom = chromeos.networkConfig.mojom;
           assertEquals('someguid', props.guid);
           assertEquals(kTestVpnName, props.name);
           assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-          assertEquals(VpnType.kIKEv2, props.typeConfig.vpn.type.value);
+          assertEquals(mojom.VpnType.kIKEv2, props.typeConfig.vpn.type.value);
           assertEquals('EAP', props.typeConfig.vpn.ipSec.authenticationType);
           assertEquals(2, props.typeConfig.vpn.ipSec.ikeVersion);
           assertEquals(1, props.typeConfig.vpn.ipSec.serverCaPems.length);
@@ -575,7 +586,7 @@
   suite('L2TP/IPsec', function() {
     setup(function() {
       mojoApi_.resetForTest();
-      setNetworkType(NetworkType.kVPN);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kVPN);
     });
 
     teardown(function() {
@@ -699,9 +710,10 @@
       assertTrue(networkConfig.vpnIsConfigured_());
 
       let props = networkConfig.getPropertiesToSet_();
+      const mojom = chromeos.networkConfig.mojom;
       assertEquals(kTestVpnName, props.name);
       assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-      assertEquals(VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
+      assertEquals(mojom.VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
       assertEquals('PSK', props.typeConfig.vpn.ipSec.authenticationType);
       assertEquals(1, props.typeConfig.vpn.ipSec.ikeVersion);
       assertFalse(props.typeConfig.vpn.ipSec.saveCredentials);
@@ -718,9 +730,10 @@
     // Checks if values are read correctly for an existing service of PSK
     // authentication.
     test('Existing PSK', function() {
+      const mojom = chromeos.networkConfig.mojom;
       const l2tp = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'someguid', kTestVpnName);
-      l2tp.typeProperties.vpn.type = VpnType.kL2TPIPsec;
+          mojom.NetworkType.kVPN, 'someguid', kTestVpnName);
+      l2tp.typeProperties.vpn.type = mojom.VpnType.kL2TPIPsec;
       l2tp.typeProperties.vpn.host = {activeValue: kTestVpnHost};
       l2tp.typeProperties.vpn.ipSec = {
         authenticationType: {activeValue: 'PSK'},
@@ -744,7 +757,7 @@
         assertEquals('someguid', props.guid);
         assertEquals(kTestVpnName, props.name);
         assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-        assertEquals(VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
+        assertEquals(mojom.VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
         assertEquals('PSK', props.typeConfig.vpn.ipSec.authenticationType);
         assertEquals(1, props.typeConfig.vpn.ipSec.ikeVersion);
         assertEquals(undefined, props.typeConfig.vpn.ipSec.eap);
@@ -774,9 +787,11 @@
           assertTrue(networkConfig.vpnIsConfigured_());
 
           const props = networkConfig.getPropertiesToSet_();
+          const mojom = chromeos.networkConfig.mojom;
           assertEquals(kTestVpnName, props.name);
           assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-          assertEquals(VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
+          assertEquals(
+              mojom.VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
           assertEquals('Cert', props.typeConfig.vpn.ipSec.authenticationType);
           assertEquals(1, props.typeConfig.vpn.ipSec.ikeVersion);
           assertEquals(1, props.typeConfig.vpn.ipSec.serverCaPems.length);
@@ -795,9 +810,10 @@
     // Checks if values are read correctly for an existing service of
     // certificate authentication.
     test('Existing Cert', function() {
+      const mojom = chromeos.networkConfig.mojom;
       const l2tp = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'someguid', kTestVpnName);
-      l2tp.typeProperties.vpn.type = VpnType.kL2TPIPsec;
+          mojom.NetworkType.kVPN, 'someguid', kTestVpnName);
+      l2tp.typeProperties.vpn.type = mojom.VpnType.kL2TPIPsec;
       l2tp.typeProperties.vpn.host = {activeValue: kTestVpnHost};
       l2tp.typeProperties.vpn.ipSec = {
         authenticationType: {activeValue: 'Cert'},
@@ -826,7 +842,7 @@
         assertEquals('someguid', props.guid);
         assertEquals(kTestVpnName, props.name);
         assertEquals(kTestVpnHost, props.typeConfig.vpn.host);
-        assertEquals(VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
+        assertEquals(mojom.VpnType.kL2TPIPsec, props.typeConfig.vpn.type.value);
         assertEquals('Cert', props.typeConfig.vpn.ipSec.authenticationType);
         assertEquals(1, props.typeConfig.vpn.ipSec.ikeVersion);
         assertEquals(1, props.typeConfig.vpn.ipSec.serverCaPems.length);
@@ -847,7 +863,7 @@
   suite('OpenVPN', function() {
     setup(function() {
       mojoApi_.resetForTest();
-      setNetworkType(NetworkType.kVPN);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kVPN);
     });
 
     teardown(function() {
@@ -906,7 +922,7 @@
   suite('WireGuard', function() {
     setup(function() {
       mojoApi_.resetForTest();
-      setNetworkType(NetworkType.kVPN);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kVPN);
       initNetworkConfig();
     });
 
@@ -960,9 +976,10 @@
   suite('Existing WireGuard', function() {
     setup(function() {
       mojoApi_.resetForTest();
-      const wg1 =
-          OncMojo.getDefaultManagedProperties(NetworkType.kVPN, 'someguid', '');
-      wg1.typeProperties.vpn.type = VpnType.kWireGuard;
+      const wg1 = OncMojo.getDefaultManagedProperties(
+          chromeos.networkConfig.mojom.NetworkType.kVPN, 'someguid', '');
+      wg1.typeProperties.vpn.type =
+          chromeos.networkConfig.mojom.VpnType.kWireGuard;
       wg1.typeProperties.vpn.wireguard = {
         peers: {
           activeValue: [{
@@ -1038,7 +1055,9 @@
 
     test('New Config: Login or guest', function() {
       // Insecure networks are always shared so test a secure config.
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWepPsk);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWepPsk);
       setLoginOrGuest();
       initNetworkConfig();
       return flushAsync().then(() => {
@@ -1051,7 +1070,9 @@
 
     test('New Config: Kiosk', function() {
       // Insecure networks are always shared so test a secure config.
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWepPsk);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWepPsk);
       setKiosk();
       initNetworkConfig();
       return flushAsync().then(() => {
@@ -1063,7 +1084,7 @@
     });
 
     test('New Config: Authenticated, Not secure', function() {
-      setNetworkType(NetworkType.kWiFi);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kWiFi);
       setAuthenticated();
       initNetworkConfig();
       return flushAsync().then(() => {
@@ -1075,7 +1096,9 @@
     });
 
     test('New Config: Authenticated, Secure', function() {
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWepPsk);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWepPsk);
       setAuthenticated();
       initNetworkConfig();
       return flushAsync().then(() => {
@@ -1088,7 +1111,7 @@
 
     test('New Config: Authenticated, Not secure to secure', async function() {
       // set default to insecure network
-      setNetworkType(NetworkType.kWiFi);
+      setNetworkType(chromeos.networkConfig.mojom.NetworkType.kWiFi);
       setAuthenticated();
       initNetworkConfig();
       await flushAsync();
@@ -1098,7 +1121,8 @@
       assertTrue(share.checked);
 
       // change to secure network
-      networkConfig.securityType_ = SecurityType.kWepPsk;
+      networkConfig.securityType_ =
+          chromeos.networkConfig.mojom.SecurityType.kWepPsk;
       await flushAsync();
       assertTrue(!!share);
       assertFalse(share.disabled);
@@ -1108,9 +1132,10 @@
     // Existing networks hide the shared control in the config UI.
     test('Existing Hides Shared', function() {
       const wifi1 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kWiFi, 'someguid', '');
-      wifi1.source = OncSource.kUser;
-      wifi1.typeProperties.wifi.security = SecurityType.kWepPsk;
+          chromeos.networkConfig.mojom.NetworkType.kWiFi, 'someguid', '');
+      wifi1.source = chromeos.networkConfig.mojom.OncSource.kUser;
+      wifi1.typeProperties.wifi.security =
+          chromeos.networkConfig.mojom.SecurityType.kWepPsk;
       setNetworkConfig(wifi1);
       setAuthenticated();
       initNetworkConfig();
@@ -1121,14 +1146,17 @@
 
     test('Ethernet', function() {
       const eth = OncMojo.getDefaultManagedProperties(
-          NetworkType.kEthernet, 'ethernetguid', '');
+          chromeos.networkConfig.mojom.NetworkType.kEthernet, 'ethernetguid',
+          '');
       eth.typeProperties.ethernet.authentication =
           OncMojo.createManagedString('None');
       setNetworkConfig(eth);
       initNetworkConfig();
       return flushAsync().then(() => {
         assertEquals('ethernetguid', networkConfig.guid);
-        assertEquals(SecurityType.kNone, networkConfig.securityType_);
+        assertEquals(
+            chromeos.networkConfig.mojom.SecurityType.kNone,
+            networkConfig.securityType_);
         const outer = networkConfig.$$('#outer');
         assertFalse(!!outer);
       });
@@ -1136,7 +1164,7 @@
 
     test('Ethernet EAP', function() {
       const eth = OncMojo.getDefaultManagedProperties(
-          NetworkType.kEthernet, 'eapguid', '');
+          chromeos.networkConfig.mojom.NetworkType.kEthernet, 'eapguid', '');
       eth.typeProperties.ethernet.authentication =
           OncMojo.createManagedString('8021x');
       eth.typeProperties.ethernet.eap = {
@@ -1146,7 +1174,9 @@
       initNetworkConfig();
       return flushAsync().then(() => {
         assertEquals('eapguid', networkConfig.guid);
-        assertEquals(SecurityType.kWpaEap, networkConfig.securityType_);
+        assertEquals(
+            chromeos.networkConfig.mojom.SecurityType.kWpaEap,
+            networkConfig.securityType_);
         assertEquals(
             'PEAP',
             networkConfig.managedProperties.typeProperties.ethernet.eap.outer
@@ -1164,7 +1194,7 @@
 
     test('Ethernet input fires enter event on keydown', function() {
       const eth = OncMojo.getDefaultManagedProperties(
-          NetworkType.kEthernet, 'eapguid', '');
+          chromeos.networkConfig.mojom.NetworkType.kEthernet, 'eapguid', '');
       eth.typeProperties.ethernet.authentication =
           OncMojo.createManagedString('8021x');
       eth.typeProperties.ethernet.eap = {
@@ -1197,7 +1227,9 @@
     }
 
     test('WiFi EAP-TLS No Certs', function() {
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWpaEap);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWpaEap);
       setAuthenticated();
       initNetworkConfig();
       networkConfig.shareNetwork_ = false;
@@ -1215,7 +1247,9 @@
     });
 
     test('WiFi EAP-TLS Certs', function() {
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWpaEap);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWpaEap);
       setAuthenticated();
       mojoApi_.setCertificatesForTest(
           [{
@@ -1244,7 +1278,9 @@
     });
 
     test('WiFi EAP-TLS Certs Shared', function() {
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWpaEap);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWpaEap);
       setAuthenticated();
       mojoApi_.setCertificatesForTest(
           [{
@@ -1283,7 +1319,9 @@
     });
 
     test('WiFi PEAP No Certs', async function() {
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWpaEap);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWpaEap);
       setAuthenticated();
       initNetworkConfig();
       networkConfig.shareNetwork_ = false;
@@ -1300,7 +1338,9 @@
     });
 
     test('WiFi PEAP Certs', async function() {
-      setNetworkType(NetworkType.kWiFi, SecurityType.kWpaEap);
+      setNetworkType(
+          chromeos.networkConfig.mojom.NetworkType.kWiFi,
+          chromeos.networkConfig.mojom.SecurityType.kWpaEap);
       setAuthenticated();
       mojoApi_.setCertificatesForTest(
           [{
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js
index 5783d2f..494adba 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js
@@ -6,13 +6,14 @@
 import 'chrome://resources/cr_components/chromeos/network/network_icon.js';
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkIconTest', function() {
   /** @type {!NetworkList|undefined} */
   let networkIcon;
 
+  let mojom;
+
   function flushAsync() {
     flush();
     // Use setTimeout to wait for the next macrotask.
@@ -20,6 +21,7 @@
   }
 
   setup(function() {
+    mojom = chromeos.networkConfig.mojom;
     networkIcon = document.createElement('network-icon');
     document.body.appendChild(networkIcon);
     assertTrue(!!networkIcon);
@@ -27,16 +29,16 @@
   });
 
   test('Display locked cellular icon', async function() {
-    const networkState =
-        OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular');
+    const networkState = OncMojo.getDefaultNetworkState(
+      mojom.NetworkType.kCellular, 'cellular');
     networkState.typeState.cellular.iccid = '1';
     networkState.typeState.cellular.eid = '1';
     networkState.typeState.cellular.simLocked = true;
     networkIcon.networkState = networkState;
 
     networkIcon.deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
       simInfos: [
         {slot_id: 1, eid: '1', iccid: '1', isPrimary: false},
       ],
@@ -48,8 +50,8 @@
   });
 
   test('Display roaming badge', async function() {
-    const networkState =
-        OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular');
+    const networkState = OncMojo.getDefaultNetworkState(
+      mojom.NetworkType.kCellular, 'cellular');
     networkState.typeState.cellular.roaming = true;
     networkIcon.networkState = networkState;
 
@@ -59,8 +61,8 @@
   });
 
   test('Should not display roaming badge', async function() {
-    const networkState =
-        OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular');
+    const networkState = OncMojo.getDefaultNetworkState(
+      mojom.NetworkType.kCellular, 'cellular');
     networkState.typeState.cellular.roaming = false;
     networkIcon.networkState = networkState;
 
@@ -71,7 +73,7 @@
 
   test('Should not display icon', async function() {
     const networkState =
-        OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular');
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kCellular, 'cellular');
     networkIcon.networkState = networkState;
     await flushAsync();
 
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js
index 6bd988b7..55a66e4 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_ip_config_test.js
@@ -6,7 +6,6 @@
 import 'chrome://resources/cr_components/chromeos/network/network_ip_config.js';
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {ConnectionStateType, NetworkType, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkIpConfigTest', function() {
@@ -20,20 +19,23 @@
   });
 
   test('Enabled', function() {
+    const mojom = chromeos.networkConfig.mojom;
     assertTrue(!!ipConfig.$$('#autoConfigIpToggle'));
     // WiFi non-policy networks should enable autoConfigIpToggle.
     ipConfig.managedProperties = {
       ipAddressConfigType: {
         activeValue: 'Static',
-        policySource: PolicySource.kNone,
+        policySource: mojom.PolicySource.kNone,
       },
-      type: NetworkType.kWiFi,
+      type: mojom.NetworkType.kWiFi,
     };
     flush();
     assertFalse(ipConfig.$$('#autoConfigIpToggle').disabled);
   });
 
   test('Auto-config toggle policy enforcement', function() {
+    const mojom = chromeos.networkConfig.mojom;
+
     assertTrue(!!ipConfig.$$('#autoConfigIpToggle'));
 
     // ipAddressConfigType is not set; auto-config is toggleable.
@@ -47,7 +49,7 @@
     ipConfig.managedProperties = {
       ipAddressConfigType: {
         activeValue: 'Static',
-        policySource: PolicySource.kNone,
+        policySource: mojom.PolicySource.kNone,
       },
     };
     flush();
@@ -57,7 +59,7 @@
     ipConfig.managedProperties = {
       ipAddressConfigType: {
         activeValue: 'Static',
-        policySource: PolicySource.kUserPolicyEnforced,
+        policySource: mojom.PolicySource.kUserPolicyEnforced,
       },
     };
     flush();
@@ -65,19 +67,20 @@
   });
 
   test('Disabled UI state', function() {
+    const mojom = chromeos.networkConfig.mojom;
     // WiFi non-policy networks should enable autoConfigIpToggle.
     ipConfig.managedProperties = {
       ipAddressConfigType: {
         activeValue: 'Static',
-        policySource: PolicySource.kNone,
+        policySource: mojom.PolicySource.kNone,
       },
       staticIpConfig: {
         ipAddress: {
           activeValue: '127.0.0.1',
         },
       },
-      connectionState: ConnectionStateType.kNotConnected,
-      type: NetworkType.kWiFi,
+      connectionState: mojom.ConnectionStateType.kNotConnected,
+      type: mojom.NetworkType.kWiFi,
     };
     flush();
 
@@ -95,16 +98,17 @@
 
   test('Do not show toggle if network is cellular', function() {
     const getAutoConfig = () => ipConfig.$$('#autoConfig');
+    const mojom = chromeos.networkConfig.mojom;
 
-    const properties =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const properties = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
     ipConfig.managedProperties = properties;
     flush();
 
     assertFalse(!!getAutoConfig());
 
-    const wifi =
-        OncMojo.getDefaultManagedProperties(NetworkType.kWiFi, 'someguid', '');
+    const wifi = OncMojo.getDefaultManagedProperties(
+        chromeos.networkConfig.mojom.NetworkType.kWiFi, 'someguid', '');
     ipConfig.managedProperties = wifi;
     flush();
 
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js
index b9f3b9de..e7cb84d9 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js
@@ -4,31 +4,36 @@
 
 import 'chrome://os-settings/strings.m.js';
 import 'chrome://resources/cr_components/chromeos/network/network_list_item.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 
 import {CellularSetupPageName} from 'chrome://resources/cr_components/chromeos/cellular_setup/cellular_types.js';
 import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {NetworkList} from 'chrome://resources/cr_components/chromeos/network/network_list_types.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {ActivationStateType, CrosNetworkConfigRemote, InhibitReason, SecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 suite('NetworkListItemTest', function() {
   /** @type {!NetworkListItem|undefined} */
   let listItem;
+  let mojom;
   let eSimManagerRemote = null;
 
-  /** @type {!CrosNetworkConfigRemote|undefined} */
+  /** @type {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote|undefined} */
   let mojoApi_;
 
   let eventTriggered;
 
   setup(function() {
+    mojom = chromeos.networkConfig.mojom;
     mojoApi_ = new FakeNetworkConfig();
     MojoInterfaceProviderImpl.getInstance().remote_ = mojoApi_;
     eSimManagerRemote = new FakeESimManagerRemote();
@@ -46,7 +51,7 @@
 
   function initCellularNetwork(iccid, eid, simLocked, name) {
     const properties = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular', name);
+        mojom.NetworkType.kCellular, 'cellular', name);
     properties.typeProperties.cellular.iccid = iccid;
     properties.typeProperties.cellular.eid = eid;
     properties.typeProperties.cellular.simLocked = simLocked;
@@ -86,8 +91,8 @@
     let networkIcon = listItem.$$('network-icon');
     assertFalse(!!networkIcon);
 
-    const properties =
-        OncMojo.getDefaultManagedProperties(NetworkType.kEthernet, 'eth0');
+    const properties = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kEthernet, 'eth0');
     mojoApi_.setManagedPropertiesForTest(properties);
     listItem.item = OncMojo.managedPropertiesToNetworkState(properties);
 
@@ -141,8 +146,8 @@
 
     // Change to network state without provider name and verify that that title
     // is displayed correctly.
-    const ethernetProperties =
-        OncMojo.getDefaultManagedProperties(NetworkType.kEthernet, 'eth0');
+    const ethernetProperties = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kEthernet, 'eth0');
     mojoApi_.setManagedPropertiesForTest(ethernetProperties);
     listItem.item = OncMojo.managedPropertiesToNetworkState(ethernetProperties);
     await flushAsync();
@@ -200,10 +205,10 @@
     assertFalse(!!listItem.$$('#activateButton'));
 
     // Set item to an activated pSIM network first.
-    const managedPropertiesActivated =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const managedPropertiesActivated = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesActivated.typeProperties.cellular.activationState =
-        ActivationStateType.kActivated;
+        mojom.ActivationStateType.kActivated;
     managedPropertiesActivated.typeProperties.cellular.paymentPortal = {
       url: 'url',
     };
@@ -220,10 +225,11 @@
 
     // Set item to an unactivated eSIM network with a payment URL.
     const managedPropertiesESimNotActivated =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+        OncMojo.getDefaultManagedProperties(
+            mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesESimNotActivated.typeProperties.cellular.eid = 'eid';
     managedPropertiesESimNotActivated.typeProperties.cellular.activationState =
-        ActivationStateType.kNotActivated;
+        mojom.ActivationStateType.kNotActivated;
     managedPropertiesESimNotActivated.typeProperties.cellular.paymentPortal = {
       url: 'url',
     };
@@ -238,10 +244,10 @@
     assertFalse(networkStateText.hidden);
 
     // Set item to an unactivated pSIM network with a payment URL.
-    const managedPropertiesNotActivated =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const managedPropertiesNotActivated = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesNotActivated.typeProperties.cellular.activationState =
-        ActivationStateType.kNotActivated;
+        mojom.ActivationStateType.kNotActivated;
     managedPropertiesNotActivated.typeProperties.cellular.paymentPortal = {
       url: 'url',
     };
@@ -295,13 +301,14 @@
 
     // Set item to an unactivated eSIM network without a payment URL.
     const managedPropertiesESimUnavailable =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+        OncMojo.getDefaultManagedProperties(
+            mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesESimUnavailable.typeProperties.cellular.eid = 'eid';
     managedPropertiesESimUnavailable.typeProperties.cellular.activationState =
-        ActivationStateType.kNotActivated;
+        mojom.ActivationStateType.kNotActivated;
     managedPropertiesESimUnavailable.typeProperties.cellular.paymentPortal = {};
     managedPropertiesESimUnavailable.connectionState =
-        ConnectionStateType.kConnected;
+        mojom.ConnectionStateType.kConnected;
     mojoApi_.setManagedPropertiesForTest(managedPropertiesESimUnavailable);
 
     listItem.item = OncMojo.managedPropertiesToNetworkState(
@@ -324,10 +331,10 @@
     assertEquals(showDetailEvent.detail, listItem.item);
 
     // Set item to an unactivated pSIM network without a payment URL.
-    const managedPropertiesUnavailable =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const managedPropertiesUnavailable = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesUnavailable.typeProperties.cellular.activationState =
-        ActivationStateType.kNotActivated;
+        mojom.ActivationStateType.kNotActivated;
     managedPropertiesUnavailable.typeProperties.cellular.paymentPortal = {};
     mojoApi_.setManagedPropertiesForTest(managedPropertiesUnavailable);
 
@@ -360,10 +367,10 @@
     assertFalse(!!listItem.$$('#activatingPSimSpinner'));
 
     // Set item to an activated pSIM network first.
-    const managedPropertiesActivated =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const managedPropertiesActivated = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesActivated.typeProperties.cellular.activationState =
-        ActivationStateType.kActivated;
+        mojom.ActivationStateType.kActivated;
     mojoApi_.setManagedPropertiesForTest(managedPropertiesActivated);
 
     listItem.item =
@@ -374,12 +381,12 @@
     assertFalse(!!listItem.$$('#activatingPSimSpinner'));
 
     // Set item to an activating eSIM network.
-    const managedPropertiesESimActivating =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const managedPropertiesESimActivating = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
 
     managedPropertiesESimActivating.typeProperties.cellular.eid = 'eid';
     managedPropertiesESimActivating.typeProperties.cellular.activationState =
-        ActivationStateType.kActivating;
+        mojom.ActivationStateType.kActivating;
     mojoApi_.setManagedPropertiesForTest(managedPropertiesESimActivating);
 
     listItem.item = OncMojo.managedPropertiesToNetworkState(
@@ -390,10 +397,10 @@
     assertFalse(!!listItem.$$('#activatingPSimSpinner'));
 
     // Set item to an activating pSIM network.
-    const managedPropertiesActivating =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular');
+    const managedPropertiesActivating = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular');
     managedPropertiesActivating.typeProperties.cellular.activationState =
-        ActivationStateType.kActivating;
+        mojom.ActivationStateType.kActivating;
     mojoApi_.setManagedPropertiesForTest(managedPropertiesActivating);
 
     const networkState =
@@ -547,8 +554,8 @@
 
     listItem.item = initCellularNetwork(iccid, eid, /*simlocked=*/ true);
     listItem.deviceState = {
-      type: NetworkType.kCellular,
-      inhibitedReason: InhibitReason.kInstallingProfile,
+      type: mojom.NetworkType.kCellular,
+      inhibitedReason: mojom.InhibitReason.kInstallingProfile,
     };
 
     await flushAsync();
@@ -573,13 +580,14 @@
       },
     };
     listItem.deviceState = {
-      type: NetworkType.kCellular,
-      inhibitedReason: InhibitReason.kInstallingProfile,
+      type: mojom.NetworkType.kCellular,
+      inhibitedReason: mojom.InhibitReason.kInstallingProfile,
     };
 
     await flushAsync();
 
-    listItem.deviceState.inhibitedReason = InhibitReason.kInstallingProfile;
+    listItem.deviceState.inhibitedReason =
+        mojom.InhibitReason.kInstallingProfile;
 
     const installButton = listItem.$$('#installButton');
     assertTrue(!!installButton);
@@ -604,13 +612,13 @@
         init();
 
         const properties = OncMojo.getDefaultManagedProperties(
-            NetworkType.kCellular, 'cellular');
+            mojom.NetworkType.kCellular, 'cellular');
         mojoApi_.setManagedPropertiesForTest(properties);
         listItem.networkState =
             OncMojo.managedPropertiesToNetworkState(properties);
         listItem.deviceState = {
-          type: NetworkType.kCellular,
-          inhibitedReason: InhibitReason.kInstallingProfile,
+          type: mojom.NetworkType.kCellular,
+          inhibitedReason: mojom.InhibitReason.kInstallingProfile,
         };
         await flushAsync();
 
@@ -692,10 +700,11 @@
     assertFalse(listItem.computeIsBlockedNetwork_());
 
     // Set item to a policy blocked wifi network.
-    const managedProperties =
-        OncMojo.getDefaultManagedProperties(NetworkType.kWiFi, 'wifiguid');
-    managedProperties.source = OncSource.kUser;
-    managedProperties.typeProperties.wifi.security = SecurityType.kWepPsk;
+    const managedProperties = OncMojo.getDefaultManagedProperties(
+        chromeos.networkConfig.mojom.NetworkType.kWiFi, 'wifiguid');
+    managedProperties.source = chromeos.networkConfig.mojom.OncSource.kUser;
+    managedProperties.typeProperties.wifi.security =
+        chromeos.networkConfig.mojom.SecurityType.kWepPsk;
     mojoApi_.setManagedPropertiesForTest(managedProperties);
     const networkState =
         OncMojo.managedPropertiesToNetworkState(managedProperties);
@@ -715,9 +724,10 @@
 
         // Set item to a policy blocked cellular network.
         const managedProperties = OncMojo.getDefaultManagedProperties(
-            NetworkType.kCellular, 'cellular');
-        managedProperties.connectionState = ConnectionStateType.kNotConnected;
-        managedProperties.source = OncSource.kNone;
+            mojom.NetworkType.kCellular, 'cellular');
+        managedProperties.connectionState =
+            mojom.ConnectionStateType.kNotConnected;
+        managedProperties.source = mojom.OncSource.kNone;
         mojoApi_.setManagedPropertiesForTest(managedProperties);
 
         const networkState =
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_list_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_list_test.js
index c67e738..358c5ce 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_list_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_list_test.js
@@ -4,18 +4,25 @@
 
 import 'chrome://os-settings/strings.m.js';
 import 'chrome://resources/cr_components/chromeos/network/network_list.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkListTest', function() {
   /** @type {!NetworkList|undefined} */
   let networkList;
 
+  let mojom;
 
   setup(function() {
+    mojom = chromeos.networkConfig.mojom;
+
     networkList = document.createElement('network-list');
     // iron-list will not create list items if the container of the list is of
     // size zero.
@@ -27,8 +34,8 @@
 
   test('focus() focuses the first item', function() {
     const testNetworks = [
-      OncMojo.getDefaultNetworkState(NetworkType.kEthernet, 'eth0'),
-      OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kEthernet, 'eth0'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi'),
     ];
     networkList.networks = testNetworks;
     flush();
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_siminfo_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_siminfo_test.js
index 1a54dc7..e909f25 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/network_siminfo_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/network_siminfo_test.js
@@ -7,7 +7,6 @@
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkSiminfoTest', function() {
@@ -15,12 +14,13 @@
   let simInfo;
 
   const TEST_ICCID = '11111111111111111';
+  const mojom = chromeos.networkConfig.mojom;
 
   setup(async function() {
     simInfo = document.createElement('network-simInfo');
 
     const cellularNetwork =
-        OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular');
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kCellular, 'cellular');
     cellularNetwork.typeState.cellular.iccid = TEST_ICCID;
 
     simInfo.networkState = cellularNetwork;
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js b/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js
index a1c58b4..c5300102 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js
@@ -7,8 +7,6 @@
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 
@@ -16,7 +14,7 @@
   let simLockDialog;
   let unlockPinDialog;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let networkConfigRemote_ = null;
 
   setup(function() {
@@ -176,9 +174,10 @@
       });
 
   test('Show unlock PUK dialog when enter pin fails', async function() {
+    const mojom = chromeos.networkConfig.mojom;
     let deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simInfos: [{slot_id: 0, iccid: '1111111111111111'}],
       simLockStatus: {lockEnabled: false, lockType: '', retriesLeft: 3},
     };
@@ -201,7 +200,7 @@
 
     // Update device state with current device state.
     deviceState =
-        networkConfigRemote_.getDeviceStateForTest(NetworkType.kCellular);
+        networkConfigRemote_.getDeviceStateForTest(mojom.NetworkType.kCellular);
     // Trigger device state change.
     simLockDialog.deviceState = {...deviceState};
     await flushAsync();
@@ -215,9 +214,10 @@
 
   test('Change pin', async function() {
     // Set sim to unlocked with multiple retries left
+    const mojom = chromeos.networkConfig.mojom;
     const deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simInfos: [{slot_id: 0, iccid: '1111111111111111'}],
       simLockStatus: {lockEnabled: true, lockType: '', retriesLeft: 2},
     };
@@ -246,9 +246,10 @@
   });
 
   test('Submit on enter pressed', async function() {
+    const mojom = chromeos.networkConfig.mojom;
     let deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simInfos: [{slot_id: 0, iccid: '1111111111111111'}],
       simLockStatus: {lockEnabled: false, lockType: '', retriesLeft: 3},
     };
@@ -265,16 +266,17 @@
     await flushAsync();
 
     deviceState =
-        networkConfigRemote_.getDeviceStateForTest(NetworkType.kCellular);
+        networkConfigRemote_.getDeviceStateForTest(mojom.NetworkType.kCellular);
 
     assertEquals(2, deviceState.simLockStatus.retriesLeft);
   });
 
   test('Close dialog on cancel event pressed', async function() {
     // cancel event can be triggered by pressing the Escape key
+    const mojom = chromeos.networkConfig.mojom;
     simLockDialog.deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simInfos: [{slot_id: 0, iccid: '1111111111111111'}],
       simLockStatus: {lockEnabled: false, lockType: '', retriesLeft: 3},
     };
@@ -292,9 +294,10 @@
   });
 
   test('Pending error is cleared', async function() {
+    const mojom = chromeos.networkConfig.mojom;
     let deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simInfos: [{slot_id: 0, iccid: '1111111111111111'}],
       simLockStatus: {lockEnabled: false, lockType: '', retriesLeft: 3},
     };
@@ -315,7 +318,7 @@
     await enterPin('111111111');
     // Update device state.
     deviceState =
-        networkConfigRemote_.getDeviceStateForTest(NetworkType.kCellular);
+        networkConfigRemote_.getDeviceStateForTest(mojom.NetworkType.kCellular);
     simLockDialog.deviceState = {...deviceState};
 
     await flushAsync();
@@ -327,7 +330,7 @@
     await enterPin('1111');
     // Update device state.
     deviceState =
-        networkConfigRemote_.getDeviceStateForTest(NetworkType.kCellular);
+        networkConfigRemote_.getDeviceStateForTest(mojom.NetworkType.kCellular);
     simLockDialog.deviceState = {...deviceState};
     await flushAsync();
 
diff --git a/chrome/test/data/webui/cr_components/chromeos/traffic_counters/traffic_counters_test.js b/chrome/test/data/webui/cr_components/chromeos/traffic_counters/traffic_counters_test.js
index c1531f2..bd78f52 100644
--- a/chrome/test/data/webui/cr_components/chromeos/traffic_counters/traffic_counters_test.js
+++ b/chrome/test/data/webui/cr_components/chromeos/traffic_counters/traffic_counters_test.js
@@ -2,18 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// clang-format off
 import 'chrome://network/strings.m.js';
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {TrafficCountersElement} from 'chrome://resources/cr_components/chromeos/traffic_counters/traffic_counters.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
+import {CrosNetworkConfig} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {assertEquals, assertTrue} from '../../../chai_assert.js';
 import {FakeNetworkConfig} from '../../../chromeos/fake_network_config_mojom.js';
 
+// clang-format on
+
 suite('TrafficCountersTest', function() {
   /** @type {!TrafficCountersElement} */
   let trafficCounters;
@@ -26,7 +29,7 @@
    * @type {bigint}
    */
   const FAKE_TIME_IN_MICROSECONDS = BigInt(13275778457938000);
-  /** @type {!Time} */
+  /** @type {!mojoBase.mojom.Time} */
   const FAKE_INITIAL_LAST_RESET_TIME = {
     internalValue: FAKE_TIME_IN_MICROSECONDS,
   };
@@ -158,8 +161,10 @@
   test('Request and reset traffic counters', async function() {
     // Set managed properties for a connected cellular network.
     const managedProperties = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_guid', 'cellular');
-    managedProperties.connectionState = ConnectionStateType.kConnected;
+        chromeos.networkConfig.mojom.NetworkType.kCellular, 'cellular_guid',
+        'cellular');
+    managedProperties.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     managedProperties.connectable = true;
     managedProperties.trafficCounterProperties.lastResetTime =
         FAKE_INITIAL_LAST_RESET_TIME;
@@ -171,7 +176,8 @@
         'cellular_guid', generateTrafficCounters(100, 100));
     // Remove default network.
     networkConfigRemote.setNetworkConnectionStateForTest(
-        'eth0_guid', ConnectionStateType.kNotConnected);
+        'eth0_guid',
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected);
     await flushAsync();
 
     // Requests traffic counters.
diff --git a/chrome/test/data/webui/engagement/site_engagement_browsertest.js b/chrome/test/data/webui/engagement/site_engagement_browsertest.js
index 373f862..17a2c44 100644
--- a/chrome/test/data/webui/engagement/site_engagement_browsertest.js
+++ b/chrome/test/data/webui/engagement/site_engagement_browsertest.js
@@ -69,7 +69,7 @@
   }
 
   setup(async function() {
-    await import('chrome://test/mojo_webui_test_support.js');
+    await import('chrome://webui-test/mojo_webui_test_support.js');
     cells = getCells();
   });
 
diff --git a/chrome/test/data/webui/new_tab_page/middle_slot_promo_test.ts b/chrome/test/data/webui/new_tab_page/middle_slot_promo_test.ts
index 0ddd37b..654aa6f 100644
--- a/chrome/test/data/webui/new_tab_page/middle_slot_promo_test.ts
+++ b/chrome/test/data/webui/new_tab_page/middle_slot_promo_test.ts
@@ -138,15 +138,12 @@
         (imageWithCommand.children[0] as CrAutoImgElement).autoSrc);
 
     assertEquals('text', text.innerText);
-    assertEquals('red', text.style.color);
 
     assertEquals('https://link/', link.href);
     assertEquals('link', link.innerText);
-    assertEquals('green', link.style.color);
 
     assertEquals('', command.href);
     assertEquals('command', command.text);
-    assertEquals('blue', command.style.color);
   });
 
   test('render canShowPromo=false', async () => {
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js
index ef932e3..c99aa8db 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/app_details_item_test.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {AppManagementStore, updateSelectedAppId} from 'chrome://os-settings/chromeos/os_settings.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {replaceBody, replaceStore, setupFakeHandler} from './test_util.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js
index 16b33ddf..05d6a2a4 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/app_item_test.js
@@ -6,7 +6,7 @@
 
 import {FakePageHandler} from 'chrome://os-settings/chromeos/os_settings.js';
 import {replaceBody} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 import {Router} from 'chrome://os-settings/chromeos/os_settings.js';
 
 suite('<app-management-app-item>', () => {
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/app_management_page_tests.js b/chrome/test/data/webui/settings/chromeos/app_management/app_management_page_tests.js
index 7e70a0a5..0ff77ab 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/app_management_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/app_management_page_tests.js
@@ -5,7 +5,7 @@
 'use strict';
 
 import {BrowserProxy} from 'chrome://os-settings/chromeos/os_settings.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 import {setupFakeHandler, replaceStore, replaceBody, isHiddenByDomIf} from './test_util.js';
 
 suite('AppManagementPageTests', () => {
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/arc_detail_view_test.js b/chrome/test/data/webui/settings/chromeos/app_management/arc_detail_view_test.js
index 3e7a2b92..f8e689a 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/arc_detail_view_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/arc_detail_view_test.js
@@ -6,7 +6,7 @@
 
 import {AppManagementStore, FakePageHandler, PermissionType, updateSelectedAppId, getPermissionValueBool} from 'chrome://os-settings/chromeos/os_settings.js';
 import {setupFakeHandler, replaceStore, replaceBody, isHiddenByDomIf, isHidden, getPermissionItemByType, getPermissionCrToggleByType} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-arc-detail-view>', () => {
   let arcPermissionView;
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/borealis_detail_view_test.js b/chrome/test/data/webui/settings/chromeos/app_management/borealis_detail_view_test.js
index 793c1ee..894056b2 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/borealis_detail_view_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/borealis_detail_view_test.js
@@ -6,7 +6,7 @@
 
 import {PermissionType, createBoolPermission, AppManagementStore, updateSelectedAppId, getPermissionValueBool, convertOptionalBoolToBool, Router} from 'chrome://os-settings/chromeos/os_settings.js';
 import {setupFakeHandler, replaceStore, replaceBody, getPermissionCrToggleByType, getPermissionToggleByType} from './test_util.js';
-import {eventToPromise, flushTasks} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-borealis-detail-view>', function() {
   let borealisDetailView;
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js b/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js
index 4b420110..5bd2c63 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/chrome_app_detail_view_test.js
@@ -6,7 +6,7 @@
 
 import {AppManagementStore, updateSelectedAppId} from 'chrome://os-settings/chromeos/os_settings.js';
 import {setupFakeHandler, replaceStore, replaceBody} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-chrome-app-detail-view>', () => {
   let chromeAppDetailView;
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/file_handling_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/file_handling_item_test.js
index 142601f8..9ecdbd1 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/file_handling_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/file_handling_item_test.js
@@ -6,7 +6,7 @@
 
 import {AppManagementStore, updateSelectedAppId} from 'chrome://os-settings/chromeos/os_settings.js';
 import {setupFakeHandler, replaceStore, replaceBody} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-file-handling-item>', () => {
   let fileHandlingItem;
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/managed_apps_test.js b/chrome/test/data/webui/settings/chromeos/app_management/managed_apps_test.js
index f8fecd01..56aee68d7 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/managed_apps_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/managed_apps_test.js
@@ -5,7 +5,7 @@
 'use strict';
 
 import {PermissionType, TriState, FakePageHandler, AppManagementStore, updateSelectedAppId, createTriStatePermission} from 'chrome://os-settings/chromeos/os_settings.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 import {setupFakeHandler, replaceStore, replaceBody, getPermissionToggleByType} from './test_util.js';
 
 suite('<app-management-managed-apps>', () => {
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js
index f5e08774..ac9c03d 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/pin_to_shelf_item_test.js
@@ -6,7 +6,7 @@
 
 import {AppManagementStore, convertOptionalBoolToBool} from 'chrome://os-settings/chromeos/os_settings.js';
 import {setupFakeHandler, replaceBody} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-pin-to-shelf-item>', () => {
   let pinToShelfItem;
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/resize_lock_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/resize_lock_item_test.js
index a8ea31f..6fc3fc4b 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/resize_lock_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/resize_lock_item_test.js
@@ -6,7 +6,7 @@
 
 import 'chrome://os-settings/chromeos/os_settings.js';
 
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 import {setupFakeHandler, replaceBody, isHidden} from './test_util.js';
 
 
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/supported_links_item_test.js b/chrome/test/data/webui/settings/chromeos/app_management/supported_links_item_test.js
index 15646e2a..1c5cf0f 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/supported_links_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/supported_links_item_test.js
@@ -6,7 +6,7 @@
 
 import {AppManagementStore, updateSelectedAppId} from 'chrome://os-settings/chromeos/os_settings.js';
 import {setupFakeHandler, replaceStore, replaceBody, isHidden} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-supported-links-item>', () => {
   let supportedLinksItem;
diff --git a/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js b/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js
index fd7de12..0aaf6d6ea 100644
--- a/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js
+++ b/chrome/test/data/webui/settings/chromeos/app_management/toggle_row_test.js
@@ -7,7 +7,7 @@
 import 'chrome://os-settings/chromeos/os_settings.js';
 
 import {replaceBody} from './test_util.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 suite('<app-management-toggle-row', () => {
   let toggleRow;
diff --git a/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
index 30c2da9..1f1f951 100644
--- a/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/app_notifications_subpage_tests.js
@@ -6,7 +6,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/apps_page_test.js b/chrome/test/data/webui/settings/chromeos/apps_page_test.js
index 225b68e..ce4949e 100644
--- a/chrome/test/data/webui/settings/chromeos/apps_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/apps_page_test.js
@@ -9,7 +9,7 @@
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {TestAndroidAppsBrowserProxy} from './test_android_apps_browser_proxy.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/bluetooth_page_tests.js b/chrome/test/data/webui/settings/chromeos/bluetooth_page_tests.js
index 0c457b2..dd604d90 100644
--- a/chrome/test/data/webui/settings/chromeos/bluetooth_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/bluetooth_page_tests.js
@@ -6,7 +6,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js b/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js
index 05ad8d9..26d60cb2 100644
--- a/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js
+++ b/chrome/test/data/webui/settings/chromeos/cellular_networks_list_test.js
@@ -7,12 +7,10 @@
 import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote, InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {eventToPromise, flushTasks} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
@@ -21,13 +19,16 @@
 suite('CellularNetworksList', function() {
   let cellularNetworkList;
 
-  /** @type {!CrosNetworkConfigRemote|undefined} */
+  let mojom;
+
+  /** @type {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote|undefined} */
   let mojoApi_;
 
   let eSimManagerRemote;
   let browserProxy;
 
   setup(function() {
+    mojom = chromeos.networkConfig.mojom;
     mojoApi_ = new FakeNetworkConfig();
     MojoInterfaceProviderImpl.getInstance().remote_ = mojoApi_;
 
@@ -70,9 +71,9 @@
     let deviceState = cellularNetworkList.cellularDeviceState;
     if (!deviceState) {
       deviceState = {
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
       };
     }
     if (!deviceState.simInfos) {
@@ -121,20 +122,22 @@
         MultiDeviceFeatureState.ENABLED_BY_USER);
 
     const eSimNetwork1 = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_esim1');
+        mojom.NetworkType.kCellular, 'cellular_esim1');
     eSimNetwork1.typeProperties.cellular.eid =
         '11111111111111111111111111111111';
     const eSimNetwork2 = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_esim2');
+        mojom.NetworkType.kCellular, 'cellular_esim2');
     eSimNetwork2.typeProperties.cellular.eid =
         '22222222222222222222222222222222';
-    setManagedPropertiesForTest(NetworkType.kCellular, [
-      OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular1'),
-      OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular2'),
+    setManagedPropertiesForTest(mojom.NetworkType.kCellular, [
+      OncMojo.getDefaultManagedProperties(
+          mojom.NetworkType.kCellular, 'cellular1'),
+      OncMojo.getDefaultManagedProperties(
+          mojom.NetworkType.kCellular, 'cellular2'),
       eSimNetwork1,
       eSimNetwork2,
-      OncMojo.getDefaultManagedProperties(NetworkType.kTether, 'tether1'),
-      OncMojo.getDefaultManagedProperties(NetworkType.kTether, 'tether2'),
+      OncMojo.getDefaultManagedProperties(mojom.NetworkType.kTether, 'tether1'),
+      OncMojo.getDefaultManagedProperties(mojom.NetworkType.kTether, 'tether2'),
     ]);
     addPSimSlot();
     addESimSlot();
@@ -244,8 +247,9 @@
   test(
       'Hide esim section when no EUICC is found or no eSIM slots', async () => {
         init();
-        setManagedPropertiesForTest(NetworkType.kCellular, [
-          OncMojo.getDefaultManagedProperties(NetworkType.kTether, 'tether1'),
+        setManagedPropertiesForTest(mojom.NetworkType.kCellular, [
+          OncMojo.getDefaultManagedProperties(
+              mojom.NetworkType.kTether, 'tether1'),
         ]);
         flush();
         await flushAsync();
@@ -275,8 +279,8 @@
 
   test('Hide pSIM section when no pSIM slots', async () => {
     init();
-    setManagedPropertiesForTest(NetworkType.kCellular, [
-      OncMojo.getDefaultManagedProperties(NetworkType.kTether, 'tether1'),
+    setManagedPropertiesForTest(mojom.NetworkType.kCellular, [
+      OncMojo.getDefaultManagedProperties(mojom.NetworkType.kTether, 'tether1'),
     ]);
     await flushAsync();
     assertFalse(
@@ -297,11 +301,11 @@
         eSimManagerRemote.addEuiccForTest(2);
         init();
 
-        setManagedPropertiesForTest(NetworkType.kCellular, [
+        setManagedPropertiesForTest(mojom.NetworkType.kCellular, [
           OncMojo.getDefaultManagedProperties(
-              NetworkType.kCellular, 'pSimCellular1'),
+              mojom.NetworkType.kCellular, 'pSimCellular1'),
           OncMojo.getDefaultManagedProperties(
-              NetworkType.kCellular, 'pSimcellular2'),
+              mojom.NetworkType.kCellular, 'pSimcellular2'),
         ]);
 
         await flushAsync();
@@ -405,9 +409,9 @@
         eSimManagerRemote.addEuiccForTest(0);
         init();
         cellularNetworkList.deviceState = {
-          type: NetworkType.kCellular,
-          deviceState: DeviceStateType.kEnabled,
-          inhibitReason: InhibitReason.kNotInhibited,
+          type: mojom.NetworkType.kCellular,
+          deviceState: mojom.DeviceStateType.kEnabled,
+          inhibitReason: mojom.InhibitReason.kNotInhibited,
         };
         cellularNetworkList.globalPolicy = {
           allowOnlyPolicyCellularNetworks: true,
@@ -433,9 +437,9 @@
         assertTrue(noESimFoundMessage.hidden);
 
         cellularNetworkList.cellularDeviceState = {
-          type: NetworkType.kCellular,
-          deviceState: DeviceStateType.kEnabled,
-          inhibitReason: InhibitReason.kInstallingProfile,
+          type: mojom.NetworkType.kCellular,
+          deviceState: mojom.DeviceStateType.kEnabled,
+          inhibitReason: mojom.InhibitReason.kInstallingProfile,
         };
         addESimSlot();
         await flushAsync();
@@ -447,17 +451,18 @@
     eSimManagerRemote.addEuiccForTest(1);
     init();
     const eSimNetwork1 = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_esim1');
+        mojom.NetworkType.kCellular, 'cellular_esim1');
     eSimNetwork1.typeProperties.cellular.eid =
         '11111111111111111111111111111111';
-    setManagedPropertiesForTest(NetworkType.kCellular, [
-      OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular1'),
+    setManagedPropertiesForTest(mojom.NetworkType.kCellular, [
+      OncMojo.getDefaultManagedProperties(
+          mojom.NetworkType.kCellular, 'cellular1'),
       eSimNetwork1,
     ]);
     cellularNetworkList.cellularDeviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
     };
     addESimSlot();
     cellularNetworkList.globalPolicy = {
@@ -492,9 +497,9 @@
 
     // When device is inhibited add cellular button should be disabled.
     cellularNetworkList.cellularDeviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kInstallingProfile,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kInstallingProfile,
     };
     addESimSlot();
     await flushAsync();
@@ -504,9 +509,9 @@
     // Device is not inhibited and policy is also false add cellular button
     // should be enabled
     cellularNetworkList.cellularDeviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
     };
     addESimSlot();
     await flushAsync();
@@ -523,9 +528,9 @@
     eSimManagerRemote.addEuiccForTest(0);
     init();
     cellularNetworkList.deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
     };
     addESimSlot();
 
@@ -537,9 +542,9 @@
     assertFalse(esimLocalizedLink.linkDisabled);
 
     cellularNetworkList.cellularDeviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kRefreshingProfileList,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kRefreshingProfileList,
     };
     addESimSlot();
     await flushAsync();
@@ -550,9 +555,9 @@
     eSimManagerRemote.addEuiccForTest(0);
     init();
     cellularNetworkList.deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
     };
     addESimSlot();
     cellularNetworkList.canShowSpinner = true;
@@ -568,9 +573,9 @@
     assertFalse(getInhibitedSpinner().active);
 
     cellularNetworkList.cellularDeviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kInstallingProfile,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kInstallingProfile,
     };
     addESimSlot();
     await flushAsync();
@@ -592,9 +597,9 @@
         // Put the device under the inhibited status with kRefreshingProfileList
         // reason first.
         cellularNetworkList.cellularDeviceState = {
-          type: NetworkType.kCellular,
-          deviceState: DeviceStateType.kEnabled,
-          inhibitReason: InhibitReason.kRefreshingProfileList,
+          type: mojom.NetworkType.kCellular,
+          deviceState: mojom.DeviceStateType.kEnabled,
+          inhibitReason: mojom.InhibitReason.kRefreshingProfileList,
         };
         addESimSlot();
         cellularNetworkList.canShowSpinner = true;
@@ -616,7 +621,7 @@
         // kInstallingProfile, the inhibited subtext should also get updated to
         // reflect that.
         cellularNetworkList.cellularDeviceState = {
-          inhibitReason: InhibitReason.kInstallingProfile,
+          inhibitReason: mojom.InhibitReason.kInstallingProfile,
         };
         addESimSlot();
         await flushAsync();
diff --git a/chrome/test/data/webui/settings/chromeos/cellular_roaming_toggle_button_test.js b/chrome/test/data/webui/settings/chromeos/cellular_roaming_toggle_button_test.js
index 22963380..a1adbcb0 100644
--- a/chrome/test/data/webui/settings/chromeos/cellular_roaming_toggle_button_test.js
+++ b/chrome/test/data/webui/settings/chromeos/cellular_roaming_toggle_button_test.js
@@ -6,8 +6,6 @@
 import '../../cr_components/chromeos/network/cr_policy_strings.js';
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
-import {CrosNetworkConfigRemote} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 
@@ -15,7 +13,7 @@
   /** @type {CellularRoamingToggleButton|undefined} */
   let cellularRoamingToggleButton;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   /** @type {Object} */
@@ -46,7 +44,7 @@
    */
   function setManagedProperties(allowRoaming, roamingState) {
     cellularRoamingToggleButton.managedProperties = {
-      type: NetworkType.kCellular,
+      type: chromeos.networkConfig.mojom.NetworkType.kCellular,
       typeProperties: {
         cellular: {
           allowRoaming: allowRoaming,
@@ -63,6 +61,7 @@
    */
   function getAllowRoamingEnforcementTestCases() {
     const ControlledBy = chrome.settingsPrivate.ControlledBy;
+    const PolicySource = chromeos.networkConfig.mojom.PolicySource;
 
     const enforcementCases = [];
 
@@ -226,6 +225,7 @@
           cellularRoamingToggleButton.getCellularRoamingToggle();
 
       const ControlledBy = chrome.settingsPrivate.ControlledBy;
+      const PolicySource = chromeos.networkConfig.mojom.PolicySource;
 
       for (const enforcementCase of getAllowRoamingEnforcementTestCases()) {
         // There is not a case where the value provided for the pref will be
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js b/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js
index af48e10..ea013e8 100644
--- a/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js
+++ b/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js
@@ -7,7 +7,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_page_test.js b/chrome/test/data/webui/settings/chromeos/crostini_page_test.js
index 73924c9b..fb1279c 100644
--- a/chrome/test/data/webui/settings/chromeos/crostini_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/crostini_page_test.js
@@ -8,7 +8,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, flushTasks, isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks, isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js b/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
index df626a5..7fc8ddc8 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_landing_page_tests.js
@@ -7,10 +7,8 @@
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {flushTasks} from '../../test_util.js';
 
@@ -1036,19 +1034,20 @@
   /** @type{!HtmlElement} */
   let printerEntryListTestElement = null;
 
-  /** @type {!NetworkStateProperties|undefined} */
+  /** @type {!chromeos.networkConfig.mojom.NetworkStateProperties|undefined} */
   let wifi1;
 
 
   setup(function() {
+    const mojom = chromeos.networkConfig.mojom;
     cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
     CupsPrintersBrowserProxyImpl.setInstanceForTesting(
         cupsPrintersBrowserProxy);
 
     // Simulate internet connection.
-    wifi1 = OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1');
-    wifi1.connectionState = ConnectionStateType.kOnline;
+    wifi1 = OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1');
+    wifi1.connectionState = mojom.ConnectionStateType.kOnline;
 
     PolymerTest.clearBody();
     Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
@@ -1339,7 +1338,8 @@
 
   test('NetworkConnectedButNoInternet', function() {
     // Simulate connecting to a network with no internet connection.
-    wifi1.connectionState = ConnectionStateType.kConnected;
+    wifi1.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     page.onActiveNetworksChanged([wifi1]);
     flush();
 
@@ -1356,7 +1356,8 @@
 
   test('checkNetworkConnection', function() {
     // Simulate disconnecting from a network.
-    wifi1.connectionState = ConnectionStateType.kNotConnected;
+    wifi1.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected;
     page.onActiveNetworksChanged([wifi1]);
     flush();
 
@@ -1370,7 +1371,8 @@
                            .disabled);
 
           // Simulate connecting to a network with connectivity.
-          wifi1.connectionState = ConnectionStateType.kOnline;
+          wifi1.connectionState =
+              chromeos.networkConfig.mojom.ConnectionStateType.kOnline;
           page.onActiveNetworksChanged([wifi1]);
           flush();
 
diff --git a/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js b/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js
index ebf47fb64..6862313 100644
--- a/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/cups_printer_page_tests.js
@@ -6,8 +6,6 @@
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
-import {NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {keyEventOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -674,18 +672,20 @@
   /** @type {?settings.TestCupsPrintersBrowserProxy} */
   let cupsPrintersBrowserProxy = null;
 
-  /** @type {!NetworkStateProperties|undefined} */
+  /** @type {!chromeos.networkConfig.mojom.NetworkStateProperties|undefined} */
   let wifi1;
 
   setup(function() {
+    const mojom = chromeos.networkConfig.mojom;
+
     cupsPrintersBrowserProxy = new TestCupsPrintersBrowserProxy();
 
     CupsPrintersBrowserProxyImpl.setInstanceForTesting(
         cupsPrintersBrowserProxy);
 
     // Simulate internet connection.
-    wifi1 = OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1');
-    wifi1.connectionState = ConnectionStateType.kOnline;
+    wifi1 = OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1');
+    wifi1.connectionState = mojom.ConnectionStateType.kOnline;
 
     PolymerTest.clearBody();
     Router.getInstance().navigateTo(routes.CUPS_PRINTERS);
@@ -1177,7 +1177,8 @@
    */
   test('OfflineEdit', function() {
     // Simulate connecting to a network with no internet connection.
-    wifi1.connectionState = ConnectionStateType.kConnected;
+    wifi1.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     page.onActiveNetworksChanged([wifi1]);
     flush();
     const expectedName = 'editedName';
diff --git a/chrome/test/data/webui/settings/chromeos/date_time_page_tests.js b/chrome/test/data/webui/settings/chromeos/date_time_page_tests.js
index 43a9c3b..d094043ec 100644
--- a/chrome/test/data/webui/settings/chromeos/date_time_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/date_time_page_tests.js
@@ -8,8 +8,8 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
-import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
index 464f952..4f0954e 100644
--- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -10,7 +10,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks, isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {flushTasks, isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js b/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js
index d9a5298..c24cd2d 100644
--- a/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js
+++ b/chrome/test/data/webui/settings/chromeos/esim_remove_profile_dialog_test.js
@@ -6,11 +6,10 @@
 import {setESimManagerRemoteForTesting} from 'chrome://resources/cr_components/chromeos/cellular_setup/mojo_interface_provider.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
@@ -60,7 +59,8 @@
 
   function addEsimCellularNetwork(guid, iccid) {
     const cellular = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, guid, 'profile' + iccid);
+        chromeos.networkConfig.mojom.NetworkType.kCellular, guid,
+        'profile' + iccid);
     cellular.typeProperties.cellular.iccid = iccid;
     cellular.typeProperties.cellular.eid = iccid + 'eid';
     mojoApi_.setManagedPropertiesForTest(cellular);
diff --git a/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js b/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js
index 07c6d0da..284c25c 100644
--- a/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js
+++ b/chrome/test/data/webui/settings/chromeos/esim_rename_dialog_test.js
@@ -8,11 +8,10 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
@@ -63,7 +62,8 @@
 
   function addEsimCellularNetwork(guid, iccid) {
     const cellular = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, guid, 'profile' + iccid);
+        chromeos.networkConfig.mojom.NetworkType.kCellular, guid,
+        'profile' + iccid);
     cellular.typeProperties.cellular.iccid = iccid;
     cellular.typeProperties.cellular.eid = iccid + 'eid';
     mojoApi_.setManagedPropertiesForTest(cellular);
diff --git a/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js b/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js
index 4c4676913..b485d4dd0 100644
--- a/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js
+++ b/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js
@@ -6,7 +6,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks, isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {flushTasks, isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/google_assistant_page_test.js b/chrome/test/data/webui/settings/chromeos/google_assistant_page_test.js
index d18367f0..eae72072 100644
--- a/chrome/test/data/webui/settings/chromeos/google_assistant_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/google_assistant_page_test.js
@@ -5,7 +5,7 @@
 import {ConsentStatus, CrSettingsPrefs, DspHotwordState, GoogleAssistantBrowserProxyImpl, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/guest_os_shared_usb_devices_test.js b/chrome/test/data/webui/settings/chromeos/guest_os_shared_usb_devices_test.js
index 2070f84..9acaaf1 100644
--- a/chrome/test/data/webui/settings/chromeos/guest_os_shared_usb_devices_test.js
+++ b/chrome/test/data/webui/settings/chromeos/guest_os_shared_usb_devices_test.js
@@ -7,7 +7,7 @@
 import {GuestOsBrowserProxyImpl} from 'chrome://os-settings/chromeos/lazy_load.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/input_page_test.js b/chrome/test/data/webui/settings/chromeos/input_page_test.js
index 81f4e3e..4d971a6 100644
--- a/chrome/test/data/webui/settings/chromeos/input_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/input_page_test.js
@@ -7,7 +7,7 @@
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {fakeDataBind} from '../../test_util.js';
diff --git a/chrome/test/data/webui/settings/chromeos/internet_config_test.js b/chrome/test/data/webui/settings/chromeos/internet_config_test.js
index fc20713..081fc06 100644
--- a/chrome/test/data/webui/settings/chromeos/internet_config_test.js
+++ b/chrome/test/data/webui/settings/chromeos/internet_config_test.js
@@ -5,8 +5,6 @@
 import {setUserActionRecorderForTesting, userActionRecorderMojomWebui} from 'chrome://os-settings/chromeos/os_settings.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {CrosNetworkConfigRemote} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 
@@ -16,7 +14,7 @@
   /** @type {!InternetConfig|undefined} */
   let internetConfig;
 
-  /** @type {!CrosNetworkConfigRemote|undefined} */
+  /** @type {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote|undefined} */
   let mojoApi_;
 
   /** @type {?userActionRecorderMojomWebui.UserActionRecorderInterface} */
@@ -29,7 +27,8 @@
 
   setup(function() {
     internetConfig = document.createElement('internet-config');
-    internetConfig.type = OncMojo.getNetworkTypeString(NetworkType.kWiFi);
+    internetConfig.type = OncMojo.getNetworkTypeString(
+        chromeos.networkConfig.mojom.NetworkType.kWiFi);
     document.body.appendChild(internetConfig);
     flush();
 
diff --git a/chrome/test/data/webui/settings/chromeos/internet_detail_menu_test.js b/chrome/test/data/webui/settings/chromeos/internet_detail_menu_test.js
index 9de20688..6cad8be 100644
--- a/chrome/test/data/webui/settings/chromeos/internet_detail_menu_test.js
+++ b/chrome/test/data/webui/settings/chromeos/internet_detail_menu_test.js
@@ -7,18 +7,17 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {DeviceStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
 suite('InternetDetailMenu', function() {
   let internetDetailMenu;
   let mojoApi_;
+  let mojom;
   let eSimManagerRemote;
 
   setup(function() {
@@ -29,7 +28,8 @@
     eSimManagerRemote = new FakeESimManagerRemote();
     setESimManagerRemoteForTesting(eSimManagerRemote);
 
-    mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+    mojom = chromeos.networkConfig.mojom;
+    mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
   });
 
   teardown(function() {
@@ -61,11 +61,12 @@
   }
 
   async function addEsimCellularNetwork(iccid, eid, is_managed) {
-    const cellular = getManagedProperties(NetworkType.kCellular, 'cellular');
+    const cellular =
+        getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
     cellular.typeProperties.cellular.iccid = iccid;
     cellular.typeProperties.cellular.eid = eid;
     if (is_managed) {
-      cellular.source = OncSource.kDevicePolicy;
+      cellular.source = mojom.OncSource.kDevicePolicy;
     }
     mojoApi_.setManagedPropertiesForTest(cellular);
     await flushAsync();
@@ -246,16 +247,16 @@
     assertFalse(tripleDot.disabled);
 
     internetDetailMenu.deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kConnectingToProfile,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kConnectingToProfile,
     };
     assertTrue(tripleDot.disabled);
 
     internetDetailMenu.deviceState = {
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
     };
     assertFalse(tripleDot.disabled);
   });
@@ -293,7 +294,7 @@
 
         // Change esim profile name.
         const cellular =
-            getManagedProperties(NetworkType.kCellular, 'cellular');
+            getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
         cellular.typeProperties.cellular.iccid = iccid;
         cellular.typeProperties.cellular.eid = eid;
         cellular.name.activeValue = profileName;
diff --git a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js
index a8ae5a96..e8d430a 100644
--- a/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/internet_detail_page_tests.js
@@ -6,11 +6,9 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {ActivationStateType, CrosNetworkConfigRemote, InhibitReason, ManagedProperties, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType, OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
-import {eventToPromise, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {TestInternetPageBrowserProxy} from './test_internet_page_browser_proxy.js';
 
@@ -18,7 +16,7 @@
   /** @type {InternetDetailPageElement} */
   let internetDetailPage = null;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   /** @type {?TestInternetPageBrowserProxy} */
@@ -107,11 +105,12 @@
    */
   function deepLinkToSimLockElement(isSimLocked) {
     init();
+    const mojom = chromeos.networkConfig.mojom;
 
     const test_iccid = '11111111111111111';
     mojoApi_.setDeviceStateForTest({
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kCellular,
+      deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
       simLockStatus: {
         lockEnabled: true,
         lockType: isSimLocked ? 'sim-pin' : undefined,
@@ -123,7 +122,7 @@
     });
 
     const cellularNetwork =
-        getManagedProperties(NetworkType.kCellular, 'cellular');
+        getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
     cellularNetwork.connectable = false;
     cellularNetwork.typeProperties.cellular.iccid = test_iccid;
     mojoApi_.setManagedPropertiesForTest(cellularNetwork);
@@ -191,9 +190,10 @@
 
     test('WiFi1', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1'),
       ]);
 
       internetDetailPage.init('wifi1_guid', 'WiFi', 'wifi1');
@@ -207,9 +207,10 @@
     // page with a different network also succeeds.
     test('WiFi2', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi2'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi2'),
       ]);
 
       internetDetailPage.init('wifi2_guid', 'WiFi', 'wifi2');
@@ -221,10 +222,12 @@
 
     test('Hidden toggle enabled', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      const wifiNetwork = getManagedProperties(NetworkType.kWiFi, 'wifi_user');
-      wifiNetwork.source = OncSource.kUser;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      const wifiNetwork =
+          getManagedProperties(mojom.NetworkType.kWiFi, 'wifi_user');
+      wifiNetwork.source = mojom.OncSource.kUser;
       wifiNetwork.connectable = true;
       wifiNetwork.typeProperties.wifi.hiddenSsid =
           OncMojo.createManagedBool(true);
@@ -242,10 +245,12 @@
 
     test('Hidden toggle disabled', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      const wifiNetwork = getManagedProperties(NetworkType.kWiFi, 'wifi_user');
-      wifiNetwork.source = OncSource.kUser;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      const wifiNetwork =
+          getManagedProperties(mojom.NetworkType.kWiFi, 'wifi_user');
+      wifiNetwork.source = mojom.OncSource.kUser;
       wifiNetwork.connectable = true;
       wifiNetwork.typeProperties.wifi.hiddenSsid =
           OncMojo.createManagedBool(false);
@@ -263,9 +268,11 @@
 
     test('Hidden toggle hidden when not configured', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      const wifiNetwork = getManagedProperties(NetworkType.kWiFi, 'wifi_user');
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      const wifiNetwork =
+          getManagedProperties(mojom.NetworkType.kWiFi, 'wifi_user');
       wifiNetwork.connectable = false;
       wifiNetwork.typeProperties.wifi.hiddenSsid =
           OncMojo.createManagedBool(false);
@@ -282,10 +289,12 @@
 
     test('Proxy Unshared', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      const wifiNetwork = getManagedProperties(NetworkType.kWiFi, 'wifi_user');
-      wifiNetwork.source = OncSource.kUser;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      const wifiNetwork =
+          getManagedProperties(mojom.NetworkType.kWiFi, 'wifi_user');
+      wifiNetwork.source = mojom.OncSource.kUser;
       mojoApi_.setManagedPropertiesForTest(wifiNetwork);
 
       internetDetailPage.init('wifi_user_guid', 'WiFi', 'wifi_user');
@@ -302,10 +311,11 @@
 
     test('Proxy Shared', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       const wifiNetwork = getManagedProperties(
-          NetworkType.kWiFi, 'wifi_device', OncSource.kDevice);
+          mojom.NetworkType.kWiFi, 'wifi_device', mojom.OncSource.kDevice);
       mojoApi_.setManagedPropertiesForTest(wifiNetwork);
 
       internetDetailPage.init('wifi_device_guid', 'WiFi', 'wifi_device');
@@ -322,14 +332,15 @@
     // TOD(stevenjb): Improve this: crbug.com/662529.
     test('Proxy Shared User Managed', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       const wifiNetwork = getManagedProperties(
-          NetworkType.kWiFi, 'wifi_device', OncSource.kDevice);
+          mojom.NetworkType.kWiFi, 'wifi_device', mojom.OncSource.kDevice);
       wifiNetwork.proxySetings = {
         type: {
           activeValue: 'Manual',
-          policySource: PolicySource.kUserPolicyEnforced,
+          policySource: mojom.PolicySource.kUserPolicyEnforced,
         },
       };
       mojoApi_.setManagedPropertiesForTest(wifiNetwork);
@@ -346,14 +357,15 @@
     // allowd_shared_proxies pref so #allowShared should be visible.
     test('Proxy Shared Device Managed', function() {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       const wifiNetwork = getManagedProperties(
-          NetworkType.kWiFi, 'wifi_device', OncSource.kDevice);
+          mojom.NetworkType.kWiFi, 'wifi_device', mojom.OncSource.kDevice);
       wifiNetwork.proxySetings = {
         type: {
           activeValue: 'Manual',
-          policySource: PolicySource.kDevicePolicyEnforced,
+          policySource: mojom.PolicySource.kDevicePolicyEnforced,
         },
       };
       mojoApi_.setManagedPropertiesForTest(wifiNetwork);
@@ -370,10 +382,11 @@
     // the shared proxy toggle, toggle is focused.
     test('Deep link to shared proxy toggle', async () => {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       const wifiNetwork = getManagedProperties(
-          NetworkType.kWiFi, 'wifi_device', OncSource.kDevice);
+          mojom.NetworkType.kWiFi, 'wifi_device', mojom.OncSource.kDevice);
       mojoApi_.setManagedPropertiesForTest(wifiNetwork);
 
       const params = new URLSearchParams();
@@ -397,10 +410,12 @@
 
     test('WiFi page disabled when blocked by policy', async () => {
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      const wifiNetwork = getManagedProperties(NetworkType.kWiFi, 'wifi_user');
-      wifiNetwork.source = OncSource.kUser;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      const wifiNetwork =
+          getManagedProperties(mojom.NetworkType.kWiFi, 'wifi_user');
+      wifiNetwork.source = mojom.OncSource.kUser;
       wifiNetwork.connectable = true;
       mojoApi_.setManagedPropertiesForTest(wifiNetwork);
 
@@ -437,21 +452,23 @@
      */
     function initVpn(opt_doNotProvidePrefs) {
       init(opt_doNotProvidePrefs);
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kVPN, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kVPN, true);
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn1'),
       ]);
 
       internetDetailPage.init('vpn1_guid', 'VPN', 'vpn1');
     }
 
     /**
-     * @param {ManagedProperties} managedProperties
+     * @param {chromeos.networkConfig.mojom.ManagedProperties} managedProperties
      *     Managed properties used to initialize the network.
      */
     function initManagedVpn(managedProperties) {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kVPN, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kVPN, true);
       mojoApi_.resetForTest();
       mojoApi_.addNetworksForTest([
         OncMojo.managedPropertiesToNetworkState(managedProperties),
@@ -462,14 +479,15 @@
     }
 
     /**
-     * @param {chromeos.networConfig.OncSource=} opt_oncSource If
+     * @param {chromeos.networConfig.mojom.OncSource=} opt_oncSource If
      *     provided, sets the source (user / device / policy) of the network.
      */
     function initAdvancedVpn(opt_oncSource) {
+      const mojom = chromeos.networkConfig.mojom;
       const vpn1 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'vpn1_guid', 'vpn1');
+          mojom.NetworkType.kVPN, 'vpn1_guid', 'vpn1');
       vpn1.source = opt_oncSource;
-      vpn1.typeProperties.vpn.type = VpnType.kOpenVPN;
+      vpn1.typeProperties.vpn.type = mojom.VpnType.kOpenVPN;
       vpn1.typeProperties.vpn.openVpn = {
         auth: 'MD5',
         cipher: 'AES-192-CBC',
@@ -481,10 +499,11 @@
     }
 
     function initVpnWithNoAdvancedProperties() {
+      const mojom = chromeos.networkConfig.mojom;
       const vpn1 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'vpn1_guid', 'vpn1');
-      vpn1.source = OncSource.kUserPolicy;
-      vpn1.typeProperties.vpn.type = VpnType.kOpenVPN;
+          mojom.NetworkType.kVPN, 'vpn1_guid', 'vpn1');
+      vpn1.source = mojom.OncSource.kUserPolicy;
+      vpn1.typeProperties.vpn.type = mojom.VpnType.kOpenVPN;
       // Try out all the values considered "empty" to make sure we do not
       // register any of them as set.
       vpn1.typeProperties.vpn.openVpn = {
@@ -496,9 +515,10 @@
     }
 
     function initWireGuard() {
+      const mojom = chromeos.networkConfig.mojom;
       const wg1 = OncMojo.getDefaultManagedProperties(
-          NetworkType.kVPN, 'wg1_guid', 'wg1');
-      wg1.typeProperties.vpn.type = VpnType.kWireGuard;
+          mojom.NetworkType.kVPN, 'wg1_guid', 'wg1');
+      wg1.typeProperties.vpn.type = mojom.VpnType.kWireGuard;
       wg1.typeProperties.vpn.wireguard = {
         peers: {
           activeValue: [{
@@ -537,7 +557,7 @@
     });
 
     test('Managed VPN with advanced fields', function() {
-      initAdvancedVpn(OncSource.kUserPolicy);
+      initAdvancedVpn(chromeos.networkConfig.mojom.OncSource.kUserPolicy);
       return flushAsync().then(() => {
         assertTrue(
             !!internetDetailPage.shadowRoot.querySelector('#advancedFields'));
@@ -545,7 +565,7 @@
     });
 
     test('Unmanaged VPN with advanced fields', function() {
-      initAdvancedVpn(OncSource.kUser);
+      initAdvancedVpn(chromeos.networkConfig.mojom.OncSource.kUser);
       return flushAsync().then(() => {
         assertFalse(
             !!internetDetailPage.shadowRoot.querySelector('#advancedFields'));
@@ -602,9 +622,10 @@
     // Regression test for https://crbug.com/1182884.
     test('Connect button enabled when not connectable', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.connectable = false;
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
@@ -618,9 +639,10 @@
 
     test('Connect button disabled when not connectable and locked', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.connectable = false;
       cellularNetwork.typeProperties.cellular.simLocked = true;
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
@@ -637,9 +659,11 @@
         'Cellular view account button opens carrier account details',
         function() {
           init();
-          mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+          const mojom = chromeos.networkConfig.mojom;
+          mojoApi_.setNetworkTypeEnabledState(
+              mojom.NetworkType.kCellular, true);
           const cellularNetwork =
-              getManagedProperties(NetworkType.kCellular, 'cellular');
+              getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
           mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
           internetDetailPage.init('cellular_guid', 'Cellular', 'cellular');
@@ -661,13 +685,16 @@
         'Unactivated eSIM does not show activate or view account button',
         function() {
           init();
-          mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+          const mojom = chromeos.networkConfig.mojom;
+          mojoApi_.setNetworkTypeEnabledState(
+              mojom.NetworkType.kCellular, true);
           const cellularNetwork =
-              getManagedProperties(NetworkType.kCellular, 'cellular');
+              getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
           cellularNetwork.typeProperties.cellular.eid = 'eid';
-          cellularNetwork.connectionState = ConnectionStateType.kConnected;
+          cellularNetwork.connectionState =
+              mojom.ConnectionStateType.kConnected;
           cellularNetwork.typeProperties.cellular.activationState =
-              ActivationStateType.kNotActivated;
+              mojom.ActivationStateType.kNotActivated;
           cellularNetwork.typeProperties.cellular.paymentPortal = {url: 'url'};
           mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
@@ -686,17 +713,18 @@
       const test_iccid = '11111111111111111';
 
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.typeProperties.cellular.iccid = test_iccid;
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
       mojoApi_.setDeviceStateForTest({
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kCellular,
+        deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
         scanning: true,
-        inhibitReason: InhibitReason.kNotInhibited,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         simInfos: [{
           iccid: test_iccid,
           isPrimary: true,
@@ -716,14 +744,15 @@
     test('Page closed while device is updating', function() {
       init();
 
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
       mojoApi_.setDeviceStateForTest({
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kCellular,
+        deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
         scanning: true,
       });
 
@@ -748,9 +777,10 @@
       const popStatePromise = eventToPromise('popstate', window);
 
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.connectable = false;
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
@@ -781,10 +811,11 @@
       const test_iccid = '11111111111111111';
 
       init();
+      const mojom = chromeos.networkConfig.mojom;
       mojoApi_.resetForTest();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.typeProperties.cellular.iccid = test_iccid;
       cellularNetwork.connectable = false;
       // Required for allowDataRoamingButton to be rendered.
@@ -794,9 +825,9 @@
 
       // Set SIM as active so that configurable sections are displayed.
       mojoApi_.setDeviceStateForTest({
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         simInfos: [{
           iccid: test_iccid,
           isPrimary: true,
@@ -860,9 +891,10 @@
 
     test('Cellular page hides hidden toggle', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.connectable = false;
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
@@ -880,10 +912,11 @@
           init();
           const test_iccid = '11111111111111111';
 
+          const mojom = chromeos.networkConfig.mojom;
           await mojoApi_.setNetworkTypeEnabledState(
-              NetworkType.kCellular, true);
+              mojom.NetworkType.kCellular, true);
           const cellularNetwork = getManagedProperties(
-              NetworkType.kCellular, 'cellular', OncSource.kDevice);
+              mojom.NetworkType.kCellular, 'cellular', mojom.OncSource.kDevice);
           cellularNetwork.typeProperties.cellular.iccid = test_iccid;
           // Required for allowDataRoamingButton to be rendered.
           cellularNetwork.typeProperties.cellular.allowRoaming =
@@ -892,9 +925,9 @@
           mojoApi_.setManagedPropertiesForTest(cellularNetwork);
           internetDetailPage.init('cellular_guid', 'Cellular', 'cellular');
           mojoApi_.setDeviceStateForTest({
-            type: NetworkType.kCellular,
-            deviceState: DeviceStateType.kEnabled,
-            inhibitReason: InhibitReason.kNotInhibited,
+            type: mojom.NetworkType.kCellular,
+            deviceState: mojom.DeviceStateType.kEnabled,
+            inhibitReason: mojom.InhibitReason.kNotInhibited,
             simInfos: [{
               iccid: test_iccid,
               isPrimary: true,
@@ -914,18 +947,19 @@
           init();
           const test_iccid = '11111111111111111';
 
+          const mojom = chromeos.networkConfig.mojom;
           await mojoApi_.setNetworkTypeEnabledState(
-              NetworkType.kCellular, true);
+              mojom.NetworkType.kCellular, true);
           const cellularNetwork = getManagedProperties(
-              NetworkType.kCellular, 'cellular', OncSource.kDevice);
+              mojom.NetworkType.kCellular, 'cellular', mojom.OncSource.kDevice);
           cellularNetwork.typeProperties.cellular.iccid = '000';
 
           mojoApi_.setManagedPropertiesForTest(cellularNetwork);
           internetDetailPage.init('cellular_guid', 'Cellular', 'cellular');
           mojoApi_.setDeviceStateForTest({
-            type: NetworkType.kCellular,
-            deviceState: DeviceStateType.kEnabled,
-            inhibitReason: InhibitReason.kNotInhibited,
+            type: mojom.NetworkType.kCellular,
+            deviceState: mojom.DeviceStateType.kEnabled,
+            inhibitReason: mojom.InhibitReason.kNotInhibited,
             simInfos: [{
               iccid: test_iccid,
               isPrimary: true,
@@ -949,10 +983,11 @@
           init();
           const test_iccid = '11111111111111111';
 
+          const mojom = chromeos.networkConfig.mojom;
           await mojoApi_.setNetworkTypeEnabledState(
-              NetworkType.kCellular, true);
+              mojom.NetworkType.kCellular, true);
           const cellularNetwork = getManagedProperties(
-              NetworkType.kCellular, 'cellular', OncSource.kDevice);
+              mojom.NetworkType.kCellular, 'cellular', mojom.OncSource.kDevice);
           cellularNetwork.typeProperties.cellular.iccid = test_iccid;
 
           const isShowingCellularDeviceObjectFields = () => {
@@ -964,9 +999,9 @@
           mojoApi_.setManagedPropertiesForTest(cellularNetwork);
           internetDetailPage.init('cellular_guid', 'Cellular', 'cellular');
           mojoApi_.setDeviceStateForTest({
-            type: NetworkType.kCellular,
-            deviceState: DeviceStateType.kEnabled,
-            inhibitReason: InhibitReason.kNotInhibited,
+            type: mojom.NetworkType.kCellular,
+            deviceState: mojom.DeviceStateType.kEnabled,
+            inhibitReason: mojom.InhibitReason.kNotInhibited,
             simInfos: [{
               iccid: test_iccid,
               isPrimary: false,
@@ -978,9 +1013,9 @@
 
           // Set sim to active.
           mojoApi_.setDeviceStateForTest({
-            type: NetworkType.kCellular,
-            deviceState: DeviceStateType.kEnabled,
-            inhibitReason: InhibitReason.kNotInhibited,
+            type: mojom.NetworkType.kCellular,
+            deviceState: mojom.DeviceStateType.kEnabled,
+            inhibitReason: mojom.InhibitReason.kNotInhibited,
             simInfos: [{
               iccid: test_iccid,
               isPrimary: true,
@@ -992,9 +1027,9 @@
 
           // Set sim to non-active again.
           mojoApi_.setDeviceStateForTest({
-            type: NetworkType.kCellular,
-            deviceState: DeviceStateType.kEnabled,
-            inhibitReason: InhibitReason.kNotInhibited,
+            type: mojom.NetworkType.kCellular,
+            deviceState: mojom.DeviceStateType.kEnabled,
+            inhibitReason: mojom.InhibitReason.kNotInhibited,
             simInfos: [{
               iccid: test_iccid,
               isPrimary: false,
@@ -1011,9 +1046,10 @@
       const MISSING_MAC_ADDRESS = '00:00:00:00:00:00';
 
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork =
-          getManagedProperties(NetworkType.kCellular, 'cellular');
+          getManagedProperties(mojom.NetworkType.kCellular, 'cellular');
       cellularNetwork.connectable = true;
       cellularNetwork.typeProperties.cellular.simLocked = false;
       cellularNetwork.typeProperties.cellular.iccid = TEST_ICCID;
@@ -1021,9 +1057,9 @@
       internetDetailPage.init('cellular_guid', 'Cellular', 'cellular');
 
       let deviceState = {
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         simInfos: [{
           iccid: TEST_ICCID,
           isPrimary: true,
@@ -1043,9 +1079,9 @@
       // is provided when device MAC address cannot be retrieved. If this is the
       // case, the MAC address should not be displayed in UI.
       deviceState = {
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         simInfos: [{
           iccid: TEST_ICCID,
           isPrimary: true,
@@ -1064,11 +1100,12 @@
     test('Page disabled when inhibited', async () => {
       init();
 
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork = getManagedProperties(
-          NetworkType.kCellular, 'cellular', OncSource.kDevice);
+          mojom.NetworkType.kCellular, 'cellular', mojom.OncSource.kDevice);
       // Required for connectDisconnectButton to be rendered.
-      cellularNetwork.connectionState = ConnectionStateType.kConnected;
+      cellularNetwork.connectionState = mojom.ConnectionStateType.kConnected;
       // Required for allowDataRoamingButton to be rendered.
       cellularNetwork.typeProperties.cellular.allowRoaming =
           OncMojo.createManagedBool(false);
@@ -1085,9 +1122,9 @@
 
       // Start uninhibited.
       mojoApi_.setDeviceStateForTest({
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         // Required for configurable sections to be rendered.
         simInfos: [{
           iccid: test_iccid,
@@ -1133,9 +1170,9 @@
 
       // Mock device being inhibited.
       mojoApi_.setDeviceStateForTest({
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kConnectingToProfile,
+        type: mojom.NetworkType.kCellular,
+        deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kConnectingToProfile,
         simInfos: [{
           iccid: test_iccid,
           isPrimary: true,
@@ -1157,9 +1194,9 @@
 
       // Uninhibit.
       mojoApi_.setDeviceStateForTest({
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: chromeos.networkConfig.mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         simInfos: [{
           iccid: test_iccid,
           isPrimary: true,
@@ -1183,11 +1220,12 @@
     test('Cellular page disabled when blocked by policy', async () => {
       init();
 
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
       const cellularNetwork = getManagedProperties(
-          NetworkType.kCellular, 'cellular', OncSource.kDevice);
+          mojom.NetworkType.kCellular, 'cellular', mojom.OncSource.kDevice);
       // Required for connectDisconnectButton to be rendered.
-      cellularNetwork.connectionState = ConnectionStateType.kNotConnected;
+      cellularNetwork.connectionState = mojom.ConnectionStateType.kNotConnected;
       cellularNetwork.typeProperties.cellular.allowRoaming =
           OncMojo.createManagedBool(false);
       // Required for advancedFields to be rendered.
@@ -1198,7 +1236,7 @@
       const test_iccid = '11111111111111111';
       cellularNetwork.typeProperties.cellular.iccid = test_iccid;
       cellularNetwork.typeProperties.cellular.supportNetworkScan = true;
-      cellularNetwork.source = OncSource.kNone;
+      cellularNetwork.source = mojom.OncSource.kNone;
       mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
       internetDetailPage.init('cellular_guid', 'Cellular', 'cellular');
@@ -1243,9 +1281,10 @@
 
     test('Eth1', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kEthernet, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kEthernet, true);
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kEthernet, 'eth1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kEthernet, 'eth1'),
       ]);
 
       internetDetailPage.init('eth1_guid', 'Ethernet', 'eth1');
@@ -1257,9 +1296,10 @@
 
     test('Deep link to configure ethernet button', async () => {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kEthernet, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kEthernet, true);
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kEthernet, 'eth1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kEthernet, 'eth1'),
       ]);
 
       const params = new URLSearchParams();
@@ -1289,9 +1329,11 @@
         'Create tether network, first connection attempt shows tether dialog',
         async () => {
           init();
-          mojoApi_.setNetworkTypeEnabledState(NetworkType.kTether, true);
+          const mojom = chromeos.networkConfig.mojom;
+          mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kTether, true);
           setNetworksForTest([
-            OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether1'),
+            OncMojo.getDefaultNetworkState(
+                mojom.NetworkType.kTether, 'tether1'),
           ]);
 
           internetDetailPage.init('tether1_guid', 'Tether', 'tether1');
@@ -1315,12 +1357,13 @@
 
     test('Deep link to disconnect tether network', async () => {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kTether, true);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kTether, true);
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether1'),
       ]);
       const tetherNetwork =
-          getManagedProperties(NetworkType.kTether, 'tether1');
+          getManagedProperties(mojom.NetworkType.kTether, 'tether1');
       tetherNetwork.connectable = true;
       mojoApi_.setManagedPropertiesForTest(tetherNetwork);
 
@@ -1347,14 +1390,15 @@
   suite('DetailsPageAutoConnect', function() {
     test('Auto Connect toggle updates after GUID change', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      const wifi1 =
-          getManagedProperties(NetworkType.kWiFi, 'wifi1', OncSource.kDevice);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      const wifi1 = getManagedProperties(
+          mojom.NetworkType.kWiFi, 'wifi1', mojom.OncSource.kDevice);
       wifi1.typeProperties.wifi.autoConnect = OncMojo.createManagedBool(true);
       mojoApi_.setManagedPropertiesForTest(wifi1);
 
-      const wifi2 =
-          getManagedProperties(NetworkType.kWiFi, 'wifi2', OncSource.kDevice);
+      const wifi2 = getManagedProperties(
+          mojom.NetworkType.kWiFi, 'wifi2', mojom.OncSource.kDevice);
       wifi2.typeProperties.wifi.autoConnect = OncMojo.createManagedBool(false);
       mojoApi_.setManagedPropertiesForTest(wifi2);
 
@@ -1378,9 +1422,10 @@
 
     test('Auto Connect updates don\'t trigger a re-save', function() {
       init();
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
-      let wifi1 =
-          getManagedProperties(NetworkType.kWiFi, 'wifi1', OncSource.kDevice);
+      const mojom = chromeos.networkConfig.mojom;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
+      let wifi1 = getManagedProperties(
+          mojom.NetworkType.kWiFi, 'wifi1', mojom.OncSource.kDevice);
       wifi1.typeProperties.wifi.autoConnect = OncMojo.createManagedBool(true);
       mojoApi_.setManagedPropertiesForTest(wifi1);
 
@@ -1396,7 +1441,7 @@
 
             // Rebuild the object to force polymer to recognize a change.
             wifi1 = getManagedProperties(
-                NetworkType.kWiFi, 'wifi1', OncSource.kDevice);
+                mojom.NetworkType.kWiFi, 'wifi1', mojom.OncSource.kDevice);
             wifi1.typeProperties.wifi.autoConnect =
                 OncMojo.createManagedBool(false);
             mojoApi_.setManagedPropertiesForTest(wifi1);
diff --git a/chrome/test/data/webui/settings/chromeos/internet_known_networks_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_known_networks_page_tests.js
index 165e83e..9a49d8fc 100644
--- a/chrome/test/data/webui/settings/chromeos/internet_known_networks_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/internet_known_networks_page_tests.js
@@ -7,17 +7,15 @@
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {CrosNetworkConfigRemote} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 suite('InternetKnownNetworksPage', function() {
   /** @type {?SettingsInternetKnownNetworksPageElement} */
   let internetKnownNetworksPage = null;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   suiteSetup(function() {
@@ -69,14 +67,15 @@
 
   suite('KnownNetworksPage', function() {
     test('WiFi', async () => {
-      internetKnownNetworksPage.networkType = NetworkType.kWiFi;
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      const mojom = chromeos.networkConfig.mojom;
+      internetKnownNetworksPage.networkType = mojom.NetworkType.kWiFi;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       const preferredWifi =
-          OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi2');
+          OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi2');
       preferredWifi.priority = 1;
       const notPreferredWifi =
-          OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1');
-      setNetworksForTest(NetworkType.kWiFi, [
+          OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1');
+      setNetworksForTest(mojom.NetworkType.kWiFi, [
         notPreferredWifi,
         preferredWifi,
       ]);
@@ -105,16 +104,17 @@
     });
 
     test('Known networks policy icon and menu button a11y', async () => {
-      internetKnownNetworksPage.networkType = NetworkType.kWiFi;
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      const mojom = chromeos.networkConfig.mojom;
+      internetKnownNetworksPage.networkType = mojom.NetworkType.kWiFi;
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       const preferredWifi =
-          OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi2');
+          OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi2');
       preferredWifi.priority = 1;
-      preferredWifi.source = OncSource.kDevicePolicy;
+      preferredWifi.source = mojom.OncSource.kDevicePolicy;
       const notPreferredWifi =
-          OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1');
-      notPreferredWifi.source = OncSource.kDevicePolicy;
-      setNetworksForTest(NetworkType.kWiFi, [
+          OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1');
+      notPreferredWifi.source = mojom.OncSource.kDevicePolicy;
+      setNetworksForTest(mojom.NetworkType.kWiFi, [
         notPreferredWifi,
         preferredWifi,
       ]);
diff --git a/chrome/test/data/webui/settings/chromeos/internet_page_tests.js b/chrome/test/data/webui/settings/chromeos/internet_page_tests.js
index cd0f460..292c79e 100644
--- a/chrome/test/data/webui/settings/chromeos/internet_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/internet_page_tests.js
@@ -8,12 +8,10 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {CrosNetworkConfigRemote, InhibitReason, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 suite('InternetPage', function() {
   /** @type {?InternetPageElement} */
@@ -22,7 +20,7 @@
   /** @type {?NetworkSummaryElement} */
   let networkSummary_ = null;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   /** @type {?ash.cellularSetup.mojom.ESimManagerRemote} */
@@ -67,7 +65,7 @@
     // Update the device state here to trigger an
     // attemptShowCellularSetupDialog_() call.
     mojoApi_.setNetworkTypeEnabledState(
-        NetworkType.kCellular, isCellularEnabled);
+        chromeos.networkConfig.mojom.NetworkType.kCellular, isCellularEnabled);
 
     return flushAsync();
   }
@@ -82,10 +80,11 @@
     assertTrue(warningMessage.hidden);
 
     // Add a pSIM network.
-    mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
-    const pSimNetwork =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular1');
-    pSimNetwork.connectionState = ConnectionStateType.kConnected;
+    const mojom = chromeos.networkConfig.mojom;
+    mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, true);
+    const pSimNetwork = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular1');
+    pSimNetwork.connectionState = mojom.ConnectionStateType.kConnected;
     mojoApi_.setManagedPropertiesForTest(pSimNetwork);
     await flushAsync();
 
@@ -93,16 +92,16 @@
     assertFalse(warningMessage.hidden);
 
     // Disconnect from the pSIM network.
-    pSimNetwork.connectionState = ConnectionStateType.kNotConnected;
+    pSimNetwork.connectionState = mojom.ConnectionStateType.kNotConnected;
     mojoApi_.setManagedPropertiesForTest(pSimNetwork);
     await flushAsync();
     // Warning message should be hidden.
     assertTrue(warningMessage.hidden);
 
     // Add an eSIM network.
-    const eSimNetwork =
-        OncMojo.getDefaultManagedProperties(NetworkType.kCellular, 'cellular2');
-    eSimNetwork.connectionState = ConnectionStateType.kConnected;
+    const eSimNetwork = OncMojo.getDefaultManagedProperties(
+        mojom.NetworkType.kCellular, 'cellular2');
+    eSimNetwork.connectionState = mojom.ConnectionStateType.kConnected;
     eSimNetwork.typeProperties.cellular.eid = 'eid';
     mojoApi_.setManagedPropertiesForTest(eSimNetwork);
     await flushAsync();
@@ -114,8 +113,9 @@
   async function navigateToCellularDetailPage() {
     await init();
 
+    const mojom = chromeos.networkConfig.mojom;
     const cellularNetwork = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular1', 'name1');
+        mojom.NetworkType.kCellular, 'cellular1', 'name1');
     cellularNetwork.typeProperties.cellular.eid = 'eid';
     mojoApi_.setManagedPropertiesForTest(cellularNetwork);
 
@@ -194,11 +194,12 @@
 
     test('WiFi', async function() {
       await init();
+      const mojom = chromeos.networkConfig.mojom;
       setNetworksForTest([
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi2'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi2'),
       ]);
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, true);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, true);
       return flushAsync().then(() => {
         const wifi = networkSummary_.shadowRoot.querySelector('#WiFi');
         assertTrue(!!wifi);
@@ -208,17 +209,19 @@
 
     test('WiFiToggle', async function() {
       await init();
+      const mojom = chromeos.networkConfig.mojom;
       // Make WiFi an available but disabled technology.
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, false);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, false);
       return flushAsync().then(() => {
         const wifi = networkSummary_.shadowRoot.querySelector('#WiFi');
         assertTrue(!!wifi);
 
         // Ensure that the initial state is disabled and the toggle is
         // enabled but unchecked.
-        const wifiDevice = mojoApi_.getDeviceStateForTest(NetworkType.kWiFi);
+        const wifiDevice =
+            mojoApi_.getDeviceStateForTest(mojom.NetworkType.kWiFi);
         assertTrue(!!wifiDevice);
-        assertEquals(DeviceStateType.kDisabled, wifiDevice.deviceState);
+        assertEquals(mojom.DeviceStateType.kDisabled, wifiDevice.deviceState);
         const toggle = wifi.shadowRoot.querySelector('#deviceEnabledButton');
         assertTrue(!!toggle);
         assertFalse(toggle.disabled);
@@ -228,17 +231,19 @@
         toggle.click();
         return flushAsync().then(() => {
           assertTrue(toggle.checked);
-          const wifiDevice = mojoApi_.getDeviceStateForTest(NetworkType.kWiFi);
+          const wifiDevice =
+              mojoApi_.getDeviceStateForTest(mojom.NetworkType.kWiFi);
           assertTrue(!!wifiDevice);
-          assertEquals(DeviceStateType.kEnabling, wifiDevice.deviceState);
+          assertEquals(mojom.DeviceStateType.kEnabling, wifiDevice.deviceState);
         });
       });
     });
 
     test('Deep link to WiFiToggle', async () => {
       await init();
+      const mojom = chromeos.networkConfig.mojom;
       // Make WiFi an available but disabled technology.
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kWiFi, false);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kWiFi, false);
 
       const params = new URLSearchParams();
       params.append('settingId', '4');
@@ -259,23 +264,24 @@
     suite('VPN', function() {
       test('VpnProviders', async function() {
         await init();
+        const mojom = chromeos.networkConfig.mojom;
         mojoApi_.setVpnProvidersForTest([
           {
-            type: VpnType.kExtension,
+            type: mojom.VpnType.kExtension,
             providerId: 'extension_id1',
             providerName: 'MyExtensionVPN1',
             appId: 'extension_id1',
             lastLaunchTime: {internalValue: 0},
           },
           {
-            type: VpnType.kArc,
+            type: mojom.VpnType.kArc,
             providerId: 'vpn.app.package1',
             providerName: 'MyArcVPN1',
             appId: 'arcid1',
             lastLaunchTime: {internalValue: 1},
           },
           {
-            type: VpnType.kArc,
+            type: mojom.VpnType.kArc,
             providerId: 'vpn.app.package2',
             providerName: 'MyArcVPN2',
             appId: 'arcid2',
@@ -311,12 +317,13 @@
             };
             clickAddConnectionsButton();
 
+            const mojom = chromeos.networkConfig.mojom;
             setNetworksForTest([
-              OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn'),
+              OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn'),
             ]);
             mojoApi_.setDeviceStateForTest({
-              type: NetworkType.kVPN,
-              deviceState: DeviceStateType.kEnabled,
+              type: mojom.NetworkType.kVPN,
+              deviceState: mojom.DeviceStateType.kEnabled,
             });
 
             return flushAsync().then(() => {
@@ -331,12 +338,13 @@
             await init();
             clickAddConnectionsButton();
 
+            const mojom = chromeos.networkConfig.mojom;
             setNetworksForTest([
-              OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn'),
+              OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn'),
             ]);
             mojoApi_.setDeviceStateForTest({
-              type: NetworkType.kVPN,
-              deviceState: DeviceStateType.kProhibited,
+              type: mojom.NetworkType.kVPN,
+              deviceState: mojom.DeviceStateType.kProhibited,
             });
 
             return flushAsync().then(() => {
@@ -354,12 +362,13 @@
             await init();
             clickAddConnectionsButton();
 
+            const mojom = chromeos.networkConfig.mojom;
             setNetworksForTest([
-              OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn'),
+              OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn'),
             ]);
             mojoApi_.setDeviceStateForTest({
-              type: NetworkType.kVPN,
-              deviceState: DeviceStateType.kEnabled,
+              type: mojom.NetworkType.kVPN,
+              deviceState: mojom.DeviceStateType.kEnabled,
             });
 
             return flushAsync().then(() => {
@@ -374,8 +383,9 @@
 
     test('Deep link to mobile on/off toggle', async () => {
       await init();
+      const mojom = chromeos.networkConfig.mojom;
       // Make WiFi an available but disabled technology.
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, false);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kCellular, false);
 
       const params = new URLSearchParams();
       params.append('settingId', '13');
@@ -465,9 +475,10 @@
         await init();
         eSimManagerRemote.addEuiccForTest(1);
 
+        const mojom = chromeos.networkConfig.mojom;
         const wifiNetwork =
-            OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi');
-        wifiNetwork.connectionState = ConnectionStateType.kOnline;
+            OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi');
+        wifiNetwork.connectionState = mojom.ConnectionStateType.kOnline;
         mojoApi_.addNetworksForTest([wifiNetwork]);
         await flushAsync();
 
@@ -545,9 +556,10 @@
         await init();
         eSimManagerRemote.addEuiccForTest(1);
 
+        const mojom = chromeos.networkConfig.mojom;
         const wifiNetwork =
-            OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi');
-        wifiNetwork.connectionState = ConnectionStateType.kOnline;
+            OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi');
+        wifiNetwork.connectionState = mojom.ConnectionStateType.kOnline;
         mojoApi_.addNetworksForTest([wifiNetwork]);
         await flushAsync();
 
@@ -574,9 +586,10 @@
         await init();
         eSimManagerRemote.addEuiccForTest(/*numProfiles=*/ 5);
 
+        const mojom = chromeos.networkConfig.mojom;
         const wifiNetwork =
-            OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi');
-        wifiNetwork.connectionState = ConnectionStateType.kOnline;
+            OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi');
+        wifiNetwork.connectionState = mojom.ConnectionStateType.kOnline;
         mojoApi_.addNetworksForTest([wifiNetwork]);
         await flushAsync();
 
@@ -598,8 +611,10 @@
   test('Show sim lock dialog through URL parameters', async () => {
     await init();
 
+    const mojom = chromeos.networkConfig.mojom;
     const params = new URLSearchParams();
-    params.append('type', OncMojo.getNetworkTypeString(NetworkType.kCellular));
+    params.append(
+        'type', OncMojo.getNetworkTypeString(mojom.NetworkType.kCellular));
     params.append('showSimLockDialog', true);
 
     // Pretend that we initially started on the INTERNET_NETWORKS route with the
@@ -609,9 +624,9 @@
 
     // Update the device state here to trigger an onDeviceStatesChanged_() call.
     mojoApi_.setDeviceStateForTest({
-      type: NetworkType.kCellular,
-      deviceState: DeviceStateType.kEnabled,
-      inhibitReason: InhibitReason.kNotInhibited,
+      type: mojom.NetworkType.kCellular,
+      deviceState: mojom.DeviceStateType.kEnabled,
+      inhibitReason: mojom.InhibitReason.kNotInhibited,
       simLockStatus: {
         lockEnabled: true,
       },
@@ -630,7 +645,8 @@
       async function() {
         await init();
         eSimManagerRemote.addEuiccForTest(/*numProfiles=*/ 1);
-        mojoApi_.setNetworkTypeEnabledState(NetworkType.kCellular, true);
+        mojoApi_.setNetworkTypeEnabledState(
+            chromeos.networkConfig.mojom.NetworkType.kCellular, true);
         await flushAsync();
 
         assertFalse(internetPage.$.errorToast.open);
@@ -653,9 +669,10 @@
         assertFalse(internetPage.$.errorToast.open);
 
         // Connect to non-cellular network.
+        const mojom = chromeos.networkConfig.mojom;
         const wifiNetwork =
-            OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi');
-        wifiNetwork.connectionState = ConnectionStateType.kOnline;
+            OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi');
+        wifiNetwork.connectionState = mojom.ConnectionStateType.kOnline;
         mojoApi_.addNetworksForTest([wifiNetwork]);
         await flushAsync();
 
@@ -717,6 +734,7 @@
       async function() {
         await init();
 
+        const mojom = chromeos.networkConfig.mojom;
         const params = new URLSearchParams();
         params.append('type', '');
 
@@ -730,7 +748,7 @@
 
         // Confirm that the knownNetworkType_ was set to kWiFi.
         assertTrue(!!knownNetworksPage);
-        assertEquals(knownNetworksPage.networkType, NetworkType.kWiFi);
+        assertEquals(knownNetworksPage.networkType, mojom.NetworkType.kWiFi);
       });
 
   // TODO(stevenjb): Figure out a way to reliably test navigation. Currently
diff --git a/chrome/test/data/webui/settings/chromeos/internet_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/internet_subpage_tests.js
index 878542e..bba227d9 100644
--- a/chrome/test/data/webui/settings/chromeos/internet_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/internet_subpage_tests.js
@@ -8,18 +8,16 @@
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {AlwaysOnVpnMode, CrosNetworkConfigRemote, InhibitReason, NetworkStateProperties, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 suite('InternetSubpage', function() {
   /** @type {?SettingsInternetSubpageElement} */
   let internetSubpage = null;
 
-  /** @type {?CrosNetworkConfigRemote} */
+  /** @type {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   let mojoApi_ = null;
 
   /** @type {?ash.cellularSetup.mojom.CellularSetupRemote} */
@@ -63,25 +61,27 @@
   }
 
   /**
-   * @param {!Array<!NetworkStateProperties>=}
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkStateProperties>=}
    *     opt_networks Networks to set. If left undefined, default networks will
    *     be set.
    */
   function addCellularNetworks(opt_networks) {
+    const mojom = chromeos.networkConfig.mojom;
+
     const networks = opt_networks || [
-      OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular1'),
-      OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether1'),
-      OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether2'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kCellular, 'cellular1'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether1'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether2'),
     ];
 
-    mojoApi_.setNetworkTypeEnabledState(NetworkType.kTether);
-    setNetworksForTest(NetworkType.kCellular, networks);
+    mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kTether);
+    setNetworksForTest(mojom.NetworkType.kCellular, networks);
     internetSubpage.tetherDeviceState = {
-      type: NetworkType.kTether,
-      deviceState: DeviceStateType.kEnabled,
+      type: mojom.NetworkType.kTether,
+      deviceState: mojom.DeviceStateType.kEnabled,
     };
     internetSubpage.cellularDeviceState =
-        mojoApi_.getDeviceStateForTest(NetworkType.kCellular);
+        mojoApi_.getDeviceStateForTest(mojom.NetworkType.kCellular);
   }
 
   function initSubpage() {
@@ -104,9 +104,10 @@
   suite('SubPage', function() {
     test('WiFi', function() {
       initSubpage();
-      setNetworksForTest(NetworkType.kWiFi, [
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi2'),
+      const mojom = chromeos.networkConfig.mojom;
+      setNetworksForTest(mojom.NetworkType.kWiFi, [
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi2'),
       ]);
       return flushAsync().then(() => {
         assertEquals(2, internetSubpage.networkStateList_.length);
@@ -123,9 +124,10 @@
 
     test('Deep link to WiFi on/off toggle', async () => {
       initSubpage();
-      setNetworksForTest(NetworkType.kWiFi, [
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kWiFi, 'wifi2'),
+      const mojom = chromeos.networkConfig.mojom;
+      setNetworksForTest(mojom.NetworkType.kWiFi, [
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kWiFi, 'wifi2'),
       ]);
 
       const params = new URLSearchParams();
@@ -145,9 +147,10 @@
 
     test('Tether', function() {
       initSubpage();
-      setNetworksForTest(NetworkType.kTether, [
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether2'),
+      const mojom = chromeos.networkConfig.mojom;
+      setNetworksForTest(mojom.NetworkType.kTether, [
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether2'),
       ]);
       return flushAsync().then(() => {
         assertEquals(2, internetSubpage.networkStateList_.length);
@@ -169,13 +172,14 @@
 
     test('Deep link to tether on/off toggle w/o cellular', async () => {
       initSubpage();
-      setNetworksForTest(NetworkType.kTether, [
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether2'),
+      const mojom = chromeos.networkConfig.mojom;
+      setNetworksForTest(mojom.NetworkType.kTether, [
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether2'),
       ]);
       internetSubpage.tetherDeviceState = {
-        type: NetworkType.kTether,
-        deviceState: DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kTether,
+        deviceState: mojom.DeviceStateType.kEnabled,
       };
 
       const params = new URLSearchParams();
@@ -196,13 +200,14 @@
     test('Deep link to add cellular button', async () => {
       initSubpage();
       addCellularNetworks();
+      const mojom = chromeos.networkConfig.mojom;
       await flushAsync();
       const cellularNetworkList =
           internetSubpage.shadowRoot.querySelector('#cellularNetworkList');
       cellularNetworkList.cellularDeviceState = {
-        type: NetworkType.kCellular,
-        deviceState: DeviceStateType.kEnabled,
-        inhibitReason: InhibitReason.kNotInhibited,
+        type: mojom.NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
         simInfos: [{eid: 'eid'}],
       };
       cellularNetworkList.globalPolicy = {
@@ -228,6 +233,7 @@
     test(
         'Tether plus Cellular', function() {
           initSubpage();
+          const mojom = chromeos.networkConfig.mojom;
           addCellularNetworks();
           return flushAsync().then(() => {
             assertEquals(3, internetSubpage.networkStateList_.length);
@@ -252,6 +258,7 @@
       // is refreshed. This test makes sure if |oldRoute| is undefined no js
       // console error is thrown.
       initSubpage();
+      const mojom = chromeos.networkConfig.mojom;
       addCellularNetworks();
       return flushAsync().then(() => {
         const params = new URLSearchParams();
@@ -268,19 +275,22 @@
     test('pSIM section shows when cellularNetworks present', async () => {
       initSubpage();
 
+      const mojom = chromeos.networkConfig.mojom;
       const networks = [
-        OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether1'),
-        OncMojo.getDefaultNetworkState(NetworkType.kTether, 'tether2'),
+        OncMojo.getDefaultNetworkState(
+            mojom.NetworkType.kCellular, 'cellular1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether1'),
+        OncMojo.getDefaultNetworkState(mojom.NetworkType.kTether, 'tether2'),
       ];
 
-      mojoApi_.setNetworkTypeEnabledState(NetworkType.kTether);
-      setNetworksForTest(NetworkType.kCellular, networks);
+      mojoApi_.setNetworkTypeEnabledState(mojom.NetworkType.kTether);
+      setNetworksForTest(mojom.NetworkType.kCellular, networks);
       internetSubpage.tetherDeviceState = {
-        type: NetworkType.kTether,
-        deviceState: DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kTether,
+        deviceState: mojom.DeviceStateType.kEnabled,
       };
-      const deviceState = mojoApi_.getDeviceStateForTest(NetworkType.kCellular);
+      const deviceState =
+          mojoApi_.getDeviceStateForTest(mojom.NetworkType.kCellular);
       // This siminfo represents a pSIM slot because this it has no EID.
       deviceState.simInfos = [{
         iccid: '11111111111',
@@ -315,23 +325,24 @@
       }
 
       function addTestVpnProviders() {
+        const mojom = chromeos.networkConfig.mojom;
         internetSubpage.vpnProviders = [
           {
-            type: VpnType.kExtension,
+            type: mojom.VpnType.kExtension,
             providerId: 'extension_id1',
             providerName: 'MyExtensionVPN1',
             appId: 'extension_id1',
             lastLaunchTime: {internalValue: 0},
           },
           {
-            type: VpnType.kExtension,
+            type: mojom.VpnType.kExtension,
             providerId: 'extension_id2',
             providerName: 'MyExtensionVPN2',
             appId: 'extension_id2',
             lastLaunchTime: {internalValue: 0},
           },
           {
-            type: VpnType.kArc,
+            type: mojom.VpnType.kArc,
             providerId: 'vpn.app.package1',
             providerName: 'MyArcVPN1',
             appId: 'arcid1',
@@ -341,17 +352,18 @@
       }
 
       function addTestVpnNetworks() {
-        setNetworksForTest(NetworkType.kVPN, [
-          OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn1'),
-          OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn2'),
+        const mojom = chromeos.networkConfig.mojom;
+        setNetworksForTest(mojom.NetworkType.kVPN, [
+          OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn1'),
+          OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn2'),
           {
             guid: 'extension1_vpn1_guid',
             name: 'vpn3',
-            type: NetworkType.kVPN,
-            connectionState: ConnectionStateType.kNotConnected,
+            type: mojom.NetworkType.kVPN,
+            connectionState: mojom.ConnectionStateType.kNotConnected,
             typeState: {
               vpn: {
-                type: VpnType.kExtension,
+                type: mojom.VpnType.kExtension,
                 providerId: 'extension_id1',
                 providerName: 'MyExntensionVPN1',
               },
@@ -360,11 +372,11 @@
           {
             guid: 'extension1_vpn2_guid',
             name: 'vpn4',
-            type: NetworkType.kVPN,
-            connectionState: ConnectionStateType.kNotConnected,
+            type: mojom.NetworkType.kVPN,
+            connectionState: mojom.ConnectionStateType.kNotConnected,
             typeState: {
               vpn: {
-                type: VpnType.kExtension,
+                type: mojom.VpnType.kExtension,
                 providerId: 'extension_id1',
                 providerName: 'MyExntensionVPN1',
               },
@@ -373,11 +385,11 @@
           {
             guid: 'extension2_vpn1_guid',
             name: 'vpn5',
-            type: NetworkType.kVPN,
-            connectionState: ConnectionStateType.kNotConnected,
+            type: mojom.NetworkType.kVPN,
+            connectionState: mojom.ConnectionStateType.kNotConnected,
             typeState: {
               vpn: {
-                type: VpnType.kExtension,
+                type: mojom.VpnType.kExtension,
                 providerId: 'extension_id2',
                 providerName: 'MyExntensionVPN2',
               },
@@ -386,11 +398,11 @@
           {
             guid: 'arc_vpn1_guid',
             name: 'vpn6',
-            type: NetworkType.kVPN,
-            connectionState: ConnectionStateType.kConnected,
+            type: mojom.NetworkType.kVPN,
+            connectionState: mojom.ConnectionStateType.kConnected,
             typeState: {
               vpn: {
-                type: VpnType.kArc,
+                type: mojom.VpnType.kArc,
                 providerId: 'vpn.app.package1',
                 providerName: 'MyArcVPN1',
               },
@@ -399,11 +411,11 @@
           {
             guid: 'arc_vpn2_guid',
             name: 'vpn7',
-            type: NetworkType.kVPN,
-            connectionState: ConnectionStateType.kNotConnected,
+            type: mojom.NetworkType.kVPN,
+            connectionState: mojom.ConnectionStateType.kNotConnected,
             typeState: {
               vpn: {
-                type: VpnType.kArc,
+                type: mojom.VpnType.kArc,
                 providerId: 'vpn.app.package1',
                 providerName: 'MyArcVPN1',
               },
@@ -436,9 +448,10 @@
           function() {
             initSubpage();
             initVpn();
+            const mojom = chromeos.networkConfig.mojom;
             internetSubpage.deviceState = {
-              type: NetworkType.kVPN,
-              deviceState: DeviceStateType.kProhibited,
+              type: mojom.NetworkType.kVPN,
+              deviceState: mojom.DeviceStateType.kProhibited,
             };
 
             return flushAsync().then(() => {
@@ -457,8 +470,9 @@
           });
 
       test('Always-on VPN settings reflects OFF mode', () => {
+        const mojom = chromeos.networkConfig.mojom;
         mojoApi_.setAlwaysOnVpn({
-          mode: AlwaysOnVpnMode.kOff,
+          mode: mojom.AlwaysOnVpnMode.kOff,
           serviceGuid: '',
         });
         return initSubpage()
@@ -471,14 +485,15 @@
                   internetSubpage.shadowRoot.querySelector(
                       '#alwaysOnVpnSelector');
               assert(networkAlwaysOnVpn);
-              assertEquals(AlwaysOnVpnMode.kOff, networkAlwaysOnVpn.mode);
+              assertEquals(mojom.AlwaysOnVpnMode.kOff, networkAlwaysOnVpn.mode);
               assertEquals('', networkAlwaysOnVpn.service);
             });
       });
 
       test('Always-on VPN settings reflects BEST-EFFORT mode', () => {
+        const mojom = chromeos.networkConfig.mojom;
         mojoApi_.setAlwaysOnVpn({
-          mode: AlwaysOnVpnMode.kBestEffort,
+          mode: mojom.AlwaysOnVpnMode.kBestEffort,
           serviceGuid: 'vpn1_guid',
         });
         return initSubpage()
@@ -492,14 +507,15 @@
                       '#alwaysOnVpnSelector');
               assert(networkAlwaysOnVpn);
               assertEquals(
-                  AlwaysOnVpnMode.kBestEffort, networkAlwaysOnVpn.mode);
+                  mojom.AlwaysOnVpnMode.kBestEffort, networkAlwaysOnVpn.mode);
               assertEquals('vpn1_guid', networkAlwaysOnVpn.service);
             });
       });
 
       test('Always-on VPN settings reflects STRICT mode', () => {
+        const mojom = chromeos.networkConfig.mojom;
         mojoApi_.setAlwaysOnVpn({
-          mode: AlwaysOnVpnMode.kStrict,
+          mode: mojom.AlwaysOnVpnMode.kStrict,
           serviceGuid: 'vpn2_guid',
         });
         return initSubpage()
@@ -512,12 +528,14 @@
                   internetSubpage.shadowRoot.querySelector(
                       '#alwaysOnVpnSelector');
               assert(networkAlwaysOnVpn);
-              assertEquals(AlwaysOnVpnMode.kStrict, networkAlwaysOnVpn.mode);
+              assertEquals(
+                  mojom.AlwaysOnVpnMode.kStrict, networkAlwaysOnVpn.mode);
               assertEquals('vpn2_guid', networkAlwaysOnVpn.service);
             });
       });
 
       test('Enabled always-on and select a service', () => {
+        const mojom = chromeos.networkConfig.mojom;
         return initSubpage()
             .then(() => {
               initVpn();
@@ -528,18 +546,20 @@
                   internetSubpage.shadowRoot.querySelector(
                       '#alwaysOnVpnSelector');
               assert(networkAlwaysOnVpn);
-              networkAlwaysOnVpn.mode = AlwaysOnVpnMode.kBestEffort;
+              networkAlwaysOnVpn.mode = mojom.AlwaysOnVpnMode.kBestEffort;
               networkAlwaysOnVpn.service = 'vpn1_guid';
               return flushAsync();
             })
             .then(() => mojoApi_.getAlwaysOnVpn())
             .then(result => {
-              assertEquals(AlwaysOnVpnMode.kBestEffort, result.properties.mode);
+              assertEquals(
+                  mojom.AlwaysOnVpnMode.kBestEffort, result.properties.mode);
               assertEquals('vpn1_guid', result.properties.serviceGuid);
             });
       });
 
       test('Enable always-on with STRICT mode and select a service', () => {
+        const mojom = chromeos.networkConfig.mojom;
         return initSubpage()
             .then(() => {
               initVpn();
@@ -550,13 +570,14 @@
                   internetSubpage.shadowRoot.querySelector(
                       '#alwaysOnVpnSelector');
               assert(networkAlwaysOnVpn);
-              networkAlwaysOnVpn.mode = AlwaysOnVpnMode.kStrict;
+              networkAlwaysOnVpn.mode = mojom.AlwaysOnVpnMode.kStrict;
               networkAlwaysOnVpn.service = 'vpn2_guid';
               return flushAsync();
             })
             .then(() => mojoApi_.getAlwaysOnVpn())
             .then(result => {
-              assertEquals(AlwaysOnVpnMode.kStrict, result.properties.mode);
+              assertEquals(
+                  mojom.AlwaysOnVpnMode.kStrict, result.properties.mode);
               assertEquals('vpn2_guid', result.properties.serviceGuid);
             });
       });
@@ -570,8 +591,9 @@
       });
 
       test('Always-on VPN list contains compatible networks', () => {
+        const mojom = chromeos.networkConfig.mojom;
         mojoApi_.setAlwaysOnVpn({
-          mode: AlwaysOnVpnMode.kBestEffort,
+          mode: mojom.AlwaysOnVpnMode.kBestEffort,
           serviceGuid: '',
         });
         return initSubpage()
diff --git a/chrome/test/data/webui/settings/chromeos/kerberos_accounts_test.js b/chrome/test/data/webui/settings/chromeos/kerberos_accounts_test.js
index 3e08ca80..77fd0d1 100644
--- a/chrome/test/data/webui/settings/chromeos/kerberos_accounts_test.js
+++ b/chrome/test/data/webui/settings/chromeos/kerberos_accounts_test.js
@@ -8,9 +8,9 @@
 import {Router, Route, routes, KerberosErrorType, KerberosConfigErrorCode, KerberosAccountsBrowserProxyImpl} from 'chrome://os-settings/chromeos/os_settings.js';
 import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks} from 'chrome://test/test_util.js';
+import {flushTasks} from 'chrome://webui-test/test_util.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 
 // Tests for the Kerberos Accounts settings page.
diff --git a/chrome/test/data/webui/settings/chromeos/keyboard_and_text_input_page_tests.js b/chrome/test/data/webui/settings/chromeos/keyboard_and_text_input_page_tests.js
index 16994a4..cd0dc7a9 100644
--- a/chrome/test/data/webui/settings/chromeos/keyboard_and_text_input_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/keyboard_and_text_input_page_tests.js
@@ -8,7 +8,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, isVisible, waitAfterNextRender, waitBeforeNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, isVisible, waitAfterNextRender, waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/keyboard_shortcut_banner_test.js b/chrome/test/data/webui/settings/chromeos/keyboard_shortcut_banner_test.js
index a5d64ad..7cafc8f 100644
--- a/chrome/test/data/webui/settings/chromeos/keyboard_shortcut_banner_test.js
+++ b/chrome/test/data/webui/settings/chromeos/keyboard_shortcut_banner_test.js
@@ -5,7 +5,7 @@
 import 'chrome://os-settings/chromeos/lazy_load.js';
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertDeepEquals, assertEquals, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/lock_screen_tests.js b/chrome/test/data/webui/settings/chromeos/lock_screen_tests.js
index c863a3a..b124dac 100644
--- a/chrome/test/data/webui/settings/chromeos/lock_screen_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/lock_screen_tests.js
@@ -6,7 +6,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 suite('LockScreenPage', function() {
   let lockScreenPage = null;
diff --git a/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js b/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js
index 754292bf..112e7bf 100644
--- a/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/manage_accessibility_page_tests.js
@@ -8,7 +8,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, isVisible, waitAfterNextRender, waitBeforeNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, isVisible, waitAfterNextRender, waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js
index 96ac81aa..8334fea5 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_feature_item_tests.js
@@ -4,7 +4,7 @@
 
 import {MultiDeviceFeature, MultiDeviceFeatureState, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
index b8620b0..acf6262 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_page_tests.js
@@ -7,7 +7,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {isChildVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {isChildVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js';
 import {FakeContactManager} from '../../nearby_share/shared/fake_nearby_contact_manager.js';
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.js b/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.js
index c9cdb76..085a3f89 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_smartlock_subpage_test.js
@@ -7,7 +7,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.js
index 1817f87..e50c198 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_subpage_tests.js
@@ -5,7 +5,7 @@
 import {MultiDeviceBrowserProxyImpl, MultiDeviceFeature, MultiDeviceFeatureState, MultiDeviceSettingsMode, PhoneHubFeatureAccessStatus, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
index f461c61..45e3d72 100644
--- a/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/multidevice_wifi_sync_item_tests.js
@@ -5,7 +5,7 @@
 import {OsSyncBrowserProxyImpl, SyncBrowserProxyImpl} from 'chrome://os-settings/chromeos/os_settings.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 import {assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
index 516a0be..cdb1de3 100644
--- a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
@@ -4,7 +4,7 @@
 
 import {NearbyAccountManagerBrowserProxyImpl, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting} from 'chrome://os-settings/chromeos/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals} from '../../chai_assert.js';
 import {FakeContactManager} from '../../nearby_share/shared/fake_nearby_contact_manager.js';
diff --git a/chrome/test/data/webui/settings/chromeos/network_always_on_vpn_test.js b/chrome/test/data/webui/settings/chromeos/network_always_on_vpn_test.js
index 61f24f2..cb3a135 100644
--- a/chrome/test/data/webui/settings/chromeos/network_always_on_vpn_test.js
+++ b/chrome/test/data/webui/settings/chromeos/network_always_on_vpn_test.js
@@ -6,11 +6,11 @@
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {AlwaysOnVpnMode} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkAlwaysOnVpn', function() {
+  const mojom = chromeos.networkConfig.mojom;
+
   /** @type {!NetworkAlwaysOnVpnElement|undefined} */
   let alwaysOnVpnOptions;
 
@@ -82,7 +82,7 @@
   }
 
   /**
-   * @param {!AlwaysOnVpnMode} mode
+   * @param {!chromeos.networkConfig.mojom.AlwaysOnVpnMode} mode
    * @param {!string} service
    * @private
    */
@@ -100,8 +100,8 @@
   function addVpnNetworks() {
     assert(alwaysOnVpnOptions);
     alwaysOnVpnOptions.networks = [
-      OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn1'),
-      OncMojo.getDefaultNetworkState(NetworkType.kVPN, 'vpn2'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn1'),
+      OncMojo.getDefaultNetworkState(mojom.NetworkType.kVPN, 'vpn2'),
     ];
     return flushAsync();
   }
@@ -111,7 +111,7 @@
         document.createElement('network-always-on-vpn');
     assert(alwaysOnVpnOptions);
     alwaysOnVpnOptions.networks = [];
-    alwaysOnVpnOptions.mode = AlwaysOnVpnMode.kOff;
+    alwaysOnVpnOptions.mode = mojom.AlwaysOnVpnMode.kOff;
     alwaysOnVpnOptions.service = '';
     document.body.appendChild(alwaysOnVpnOptions);
     flush();
@@ -136,7 +136,7 @@
   });
 
   test('Mode best-effort with available networks', () => {
-    return setConfiguration(AlwaysOnVpnMode.kBestEffort, '')
+    return setConfiguration(mojom.AlwaysOnVpnMode.kBestEffort, '')
         .then(addVpnNetworks)
         .then(() => {
           const enableToggle = getEnableToggle();
@@ -153,7 +153,7 @@
   });
 
   test('Mode strict with available networks', () => {
-    return setConfiguration(AlwaysOnVpnMode.kStrict, '')
+    return setConfiguration(mojom.AlwaysOnVpnMode.kStrict, '')
         .then(addVpnNetworks)
         .then(() => {
           const enableToggle = getEnableToggle();
@@ -170,7 +170,7 @@
   });
 
   test('Mode best-effort with a selected network', () => {
-    return setConfiguration(AlwaysOnVpnMode.kBestEffort, 'vpn1_guid')
+    return setConfiguration(mojom.AlwaysOnVpnMode.kBestEffort, 'vpn1_guid')
         .then(addVpnNetworks)
         .then(() => {
           // Best-effort mode
@@ -181,7 +181,7 @@
   });
 
   test('Mode best-effort: options count in the services menu', () => {
-    return setConfiguration(AlwaysOnVpnMode.kBestEffort, '')
+    return setConfiguration(mojom.AlwaysOnVpnMode.kBestEffort, '')
         .then(addVpnNetworks)
         .then(() => {
           // No service is selected, the menu contains a blank item (the
@@ -189,7 +189,8 @@
           assertEquals(3, getServiceSelect().options.length);
         })
         .then(() => {
-          return setConfiguration(AlwaysOnVpnMode.kBestEffort, 'vpn1_guid');
+          return setConfiguration(
+              mojom.AlwaysOnVpnMode.kBestEffort, 'vpn1_guid');
         })
         .then(() => {
           // A services is select, the placeholder is not required, there's only
@@ -200,7 +201,7 @@
 
   test('Always-on VPN without service', () => {
     return addVpnNetworks().then(() => click(getEnableToggle())).then(() => {
-      assertEquals(AlwaysOnVpnMode.kBestEffort, alwaysOnVpnOptions.mode);
+      assertEquals(mojom.AlwaysOnVpnMode.kBestEffort, alwaysOnVpnOptions.mode);
       assertEquals('', alwaysOnVpnOptions.service);
     });
   });
@@ -210,7 +211,7 @@
         .then(() => click(getEnableToggle()))
         .then(() => click(getLockdownToggle()))
         .then(() => {
-          assertEquals(AlwaysOnVpnMode.kStrict, alwaysOnVpnOptions.mode);
+          assertEquals(mojom.AlwaysOnVpnMode.kStrict, alwaysOnVpnOptions.mode);
           assertEquals('', alwaysOnVpnOptions.service);
         });
   });
@@ -220,7 +221,8 @@
         .then(() => click(getEnableToggle()))
         .then(() => select(getServiceSelect(), 'vpn2_guid'))
         .then(() => {
-          assertEquals(AlwaysOnVpnMode.kBestEffort, alwaysOnVpnOptions.mode);
+          assertEquals(
+              mojom.AlwaysOnVpnMode.kBestEffort, alwaysOnVpnOptions.mode);
           assertEquals('vpn2_guid', alwaysOnVpnOptions.service);
         });
   });
diff --git a/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js b/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js
index b992c4ea..f6b1b67 100644
--- a/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js
+++ b/chrome/test/data/webui/settings/chromeos/network_proxy_section_test.js
@@ -4,7 +4,6 @@
 
 import 'chrome://os-settings/chromeos/os_settings.js';
 
-import {OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 suite('NetworkProxySection', function() {
@@ -36,31 +35,33 @@
   });
 
   test('Visibility of Allow Shared toggle', function() {
+    const mojom = chromeos.networkConfig.mojom;
+
     const allowSharedToggle = proxySection.$.allowShared;
     assertTrue(!!allowSharedToggle);
 
     proxySection.managedProperties = {
-      source: OncSource.kNone,
+      source: mojom.OncSource.kNone,
     };
     assertTrue(allowSharedToggle.hidden);
 
     proxySection.managedProperties = {
-      source: OncSource.kDevice,
+      source: mojom.OncSource.kDevice,
     };
     assertFalse(allowSharedToggle.hidden);
 
     proxySection.managedProperties = {
-      source: OncSource.kDevicePolicy,
+      source: mojom.OncSource.kDevicePolicy,
     };
     assertFalse(allowSharedToggle.hidden);
 
     proxySection.managedProperties = {
-      source: OncSource.kUser,
+      source: mojom.OncSource.kUser,
     };
     assertTrue(allowSharedToggle.hidden);
 
     proxySection.managedProperties = {
-      source: OncSource.kUserPolicy,
+      source: mojom.OncSource.kUserPolicy,
     };
     assertTrue(allowSharedToggle.hidden);
   });
diff --git a/chrome/test/data/webui/settings/chromeos/network_summary_item_test.js b/chrome/test/data/webui/settings/chromeos/network_summary_item_test.js
index 6a7d4bc..1e3635e5 100644
--- a/chrome/test/data/webui/settings/chromeos/network_summary_item_test.js
+++ b/chrome/test/data/webui/settings/chromeos/network_summary_item_test.js
@@ -4,10 +4,8 @@
 
 import 'chrome://os-settings/chromeos/os_settings.js';
 
-import {InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 suite('NetworkSummaryItem', function() {
   /** @type {!NetworkSummaryItemElement|undefined} */
@@ -21,22 +19,23 @@
   }
 
   function initWithPSimOnly(isLocked) {
+    const mojom = chromeos.networkConfig.mojom;
     const kTestIccid1 = '00000000000000000000';
 
     const simLockStatus = isLocked ? {lockType: 'sim-pin'} : {lockType: ''};
 
     netSummaryItem.setProperties({
       deviceState: {
-        deviceState: DeviceStateType.kEnabled,
-        type: NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kCellular,
         simAbsent: false,
         simLockStatus: simLockStatus,
         simInfos: [{slot_id: 1, eid: '', iccid: kTestIccid1, isPrimary: true}],
       },
       activeNetworkState: {
-        connectionState: ConnectionStateType.kNotConnected,
+        connectionState: mojom.ConnectionStateType.kNotConnected,
         guid: '',
-        type: NetworkType.kCellular,
+        type: mojom.NetworkType.kCellular,
         typeState: {cellular: {networkTechnology: ''}},
       },
     });
@@ -45,21 +44,22 @@
   }
 
   function initWithESimLocked() {
+    const mojom = chromeos.networkConfig.mojom;
     const kTestIccid1 = '00000000000000000000';
 
     netSummaryItem.setProperties({
       deviceState: {
-        deviceState: DeviceStateType.kEnabled,
-        type: NetworkType.kCellular,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kCellular,
         simAbsent: false,
         simLockStatus: {lockType: 'sim-pin'},
         simInfos:
             [{slot_id: 1, eid: 'eid', iccid: kTestIccid1, isPrimary: true}],
       },
       activeNetworkState: {
-        connectionState: ConnectionStateType.kNotConnected,
+        connectionState: mojom.ConnectionStateType.kNotConnected,
         guid: '',
-        type: NetworkType.kCellular,
+        type: mojom.NetworkType.kCellular,
         typeState: {cellular: {networkTechnology: ''}},
       },
     });
@@ -75,15 +75,17 @@
   });
 
   test('Device enabled button state', function() {
+    const mojom = chromeos.networkConfig.mojom;
+
     netSummaryItem.setProperties({
       deviceState: {
-        deviceState: DeviceStateType.kUninitialized,
-        type: NetworkType.kEthernet,
+        deviceState: mojom.DeviceStateType.kUninitialized,
+        type: mojom.NetworkType.kEthernet,
       },
       activeNetworkState: {
-        connectionState: ConnectionStateType.kNotConnected,
+        connectionState: mojom.ConnectionStateType.kNotConnected,
         guid: '',
-        type: NetworkType.kEthernet,
+        type: mojom.NetworkType.kEthernet,
       },
     });
 
@@ -91,38 +93,38 @@
     assertFalse(doesElementExist('#deviceEnabledButton'));
 
     netSummaryItem.deviceState = {
-      deviceState: DeviceStateType.kUninitialized,
-      type: NetworkType.kVPN,
+      deviceState: mojom.DeviceStateType.kUninitialized,
+      type: mojom.NetworkType.kVPN,
     };
     flush();
     assertFalse(doesElementExist('#deviceEnabledButton'));
 
     netSummaryItem.deviceState = {
-      deviceState: DeviceStateType.kUninitialized,
-      type: NetworkType.kTether,
+      deviceState: mojom.DeviceStateType.kUninitialized,
+      type: mojom.NetworkType.kTether,
     };
     flush();
     assertTrue(doesElementExist('#deviceEnabledButton'));
 
     netSummaryItem.deviceState = {
-      deviceState: DeviceStateType.kUninitialized,
-      type: NetworkType.kWiFi,
+      deviceState: mojom.DeviceStateType.kUninitialized,
+      type: mojom.NetworkType.kWiFi,
     };
     flush();
     assertFalse(doesElementExist('#deviceEnabledButton'));
 
     netSummaryItem.setProperties({
       activeNetworkState: {
-        connectionState: ConnectionStateType.kConnected,
+        connectionState: mojom.ConnectionStateType.kConnected,
         guid: '',
-        type: NetworkType.kWiFi,
+        type: mojom.NetworkType.kWiFi,
         typeState: {
           wifi: {},
         },
       },
       deviceState: {
-        deviceState: DeviceStateType.kEnabled,
-        type: NetworkType.kWiFi,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kWiFi,
       },
     });
     flush();
@@ -130,17 +132,19 @@
   });
 
   test('Inhibited device on cellular network', function() {
+    const mojom = chromeos.networkConfig.mojom;
+
     netSummaryItem.setProperties({
       deviceState: {
-        inhibitReason: InhibitReason.kInstallingProfile,
-        deviceState: DeviceStateType.kEnabled,
-        type: NetworkType.kCellular,
+        inhibitReason: mojom.InhibitReason.kInstallingProfile,
+        deviceState: mojom.DeviceStateType.kEnabled,
+        type: mojom.NetworkType.kCellular,
         simAbsent: false,
       },
       activeNetworkState: {
-        connectionState: ConnectionStateType.kNotConnected,
+        connectionState: mojom.ConnectionStateType.kNotConnected,
         guid: '',
-        type: NetworkType.kCellular,
+        type: mojom.NetworkType.kCellular,
         typeState: {cellular: {networkTechnology: ''}},
       },
     });
@@ -156,17 +160,19 @@
   });
 
   test('Not inhibited device on cellular network', function() {
+    const mojom = chromeos.networkConfig.mojom;
+
     netSummaryItem.setProperties({
       deviceState: {
-        inhibitReason: InhibitReason.kNotInhibited,
-        deviceState: DeviceStateType.kUnavailable,
-        type: NetworkType.kCellular,
+        inhibitReason: mojom.InhibitReason.kNotInhibited,
+        deviceState: mojom.DeviceStateType.kUnavailable,
+        type: mojom.NetworkType.kCellular,
         simAbsent: false,
       },
       activeNetworkState: {
-        connectionState: ConnectionStateType.kNotConnected,
+        connectionState: mojom.ConnectionStateType.kNotConnected,
         guid: '',
-        type: NetworkType.kCellular,
+        type: mojom.NetworkType.kCellular,
         typeState: {cellular: {networkTechnology: ''}},
       },
     });
@@ -218,6 +224,8 @@
   test(
       'Show networks list when only 1 pSIM network is available',
       async function() {
+        const mojom = chromeos.networkConfig.mojom;
+
         const showNetworksFiredPromise =
             eventToPromise('show-networks', netSummaryItem);
 
@@ -226,17 +234,17 @@
 
         netSummaryItem.setProperties({
           deviceState: {
-            deviceState: DeviceStateType.kEnabled,
-            type: NetworkType.kCellular,
+            deviceState: mojom.DeviceStateType.kEnabled,
+            type: mojom.NetworkType.kCellular,
             simAbsent: false,
-            inhibitReason: InhibitReason.kNotInhibited,
+            inhibitReason: mojom.InhibitReason.kNotInhibited,
             simLockStatus: {lockEnabled: false},
             simInfos: simInfos,
           },
           activeNetworkState: {
-            connectionState: ConnectionStateType.kNotConnected,
+            connectionState: mojom.ConnectionStateType.kNotConnected,
             guid: '',
-            type: NetworkType.kCellular,
+            type: mojom.NetworkType.kCellular,
             typeState: {cellular: {networkTechnology: ''}},
           },
         });
diff --git a/chrome/test/data/webui/settings/chromeos/onc_mojo_test.js b/chrome/test/data/webui/settings/chromeos/onc_mojo_test.js
index 32d4a817..af529de33bb 100644
--- a/chrome/test/data/webui/settings/chromeos/onc_mojo_test.js
+++ b/chrome/test/data/webui/settings/chromeos/onc_mojo_test.js
@@ -3,7 +3,8 @@
 // found in the LICENSE file.
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
-import {SubjectAltName_Type} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+
+const mojom = chromeos.networkConfig.mojom;
 
 suite('OncMojoTest', () => {
   test('Serialize Domain Suffix Match', () => {
@@ -34,8 +35,8 @@
     assertEquals(OncMojo.serializeSubjectAltNameMatch([]), '');
     assertEquals(
         OncMojo.serializeSubjectAltNameMatch([
-          {type: SubjectAltName_Type.kEmail, value: 'test@example.com'},
-          {type: SubjectAltName_Type.kUri, value: 'http://test.com'},
+          {type: mojom.SubjectAltName_Type.kEmail, value: 'test@example.com'},
+          {type: mojom.SubjectAltName_Type.kUri, value: 'http://test.com'},
         ]),
         'EMAIL:test@example.com;URI:http://test.com');
   });
@@ -48,8 +49,8 @@
     expectEqualValues('', []);
     expectEqualValues('  ', []);
     expectEqualValues('EMAIL:test@example.com;uri:http://test.com', [
-      {type: SubjectAltName_Type.kEmail, value: 'test@example.com'},
-      {type: SubjectAltName_Type.kUri, value: 'http://test.com'},
+      {type: mojom.SubjectAltName_Type.kEmail, value: 'test@example.com'},
+      {type: mojom.SubjectAltName_Type.kUri, value: 'http://test.com'},
     ]);
     // Malformed SAN entry.
     assertEquals(
diff --git a/chrome/test/data/webui/settings/chromeos/os_a11y_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_a11y_page_tests.js
index 10270275..a174a3a 100644
--- a/chrome/test/data/webui/settings/chromeos/os_a11y_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_a11y_page_tests.js
@@ -5,10 +5,11 @@
 import 'chrome://os-settings/chromeos/lazy_load.js';
 
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-import {assertEquals} from '../../chai_assert.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
+
+import {assertEquals} from '../../chai_assert.js';
 
 suite('A11yPageTests', function() {
   /** @type {SettingsA11yPageElement} */
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
index 187fe14..38cdf1f 100644
--- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -8,7 +8,7 @@
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {TestAboutPageBrowserProxyChromeOS} from './test_about_page_browser_proxy_chromeos.js';
 import {TestDeviceNameBrowserProxy} from './test_device_name_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js
index a04618dc..e27b425 100644
--- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_device_detail_subpage_tests.js
@@ -9,7 +9,7 @@
 import {AudioOutputCapability, BluetoothSystemProperties, DeviceConnectionState, DeviceType, SystemPropertiesObserverInterface} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice, FakeBluetoothConfig} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise, waitBeforeNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_devices_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_devices_subpage_tests.js
index 5165103..83432daf 100644
--- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_devices_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_devices_subpage_tests.js
@@ -10,7 +10,7 @@
 import {BluetoothSystemProperties, BluetoothSystemState, DeviceConnectionState, SystemPropertiesObserverInterface} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice, FakeBluetoothConfig} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise, isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertNotEquals, assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_pairing_dialog_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_pairing_dialog_tests.js
index 22fc8472..e58f5d7a 100644
--- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_pairing_dialog_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_pairing_dialog_tests.js
@@ -8,7 +8,7 @@
 import {setBluetoothConfigForTesting} from 'chrome://resources/cr_components/chromeos/bluetooth/cros_bluetooth_config.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeBluetoothConfig} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_bluetooth_summary_tests.js b/chrome/test/data/webui/settings/chromeos/os_bluetooth_summary_tests.js
index 41b979c..07cddd3 100644
--- a/chrome/test/data/webui/settings/chromeos/os_bluetooth_summary_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_bluetooth_summary_tests.js
@@ -10,7 +10,7 @@
 import {BluetoothSystemProperties, BluetoothSystemState, DeviceConnectionState, SystemPropertiesObserverInterface} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice, FakeBluetoothConfig} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise, waitBeforeNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertNotEquals, assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_files_page_test.js b/chrome/test/data/webui/settings/chromeos/os_files_page_test.js
index 3284e077..75fbb06 100644
--- a/chrome/test/data/webui/settings/chromeos/os_files_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_files_page_test.js
@@ -8,7 +8,7 @@
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_languages_page_v2_tests.js b/chrome/test/data/webui/settings/chromeos/os_languages_page_v2_tests.js
index 3af6ccc..b0ce6d7 100644
--- a/chrome/test/data/webui/settings/chromeos/os_languages_page_v2_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_languages_page_v2_tests.js
@@ -8,7 +8,7 @@
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {keyDownOn} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {fakeDataBind} from '../../test_util.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js b/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js
index 12be2aef..adf2211b 100644
--- a/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_item_tests.js
@@ -8,7 +8,7 @@
 import {AudioOutputCapability, DeviceConnectionState, DeviceType} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_tests.js b/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_tests.js
index 05224d0..b0ae33c 100644
--- a/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_paired_bluetooth_list_tests.js
@@ -8,7 +8,7 @@
 import {DeviceConnectionState} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page_test.js b/chrome/test/data/webui/settings/chromeos/os_people_page_test.js
index 284813bc..70c4545 100644
--- a/chrome/test/data/webui/settings/chromeos/os_people_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_people_page_test.js
@@ -8,7 +8,7 @@
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {TestProfileInfoBrowserProxy} from 'chrome://test/settings/chromeos/test_profile_info_browser_proxy.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js
index b81193a..b741342 100644
--- a/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_printing_page_tests.js
@@ -7,7 +7,7 @@
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {flushTasks, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js b/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
index d5737de..5164e22 100644
--- a/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_privacy_page_test.js
@@ -9,7 +9,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js b/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js
index 46ef3db..f73704a 100644
--- a/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js
@@ -8,7 +8,7 @@
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeESimManagerRemote} from 'chrome://test/cr_components/chromeos/cellular_setup/fake_esim_manager_remote.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js b/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js
index 1eb9870..d9bd247 100644
--- a/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_saved_devices_list_tests.js
@@ -9,7 +9,7 @@
 import {DeviceConnectionState} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise, isVisible} from 'chrome://test/test_util.js';
+import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_saved_devices_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/os_saved_devices_subpage_tests.js
index b1bc43b..afe6aa5 100644
--- a/chrome/test/data/webui/settings/chromeos/os_saved_devices_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_saved_devices_subpage_tests.js
@@ -10,7 +10,7 @@
 import {DeviceConnectionState} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {createDefaultBluetoothDevice} from 'chrome://test/cr_components/chromeos/bluetooth/fake_bluetooth_config.js';
-import {eventToPromise, isVisible, waitAfterNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, isVisible, waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 import {flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertGT, assertTrue} from '../../../chai_assert.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_search_page_test.js b/chrome/test/data/webui/settings/chromeos/os_search_page_test.js
index 4995170..8b5de8d 100644
--- a/chrome/test/data/webui/settings/chromeos/os_search_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_search_page_test.js
@@ -5,7 +5,7 @@
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js
index eceebc6a..5195ef9 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js
@@ -5,7 +5,7 @@
 import {OpenWindowProxyImpl, personalizationSearchMojomWebui, Router, routes, routesMojomWebui, searchMojomWebui, searchResultIconMojomWebui, setPersonalizationSearchHandlerForTesting, setSettingsSearchHandlerForTesting, settingMojomWebui, setUserActionRecorderForTesting, userActionRecorderMojomWebui} from 'chrome://os-settings/chromeos/os_settings.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {assertDeepEquals, assertEquals, assertFalse, assertNotEquals, assertTrue} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js
index 70e50af..ab1fdb8 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui_test.js
@@ -5,7 +5,7 @@
 import {CrSettingsPrefs} from 'chrome://os-settings/chromeos/os_settings.js';
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, flushTasks} from 'chrome://test/test_util.js';
+import {eventToPromise, flushTasks} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js b/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js
index dda1ffc6..7a2b379 100644
--- a/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js
+++ b/chrome/test/data/webui/settings/chromeos/people_page_account_manager_test.js
@@ -6,7 +6,7 @@
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js b/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js
index ebab554..6a1757c 100644
--- a/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js
+++ b/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js
@@ -4,7 +4,7 @@
 
 import {PersonalizationHubBrowserProxyImpl, Router} from 'chrome://os-settings/chromeos/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/privacy_hub_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/privacy_hub_subpage_tests.js
index b12a793..3353cd5e 100644
--- a/chrome/test/data/webui/settings/chromeos/privacy_hub_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/privacy_hub_subpage_tests.js
@@ -11,7 +11,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertNotReached} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/search_subpage_test.js b/chrome/test/data/webui/settings/chromeos/search_subpage_test.js
index 5d2d52ca..d87f752 100644
--- a/chrome/test/data/webui/settings/chromeos/search_subpage_test.js
+++ b/chrome/test/data/webui/settings/chromeos/search_subpage_test.js
@@ -5,7 +5,7 @@
 import {CrSettingsPrefs, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/settings_traffic_counters_test.js b/chrome/test/data/webui/settings/chromeos/settings_traffic_counters_test.js
index 1d515c9..34fbab1 100644
--- a/chrome/test/data/webui/settings/chromeos/settings_traffic_counters_test.js
+++ b/chrome/test/data/webui/settings/chromeos/settings_traffic_counters_test.js
@@ -5,9 +5,10 @@
 // clang-format off
 import 'chrome://os-settings/chromeos/os_settings.js';
 
-import { ConnectionStateType, NetworkType } from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
+import {CrosNetworkConfig} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
 
@@ -187,15 +188,18 @@
 
     // Remove default network.
     networkConfigRemote_.setNetworkConnectionStateForTest(
-        'eth0_guid', ConnectionStateType.kNotConnected);
+        'eth0_guid',
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected);
     flush();
   });
 
   test('Missing friendly date info', async function() {
     // Set managed properties for a connected cellular network.
     const managedProperties = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_guid', 'cellular');
-    managedProperties.connectionState = ConnectionStateType.kConnected;
+        chromeos.networkConfig.mojom.NetworkType.kCellular, 'cellular_guid',
+        'cellular');
+    managedProperties.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     managedProperties.connectable = true;
     managedProperties.trafficCounterProperties.autoReset = true;
     managedProperties.trafficCounterProperties.userSpecifiedResetDay = 31;
@@ -221,8 +225,10 @@
   test('Show traffic counter info', async function() {
     // Set managed properties for a connected cellular network.
     const managedProperties = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_guid', 'cellular');
-    managedProperties.connectionState = ConnectionStateType.kConnected;
+        chromeos.networkConfig.mojom.NetworkType.kCellular, 'cellular_guid',
+        'cellular');
+    managedProperties.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     managedProperties.connectable = true;
     managedProperties.trafficCounterProperties.lastResetTime =
         FAKE_INITIAL_LAST_RESET_TIME;
@@ -288,8 +294,10 @@
   test('Enable traffic counters auto reset', async function() {
     // Disable auto reset initially.
     const managedProperties = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, 'cellular_guid', 'cellular');
-    managedProperties.connectionState = ConnectionStateType.kConnected;
+        chromeos.networkConfig.mojom.NetworkType.kCellular, 'cellular_guid',
+        'cellular');
+    managedProperties.connectionState =
+        chromeos.networkConfig.mojom.ConnectionStateType.kConnected;
     managedProperties.connectable = true;
     managedProperties.trafficCounterProperties.autoReset = false;
     managedProperties.trafficCounterProperties.userSpecifiedResetDay = null;
diff --git a/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js b/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
index 4b38a4e..a6404e30 100644
--- a/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/smart_inputs_page_test.js
@@ -3,10 +3,11 @@
 // found in the LICENSE file.
 
 import 'chrome://os-settings/chromeos/lazy_load.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 let smartInputsPage;
 
diff --git a/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js
index c829169..4afae8b 100644
--- a/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/switch_access_subpage_tests.js
@@ -9,7 +9,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertDeepEquals, assertEquals} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
diff --git a/chrome/test/data/webui/settings/chromeos/test_kerberos_accounts_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/test_kerberos_accounts_browser_proxy.js
index 5eda218..97e105b9 100644
--- a/chrome/test/data/webui/settings/chromeos/test_kerberos_accounts_browser_proxy.js
+++ b/chrome/test/data/webui/settings/chromeos/test_kerberos_accounts_browser_proxy.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 import {KerberosConfigErrorCode, KerberosErrorType} from 'chrome://os-settings/chromeos/os_settings.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 // List of fake accounts.
 export const TEST_KERBEROS_ACCOUNTS = [
diff --git a/chrome/test/data/webui/settings/chromeos/text_to_speech_page_tests.js b/chrome/test/data/webui/settings/chromeos/text_to_speech_page_tests.js
index 9238511b..0e7d34c 100644
--- a/chrome/test/data/webui/settings/chromeos/text_to_speech_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/text_to_speech_page_tests.js
@@ -6,7 +6,7 @@
 
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {eventToPromise, isVisible, waitAfterNextRender, waitBeforeNextRender} from 'chrome://test/test_util.js';
+import {eventToPromise, isVisible, waitAfterNextRender, waitBeforeNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/text_to_speech_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/text_to_speech_subpage_tests.js
index f53fdce..c35791c7d 100644
--- a/chrome/test/data/webui/settings/chromeos/text_to_speech_subpage_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/text_to_speech_subpage_tests.js
@@ -4,11 +4,12 @@
 
 import 'chrome://os-settings/chromeos/lazy_load.js';
 
-import {TtsSubpageBrowserProxyImpl, Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
-import {flush} from'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {assertEquals} from '../../chai_assert.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {Router, routes, TtsSubpageBrowserProxyImpl} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
+
+import {assertEquals} from '../../chai_assert.js';
 import {TestBrowserProxy} from '../../test_browser_proxy.js';
 
 /**
diff --git a/chrome/test/data/webui/settings/chromeos/timezone_subpage_test.js b/chrome/test/data/webui/settings/chromeos/timezone_subpage_test.js
index 08efd2d..dd01af0 100644
--- a/chrome/test/data/webui/settings/chromeos/timezone_subpage_test.js
+++ b/chrome/test/data/webui/settings/chromeos/timezone_subpage_test.js
@@ -8,7 +8,7 @@
 import {assert} from 'chrome://resources/js/assert.m.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {assertEquals} from '../../chai_assert.js';
 
diff --git a/chrome/test/data/webui/settings/chromeos/user_page_tests.js b/chrome/test/data/webui/settings/chromeos/user_page_tests.js
index d5db5d3..4947f9e 100644
--- a/chrome/test/data/webui/settings/chromeos/user_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/user_page_tests.js
@@ -5,7 +5,7 @@
 import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
 import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {waitAfterNextRender} from 'chrome://test/test_util.js';
+import {waitAfterNextRender} from 'chrome://webui-test/test_util.js';
 
 import {FakeUsersPrivate} from './fake_users_private.js';
 
diff --git a/chrome/test/data/webui/usb_internals_test.js b/chrome/test/data/webui/usb_internals_test.js
index 2b0c25f7..7c29fc00 100644
--- a/chrome/test/data/webui/usb_internals_test.js
+++ b/chrome/test/data/webui/usb_internals_test.js
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import 'chrome://test/mojo_webui_test_support.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
 
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
 import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
-import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.js';
-import {eventToPromise} from 'chrome://test/test_util.js';
 import {setSetupFn} from 'chrome://usb-internals/app.js';
 import {UsbControlTransferParams, UsbControlTransferRecipient, UsbControlTransferType, UsbDeviceCallbackRouter, UsbDeviceRemote, UsbOpenDeviceError, UsbTransferStatus} from 'chrome://usb-internals/usb_device.mojom-webui.js';
 import {UsbInternalsPageHandler, UsbInternalsPageHandlerReceiver, UsbInternalsPageHandlerRemote} from 'chrome://usb-internals/usb_internals.mojom-webui.js';
 import {UsbDeviceManagerReceiver, UsbDeviceManagerRemote} from 'chrome://usb-internals/usb_manager.mojom-webui.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 /** @implements {UsbInternalsPageHandlerRemote} */
 class FakePageHandlerRemote extends TestBrowserProxy {
diff --git a/chrome/test/media_router/media_router_cast_ui_for_test.cc b/chrome/test/media_router/media_router_cast_ui_for_test.cc
index 2f96da0..8b015f9 100644
--- a/chrome/test/media_router/media_router_cast_ui_for_test.cc
+++ b/chrome/test/media_router/media_router_cast_ui_for_test.cc
@@ -5,6 +5,7 @@
 #include "chrome/test/media_router/media_router_cast_ui_for_test.h"
 
 #include "base/memory/raw_ptr.h"
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/ui/media_router/media_router_ui.h"
@@ -139,29 +140,29 @@
 
   const std::vector<CastDialogSinkButton*>& sink_buttons =
       dialog_view->sink_buttons_for_test();
-  if (std::find_if(sink_buttons.begin(), sink_buttons.end(),
-                   [&, this](CastDialogSinkButton* sink_button) {
-                     switch (watch_type_) {
-                       case WatchType::kSink:
-                         return sink_button->sink().friendly_name ==
-                                base::UTF8ToUTF16(*watch_sink_name_);
-                       case WatchType::kSinkAvailable:
-                         return sink_button->sink().friendly_name ==
-                                    base::UTF8ToUTF16(*watch_sink_name_) &&
-                                sink_button->sink().state ==
-                                    UIMediaSinkState::AVAILABLE &&
-                                sink_button->GetEnabled();
-                       case WatchType::kAnyIssue:
-                         return sink_button->sink().issue.has_value();
-                       case WatchType::kAnyRoute:
-                         return sink_button->sink().route.has_value();
-                       case WatchType::kNone:
-                       case WatchType::kDialogShown:
-                       case WatchType::kDialogHidden:
-                         NOTREACHED() << "Invalid WatchType";
-                         return false;
-                     }
-                   }) != sink_buttons.end()) {
+  if (base::ranges::any_of(
+          sink_buttons, [&, this](CastDialogSinkButton* sink_button) {
+            switch (watch_type_) {
+              case WatchType::kSink:
+                return sink_button->sink().friendly_name ==
+                       base::UTF8ToUTF16(*watch_sink_name_);
+              case WatchType::kSinkAvailable:
+                return sink_button->sink().friendly_name ==
+                           base::UTF8ToUTF16(*watch_sink_name_) &&
+                       sink_button->sink().state ==
+                           UIMediaSinkState::AVAILABLE &&
+                       sink_button->GetEnabled();
+              case WatchType::kAnyIssue:
+                return sink_button->sink().issue.has_value();
+              case WatchType::kAnyRoute:
+                return sink_button->sink().route.has_value();
+              case WatchType::kNone:
+              case WatchType::kDialogShown:
+              case WatchType::kDialogHidden:
+                NOTREACHED() << "Invalid WatchType";
+                return false;
+            }
+          })) {
     std::move(*watch_callback_).Run();
     watch_callback_.reset();
     watch_sink_name_.reset();
diff --git a/chrome/test/media_router/media_router_ui_for_test_base.cc b/chrome/test/media_router/media_router_ui_for_test_base.cc
index 7ee6adf..df24bfa22 100644
--- a/chrome/test/media_router/media_router_ui_for_test_base.cc
+++ b/chrome/test/media_router/media_router_ui_for_test_base.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/test/media_router/media_router_ui_for_test_base.h"
 
+#include "base/ranges/algorithm.h"
 #include "base/run_loop.h"
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "components/media_router/browser/media_router_factory.h"
@@ -84,11 +85,10 @@
 CastDialogSinkButton* MediaRouterUiForTestBase::GetSinkButtonWithName(
     const std::vector<CastDialogSinkButton*>& sink_buttons,
     const std::string& sink_name) {
-  auto it = std::find_if(sink_buttons.begin(), sink_buttons.end(),
-                         [sink_name](CastDialogSinkButton* sink_button) {
-                           return sink_button->sink().friendly_name ==
-                                  base::UTF8ToUTF16(sink_name);
-                         });
+  auto it = base::ranges::find(sink_buttons, base::UTF8ToUTF16(sink_name),
+                               [](CastDialogSinkButton* sink_button) {
+                                 return sink_button->sink().friendly_name;
+                               });
   if (it == sink_buttons.end()) {
     NOTREACHED() << "Sink button not found for sink: " << sink_name;
     return nullptr;
diff --git a/chrome/updater/win/manifest_util.cc b/chrome/updater/win/manifest_util.cc
index 1f586f5..360dea8 100644
--- a/chrome/updater/win/manifest_util.cc
+++ b/chrome/updater/win/manifest_util.cc
@@ -100,11 +100,9 @@
   install_args = it->manifest.arguments;
 
   if (!install_data_index.empty()) {
-    auto data_iter = base::ranges::find_if(
-        it->data, [&install_data_index](
-                      const update_client::ProtocolParser::Result::Data& data) {
-          return install_data_index == data.install_data_index;
-        });
+    auto data_iter = base::ranges::find(
+        it->data, install_data_index,
+        &update_client::ProtocolParser::Result::Data::install_data_index);
     if (data_iter == std::end(it->data)) {
       VLOG(2) << "Install data index not found: " << install_data_index;
       return;
diff --git a/chromeos/ash/components/network/cellular_connection_handler.cc b/chromeos/ash/components/network/cellular_connection_handler.cc
index 12aa36f..0ba6c4c 100644
--- a/chromeos/ash/components/network/cellular_connection_handler.cc
+++ b/chromeos/ash/components/network/cellular_connection_handler.cc
@@ -75,6 +75,9 @@
 }  // namespace
 
 // static
+const base::TimeDelta CellularConnectionHandler::kWaitingForAutoConnectTimeout =
+    base::Minutes(2);
+
 absl::optional<std::string> CellularConnectionHandler::ResultToErrorString(
     PrepareCellularConnectionResult result) {
   switch (result) {
@@ -216,7 +219,8 @@
 }
 
 void CellularConnectionHandler::CompleteConnectionAttempt(
-    PrepareCellularConnectionResult result) {
+    PrepareCellularConnectionResult result,
+    bool auto_connected) {
   DCHECK(state_ != ConnectionState::kIdle);
   DCHECK(!request_queue_.empty());
 
@@ -244,7 +248,7 @@
     std::move(metadata->error_callback)
         .Run(service_path, NetworkConnectionHandler::kErrorNotFound);
   } else {
-    std::move(metadata->success_callback).Run(service_path);
+    std::move(metadata->success_callback).Run(service_path, auto_connected);
   }
 
   ProcessRequestQueue();
@@ -322,14 +326,16 @@
     NET_LOG(ERROR) << "Could not find network for ICCID "
                    << *request_queue_.front()->iccid;
     CompleteConnectionAttempt(
-        PrepareCellularConnectionResult::kCouldNotFindNetworkWithIccid);
+        PrepareCellularConnectionResult::kCouldNotFindNetworkWithIccid,
+        /*auto_connected=*/false);
     return;
   }
 
   if (CanInitiateShillConnection(network_state)) {
     NET_LOG(USER) << "Cellular service with ICCID " << iccid
                   << " is connectable";
-    CompleteConnectionAttempt(PrepareCellularConnectionResult::kSuccess);
+    CompleteConnectionAttempt(PrepareCellularConnectionResult::kSuccess,
+                              /*auto_connected=*/false);
     return;
   }
 
@@ -362,7 +368,8 @@
 
   if (!inhibit_lock) {
     NET_LOG(ERROR) << "eSIM connection flow failed to inhibit scan";
-    CompleteConnectionAttempt(PrepareCellularConnectionResult::kInhibitFailed);
+    CompleteConnectionAttempt(PrepareCellularConnectionResult::kInhibitFailed,
+                              /*auto_connected=*/false);
     return;
   }
 
@@ -378,7 +385,8 @@
   if (!euicc_path) {
     NET_LOG(ERROR) << "eSIM connection flow could not find relevant EUICC";
     CompleteConnectionAttempt(
-        PrepareCellularConnectionResult::kCouldNotFindRelevantEuicc);
+        PrepareCellularConnectionResult::kCouldNotFindRelevantEuicc,
+        /*auto_connected=*/false);
     return;
   }
 
@@ -396,7 +404,8 @@
   if (!inhibit_lock) {
     NET_LOG(ERROR) << "eSIM connection flow failed to request profiles";
     CompleteConnectionAttempt(
-        PrepareCellularConnectionResult::kRefreshProfilesFailed);
+        PrepareCellularConnectionResult::kRefreshProfilesFailed,
+        /*auto_connected=*/false);
     return;
   }
 
@@ -412,7 +421,8 @@
   if (!profile_path) {
     NET_LOG(ERROR) << "eSIM connection flow could not find profile";
     CompleteConnectionAttempt(
-        PrepareCellularConnectionResult::kCouldNotFindRelevantESimProfile);
+        PrepareCellularConnectionResult::kCouldNotFindRelevantESimProfile,
+        /*auto_connected=*/false);
     return;
   }
 
@@ -436,10 +446,14 @@
   if (!success) {
     NET_LOG(ERROR) << "eSIM connection flow failed to enable profile";
     CompleteConnectionAttempt(
-        PrepareCellularConnectionResult::kEnableProfileFailed);
+        PrepareCellularConnectionResult::kEnableProfileFailed,
+        /*auto_connected=*/false);
     return;
   }
 
+  // kErrorAlreadyEnabled implies that the SIM profile was already enabled.
+  request_queue_.front()->did_connection_require_enabling_profile =
+      status == HermesResponseStatus::kSuccess;
   // Reset the inhibit_lock so that the device will be uninhibited
   // automatically.
   request_queue_.front()->inhibit_lock.reset();
@@ -452,12 +466,23 @@
     CheckForConnectable();
 }
 
+void CellularConnectionHandler::NetworkConnectionStateChanged(
+    const NetworkState* network) {
+  if (state_ == ConnectionState::kWaitingForShillAutoConnect)
+    CheckForAutoConnected();
+}
+
 void CellularConnectionHandler::CheckForConnectable() {
   DCHECK_EQ(state_, ConnectionState::kWaitingForConnectable);
 
   const NetworkState* network_state = GetNetworkStateForCurrentOperation();
   if (network_state && CanInitiateShillConnection(network_state)) {
-    CompleteConnectionAttempt(PrepareCellularConnectionResult::kSuccess);
+    if (!request_queue_.front()->did_connection_require_enabling_profile) {
+      CompleteConnectionAttempt(PrepareCellularConnectionResult::kSuccess,
+                                /*auto_connected=*/false);
+    } else {
+      StartWaitingForShillAutoConnect();
+    }
     return;
   }
 
@@ -477,7 +502,45 @@
   NET_LOG(ERROR) << "Cellular connection timed out waiting for network to "
                     "become connectable";
   CompleteConnectionAttempt(
-      PrepareCellularConnectionResult::kTimeoutWaitingForConnectable);
+      PrepareCellularConnectionResult::kTimeoutWaitingForConnectable,
+      /*auto_connected=*/false);
+}
+
+void CellularConnectionHandler::StartWaitingForShillAutoConnect() {
+  // Stop the timer that wait for the network to become connectable.
+  if (timer_.IsRunning())
+    timer_.Stop();
+
+  TransitionToConnectionState(ConnectionState::kWaitingForShillAutoConnect);
+  CheckForAutoConnected();
+}
+
+void CellularConnectionHandler::CheckForAutoConnected() {
+  CHECK_EQ(state_, ConnectionState::kWaitingForShillAutoConnect);
+
+  const NetworkState* network_state = GetNetworkStateForCurrentOperation();
+  if (network_state && network_state->IsConnectedState()) {
+    CompleteConnectionAttempt(PrepareCellularConnectionResult::kSuccess,
+                              /*auto_connected=*/true);
+    return;
+  }
+
+  // If network hasn't autoconnected by Shill yet, start a timer and wait for
+  // the network to become connected.
+  if (!timer_.IsRunning()) {
+    timer_.Start(
+        FROM_HERE, kWaitingForAutoConnectTimeout,
+        base::BindOnce(&CellularConnectionHandler::OnWaitForAutoConnectTimeout,
+                       weak_ptr_factory_.GetWeakPtr()));
+  }
+}
+
+void CellularConnectionHandler::OnWaitForAutoConnectTimeout() {
+  DCHECK_EQ(state_, ConnectionState::kWaitingForShillAutoConnect);
+  NET_LOG(ERROR) << "Cellular connection timed out waiting for network to "
+                    "become auto connected";
+  CompleteConnectionAttempt(PrepareCellularConnectionResult::kSuccess,
+                            /*auto_connected=*/false);
 }
 
 std::ostream& operator<<(
@@ -503,6 +566,10 @@
     case CellularConnectionHandler::ConnectionState::kWaitingForConnectable:
       stream << "[Waiting for network to become connectable]";
       break;
+    case CellularConnectionHandler::ConnectionState::
+        kWaitingForShillAutoConnect:
+      stream << "[Waiting for network to become auto-connected]";
+      break;
   }
   return stream;
 }
diff --git a/chromeos/ash/components/network/cellular_connection_handler.h b/chromeos/ash/components/network/cellular_connection_handler.h
index f05d9dfa..733afb1 100644
--- a/chromeos/ash/components/network/cellular_connection_handler.h
+++ b/chromeos/ash/components/network/cellular_connection_handler.h
@@ -21,6 +21,10 @@
 
 namespace ash {
 
+namespace cellular_setup {
+class ESimTestBase;
+}
+
 class CellularESimProfileHandler;
 class CellularInhibitor;
 class NetworkState;
@@ -46,6 +50,7 @@
 //   (4) Enable the relevant profile.
 //   (5) Uninhibit cellular scans.
 //   (6) Wait until the associated NetworkState becomes connectable.
+//   (7) Wait until Shill auto connected if the sim slot is switched.
 //
 // Note that if this class receives multiple connection requests, it processes
 // them in FIFO order.
@@ -62,8 +67,10 @@
             CellularInhibitor* cellular_inhibitor,
             CellularESimProfileHandler* cellular_esim_profile_handler);
 
-  // Success callback which receives the network's service path as a parameter.
-  typedef base::OnceCallback<void(const std::string&)> SuccessCallback;
+  // Success callback which receives the network's service path as the first
+  // parameter and a boolean indicates whether the network is autoconnected
+  // as the second parameter.
+  typedef base::OnceCallback<void(const std::string&, bool)> SuccessCallback;
 
   // Error callback which receives the network's service path as the first
   // parameter and an error name as the second parameter. If no service path is
@@ -93,6 +100,11 @@
 
  private:
   friend class CellularConnectionHandlerTest;
+  friend class CellularESimInstallerTest;
+  friend class CellularPolicyHandlerTest;
+  friend class ManagedNetworkConfigurationHandlerTest;
+  friend class cellular_setup::ESimTestBase;
+
   FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, NoService);
   FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest,
                            ServiceAlreadyConnectable);
@@ -104,7 +116,10 @@
                            TimeoutWaitingForConnectable_ESim);
   FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest,
                            TimeoutWaitingForConnectable_PSim);
-  FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, Success);
+  FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest,
+                           Success_AutoConnected);
+  FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest,
+                           Success_TimeoutAutoConnected);
   FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest,
                            Success_AlreadyEnabled);
   FRIEND_TEST_ALL_PREFIXES(CellularConnectionHandlerTest, ConnectToStub);
@@ -127,6 +142,9 @@
     absl::optional<dbus::ObjectPath> euicc_path;
     absl::optional<dbus::ObjectPath> profile_path;
     std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock;
+    // A boolean indicating that if the connection switches the SIM profile and
+    // requires enabling the profile first.
+    bool did_connection_require_enabling_profile = false;
     SuccessCallback success_callback;
     ErrorCallback error_callback;
   };
@@ -137,7 +155,8 @@
     kInhibitingScans,
     kRequestingProfilesBeforeEnabling,
     kEnablingProfile,
-    kWaitingForConnectable
+    kWaitingForConnectable,
+    kWaitingForShillAutoConnect,
   };
   friend std::ostream& operator<<(std::ostream& stream,
                                   const ConnectionState& step);
@@ -155,6 +174,10 @@
     kTimeoutWaitingForConnectable = 7,
     kMaxValue = kTimeoutWaitingForConnectable
   };
+
+  // Timeout waiting for a cellular network to auto connect after switch
+  // profile.
+  static const base::TimeDelta kWaitingForAutoConnectTimeout;
   static absl::optional<std::string> ResultToErrorString(
       PrepareCellularConnectionResult result);
 
@@ -165,12 +188,15 @@
                                      const std::string& new_service_path,
                                      const std::string& old_guid,
                                      const std::string& new_guid) override;
+  void NetworkConnectionStateChanged(const NetworkState* network) override;
 
   void ProcessRequestQueue();
   void TransitionToConnectionState(ConnectionState state);
 
-  // Invokes the success or error callback, depending on |result|.
-  void CompleteConnectionAttempt(PrepareCellularConnectionResult result);
+  // Invokes the success or error callback, depending on |result| and
+  // |auto_connected|.
+  void CompleteConnectionAttempt(PrepareCellularConnectionResult result,
+                                 bool auto_connected);
 
   const NetworkState* GetNetworkStateForCurrentOperation() const;
   absl::optional<dbus::ObjectPath> GetEuiccPathForCurrentOperation() const;
@@ -193,6 +219,9 @@
   void HandleNetworkPropertiesUpdate();
   void CheckForConnectable();
   void OnWaitForConnectableTimeout();
+  void StartWaitingForShillAutoConnect();
+  void CheckForAutoConnected();
+  void OnWaitForAutoConnectTimeout();
 
   base::OneShotTimer timer_;
 
diff --git a/chromeos/ash/components/network/cellular_connection_handler_unittest.cc b/chromeos/ash/components/network/cellular_connection_handler_unittest.cc
index 49bd5a60..e97ec23a 100644
--- a/chromeos/ash/components/network/cellular_connection_handler_unittest.cc
+++ b/chromeos/ash/components/network/cellular_connection_handler_unittest.cc
@@ -114,6 +114,13 @@
     base::RunLoop().RunUntilIdle();
   }
 
+  void SetCellularServiceConnected(int profile_num) {
+    helper_.service_test()->SetServiceProperty(
+        CreateTestServicePath(profile_num), shill::kStateProperty,
+        base::Value(shill::kStateOnline));
+    base::RunLoop().RunUntilIdle();
+  }
+
   void ExpectServiceConnectable(int profile_num) {
     const NetworkState* network_state =
         helper_.network_state_handler()->GetNetworkState(
@@ -194,8 +201,10 @@
   }
 
   void ExpectSuccess(const std::string& expected_service_path,
-                     base::RunLoop* run_loop) {
+                     base::RunLoop* run_loop,
+                     bool auto_connected) {
     expected_service_path_ = expected_service_path;
+    expected_auto_connected_ = auto_connected;
     on_success_callback_ = run_loop->QuitClosure();
   }
 
@@ -236,8 +245,9 @@
   }
 
  private:
-  void OnSuccess(const std::string& service_path) {
+  void OnSuccess(const std::string& service_path, bool auto_connected) {
     EXPECT_EQ(expected_service_path_, service_path);
+    EXPECT_EQ(expected_auto_connected_, auto_connected);
     std::move(on_success_callback_).Run();
   }
 
@@ -260,6 +270,7 @@
   base::OnceClosure on_success_callback_;
   base::OnceClosure on_failure_callback_;
   std::string expected_service_path_;
+  bool expected_auto_connected_;
   std::string expected_error_name_;
 };
 
@@ -283,7 +294,8 @@
   SetServiceConnectable(/*profile_num=*/1);
 
   base::RunLoop run_loop;
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop,
+                /*auto_connected=*/false);
   CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1);
   run_loop.Run();
 
@@ -397,7 +409,7 @@
                    kTimeoutWaitingForConnectable);
 }
 
-TEST_F(CellularConnectionHandlerTest, Success) {
+TEST_F(CellularConnectionHandlerTest, Success_AutoConnected) {
   AddCellularDevice();
   AddEuicc(/*euicc_num=*/1);
   AddProfile(/*profile_num=*/1, /*euicc_num=*/1);
@@ -405,7 +417,29 @@
   SetServiceIccid(/*profile_num=*/1);
 
   base::RunLoop run_loop;
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop,
+                /*auto_connected=*/true);
+  CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1);
+  // Simulate the cellular network get connected after 10 seconds.
+  AdvanceClock(base::Seconds(10));
+  SetCellularServiceConnected(/*profile_num=*/1);
+  run_loop.Run();
+
+  ExpectServiceConnectable(/*profile_num=*/1);
+  ExpectResult(
+      CellularConnectionHandler::PrepareCellularConnectionResult::kSuccess);
+}
+
+TEST_F(CellularConnectionHandlerTest, Success_TimeoutAutoConnected) {
+  AddCellularDevice();
+  AddEuicc(/*euicc_num=*/1);
+  AddProfile(/*profile_num=*/1, /*euicc_num=*/1);
+  SetServiceEid(/*profile_num=*/1, /*euicc_num=*/1);
+  SetServiceIccid(/*profile_num=*/1);
+
+  base::RunLoop run_loop;
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop,
+                /*auto_connected=*/false);
   CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1);
   run_loop.Run();
 
@@ -425,7 +459,8 @@
   SetServiceIccid(/*profile_num=*/1);
 
   base::RunLoop run_loop;
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop,
+                /*auto_connected=*/false);
   CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1);
   SetServiceConnectable(/*profile_num=*/1);
   run_loop.Run();
@@ -445,7 +480,8 @@
   base::RunLoop run_loop;
   // Expect that by the end, we will connect to a "real" (i.e., non-stub)
   // service path.
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop,
+                /*auto_connected=*/false);
   CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1);
   base::RunLoop().RunUntilIdle();
 
@@ -473,7 +509,8 @@
   SetServiceIccid(/*profile_num=*/2);
 
   base::RunLoop run_loop1;
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop1);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop1,
+                /*auto_connected=*/false);
 
   // Start both operations.
   CallPrepareExistingCellularNetworkForConnection(/*profile_num=*/1);
@@ -484,7 +521,8 @@
   ExpectServiceConnectable(/*profile_num=*/1);
 
   base::RunLoop run_loop2;
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/2), &run_loop2);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/2), &run_loop2,
+                /*auto_connected=*/false);
 
   // Verify that the second service becomes connectable.
   run_loop2.Run();
@@ -501,9 +539,10 @@
   AddProfile(/*profile_num=*/1, /*euicc_num=*/1);
 
   base::RunLoop run_loop;
-  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop);
-  CallPrepareNewlyInstalledCellularNetworkForConnection(/*euicc_num=*/1,
-                                                        /*profile_num=*/1);
+  ExpectSuccess(CreateTestServicePath(/*profile_num=*/1), &run_loop,
+                /*auto_connected=*/false);
+  CallPrepareNewlyInstalledCellularNetworkForConnection(/*profile_num=*/1,
+                                                        /*euicc_num=*/1);
 
   // Verify that service corresponding to new profile becomes
   // connectable.
diff --git a/chromeos/ash/components/network/cellular_esim_installer.cc b/chromeos/ash/components/network/cellular_esim_installer.cc
index 0a87fed..7b027c0 100644
--- a/chromeos/ash/components/network/cellular_esim_installer.cc
+++ b/chromeos/ash/components/network/cellular_esim_installer.cc
@@ -298,7 +298,8 @@
 void CellularESimInstaller::OnPrepareCellularNetworkForConnectionSuccess(
     const dbus::ObjectPath& profile_path,
     InstallProfileFromActivationCodeCallback callback,
-    const std::string& service_path) {
+    const std::string& service_path,
+    bool auto_connected) {
   NET_LOG(EVENT) << "Successfully enabled installed profile on service path: "
                  << service_path;
   const NetworkState* network_state =
diff --git a/chromeos/ash/components/network/cellular_esim_installer.h b/chromeos/ash/components/network/cellular_esim_installer.h
index 68ff439..e60c328 100644
--- a/chromeos/ash/components/network/cellular_esim_installer.h
+++ b/chromeos/ash/components/network/cellular_esim_installer.h
@@ -96,6 +96,8 @@
                            InstallProfileConnectFailure);
   FRIEND_TEST_ALL_PREFIXES(CellularESimInstallerTest, InstallProfileSuccess);
   FRIEND_TEST_ALL_PREFIXES(CellularESimInstallerTest,
+                           InstallProfileAutoConnect);
+  FRIEND_TEST_ALL_PREFIXES(CellularESimInstallerTest,
                            InstallProfileViaQrCodeSuccess);
   FRIEND_TEST_ALL_PREFIXES(CellularESimInstallerTest,
                            InstallProfileAlreadyConnected);
@@ -153,7 +155,8 @@
   void OnPrepareCellularNetworkForConnectionSuccess(
       const dbus::ObjectPath& profile_path,
       InstallProfileFromActivationCodeCallback callback,
-      const std::string& service_path);
+      const std::string& service_path,
+      bool auto_connected);
   void OnPrepareCellularNetworkForConnectionFailure(
       const dbus::ObjectPath& profile_path,
       InstallProfileFromActivationCodeCallback callback,
diff --git a/chromeos/ash/components/network/cellular_esim_installer_unittest.cc b/chromeos/ash/components/network/cellular_esim_installer_unittest.cc
index a9f3f20..8872070 100644
--- a/chromeos/ash/components/network/cellular_esim_installer_unittest.cc
+++ b/chromeos/ash/components/network/cellular_esim_installer_unittest.cc
@@ -43,6 +43,7 @@
 
 const char kTestEuiccPath[] = "/org/chromium/Hermes/Euicc/0";
 const char kTestEid[] = "12345678901234567890123456789012";
+const char kTestCellularServicePath[] = "/service/cellular101";
 const char kInstallViaQrCodeHistogram[] =
     "Network.Cellular.ESim.InstallViaQrCode.Result";
 
@@ -148,7 +149,8 @@
       bool wait_for_connect,
       bool fail_connect,
       bool is_initial_install = true,
-      bool is_install_via_qr_code = false) {
+      bool is_install_via_qr_code = false,
+      bool auto_connected = false) {
     HermesResponseStatus out_install_result;
     absl::optional<dbus::ObjectPath> out_esim_profile_path;
     absl::optional<std::string> out_service_path;
@@ -171,15 +173,23 @@
     FastForwardProfileRefreshDelay();
 
     if (wait_for_connect) {
-      base::RunLoop().RunUntilIdle();
-      EXPECT_LE(1u, network_connection_handler_->connect_calls().size());
-      if (fail_connect) {
-        network_connection_handler_->connect_calls().back().InvokeErrorCallback(
-            "fake_error_name");
+      if (auto_connected) {
+        ShillServiceClient::Get()->GetTestInterface()->SetServiceProperty(
+            kTestCellularServicePath, shill::kStateProperty,
+            base::Value(shill::kStateOnline));
       } else {
-        network_connection_handler_->connect_calls()
-            .back()
-            .InvokeSuccessCallback();
+        FastForwardAutoConnectWaiting();
+        base::RunLoop().RunUntilIdle();
+        EXPECT_LE(1u, network_connection_handler_->connect_calls().size());
+        if (fail_connect) {
+          network_connection_handler_->connect_calls()
+              .back()
+              .InvokeErrorCallback("fake_error_name");
+        } else {
+          network_connection_handler_->connect_calls()
+              .back()
+              .InvokeSuccessCallback();
+        }
       }
     }
 
@@ -271,6 +281,11 @@
     task_environment_.FastForwardBy(2 * kProfileRefreshCallbackDelay);
   }
 
+  void FastForwardAutoConnectWaiting() {
+    task_environment_.FastForwardBy(
+        CellularConnectionHandler::kWaitingForAutoConnectTimeout);
+  }
+
   base::HistogramTester* HistogramTesterPtr() { return &histogram_tester_; }
 
  private:
@@ -417,7 +432,32 @@
       /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
       /*new_shill_properties=*/base::Value(base::Value::Type::DICTIONARY),
       /*wait_for_connect=*/true, /*fail_connect=*/false,
-      /*is_initial_install=*/true, /*install_via_qr_code=*/true);
+      /*is_initial_install=*/true, /*is_install_via_qr_code=*/true);
+  CheckInstallSuccess(result_tuple);
+
+  HistogramTesterPtr()->ExpectTotalCount(kESimProfileDownloadLatencyHistogram,
+                                         1);
+  CheckESimInstallHistograms(
+      /*expected_count=*/1, HermesResponseStatus::kSuccess,
+      CellularESimInstaller::InstallESimProfileResult::kSuccess);
+  CheckDetailedESimInstallHistograms(
+      CellularESimInstaller::InstallESimProfileResult::kSuccess,
+      /*is_managed=*/false, /*is_retry=*/false,
+      /*is_install_via_qr_code=*/true);
+}
+
+TEST_F(CellularESimInstallerTest, InstallProfileAutoConnect) {
+  // Verify that install succeeds when valid activation code is passed.
+  InstallResultTuple result_tuple = InstallProfileFromActivationCode(
+      HermesEuiccClient::Get()
+          ->GetTestInterface()
+          ->GenerateFakeActivationCode(),
+      /*confirmation_code=*/std::string(),
+      /*euicc_path=*/dbus::ObjectPath(kTestEuiccPath),
+      /*new_shill_properties=*/base::Value(base::Value::Type::DICTIONARY),
+      /*wait_for_connect=*/true, /*fail_connect=*/false,
+      /*is_initial_install=*/true, /*is_install_via_qr_code=*/true,
+      /*auto_connected=*/true);
   CheckInstallSuccess(result_tuple);
 
   HistogramTesterPtr()->ExpectTotalCount(kESimProfileDownloadLatencyHistogram,
diff --git a/chromeos/ash/components/network/cellular_policy_handler_unittest.cc b/chromeos/ash/components/network/cellular_policy_handler_unittest.cc
index 28db9c5..3e74dc94 100644
--- a/chromeos/ash/components/network/cellular_policy_handler_unittest.cc
+++ b/chromeos/ash/components/network/cellular_policy_handler_unittest.cc
@@ -212,6 +212,8 @@
     base::RunLoop().RunUntilIdle();
 
     if (expect_install_success) {
+      FastForwardAutoConnectWaiting();
+      base::RunLoop().RunUntilIdle();
       EXPECT_LE(1u, network_connection_handler_->connect_calls().size());
       network_connection_handler_->connect_calls()
           .back()
@@ -241,6 +243,11 @@
     FastForwardBy(2 * kProfileRefreshCallbackDelay);
   }
 
+  void FastForwardAutoConnectWaiting() {
+    task_environment_.FastForwardBy(
+        CellularConnectionHandler::kWaitingForAutoConnectTimeout);
+  }
+
   void FastForwardBy(base::TimeDelta delay) {
     task_environment_.FastForwardBy(delay);
   }
@@ -318,6 +325,7 @@
   ShillDeviceClient::Get()->GetTestInterface()->AddDevice(
       "/device/cellular1", shill::kTypeCellular, "TestCellular");
   FastForwardProfileRefreshDelay();
+  FastForwardAutoConnectWaiting();
   base::RunLoop().RunUntilIdle();
   CheckShillConfiguration(/*is_installed=*/true);
 }
@@ -338,6 +346,7 @@
   CheckShillConfiguration(/*is_installed=*/false);
   SetupEuicc();
   FastForwardProfileRefreshDelay();
+  FastForwardAutoConnectWaiting();
   base::RunLoop().RunUntilIdle();
   CheckShillConfiguration(/*is_installed=*/true);
   CheckIccidSmdpPairInPref(/*is_installed=*/true);
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
index 8add95f..3a070ef 100644
--- a/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
+++ b/chromeos/ash/components/network/managed_network_configuration_handler_unittest.cc
@@ -357,6 +357,11 @@
     task_environment_.FastForwardBy(2 * kProfileRefreshCallbackDelay);
   }
 
+  void FastForwardAutoConnectWaiting() {
+    task_environment_.FastForwardBy(
+        CellularConnectionHandler::kWaitingForAutoConnectTimeout);
+  }
+
   ProhibitedTechnologiesHandler* prohibited_technologies_handler() {
     return prohibited_technologies_handler_.get();
   }
@@ -613,6 +618,7 @@
   SetPolicy(::onc::ONC_SOURCE_DEVICE_POLICY, std::string(),
             "policy/policy_cellular.onc");
   FastForwardProfileRefreshDelay();
+  FastForwardAutoConnectWaiting();
   base::RunLoop().RunUntilIdle();
 
   std::string service_path = GetShillServiceClient()->FindServiceMatchingGUID(
diff --git a/chromeos/ash/components/network/network_connection_handler_impl.cc b/chromeos/ash/components/network/network_connection_handler_impl.cc
index 86a0129..460d39c 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl.cc
+++ b/chromeos/ash/components/network/network_connection_handler_impl.cc
@@ -425,7 +425,8 @@
     // connection. Prepare the network for connection before proceeding.
     cellular_connection_handler_->PrepareExistingCellularNetworkForConnection(
         cellular_network_iccid,
-        base::BindOnce(&NetworkConnectionHandlerImpl::CallShillConnect,
+        base::BindOnce(&NetworkConnectionHandlerImpl::
+                           OnPrepareCellularNetworkForConnectionSuccess,
                        AsWeakPtr()),
         base::BindOnce(&NetworkConnectionHandlerImpl::
                            OnPrepareCellularNetworkForConnectionFailure,
@@ -447,6 +448,18 @@
                      AsWeakPtr(), check_error_state));
 }
 
+void NetworkConnectionHandlerImpl::OnPrepareCellularNetworkForConnectionSuccess(
+    const std::string& service_path,
+    bool auto_connected) {
+  // If the cellular network is auto-connected by Shill, there is no need to
+  // call Shill connect.
+  if (auto_connected) {
+    HandleShillConnectSuccess(service_path);
+    return;
+  }
+  CallShillConnect(service_path);
+}
+
 void NetworkConnectionHandlerImpl::DisconnectNetwork(
     const std::string& service_path,
     base::OnceClosure success_callback,
diff --git a/chromeos/ash/components/network/network_connection_handler_impl.h b/chromeos/ash/components/network/network_connection_handler_impl.h
index e51e684e..4785653 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl.h
+++ b/chromeos/ash/components/network/network_connection_handler_impl.h
@@ -99,6 +99,12 @@
   ConnectRequest* GetPendingRequest(const std::string& service_path);
   bool HasPendingCellularRequest() const;
 
+  // Callback when PrepareExistingCellularNetworkForConnection succeeded.
+  void OnPrepareCellularNetworkForConnectionSuccess(
+      const std::string& service_path,
+      bool auto_connected);
+
+  // Callback when PrepareExistingCellularNetworkForConnection failed.
   void OnPrepareCellularNetworkForConnectionFailure(
       const std::string& service_path,
       const std::string& error_name);
diff --git a/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc b/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc
index 63b4dd6a..1f9e8c35 100644
--- a/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc
+++ b/chromeos/ash/components/network/network_connection_handler_impl_unittest.cc
@@ -701,7 +701,8 @@
 TEST_F(NetworkConnectionHandlerImplTest, IgnoreConnectInProgressError_Fails) {
   Init();
 
-  AddCellularServiceWithESimProfile();
+  AddNonConnectablePSimService();
+  SetCellularServiceConnectable();
   SetShillConnectError(shill::kErrorResultInProgress);
   Connect(kTestCellularServicePath);
   EXPECT_TRUE(GetResultAndReset().empty());
@@ -1169,7 +1170,8 @@
   EXPECT_EQ(kSuccessResult, GetResultAndReset());
 }
 
-TEST_F(NetworkConnectionHandlerImplTest, ESimProfile_EnableProfile) {
+TEST_F(NetworkConnectionHandlerImplTest,
+       ESimProfile_EnableProfileAndWaitForAutoconnect) {
   Init();
   AddCellularServiceWithESimProfile();
 
@@ -1177,6 +1179,24 @@
   // connection is initiated, we attempt to enable the profile via Hermes.
   Connect(kTestCellularServicePath);
   SetCellularServiceConnectable();
+  // Set cellular service to connected state.
+  SetCellularServiceState(shill::kStateOnline);
+  EXPECT_EQ(kSuccessResult, GetResultAndReset());
+}
+
+TEST_F(NetworkConnectionHandlerImplTest,
+       ESimProfile_EnableProfileAndAutoconnectTimeout) {
+  const base::TimeDelta kCellularAutoConnectTimeout = base::Seconds(120);
+  Init();
+  AddCellularServiceWithESimProfile();
+
+  // Do not set the service to be connectable before trying to connect. When a
+  // connection is initiated, we attempt to enable the profile via Hermes.
+  Connect(kTestCellularServicePath);
+  SetCellularServiceConnectable();
+  EXPECT_TRUE(GetResultAndReset().empty());
+
+  AdvanceClock(kCellularAutoConnectTimeout);
   EXPECT_EQ(kSuccessResult, GetResultAndReset());
 }
 
@@ -1191,6 +1211,8 @@
   // Now, create a non-stub service and make it connectable.
   AddNonConnectableESimService();
   SetCellularServiceConnectable();
+  // Set cellular service to connected state.
+  SetCellularServiceState(shill::kStateOnline);
 
   EXPECT_EQ(kSuccessResult, GetResultAndReset());
 
diff --git a/chromeos/ash/components/network/portal_detector/network_portal_detector.h b/chromeos/ash/components/network/portal_detector/network_portal_detector.h
index efb5009..79b02b8c 100644
--- a/chromeos/ash/components/network/portal_detector/network_portal_detector.h
+++ b/chromeos/ash/components/network/portal_detector/network_portal_detector.h
@@ -37,10 +37,12 @@
   // Returns true if portal detection is enabled.
   virtual bool IsEnabled() = 0;
 
-  // Enable portal detection. We do not want to show any portal detection UI
-  // during OOBE until the user accepts the EULA, so NetworkPortalDetector is
-  // 'disabled' while in that state. Once enabled, if a network is connected,
-  // portal detection for the default network will be handled.
+  // Enable portal detection. This will do nothing if the EULA has not been
+  // accepted (i.e. OOBE has not completed) since we do not want to show a
+  // captive portal signin page until the user accepts the EULA. Once accepted,
+  // Enable() should be called again.
+  // Once enabled, portal detection for the default network will be handled any
+  // time the default network state changes.
   virtual void Enable() = 0;
 
   // Returns non-localized string representation of |status|.
diff --git a/chromeos/ash/services/cellular_setup/esim_profile.cc b/chromeos/ash/services/cellular_setup/esim_profile.cc
index 43bbf2b13..353bccb4 100644
--- a/chromeos/ash/services/cellular_setup/esim_profile.cc
+++ b/chromeos/ash/services/cellular_setup/esim_profile.cc
@@ -390,7 +390,8 @@
               weak_ptr_factory_.GetWeakPtr()));
 }
 
-void ESimProfile::OnNewProfileEnableSuccess(const std::string& service_path) {
+void ESimProfile::OnNewProfileEnableSuccess(const std::string& service_path,
+                                            bool auto_connected) {
   const NetworkState* network_state =
       esim_manager_->network_state_handler()->GetNetworkState(service_path);
   if (!network_state) {
diff --git a/chromeos/ash/services/cellular_setup/esim_profile.h b/chromeos/ash/services/cellular_setup/esim_profile.h
index ac54149..b4961d8 100644
--- a/chromeos/ash/services/cellular_setup/esim_profile.h
+++ b/chromeos/ash/services/cellular_setup/esim_profile.h
@@ -94,7 +94,8 @@
   void OnPendingProfileInstallResult(
       std::unique_ptr<CellularInhibitor::InhibitLock> inhibit_lock,
       HermesResponseStatus status);
-  void OnNewProfileEnableSuccess(const std::string& service_path);
+  void OnNewProfileEnableSuccess(const std::string& service_path,
+                                 bool auto_connected);
   void OnPrepareCellularNetworkForConnectionFailure(
       const std::string& service_path,
       const std::string& error_name);
diff --git a/chromeos/ash/services/cellular_setup/esim_profile_unittest.cc b/chromeos/ash/services/cellular_setup/esim_profile_unittest.cc
index bb1f777..2c13dd5 100644
--- a/chromeos/ash/services/cellular_setup/esim_profile_unittest.cc
+++ b/chromeos/ash/services/cellular_setup/esim_profile_unittest.cc
@@ -139,6 +139,7 @@
             }));
 
     FastForwardProfileRefreshDelay();
+    FastForwardAutoConnectWaiting();
 
     if (wait_for_connect) {
       base::RunLoop().RunUntilIdle();
diff --git a/chromeos/ash/services/cellular_setup/esim_test_base.cc b/chromeos/ash/services/cellular_setup/esim_test_base.cc
index 527d7ca..ffb9affb 100644
--- a/chromeos/ash/services/cellular_setup/esim_test_base.cc
+++ b/chromeos/ash/services/cellular_setup/esim_test_base.cc
@@ -139,4 +139,9 @@
   task_environment()->FastForwardBy(2 * kProfileRefreshCallbackDelay);
 }
 
+void ESimTestBase::FastForwardAutoConnectWaiting() {
+  task_environment_.FastForwardBy(
+      CellularConnectionHandler::kWaitingForAutoConnectTimeout);
+}
+
 }  // namespace ash::cellular_setup
diff --git a/chromeos/ash/services/cellular_setup/esim_test_base.h b/chromeos/ash/services/cellular_setup/esim_test_base.h
index f82f2b6..38aaad4 100644
--- a/chromeos/ash/services/cellular_setup/esim_test_base.h
+++ b/chromeos/ash/services/cellular_setup/esim_test_base.h
@@ -52,6 +52,7 @@
   ~ESimTestBase() override;
 
   void FastForwardProfileRefreshDelay();
+  void FastForwardAutoConnectWaiting();
 
   ESimManager* esim_manager() { return esim_manager_.get(); }
   ESimManagerTestObserver* observer() { return observer_.get(); }
diff --git a/chromeos/ash/services/cellular_setup/euicc_unittest.cc b/chromeos/ash/services/cellular_setup/euicc_unittest.cc
index a33856a9..feb005d 100644
--- a/chromeos/ash/services/cellular_setup/euicc_unittest.cc
+++ b/chromeos/ash/services/cellular_setup/euicc_unittest.cc
@@ -94,6 +94,7 @@
     FastForwardProfileRefreshDelay();
 
     if (wait_for_connect) {
+      FastForwardAutoConnectWaiting();
       base::RunLoop().RunUntilIdle();
       EXPECT_LE(1u, network_connection_handler()->connect_calls().size());
       if (fail_connect) {
diff --git a/components/BUILD.gn b/components/BUILD.gn
index f50c6246..0d03737 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -1070,7 +1070,6 @@
 }
 if (is_android) {
   robolectric_binary("components_junit_tests") {
-    data = [ "//chrome/test/data/webapks/" ]
     deps = [
       "//components/android_autofill/browser/junit:components_autofill_junit_tests",
       "//components/background_task_scheduler:components_background_task_scheduler_junit_tests",
diff --git a/components/autofill_assistant/browser/actions/collect_user_data_action.cc b/components/autofill_assistant/browser/actions/collect_user_data_action.cc
index 0f5dd39..52bd94ad 100644
--- a/components/autofill_assistant/browser/actions/collect_user_data_action.cc
+++ b/components/autofill_assistant/browser/actions/collect_user_data_action.cc
@@ -467,12 +467,10 @@
   // If Chrome password manager logins are requested, we need to asynchronously
   // obtain them before showing the UI.
   auto collect_user_data = proto_.collect_user_data();
-  auto password_manager_option = base::ranges::find_if(
-      collect_user_data.login_details().login_options(),
-      [&](const LoginDetailsProto::LoginOptionProto& option) {
-        return option.type_case() ==
-               LoginDetailsProto::LoginOptionProto::kPasswordManager;
-      });
+  auto password_manager_option =
+      base::ranges::find(collect_user_data.login_details().login_options(),
+                         LoginDetailsProto::LoginOptionProto::kPasswordManager,
+                         &LoginDetailsProto::LoginOptionProto::type_case);
   bool requests_pwm_logins =
       password_manager_option !=
       collect_user_data.login_details().login_options().end();
diff --git a/components/autofill_assistant/browser/ui_controller.cc b/components/autofill_assistant/browser/ui_controller.cc
index c103fc1..e8dd987 100644
--- a/components/autofill_assistant/browser/ui_controller.cc
+++ b/components/autofill_assistant/browser/ui_controller.cc
@@ -319,11 +319,10 @@
 
 bool UiController::SetProgressActiveStepIdentifier(
     const std::string& active_step_identifier) {
-  const auto it = base::ranges::find_if(
+  const auto it = base::ranges::find(
       step_progress_bar_configuration_.annotated_step_icons(),
-      [&](const ShowProgressBarProto::StepProgressBarIcon& icon) {
-        return icon.identifier() == active_step_identifier;
-      });
+      active_step_identifier,
+      &ShowProgressBarProto::StepProgressBarIcon::identifier);
   if (it == step_progress_bar_configuration_.annotated_step_icons().cend()) {
     return false;
   }
diff --git a/components/autofill_assistant/browser/url_utils.cc b/components/autofill_assistant/browser/url_utils.cc
index bfe8253..f919754a 100644
--- a/components/autofill_assistant/browser/url_utils.cc
+++ b/components/autofill_assistant/browser/url_utils.cc
@@ -32,11 +32,11 @@
 
 bool IsInDomainOrSubDomain(const GURL& url,
                            const std::vector<std::string>& allowed_domains) {
-  return base::ranges::find_if(allowed_domains,
-                               [url](const std::string& allowed_domain) {
-                                 return url.host() == allowed_domain ||
-                                        IsInSubDomain(url, allowed_domain);
-                               }) != allowed_domains.end();
+  return base::ranges::any_of(allowed_domains,
+                              [url](const std::string& allowed_domain) {
+                                return url.host() == allowed_domain ||
+                                       IsInSubDomain(url, allowed_domain);
+                              });
 }
 
 bool IsSamePublicSuffixDomain(const GURL& url1, const GURL& url2) {
diff --git a/components/autofill_assistant/browser/user_model.cc b/components/autofill_assistant/browser/user_model.cc
index 210276f..6c0faf9 100644
--- a/components/autofill_assistant/browser/user_model.cc
+++ b/components/autofill_assistant/browser/user_model.cc
@@ -186,10 +186,8 @@
     const CollectUserDataOptions& collect_user_data_options,
     UserData* user_data) {
   const auto login_choice =
-      base::ranges::find_if(collect_user_data_options.login_choices,
-                            [&identifier](const LoginChoice& login_choice) {
-                              return login_choice.identifier == identifier;
-                            });
+      base::ranges::find(collect_user_data_options.login_choices, identifier,
+                         &LoginChoice::identifier);
   if (login_choice == collect_user_data_options.login_choices.end()) {
     user_data->selected_login_choice_.reset();
     return;
diff --git a/components/browser_ui/site_settings/android/BUILD.gn b/components/browser_ui/site_settings/android/BUILD.gn
index 977a3d9..8b2e3fe 100644
--- a/components/browser_ui/site_settings/android/BUILD.gn
+++ b/components/browser_ui/site_settings/android/BUILD.gn
@@ -77,11 +77,12 @@
     "java/src/org/chromium/components/browser_ui/site_settings/TriStateSiteSettingsPreference.java",
     "java/src/org/chromium/components/browser_ui/site_settings/Website.java",
     "java/src/org/chromium/components/browser_ui/site_settings/WebsiteAddress.java",
+    "java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java",
     "java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java",
-    "java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupPreference.java",
     "java/src/org/chromium/components/browser_ui/site_settings/WebsitePermissionsFetcher.java",
     "java/src/org/chromium/components/browser_ui/site_settings/WebsitePreference.java",
     "java/src/org/chromium/components/browser_ui/site_settings/WebsitePreferenceBridge.java",
+    "java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java",
   ]
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
   resources_package = "org.chromium.components.browser_ui.site_settings"
diff --git a/components/browser_ui/site_settings/android/java/res/xml/grouped_websites_preferences.xml b/components/browser_ui/site_settings/android/java/res/xml/grouped_websites_preferences.xml
index 26b831009..d2cb250f 100644
--- a/components/browser_ui/site_settings/android/java/res/xml/grouped_websites_preferences.xml
+++ b/components/browser_ui/site_settings/android/java/res/xml/grouped_websites_preferences.xml
@@ -26,5 +26,7 @@
         android:key="sites_in_group" />
     <org.chromium.components.browser_ui.settings.ButtonPreference
         android:key="reset_site_button"
-        android:title="@string/website_reset_full" />
+        android:title="@string/website_reset_full"
+        app:allowDividerAbove="false"
+        app:allowDividerBelow="false" />
 </PreferenceScreen>
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java
index 3ce7127..94f06a01 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AllSiteSettings.java
@@ -289,18 +289,8 @@
             // was populated with data for all permission types.
             website.putSiteIntoExtras(SingleWebsiteSettings.EXTRA_SITE);
             website.getExtras().putInt(extraKey, getNavigationSource());
-        } else if (preference instanceof WebsiteGroupPreference) {
-            WebsiteGroupPreference group = (WebsiteGroupPreference) preference;
-            if (group.representsOneWebsite()) {
-                group.setFragment(SingleWebsiteSettings.class.getName());
-                // EXTRA_SITE re-uses already-fetched permissions, which we can only use if the
-                // Website was populated with data for all permission types.
-                group.putSingleSiteIntoExtras(SingleWebsiteSettings.EXTRA_SITE);
-            } else {
-                group.setFragment(GroupedWebsitesSettings.class.getName());
-                group.putGroupSiteIntoExtras(GroupedWebsitesSettings.EXTRA_GROUP);
-            }
-            group.getExtras().putInt(extraKey, getNavigationSource());
+        } else if (preference instanceof WebsiteRowPreference) {
+            ((WebsiteRowPreference) preference).handleClick(getArguments());
         }
 
         return super.onPreferenceTreeClick(preference);
@@ -354,17 +344,17 @@
     private boolean addWebsites(Collection<Website> sites) {
         filterSelectedDomains(sites);
         if (isNewAllSitesUiEnabled()) {
-            List<WebsiteGroup> groups = WebsiteGroup.groupWebsites(sites);
-            List<WebsiteGroupPreference> preferences = new ArrayList<>();
-            // Find groups matching the current search.
-            for (WebsiteGroup group : groups) {
-                if (mSearch == null || mSearch.isEmpty() || group.matches(mSearch)) {
-                    preferences.add(new WebsiteGroupPreference(
-                            getStyledContext(), getSiteSettingsDelegate(), group));
+            List<WebsiteEntry> entries = WebsiteGroup.groupWebsites(sites);
+            List<WebsiteRowPreference> preferences = new ArrayList<>();
+            // Find entries matching the current search.
+            for (WebsiteEntry entry : entries) {
+                if (mSearch == null || mSearch.isEmpty() || entry.matches(mSearch)) {
+                    preferences.add(new WebsiteRowPreference(
+                            getStyledContext(), getSiteSettingsDelegate(), entry));
                 }
             }
             Collections.sort(preferences);
-            for (WebsiteGroupPreference preference : preferences) {
+            for (WebsiteRowPreference preference : preferences) {
                 getPreferenceScreen().addPreference(preference);
             }
             return !preferences.isEmpty();
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
index dc77d619..73f001f 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/GroupedWebsitesSettings.java
@@ -8,6 +8,9 @@
 import android.os.Bundle;
 import android.text.format.Formatter;
 
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+
 import org.chromium.components.browser_ui.settings.SettingsUtils;
 
 /**
@@ -19,6 +22,7 @@
     // Preference keys, see grouped_websites_preferences.xml.
     public static final String PREF_SITE_TITLE = "site_title";
     public static final String PREF_CLEAR_DATA = "clear_data";
+    public static final String PREF_SITES_IN_GROUP = "sites_in_group";
 
     private WebsiteGroup mSiteGroup;
 
@@ -32,6 +36,7 @@
     public void onActivityCreated(Bundle savedInstanceState) {
         init();
         super.onActivityCreated(savedInstanceState);
+        setDivider(null);
     }
 
     private void init() {
@@ -53,7 +58,21 @@
         // Preferences screen
         SettingsUtils.addPreferencesFromResource(this, R.xml.grouped_websites_preferences);
         findPreference(PREF_SITE_TITLE).setTitle(mSiteGroup.getDomainAndRegistry());
+        findPreference(PREF_SITES_IN_GROUP)
+                .setTitle(String.format(
+                        getContext().getString(R.string.domain_settings_sites_in_group,
+                                mSiteGroup.getDomainAndRegistry())));
         setUpClearDataPreference();
+        updateSitesInGroup();
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(Preference preference) {
+        if (preference instanceof WebsiteRowPreference) {
+            ((WebsiteRowPreference) preference).handleClick(getArguments());
+        }
+
+        return super.onPreferenceTreeClick(preference);
     }
 
     private void setUpClearDataPreference() {
@@ -72,4 +91,13 @@
             getPreferenceScreen().removePreference(preference);
         }
     }
+
+    private void updateSitesInGroup() {
+        PreferenceCategory category = findPreference(PREF_SITES_IN_GROUP);
+        category.removeAll();
+        for (Website site : mSiteGroup.getWebsites()) {
+            category.addPreference(new WebsiteRowPreference(
+                    category.getContext(), getSiteSettingsDelegate(), site));
+        }
+    }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
index fe446a3..371c685 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
@@ -13,9 +13,10 @@
 import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.StorageInfoClearedCallback;
 import org.chromium.components.content_settings.ContentSettingValues;
 import org.chromium.components.content_settings.ContentSettingsType;
+import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.content_public.browser.BrowserContextHandle;
+import org.chromium.url.GURL;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -25,7 +26,7 @@
 /**
  * Website is a class for storing information about a website and its associated permissions.
  */
-public final class Website implements Serializable {
+public final class Website implements WebsiteEntry {
     private final WebsiteAddress mOrigin;
     private final WebsiteAddress mEmbedder;
 
@@ -47,6 +48,20 @@
     // built this list could contain multiple types of objects.
     private final List<ChosenObjectInfo> mObjectInfo = new ArrayList<ChosenObjectInfo>();
 
+    private static final String SCHEME_SUFFIX = "://";
+
+    /**
+     * Removes the scheme in a given URL, if present.
+     *
+     * Examples:
+     * - "google.com" -> "google.com"
+     * - "https://google.com" -> "google.com"
+     */
+    public static String omitProtocolIfPresent(String url) {
+        if (url.indexOf(SCHEME_SUFFIX) == -1) return url;
+        return UrlFormatter.formatUrlForDisplayOmitScheme(url);
+    }
+
     public Website(WebsiteAddress origin, WebsiteAddress embedder) {
         mOrigin = origin;
         mEmbedder = embedder;
@@ -288,13 +303,6 @@
         public void onStoredDataCleared();
     }
 
-    public long getTotalUsage() {
-        long usage = 0;
-        if (mLocalStorageInfo != null) usage += mLocalStorageInfo.getSize();
-        for (StorageInfo info : mStorageInfo) usage += info.getSize();
-        return usage;
-    }
-
     /**
      * Add information about an object the user has granted permission for this site to access.
      */
@@ -308,4 +316,28 @@
     public List<ChosenObjectInfo> getChosenObjectInfo() {
         return new ArrayList<ChosenObjectInfo>(mObjectInfo);
     }
+
+    // WebsiteEntry implementation.
+    @Override
+    public String getTitleForPreferenceRow() {
+        return omitProtocolIfPresent(getTitle());
+    }
+
+    @Override
+    public GURL getFaviconUrl() {
+        return new GURL(getAddress().getOrigin());
+    }
+
+    @Override
+    public long getTotalUsage() {
+        long usage = 0;
+        if (mLocalStorageInfo != null) usage += mLocalStorageInfo.getSize();
+        for (StorageInfo info : mStorageInfo) usage += info.getSize();
+        return usage;
+    }
+
+    @Override
+    public boolean matches(String search) {
+        return getTitle().contains(search);
+    }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java
new file mode 100644
index 0000000..5815d2d
--- /dev/null
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteEntry.java
@@ -0,0 +1,29 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.browser_ui.site_settings;
+
+import org.chromium.url.GURL;
+
+import java.io.Serializable;
+
+/**
+ * Used by {@link WebsiteRowPreference} to display various information about one or multiple sites.
+ */
+public interface WebsiteEntry extends Serializable {
+    /** @return the title to display in a {@link WebsiteRowPreference}. */
+    String getTitleForPreferenceRow();
+
+    /** @return the URL for fetching a favicon. */
+    GURL getFaviconUrl();
+
+    /** @return the total bytes used for associated storage. */
+    long getTotalUsage();
+
+    /**
+     * @return whether either the eTLD+1 or one of the origins associated with it matches the given
+     * search query.
+     */
+    boolean matches(String search);
+}
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java
index b0bf738b..8853faa5 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroup.java
@@ -5,10 +5,8 @@
 package org.chromium.components.browser_ui.site_settings;
 
 import org.chromium.components.embedder_support.util.UrlConstants;
-import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.url.GURL;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -18,7 +16,7 @@
 /**
  * Represents a group of Websites that either share the same eTLD+1 or are embedded on it.
  */
-public class WebsiteGroup implements Serializable {
+public class WebsiteGroup implements WebsiteEntry {
     // The common eTLD+1.
     private final String mDomainAndRegistry;
     // A list of origins associated with the eTLD+1.
@@ -26,27 +24,13 @@
     // Total storage taken up by all the stored websites.
     private final long mTotalUsage;
 
-    private static final String SCHEME_SUFFIX = "://";
-
-    /**
-     * Removes the scheme in a given URL, if present.
-     *
-     * Examples:
-     * - "google.com" -> "google.com"
-     * - "https://google.com" -> "google.com"
-     */
-    public static String omitProtocolIfPresent(String url) {
-        if (url.indexOf(SCHEME_SUFFIX) == -1) return url;
-        return UrlFormatter.formatUrlForDisplayOmitScheme(url);
-    }
-
     /**
      * Groups the websites by eTLD+1.
      *
      * @param websites A collection of {@code Website} objects representing origins.
      * @return A {@code List} of {@code WebsiteGroup} objects, each corresponding to an eTLD+1.
      */
-    public static List<WebsiteGroup> groupWebsites(Collection<Website> websites) {
+    public static List<WebsiteEntry> groupWebsites(Collection<Website> websites) {
         // Put all the sites into an eTLD+1 -> list of origins mapping.
         Map<String, List<Website>> etldMap = new HashMap<>();
         for (Website website : websites) {
@@ -60,11 +44,13 @@
             etldSites.add(website);
         }
         // Convert the mapping to a list of WebsiteGroup objects.
-        List<WebsiteGroup> groups = new ArrayList<>();
+        List<WebsiteEntry> entries = new ArrayList<>();
         for (Map.Entry<String, List<Website>> etld : etldMap.entrySet()) {
-            groups.add(new WebsiteGroup(etld.getKey(), etld.getValue()));
+            entries.add((etld.getValue().size() == 1)
+                            ? etld.getValue().get(0)
+                            : new WebsiteGroup(etld.getKey(), etld.getValue()));
         }
-        return groups;
+        return entries;
     }
 
     public WebsiteGroup(String domainAndRegistry, List<Website> websites) {
@@ -78,51 +64,28 @@
         mTotalUsage = totalUsage;
     }
 
-    public String getDomainAndRegistry() {
+    // WebsiteEntry implementation.
+
+    /** Returns the title to be displayed in a user-friendly way. */
+    @Override
+    public String getTitleForPreferenceRow() {
         return mDomainAndRegistry;
     }
 
-    public List<Website> getWebsites() {
-        return mWebsites;
+    /**
+     * Returns the URL to use for fetching the favicon: https:// + eTLD+1 is returned.
+     */
+    @Override
+    public GURL getFaviconUrl() {
+        return new GURL(UrlConstants.HTTPS_URL_PREFIX + mDomainAndRegistry);
     }
 
+    @Override
     public long getTotalUsage() {
         return mTotalUsage;
     }
 
-    public boolean hasOneOrigin() {
-        return mWebsites.size() == 1;
-    }
-
-    public boolean hasOneHttpOrigin() {
-        return hasOneOrigin()
-                && mWebsites.get(0).getAddress().getOrigin().startsWith(
-                        UrlConstants.HTTP_URL_PREFIX);
-    }
-
-    /** Returns the title to be displayed in a user-friendly way. */
-    public String getTitle() {
-        // If there is only one origin, return the title of that origin without the scheme.
-        if (hasOneOrigin()) {
-            return omitProtocolIfPresent(mWebsites.get(0).getTitle());
-        } else {
-            return mDomainAndRegistry;
-        }
-    }
-
-    /**
-     * Returns the URL to use for fetching the favicon. If only one origin is in the group, it is
-     * returned; otherwise - https + eTLD+1 is returned.
-     */
-    public GURL getFaviconUrl() {
-        return new GURL(hasOneOrigin() ? mWebsites.get(0).getAddress().getOrigin()
-                                       : UrlConstants.HTTPS_URL_PREFIX + mDomainAndRegistry);
-    }
-
-    /**
-     * Returns whether either the eTLD+1 or one of the origins associated with it matches the given
-     * search query.
-     */
+    @Override
     public boolean matches(String search) {
         // eTLD+1 matches.
         if (mDomainAndRegistry.contains(search)) return true;
@@ -133,4 +96,12 @@
         // No matches.
         return false;
     }
+
+    public String getDomainAndRegistry() {
+        return mDomainAndRegistry;
+    }
+
+    public List<Website> getWebsites() {
+        return mWebsites;
+    }
 }
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
similarity index 66%
rename from components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupPreference.java
rename to components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
index bf3b0b54..e2c012dd 100644
--- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupPreference.java
+++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
@@ -8,6 +8,7 @@
 import android.graphics.Color;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
+import android.os.Bundle;
 import android.text.format.Formatter;
 import android.widget.ImageView;
 
@@ -15,24 +16,25 @@
 
 import org.chromium.components.browser_ui.settings.ChromeImageViewPreference;
 import org.chromium.components.browser_ui.settings.FaviconViewUtils;
+import org.chromium.components.embedder_support.util.UrlConstants;
 
 /**
  * Used by {@link AllSiteSettings} to display a row for a group of sites or a single site.
  */
-public class WebsiteGroupPreference extends ChromeImageViewPreference {
+public class WebsiteRowPreference extends ChromeImageViewPreference {
     private final SiteSettingsDelegate mSiteSettingsDelegate;
-    private final WebsiteGroup mSiteGroup;
+    private final WebsiteEntry mSiteEntry;
 
     private static final String HTTP = "http";
 
     // Whether the favicon has been fetched already.
     private boolean mFaviconFetched;
 
-    WebsiteGroupPreference(
-            Context context, SiteSettingsDelegate siteSettingsDelegate, WebsiteGroup siteGroup) {
+    WebsiteRowPreference(
+            Context context, SiteSettingsDelegate siteSettingsDelegate, WebsiteEntry siteEntry) {
         super(context);
         mSiteSettingsDelegate = siteSettingsDelegate;
-        mSiteGroup = siteGroup;
+        mSiteEntry = siteEntry;
 
         // To make sure the layout stays stable throughout, we assign a
         // transparent drawable as the icon initially. This is so that
@@ -40,23 +42,22 @@
         // about the title appearing to jump (http://crbug.com/453626) when the
         // favicon becomes available.
         setIcon(new ColorDrawable(Color.TRANSPARENT));
-        setTitle(mSiteGroup.getTitle());
+        setTitle(mSiteEntry.getTitleForPreferenceRow());
         setImageView(
                 R.drawable.ic_delete_white_24dp, R.string.webstorage_clear_data_dialog_title, null);
         updateSummary();
     }
 
-    public boolean representsOneWebsite() {
-        return mSiteGroup.hasOneOrigin();
-    }
-
-    public void putSingleSiteIntoExtras(String key) {
-        if (!representsOneWebsite()) return;
-        getExtras().putSerializable(key, mSiteGroup.getWebsites().get(0));
-    }
-
-    public void putGroupSiteIntoExtras(String key) {
-        getExtras().putSerializable(key, mSiteGroup);
+    @SuppressWarnings("WrongConstant")
+    public void handleClick(Bundle args) {
+        getExtras().putSerializable(mSiteEntry instanceof Website
+                        ? SingleWebsiteSettings.EXTRA_SITE
+                        : GroupedWebsitesSettings.EXTRA_GROUP,
+                mSiteEntry);
+        setFragment(mSiteEntry instanceof Website ? SingleWebsiteSettings.class.getName()
+                                                  : GroupedWebsitesSettings.class.getName());
+        getExtras().putInt(SettingsNavigationSource.EXTRA_KEY,
+                args.getInt(SettingsNavigationSource.EXTRA_KEY, SettingsNavigationSource.OTHER));
     }
 
     @Override
@@ -70,7 +71,7 @@
         if (!mFaviconFetched) {
             // Start the favicon fetching. Will respond in onFaviconAvailable.
             mSiteSettingsDelegate.getFaviconImageForURL(
-                    mSiteGroup.getFaviconUrl(), this::onFaviconAvailable);
+                    mSiteEntry.getFaviconUrl(), this::onFaviconAvailable);
             mFaviconFetched = true;
         }
     }
@@ -81,15 +82,22 @@
         }
     }
 
+    private boolean isSiteEntryASingleHttpOrigin() {
+        if (!(mSiteEntry instanceof Website)) return false;
+        Website website = (Website) mSiteEntry;
+        return website.getAddress().getOrigin().startsWith(UrlConstants.HTTP_URL_PREFIX);
+    }
+
     private void updateSummary() {
         String summary = "";
 
-        long usage = mSiteGroup.getTotalUsage();
+        long usage = mSiteEntry.getTotalUsage();
         if (usage > 0) {
             summary = Formatter.formatShortFileSize(getContext(), usage);
         }
 
-        if (mSiteGroup.hasOneHttpOrigin()) {
+        // When a single HTTP origin is represented, mark it as such.
+        if (isSiteEntryASingleHttpOrigin()) {
             if (summary.isEmpty()) {
                 summary = HTTP;
             } else {
diff --git a/components/browser_ui/site_settings/android/javatests/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupTest.java b/components/browser_ui/site_settings/android/javatests/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupTest.java
index 437be9f..9c555dd 100644
--- a/components/browser_ui/site_settings/android/javatests/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupTest.java
+++ b/components/browser_ui/site_settings/android/javatests/src/org/chromium/components/browser_ui/site_settings/WebsiteGroupTest.java
@@ -27,9 +27,9 @@
 @RunWith(BaseJUnit4ClassRunner.class)
 @Batch(Batch.PER_CLASS)
 public class WebsiteGroupTest {
-    private WebsiteGroup getGroupWithTitle(List<WebsiteGroup> groups, String title) {
-        for (WebsiteGroup group : groups) {
-            if (group.getTitle().equals(title)) return group;
+    private WebsiteEntry getEntryWithTitle(List<WebsiteEntry> entries, String title) {
+        for (WebsiteEntry entry : entries) {
+            if (entry.getTitleForPreferenceRow().equals(title)) return entry;
         }
         return null;
     }
@@ -42,28 +42,13 @@
 
     @Test
     @SmallTest
-    public void testOneOrigin() {
-        Website origin = new Website(WebsiteAddress.create("http://test.google.com"), null);
-        WebsiteGroup group = new WebsiteGroup(
-                origin.getAddress().getDomainAndRegistry(), new ArrayList<>(Arrays.asList(origin)));
-        Assert.assertTrue(group.hasOneOrigin());
-        Assert.assertEquals("google.com", group.getDomainAndRegistry());
-        Assert.assertEquals("test.google.com", group.getTitle());
-        Assert.assertEquals(new GURL("http://test.google.com"), group.getFaviconUrl());
-        Assert.assertTrue(group.matches("goog"));
-        Assert.assertFalse(group.matches("face"));
-    }
-
-    @Test
-    @SmallTest
     public void testLocalhost() {
         Website origin = new Website(WebsiteAddress.create("localhost"), null);
         WebsiteGroup group = new WebsiteGroup(
                 origin.getAddress().getDomainAndRegistry(), new ArrayList<>(Arrays.asList(origin)));
-        Assert.assertTrue(group.hasOneOrigin());
         Assert.assertEquals("localhost", group.getDomainAndRegistry());
-        Assert.assertEquals("localhost", group.getTitle());
-        Assert.assertEquals(new GURL("http://localhost"), group.getFaviconUrl());
+        Assert.assertEquals("localhost", group.getTitleForPreferenceRow());
+        Assert.assertEquals(new GURL("https://localhost"), group.getFaviconUrl());
         Assert.assertTrue(group.matches("local"));
         Assert.assertFalse(group.matches("goog"));
     }
@@ -74,9 +59,8 @@
         Website origin = new Website(WebsiteAddress.create("https://1.1.1.1"), null);
         WebsiteGroup group = new WebsiteGroup(
                 origin.getAddress().getDomainAndRegistry(), new ArrayList<>(Arrays.asList(origin)));
-        Assert.assertTrue(group.hasOneOrigin());
         Assert.assertEquals("1.1.1.1", group.getDomainAndRegistry());
-        Assert.assertEquals("1.1.1.1", group.getTitle());
+        Assert.assertEquals("1.1.1.1", group.getTitleForPreferenceRow());
         Assert.assertEquals(new GURL("https://1.1.1.1"), group.getFaviconUrl());
         Assert.assertTrue(group.matches("1.1"));
         Assert.assertFalse(group.matches("goog"));
@@ -89,9 +73,8 @@
         Website origin2 = new Website(WebsiteAddress.create("https://two.google.com"), null);
         WebsiteGroup group = new WebsiteGroup(origin1.getAddress().getDomainAndRegistry(),
                 new ArrayList<>(Arrays.asList(origin1, origin2)));
-        Assert.assertFalse(group.hasOneOrigin());
         Assert.assertEquals("google.com", group.getDomainAndRegistry());
-        Assert.assertEquals("google.com", group.getTitle());
+        Assert.assertEquals("google.com", group.getTitleForPreferenceRow());
         Assert.assertEquals(new GURL("https://google.com"), group.getFaviconUrl());
         Assert.assertTrue(group.matches("goog"));
         Assert.assertTrue(group.matches("one"));
@@ -108,23 +91,24 @@
                         new Website(WebsiteAddress.create("https://test.com"), null),
                         new Website(WebsiteAddress.create("localhost"), null),
                         new Website(WebsiteAddress.create("1.1.1.1"), null)));
-        List<WebsiteGroup> groups = WebsiteGroup.groupWebsites(websites);
-        Assert.assertEquals(4, groups.size());
+        List<WebsiteEntry> entries = WebsiteGroup.groupWebsites(websites);
+        Assert.assertEquals(4, entries.size());
 
-        WebsiteGroup google = getGroupWithTitle(groups, "google.com");
+        WebsiteEntry google = getEntryWithTitle(entries, "google.com");
         Assert.assertNotNull(google);
-        Assert.assertEquals(2, google.getWebsites().size());
+        Assert.assertTrue(google instanceof WebsiteGroup);
+        Assert.assertEquals(2, ((WebsiteGroup) google).getWebsites().size());
 
-        WebsiteGroup test = getGroupWithTitle(groups, "test.com");
+        WebsiteEntry test = getEntryWithTitle(entries, "test.com");
         Assert.assertNotNull(test);
-        Assert.assertEquals(1, test.getWebsites().size());
+        Assert.assertTrue(test instanceof Website);
 
-        WebsiteGroup localhost = getGroupWithTitle(groups, "localhost");
+        WebsiteEntry localhost = getEntryWithTitle(entries, "localhost");
         Assert.assertNotNull(localhost);
-        Assert.assertEquals(1, localhost.getWebsites().size());
+        Assert.assertTrue(localhost instanceof Website);
 
-        WebsiteGroup ipaddr = getGroupWithTitle(groups, "1.1.1.1");
+        WebsiteEntry ipaddr = getEntryWithTitle(entries, "1.1.1.1");
         Assert.assertNotNull(ipaddr);
-        Assert.assertEquals(1, ipaddr.getWebsites().size());
+        Assert.assertTrue(ipaddr instanceof Website);
     }
 }
diff --git a/components/browser_ui/strings/android/site_settings.grdp b/components/browser_ui/strings/android/site_settings.grdp
index c098c9c..2f6b2b3 100644
--- a/components/browser_ui/strings/android/site_settings.grdp
+++ b/components/browser_ui/strings/android/site_settings.grdp
@@ -161,7 +161,9 @@
   <message name="IDS_DOMAIN_SETTINGS_TITLE" desc="Title of the domain-level Site Settings page.">
     Settings for <ph name="DOMAIN">%1$s<ex>google.com</ex></ph>
   </message>
-
+  <message name="IDS_DOMAIN_SETTINGS_SITES_IN_GROUP" desc="Title for the section that lists sites in the group for a given domain.">
+    Sites under <ph name="DOMAIN">%1$s<ex>google.com</ex></ph>
+  </message>
   <!-- Site settings: Possible permission values for a single site -->
 
   <message name="IDS_WEBSITE_SETTINGS_SITE_CATEGORY" desc="The headline above the website name on the website details page.">
diff --git a/components/browser_ui/strings/android/site_settings_grdp/IDS_DOMAIN_SETTINGS_SITES_IN_GROUP.png.sha1 b/components/browser_ui/strings/android/site_settings_grdp/IDS_DOMAIN_SETTINGS_SITES_IN_GROUP.png.sha1
new file mode 100644
index 0000000..efa8c3d6
--- /dev/null
+++ b/components/browser_ui/strings/android/site_settings_grdp/IDS_DOMAIN_SETTINGS_SITES_IN_GROUP.png.sha1
@@ -0,0 +1 @@
+01f3e71dd132b2b95dd3bd58a0829c64f5d85123
\ No newline at end of file
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java
index 571990e..c64d1bee 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/gesture/BackPressHandler.java
@@ -40,11 +40,11 @@
         int MANUAL_FILLING = 6;
         int FULLSCREEN = 7;
         int BOTTOM_SHEET = 8;
-        int TAB_MODAL_HANDLER = 9;
-        int TAB_SWITCHER_TO_BROWSING = 10; // Removed.
-        int CLOSE_WATCHER = 11;
-        int FIND_TOOLBAR = 12;
-        int LOCATION_BAR = 13;
+        int LOCATION_BAR = 9;
+        int TAB_MODAL_HANDLER = 10;
+        int TAB_SWITCHER_TO_BROWSING = 11; // Removed.
+        int CLOSE_WATCHER = 12;
+        int FIND_TOOLBAR = 13;
         int TOOLBAR_TAB_CONTROLLER = 14;
         int TAB_RETURN_TO_CHROME_START_SURFACE = 15;
         int SHOW_READING_LIST = 16;
diff --git a/components/cdm/browser/cdm_message_filter_android.cc b/components/cdm/browser/cdm_message_filter_android.cc
index 7b2a0e0..8b3d126 100644
--- a/components/cdm/browser/cdm_message_filter_android.cc
+++ b/components/cdm/browser/cdm_message_filter_android.cc
@@ -146,12 +146,11 @@
       (supported_codecs & media::EME_CODEC_VP9_PROFILE0)) {
     std::vector<media::CodecProfileLevel> profiles;
     media::MediaCodecUtil::AddSupportedCodecProfileLevels(&profiles);
-    auto iter = base::ranges::find_if(
-        profiles, [](const media::CodecProfileLevel& profile) {
-          return profile.codec == media::VideoCodec::kVP9 &&
-                 profile.profile == media::VP9PROFILE_PROFILE2;
-        });
-    if (iter != profiles.end()) {
+    if (base::ranges::any_of(
+            profiles, [](const media::CodecProfileLevel& profile) {
+              return profile.codec == media::VideoCodec::kVP9 &&
+                     profile.profile == media::VP9PROFILE_PROFILE2;
+            })) {
       supported_codecs |= media::EME_CODEC_VP9_PROFILE2;
     }
   }
@@ -160,12 +159,11 @@
       (supported_codecs & media::EME_CODEC_HEVC_PROFILE_MAIN)) {
     std::vector<media::CodecProfileLevel> profiles;
     media::MediaCodecUtil::AddSupportedCodecProfileLevels(&profiles);
-    auto iter = base::ranges::find_if(
-        profiles, [](const media::CodecProfileLevel& profile) {
-          return profile.codec == media::VideoCodec::kHEVC &&
-                 profile.profile == media::HEVCPROFILE_MAIN10;
-        });
-    if (iter != profiles.end()) {
+    if (base::ranges::any_of(
+            profiles, [](const media::CodecProfileLevel& profile) {
+              return profile.codec == media::VideoCodec::kHEVC &&
+                     profile.profile == media::HEVCPROFILE_MAIN10;
+            })) {
       supported_codecs |= media::EME_CODEC_HEVC_PROFILE_MAIN10;
     }
   }
diff --git a/components/enterprise/browser/controller/browser_dm_token_storage.cc b/components/enterprise/browser/controller/browser_dm_token_storage.cc
index 59dc029..d0d1a44 100644
--- a/components/enterprise/browser/controller/browser_dm_token_storage.cc
+++ b/components/enterprise/browser/controller/browser_dm_token_storage.cc
@@ -180,9 +180,9 @@
   }
 
   // checks if client ID includes an illegal character
-  if (base::ranges::find_if(client_id_, [](char ch) {
+  if (base::ranges::any_of(client_id_, [](char ch) {
         return ch == ' ' || !base::IsAsciiPrintable(ch);
-      }) != client_id_.end()) {
+      })) {
     SYSLOG(ERROR)
         << "Chrome browser cloud management client ID should not"
            " contain a space, new line, or any nonprintable character.";
diff --git a/components/exo/wayland/clients/client_base.cc b/components/exo/wayland/clients/client_base.cc
index 4225689..75c5d39 100644
--- a/components/exo/wayland/clients/client_base.cc
+++ b/components/exo/wayland/clients/client_base.cc
@@ -1241,10 +1241,8 @@
 }
 
 ClientBase::Buffer* ClientBase::DequeueBuffer() {
-  auto buffer_it = base::ranges::find_if_not(
-      buffers_, [](const std::unique_ptr<ClientBase::Buffer>& buffer) {
-        return buffer->busy;
-      });
+  auto buffer_it =
+      base::ranges::find_if_not(buffers_, &ClientBase::Buffer::busy);
   if (buffer_it == buffers_.end())
     return nullptr;
 
diff --git a/components/exo/wayland/zaura_shell.cc b/components/exo/wayland/zaura_shell.cc
index 1c79b9ec..63f580d 100644
--- a/components/exo/wayland/zaura_shell.cc
+++ b/components/exo/wayland/zaura_shell.cc
@@ -876,13 +876,12 @@
         display::GetDisplayZoomFactors(active_mode);
 
     // Ensure that the current zoom factor is a part of the list.
-    auto it =
-        base::ranges::find_if(zoom_factors, [&display_info](float zoom_factor) {
+    if (base::ranges::none_of(zoom_factors, [&display_info](float zoom_factor) {
           return std::abs(display_info.zoom_factor() - zoom_factor) <=
                  std::numeric_limits<float>::epsilon();
-        });
-    if (it == zoom_factors.end())
+        })) {
       zoom_factors.push_back(display_info.zoom_factor());
+    }
 
     for (float zoom_factor : zoom_factors) {
       int32_t output_scale = std::round(zoom_factor * 1000.f);
diff --git a/components/favicon/core/favicon_handler.cc b/components/favicon/core/favicon_handler.cc
index 9558aeb..bbc6232 100644
--- a/components/favicon/core/favicon_handler.cc
+++ b/components/favicon/core/favicon_handler.cc
@@ -43,11 +43,10 @@
     return false;
 
   // Check if at least one of the bitmaps is expired.
-  auto it = base::ranges::find_if(
-      bitmap_results,
-      [](const auto& bitmap_result) { return bitmap_result.expired; });
-  if (it != bitmap_results.end())
+  if (base::ranges::any_of(bitmap_results,
+                           &favicon_base::FaviconRawBitmapResult::expired)) {
     return true;
+  }
 
   // Any favicon size is good if the desired size is 0.
   if (desired_size_in_dip == 0)
@@ -77,9 +76,8 @@
 // Returns true if at least one of |bitmap_results| is valid.
 bool HasValidResult(
     const std::vector<favicon_base::FaviconRawBitmapResult>& bitmap_results) {
-  return base::ranges::find_if(bitmap_results, [](const auto& bitmap_result) {
-           return bitmap_result.is_valid();
-         }) != bitmap_results.end();
+  return base::ranges::any_of(bitmap_results,
+                              &favicon_base::FaviconRawBitmapResult::is_valid);
 }
 
 std::vector<int> GetDesiredPixelSizes(
diff --git a/components/history/core/browser/expire_history_backend_unittest.cc b/components/history/core/browser/expire_history_backend_unittest.cc
index 00947adf..305b8ad 100644
--- a/components/history/core/browser/expire_history_backend_unittest.cc
+++ b/components/history/core/browser/expire_history_backend_unittest.cc
@@ -334,8 +334,8 @@
   }
   for (const auto& pair : urls_modified_notifications_) {
     const auto& rows = pair.second;
-    EXPECT_TRUE(base::ranges::find_if(rows, history::URLRow::URLRowHasURL(
-                                                row.url())) == rows.end());
+    EXPECT_TRUE(
+        base::ranges::none_of(rows, history::URLRow::URLRowHasURL(row.url())));
   }
   EXPECT_TRUE(found_delete_notification);
 }
@@ -357,8 +357,7 @@
     const bool is_from_expiration = pair.first;
     const auto& rows = pair.second;
     if (is_from_expiration == should_be_from_expiration &&
-        base::ranges::find_if(rows, history::URLRow::URLRowHasURL(url)) !=
-            rows.end()) {
+        base::ranges::any_of(rows, history::URLRow::URLRowHasURL(url))) {
       return true;
     }
   }
diff --git a/components/history/core/browser/sync/history_sync_bridge.cc b/components/history/core/browser/sync/history_sync_bridge.cc
index e6707c40..8ec0a61 100644
--- a/components/history/core/browser/sync/history_sync_bridge.cc
+++ b/components/history/core/browser/sync/history_sync_bridge.cc
@@ -543,25 +543,11 @@
       continue;
     }
 
-    // Query the redirect chain that ended in this visit.
-    std::vector<VisitRow> redirect_visits =
-        history_backend_->GetRedirectChain(final_visit);
-    if (redirect_visits.empty()) {
-      // This can happen if there's invalid data in the DB (e.g. broken referrer
-      // "links"). In that case, skip this item.
+    std::unique_ptr<syncer::EntityData> entity_data =
+        QueryRedirectChainAndMakeEntityData(final_visit);
+    if (!entity_data) {
       continue;
     }
-    DCHECK_EQ(redirect_visits.back().visit_id, final_visit.visit_id);
-
-    std::vector<AnnotatedVisit> annotated_visits =
-        history_backend_->ToAnnotatedVisits(redirect_visits);
-
-    std::vector<GURL> favicon_urls = history_backend_->GetFaviconURLsForURL(
-        annotated_visits.back().url_row.url());
-
-    std::unique_ptr<syncer::EntityData> entity_data =
-        MakeEntityData(GetLocalCacheGuid(), annotated_visits, favicon_urls);
-
     batch->Put(key, std::move(entity_data));
   }
 
@@ -652,24 +638,11 @@
     return;
   }
 
-  // Query the redirect chain that ended in this visit.
-  std::vector<VisitRow> redirect_visits =
-      history_backend_->GetRedirectChain(visit_row);
-  if (redirect_visits.empty()) {
-    // This can happen if there's invalid data in the DB (e.g. broken referrer
-    // "links"). In that case, ignore the change.
+  std::unique_ptr<syncer::EntityData> entity_data =
+      QueryRedirectChainAndMakeEntityData(visit_row);
+  if (!entity_data) {
     return;
   }
-  DCHECK_EQ(redirect_visits.back().visit_id, visit_row.visit_id);
-
-  std::vector<AnnotatedVisit> annotated_visits =
-      history_backend_->ToAnnotatedVisits(redirect_visits);
-
-  std::vector<GURL> favicon_urls = history_backend_->GetFaviconURLsForURL(
-      annotated_visits.back().url_row.url());
-
-  std::unique_ptr<syncer::EntityData> entity_data =
-      MakeEntityData(GetLocalCacheGuid(), annotated_visits, favicon_urls);
 
   std::unique_ptr<syncer::MetadataChangeList> metadata_change_list =
       CreateMetadataChangeList();
@@ -751,24 +724,11 @@
     return;
   }
 
-  // Query the redirect chain that ended in this visit.
-  std::vector<VisitRow> redirect_visits =
-      history_backend_->GetRedirectChain(visit_row);
-  if (redirect_visits.empty()) {
-    // This can happen if there's invalid data in the DB (e.g. broken referrer
-    // "links"). In that case, ignore the change.
+  std::unique_ptr<syncer::EntityData> entity_data =
+      QueryRedirectChainAndMakeEntityData(visit_row);
+  if (!entity_data) {
     return;
   }
-  DCHECK_EQ(redirect_visits.back().visit_id, visit_row.visit_id);
-
-  std::vector<AnnotatedVisit> annotated_visits =
-      history_backend_->ToAnnotatedVisits(redirect_visits);
-
-  std::vector<GURL> favicon_urls = history_backend_->GetFaviconURLsForURL(
-      annotated_visits.back().url_row.url());
-
-  std::unique_ptr<syncer::EntityData> entity_data =
-      MakeEntityData(GetLocalCacheGuid(), annotated_visits, favicon_urls);
 
   std::unique_ptr<syncer::MetadataChangeList> metadata_change_list =
       CreateMetadataChangeList();
@@ -821,6 +781,33 @@
   change_processor()->ModelReadyToSync(std::move(batch));
 }
 
+std::unique_ptr<syncer::EntityData>
+HistorySyncBridge::QueryRedirectChainAndMakeEntityData(
+    const VisitRow& final_visit) {
+  // Query the redirect chain that ended in this visit.
+  std::vector<VisitRow> redirect_visits =
+      history_backend_->GetRedirectChain(final_visit);
+  if (redirect_visits.empty()) {
+    // This can happen if there's invalid data in the DB (e.g. broken referrer
+    // "links").
+    return nullptr;
+  }
+  DCHECK_EQ(redirect_visits.back().visit_id, final_visit.visit_id);
+
+  std::vector<AnnotatedVisit> annotated_visits =
+      history_backend_->ToAnnotatedVisits(redirect_visits);
+  if (annotated_visits.empty()) {
+    // Again, this can happen if there's invalid data in the DB.
+    return nullptr;
+  }
+
+  std::vector<GURL> favicon_urls = history_backend_->GetFaviconURLsForURL(
+      annotated_visits.back().url_row.url());
+  // Note: `favicon_urls` may legitimately be empty, that's fine.
+
+  return MakeEntityData(GetLocalCacheGuid(), annotated_visits, favicon_urls);
+}
+
 bool HistorySyncBridge::AddEntityInBackend(
     VisitIDRemapper* id_remapper,
     const sync_pb::HistorySpecifics& specifics) {
diff --git a/components/history/core/browser/sync/history_sync_bridge.h b/components/history/core/browser/sync/history_sync_bridge.h
index 06759aec..63d2f2e 100644
--- a/components/history/core/browser/sync/history_sync_bridge.h
+++ b/components/history/core/browser/sync/history_sync_bridge.h
@@ -83,6 +83,12 @@
   // passes it to the processor so that it can start tracking changes.
   void LoadMetadata();
 
+  // Queries the redirect chain ending in `final_visit` from the HistoryBackend,
+  // and creates the corresponding EntityData. May return null in case of
+  // HistoryBackend failure (e.g. corrupted DB).
+  std::unique_ptr<syncer::EntityData> QueryRedirectChainAndMakeEntityData(
+      const VisitRow& final_visit);
+
   // Adds visit(s) corresponding to the `specifics` to the HistoryBackend.
   // Returns true on success, or false in case of backend errors.
   bool AddEntityInBackend(VisitIDRemapper* id_remapper,
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge.cc b/components/history/core/browser/sync/typed_url_sync_bridge.cc
index 2189b9b..4c138bc 100644
--- a/components/history/core/browser/sync/typed_url_sync_bridge.cc
+++ b/components/history/core/browser/sync/typed_url_sync_bridge.cc
@@ -67,12 +67,10 @@
 }
 
 bool HasTypedUrl(const std::vector<VisitRow>& visits) {
-  auto typed_url_visit =
-      base::ranges::find_if(visits, [](const VisitRow& visit) {
-        return ui::PageTransitionCoreTypeIs(visit.transition,
-                                            ui::PAGE_TRANSITION_TYPED);
-      });
-  return typed_url_visit != visits.end();
+  return base::ranges::any_of(visits, [](const VisitRow& visit) {
+    return ui::PageTransitionCoreTypeIs(visit.transition,
+                                        ui::PAGE_TRANSITION_TYPED);
+  });
 }
 
 void RecordDatabaseError(SyncTypedUrlDatabaseError error) {
diff --git a/components/history/core/browser/top_sites_database.cc b/components/history/core/browser/top_sites_database.cc
index fde0be4c..d8f217b 100644
--- a/components/history/core/browser/top_sites_database.cc
+++ b/components/history/core/browser/top_sites_database.cc
@@ -15,7 +15,6 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/strings/stringprintf.h"
 #include "components/history/core/browser/history_types.h"
 #include "components/history/core/browser/top_sites.h"
 #include "sql/database.h"
@@ -54,7 +53,7 @@
 // NOTE(shess): When changing the version, add a new golden file for
 // the new version and a test to verify that Init() works with it.
 static const int kVersionNumber = 4;
-static const int kDeprecatedVersionNumber = 2;  // and earlier.
+static const int kDeprecatedVersionNumber = 3;  // and earlier.
 
 // Rank used to indicate that this is a newly added URL.
 static const int kRankOfNewURL = -1;
@@ -98,8 +97,8 @@
   RECOVERY_EVENT_FAILED_COMMIT,
 
   // Track invariants resolved by FixTopSitesTable().
-  RECOVERY_EVENT_INVARIANT_RANK,
-  RECOVERY_EVENT_INVARIANT_REDIRECT,
+  OBSOLETE_RECOVERY_EVENT_INVARIANT_RANK,
+  OBSOLETE_RECOVERY_EVENT_INVARIANT_REDIRECT,
   RECOVERY_EVENT_INVARIANT_CONTIGUOUS,
 
   // Track automated full-database recovery.
@@ -120,45 +119,20 @@
 // overflow pages, so it is possible (though unlikely) that a chain could fit
 // together and yield a row with errors.
 void FixTopSitesTable(sql::Database* db, int version) {
-  // Forced sites are only present in version 3.
-  if (version == 3) {
-    // Enforce invariant separating forced and non-forced thumbnails.
-    static constexpr char kFixRankSql[] =
-        "DELETE FROM thumbnails "
-        "WHERE(url_rank=-1 AND last_forced=0)"
-        "OR(url_rank<>-1 AND last_forced<>0)";
-    std::ignore = db->Execute(kFixRankSql);
-    if (db->GetLastChangeCount() > 0)
-      RecordRecoveryEvent(RECOVERY_EVENT_INVARIANT_RANK);
-  }
-
-  // The table was renamed to "top_sites" in version 4.
-  const char* kTableName = (version == 3 ? "thumbnails" : "top_sites");
-
-  // Enforce invariant that url is in its own redirects.
-  static constexpr char kFixRedirectsSql[] =
-      "DELETE FROM %s "
-      "WHERE url<>substr(redirects,-length(url),length(url))";
-  std::ignore =
-      db->Execute(base::StringPrintf(kFixRedirectsSql, kTableName).c_str());
-  if (db->GetLastChangeCount() > 0)
-    RecordRecoveryEvent(RECOVERY_EVENT_INVARIANT_REDIRECT);
-
   // Enforce invariant that url_rank>=0 forms a contiguous series.
   // TODO(shess): I have not found an UPDATE+SUBSELECT method of managing this.
   // It can be done with a temporary table and a subselect, but doing it
   // manually is easier to follow.  Another option would be to somehow integrate
   // the renumbering into the table recovery code.
   static constexpr char kByRankSql[] =
-      "SELECT url_rank,rowid FROM %s WHERE url_rank<>-1 "
+      "SELECT url_rank,rowid FROM top_sites "
+      "WHERE url_rank<>-1 "
       "ORDER BY url_rank";
-  sql::Statement select_statement(db->GetUniqueStatement(
-      base::StringPrintf(kByRankSql, kTableName).c_str()));
+  sql::Statement select_statement(db->GetUniqueStatement(kByRankSql));
 
   static constexpr char kAdjustRankSql[] =
-      "UPDATE %s SET url_rank=? WHERE rowid=?";
-  sql::Statement update_statement(db->GetUniqueStatement(
-      base::StringPrintf(kAdjustRankSql, kTableName).c_str()));
+      "UPDATE top_sites SET url_rank=? WHERE rowid=?";
+  sql::Statement update_statement(db->GetUniqueStatement(kAdjustRankSql));
 
   // Update any rows where `next_rank` doesn't match `url_rank`.
   int next_rank = 0;
@@ -350,20 +324,6 @@
   if (!InitTables(db_.get()))
     return false;
 
-  if (meta_table_.GetVersionNumber() == 2) {
-    if (!UpgradeToVersion3()) {
-      LOG(WARNING) << "Unable to upgrade top sites database to version 3.";
-      return false;
-    }
-  }
-
-  if (meta_table_.GetVersionNumber() == 3) {
-    if (!UpgradeToVersion4()) {
-      LOG(WARNING) << "Unable to upgrade top sites database to version 4.";
-      return false;
-    }
-  }
-
   // Version check.
   if (meta_table_.GetVersionNumber() != kVersionNumber)
     return false;
@@ -391,38 +351,6 @@
   transaction.Commit();
 }
 
-bool TopSitesDatabase::UpgradeToVersion3() {
-  // Add 'last_forced' column.
-  if (!db_->Execute(
-          "ALTER TABLE thumbnails ADD last_forced INTEGER DEFAULT 0")) {
-    return false;
-  }
-  meta_table_.SetVersionNumber(3);
-  return true;
-}
-
-bool TopSitesDatabase::UpgradeToVersion4() {
-  // Rename table to "top_sites" and retain only the url, url_rank, title, and
-  // redirects columns. Also, remove any remaining forced sites.
-
-  static constexpr char kInsertSql[] =
-      // The top_sites table is created before the version upgrade.
-      "INSERT INTO top_sites SELECT "
-      "url,url_rank,title,redirects FROM thumbnails";
-  if (!db_->Execute(kInsertSql))
-    return false;
-
-  if (!db_->Execute("DROP TABLE thumbnails"))
-    return false;
-
-  // Remove any forced sites.
-  if (!db_->Execute("DELETE FROM top_sites WHERE url_rank=-1"))
-    return false;
-
-  meta_table_.SetVersionNumber(4);
-  return true;
-}
-
 void TopSitesDatabase::GetSites(MostVisitedURLList* urls) {
   sql::Statement statement(
       db_->GetCachedStatement(SQL_FROM_HERE,
diff --git a/components/history/core/browser/top_sites_database.h b/components/history/core/browser/top_sites_database.h
index dda2296..b191c98 100644
--- a/components/history/core/browser/top_sites_database.h
+++ b/components/history/core/browser/top_sites_database.h
@@ -56,14 +56,6 @@
   // Rank used to indicate that a URL is not stored in the database.
   static const int kRankOfNonExistingURL;
 
-  // Upgrades the thumbnail table to version 3, returning true if the
-  // upgrade was successful.
-  bool UpgradeToVersion3();
-
-  // Upgrades the top_sites table to version 4, returning true if the upgrade
-  // was successful.
-  bool UpgradeToVersion4();
-
   // Sets a top site for the URL. `new_rank` is the position of the URL in the
   // list of top sites, zero-based.
   // If the URL is not in the table, adds it. If it is, updates its rank and
diff --git a/components/history/core/browser/top_sites_database_unittest.cc b/components/history/core/browser/top_sites_database_unittest.cc
index 8b191bf..171db14 100644
--- a/components/history/core/browser/top_sites_database_unittest.cc
+++ b/components/history/core/browser/top_sites_database_unittest.cc
@@ -97,27 +97,15 @@
   VerifyDatabaseEmpty(db.db_.get());
 }
 
+// Version 3 is deprecated, the resulting schema should be current,
+// with no data.
 TEST_F(TopSitesDatabaseTest, Version3) {
   ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
 
   TopSitesDatabase db;
   ASSERT_TRUE(db.Init(file_name_));
-
   VerifyTablesAndColumns(db.db_.get());
-
-  // Basic operational check.
-  MostVisitedURLList urls;
-  db.GetSites(&urls);
-  ASSERT_EQ(3u, urls.size());
-  EXPECT_EQ(kUrl0, urls[0].url);  // [0] because of url_rank.
-
-  sql::Transaction transaction(db.db_.get());
-  transaction.Begin();
-  ASSERT_TRUE(db.RemoveURLNoTransaction(urls[1]));
-  transaction.Commit();
-
-  db.GetSites(&urls);
-  ASSERT_EQ(2u, urls.size());
+  VerifyDatabaseEmpty(db.db_.get());
 }
 
 TEST_F(TopSitesDatabaseTest, Version4) {
@@ -213,122 +201,6 @@
   }
 }
 
-TEST_F(TopSitesDatabaseTest, Recovery3_CorruptHeader) {
-  // Create an example database.
-  ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
-
-  // Corrupt the database by adjusting the header.
-  EXPECT_TRUE(sql::test::CorruptSizeInHeader(file_name_));
-
-  // Database is unusable at the SQLite level.
-  {
-    sql::Database raw_db;
-    {
-      sql::test::ScopedErrorExpecter expecter;
-      expecter.ExpectError(SQLITE_CORRUPT);
-      ASSERT_TRUE(raw_db.Open(file_name_));
-      EXPECT_TRUE(expecter.SawExpectedErrors());
-    }
-    EXPECT_EQ("ok", sql::test::IntegrityCheck(raw_db));
-  }
-
-  // Corruption should be detected and recovered during Init().
-  {
-    TopSitesDatabase db;
-    {
-      sql::test::ScopedErrorExpecter expecter;
-      expecter.ExpectError(SQLITE_CORRUPT);
-      ASSERT_TRUE(db.Init(file_name_));
-      EXPECT_TRUE(expecter.SawExpectedErrors());
-    }
-
-    MostVisitedURLList urls;
-    db.GetSites(&urls);
-    ASSERT_EQ(3u, urls.size());
-    EXPECT_EQ(kUrl0, urls[0].url);  // [0] because of url_rank.
-  }
-
-  // Double-check database integrity.
-  {
-    sql::Database raw_db;
-    EXPECT_TRUE(raw_db.Open(file_name_));
-    EXPECT_EQ("ok", sql::test::IntegrityCheck(raw_db));
-  }
-}
-
-TEST_F(TopSitesDatabaseTest, Recovery3to4_CorruptIndex) {
-  // Create an example database.
-  ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v3.sql"));
-
-  // Previously, this was part of a monolithic Recovery3 test that aimed to
-  // cover both header corruption and index corruption. However, while testing
-  // recovery from header corruption, the test also upgraded the database to v4.
-  // So, we never had coverage for recovery from v3 with a corrupted index, and
-  // it doesn't work. For now, reproduce the upgrade in the old Recovery3 test.
-  {
-    TopSitesDatabase db;
-    ASSERT_TRUE(db.Init(file_name_));
-  }
-
-  // Corrupt the thumbnails.url auto-index.
-  // Note: The v3 index name is "sqlite_autoindex_thumbnails_1".
-  static const char kIndexName[] = "sqlite_autoindex_top_sites_1";
-  EXPECT_TRUE(sql::test::CorruptIndexRootPage(file_name_, kIndexName));
-
-  // SQLite can operate on the database, but notices the corruption in integrity
-  // check.
-  {
-    sql::Database raw_db;
-    ASSERT_TRUE(raw_db.Open(file_name_));
-    EXPECT_NE("ok", sql::test::IntegrityCheck(raw_db));
-  }
-
-  // Open the database and access the corrupt index.
-  {
-    TopSitesDatabase db;
-    ASSERT_TRUE(db.Init(file_name_));
-
-    {
-      sql::test::ScopedErrorExpecter expecter;
-      expecter.ExpectError(SQLITE_CORRUPT);
-
-      // Accessing the index will throw SQLITE_CORRUPT. The corruption handler
-      // will recover the database and poison the handle, so the outer call
-      // fails.
-      EXPECT_EQ(TopSitesDatabase::kRankOfNonExistingURL,
-                db.GetURLRank(MostVisitedURL(kUrl1, std::u16string())));
-
-      EXPECT_TRUE(expecter.SawExpectedErrors());
-    }
-  }
-
-  // Check that the database is recovered at the SQLite level.
-  {
-    sql::Database raw_db;
-    ASSERT_TRUE(raw_db.Open(file_name_));
-    ASSERT_EQ("ok", sql::test::IntegrityCheck(raw_db));
-  }
-
-  // After recovery, the database accesses won't throw errors. Recovery should
-  // have regenerated the index with no data loss.
-  {
-    TopSitesDatabase db;
-    ASSERT_TRUE(db.Init(file_name_));
-    VerifyTablesAndColumns(db.db_.get());
-
-    EXPECT_EQ(0, db.GetURLRank(MostVisitedURL(kUrl0, std::u16string())));
-    EXPECT_EQ(1, db.GetURLRank(MostVisitedURL(kUrl1, std::u16string())));
-    EXPECT_EQ(2, db.GetURLRank(MostVisitedURL(kUrl2, std::u16string())));
-
-    MostVisitedURLList urls;
-    db.GetSites(&urls);
-    ASSERT_EQ(3u, urls.size());
-    EXPECT_EQ(kUrl0, urls[0].url);  // [0] because of url_rank.
-    EXPECT_EQ(kUrl1, urls[1].url);  // [1] because of url_rank.
-    EXPECT_EQ(kUrl2, urls[2].url);  // [2] because of url_rank.
-  }
-}
-
 TEST_F(TopSitesDatabaseTest, Recovery4_CorruptHeader) {
   // Create an example database.
   EXPECT_TRUE(CreateDatabaseFromSQL(file_name_, "TopSites.v4.sql"));
diff --git a/components/history_clusters/core/BUILD.gn b/components/history_clusters/core/BUILD.gn
index 8662e9d..03608ea 100644
--- a/components/history_clusters/core/BUILD.gn
+++ b/components/history_clusters/core/BUILD.gn
@@ -8,6 +8,8 @@
 
 static_library("core") {
   sources = [
+    "category_cluster_finalizer.cc",
+    "category_cluster_finalizer.h",
     "cluster_finalizer.h",
     "cluster_metrics_utils.cc",
     "cluster_metrics_utils.h",
@@ -90,6 +92,7 @@
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "category_cluster_finalizer_unittest.cc",
     "clusterer_unittest.cc",
     "config_unittest.cc",
     "content_annotations_cluster_processor_unittest.cc",
diff --git a/components/history_clusters/core/category_cluster_finalizer.cc b/components/history_clusters/core/category_cluster_finalizer.cc
new file mode 100644
index 0000000..3606878
--- /dev/null
+++ b/components/history_clusters/core/category_cluster_finalizer.cc
@@ -0,0 +1,47 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/history_clusters/core/category_cluster_finalizer.h"
+
+#include "components/history/core/browser/history_types.h"
+#include "components/history_clusters/core/cluster_metrics_utils.h"
+#include "components/history_clusters/core/config.h"
+#include "components/history_clusters/core/on_device_clustering_features.h"
+#include "components/history_clusters/core/on_device_clustering_util.h"
+
+namespace history_clusters {
+
+CategoryClusterFinalizer::CategoryClusterFinalizer() = default;
+CategoryClusterFinalizer::~CategoryClusterFinalizer() = default;
+
+void CategoryClusterFinalizer::FinalizeCluster(history::Cluster& cluster) {
+  const base::flat_set<std::string>& categories_for_filtering =
+      GetConfig().categories_for_filtering;
+  size_t interesting_visit_cnt = 0;
+
+  ScopedFilterClusterMetricsRecorder metrics_recorder("Category");
+  for (const auto& visit : cluster.visits) {
+    for (const auto& category : visit.annotated_visit.content_annotations
+                                    .model_annotations.categories) {
+      if (categories_for_filtering.find(category.id) !=
+          categories_for_filtering.end()) {
+        interesting_visit_cnt++;
+        break;
+      }
+    }
+
+    if (interesting_visit_cnt >=
+        GetConfig().number_interesting_visits_filter_threshold) {
+      return;
+    }
+  }
+
+  // If we check all the visits in the cluster and all have categories that are
+  // not representative of Journeys, then it's probably not interesting so we
+  // can hide it.
+  cluster.should_show_on_prominent_ui_surfaces = false;
+  metrics_recorder.set_was_filtered(true);
+}
+
+}  // namespace history_clusters
diff --git a/components/history_clusters/core/category_cluster_finalizer.h b/components/history_clusters/core/category_cluster_finalizer.h
new file mode 100644
index 0000000..cfac610
--- /dev/null
+++ b/components/history_clusters/core/category_cluster_finalizer.h
@@ -0,0 +1,25 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_HISTORY_CLUSTERS_CORE_CATEGORY_CLUSTER_FINALIZER_H_
+#define COMPONENTS_HISTORY_CLUSTERS_CORE_CATEGORY_CLUSTER_FINALIZER_H_
+
+#include "components/history_clusters/core/cluster_finalizer.h"
+
+namespace history_clusters {
+
+// A ClusterFinalizer that determines whether a cluster represents a complex
+// task or not based on the categories associated with its visits.
+class CategoryClusterFinalizer : public ClusterFinalizer {
+ public:
+  explicit CategoryClusterFinalizer();
+  ~CategoryClusterFinalizer() override;
+
+  // ClusterFinalizer:
+  void FinalizeCluster(history::Cluster& cluster) override;
+};
+
+}  // namespace history_clusters
+
+#endif  // COMPONENTS_HISTORY_CLUSTERS_CORE_CATEGORY_CLUSTER_FINALIZER_H_
diff --git a/components/history_clusters/core/category_cluster_finalizer_unittest.cc b/components/history_clusters/core/category_cluster_finalizer_unittest.cc
new file mode 100644
index 0000000..881b281c
--- /dev/null
+++ b/components/history_clusters/core/category_cluster_finalizer_unittest.cc
@@ -0,0 +1,112 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/history_clusters/core/category_cluster_finalizer.h"
+
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/task_environment.h"
+#include "components/history_clusters/core/clustering_test_utils.h"
+#include "components/history_clusters/core/config.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace history_clusters {
+namespace {
+
+class CategoryClusterFinalizerTest : public ::testing::Test {
+ public:
+  void SetUp() override {
+    cluster_finalizer_ = std::make_unique<CategoryClusterFinalizer>();
+
+    config_.categories_for_filtering = {"verycomplex", "alsocomplex"};
+    config_.number_interesting_visits_filter_threshold = 2;
+    SetConfigForTesting(config_);
+  }
+
+  void TearDown() override { cluster_finalizer_.reset(); }
+
+  void FinalizeCluster(history::Cluster& cluster) {
+    cluster_finalizer_->FinalizeCluster(cluster);
+  }
+
+ private:
+  Config config_;
+  std::unique_ptr<CategoryClusterFinalizer> cluster_finalizer_;
+  base::test::TaskEnvironment task_environment_;
+};
+
+TEST_F(CategoryClusterFinalizerTest, FilterOnlyNonInterestingCategories) {
+  base::HistogramTester histogram_tester;
+  history::ClusterVisit visit = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(1, GURL("https://bar.com/")));
+  visit.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("mundane", 80);
+
+  history::ClusterVisit visit2 = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(2, GURL("https://bar.com/")));
+  visit2.duplicate_visits.emplace_back(
+      testing::ClusterVisitToDuplicateClusterVisit(visit));
+  visit2.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("alsomundane", 90);
+
+  history::Cluster cluster;
+  cluster.visits = {visit2};
+  FinalizeCluster(cluster);
+  EXPECT_FALSE(cluster.should_show_on_prominent_ui_surfaces);
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.WasClusterFiltered.Category", true, 1);
+}
+
+TEST_F(CategoryClusterFinalizerTest, HideClusterWithOnlyOneInterestingVisit) {
+  base::HistogramTester histogram_tester;
+  history::ClusterVisit visit = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(1, GURL("https://bar.com/")));
+  visit.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("verycomplex", 80);
+
+  history::ClusterVisit visit2 = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(2, GURL("https://bar.com/")));
+  visit2.duplicate_visits.emplace_back(
+      testing::ClusterVisitToDuplicateClusterVisit(visit));
+  visit2.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("alsomundane", 90);
+
+  history::Cluster cluster;
+  cluster.visits = {visit2};
+  FinalizeCluster(cluster);
+  EXPECT_FALSE(cluster.should_show_on_prominent_ui_surfaces);
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.WasClusterFiltered.Category", true, 1);
+}
+
+TEST_F(CategoryClusterFinalizerTest,
+       KeepClusterWithAtLeastTwoInterestingVisits) {
+  base::HistogramTester histogram_tester;
+  history::ClusterVisit visit = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(1, GURL("https://bar.com/")));
+  visit.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("alsocomplex", 90);
+
+  history::ClusterVisit visit2 = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(2, GURL("https://bar.com/")));
+  visit2.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("verymundane", 80);
+
+  history::ClusterVisit visit3 = testing::CreateClusterVisit(
+      testing::CreateDefaultAnnotatedVisit(3, GURL("https://foo.com/")));
+  visit3.duplicate_visits.emplace_back(
+      testing::ClusterVisitToDuplicateClusterVisit(visit));
+  visit3.annotated_visit.content_annotations.model_annotations.categories
+      .emplace_back("verycomplex", 80);
+
+  history::Cluster cluster;
+  cluster.visits = {visit, visit2, visit3};
+  FinalizeCluster(cluster);
+  EXPECT_TRUE(cluster.should_show_on_prominent_ui_surfaces);
+  histogram_tester.ExpectUniqueSample(
+      "History.Clusters.Backend.WasClusterFiltered.Category", false, 1);
+}
+
+}  // namespace
+}  // namespace history_clusters
diff --git a/components/history_clusters/core/config.cc b/components/history_clusters/core/config.cc
index 3c6108f..173bffe8 100644
--- a/components/history_clusters/core/config.cc
+++ b/components/history_clusters/core/config.cc
@@ -311,6 +311,15 @@
         cluster_interaction_threshold);
   }
 
+  // The `kJourneysCategoryFiltering` feature and child parans.
+  {
+    should_use_categories_to_filter_on_prominent_ui_surfaces =
+        base::FeatureList::IsEnabled(
+            features::kOnDeviceClusteringCategoryFiltering);
+
+    categories_for_filtering = JourneysCategoryFilteringAllowlist();
+  }
+
   // The `kUseEngagementScoreCache` feature and child params.
   {
     engagement_score_cache_size = GetFieldTrialParamByFeatureAsInt(
@@ -353,6 +362,23 @@
   GetConfigInternal() = config;
 }
 
+base::flat_set<std::string> JourneysCategoryFilteringAllowlist() {
+  const base::FeatureParam<std::string> kJourneysCategoryFilteringAllowlist{
+      &features::kOnDeviceClusteringCategoryFiltering,
+      "categories_filtering_allowlist", ""};
+  std::string allowlist_string = kJourneysCategoryFilteringAllowlist.Get();
+  if (allowlist_string.empty())
+    return {};
+
+  auto allowlist = base::SplitString(allowlist_string, ",",
+                                     base::WhitespaceHandling::TRIM_WHITESPACE,
+                                     base::SplitResult::SPLIT_WANT_NONEMPTY);
+
+  return allowlist.empty()
+             ? base::flat_set<std::string>()
+             : base::flat_set<std::string>(allowlist.begin(), allowlist.end());
+}
+
 base::flat_set<std::string> JourneysMidBlocklist() {
   const base::FeatureParam<std::string> kJourneysMidBlocklist{
       &internal::kHistoryClustersKeywordFiltering, "JourneysMidBlocklist", ""};
diff --git a/components/history_clusters/core/config.h b/components/history_clusters/core/config.h
index 7231341..d5ba367 100644
--- a/components/history_clusters/core/config.h
+++ b/components/history_clusters/core/config.h
@@ -284,6 +284,15 @@
   // use when clustering based on intersection score.
   int cluster_interaction_threshold = 2;
 
+  // Whether to determine whether to show/hide clusters on prominent UI surfaces
+  // based on categories annotated for a visit.
+  bool should_use_categories_to_filter_on_prominent_ui_surfaces = false;
+
+  // The category IDs used for filtering. These should represent categories that
+  // are repesentatitive of Journeys that we think the user is likely to want to
+  // re-engage with.
+  base::flat_set<std::string> categories_for_filtering;
+
   // The `kUseEngagementScoreCache` feature and child params.
 
   // The max number of hosts that should be stored in the engagement score
@@ -328,6 +337,10 @@
   ~Config();
 };
 
+// Returns the set of categories that should be used to filter for whether a
+// user is likely to re-engage with a cluster.
+base::flat_set<std::string> JourneysCategoryFilteringAllowlist();
+
 // Returns the set of mids that should be blocked from being used by the
 // clustering backend, particularly for potential keywords used for omnibox
 // triggering.
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc
index 5b8a56e6..9bd209a3 100644
--- a/components/history_clusters/core/on_device_clustering_backend.cc
+++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -17,6 +17,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/timer/elapsed_timer.h"
 #include "components/history/core/browser/history_types.h"
+#include "components/history_clusters/core/category_cluster_finalizer.h"
 #include "components/history_clusters/core/config.h"
 #include "components/history_clusters/core/content_annotations_cluster_processor.h"
 #include "components/history_clusters/core/content_visibility_cluster_finalizer.h"
@@ -365,6 +366,9 @@
       GetConfig().should_filter_noisy_clusters) {
     cluster_finalizers.push_back(std::make_unique<NoisyClusterFinalizer>());
   }
+  if (GetConfig().should_use_categories_to_filter_on_prominent_ui_surfaces) {
+    cluster_finalizers.push_back(std::make_unique<CategoryClusterFinalizer>());
+  }
   cluster_finalizers.push_back(std::make_unique<KeywordClusterFinalizer>(
       human_readable_entity_name_to_entity_metadata_map));
   if (GetConfig().should_label_clusters) {
diff --git a/components/history_clusters/core/on_device_clustering_features.cc b/components/history_clusters/core/on_device_clustering_features.cc
index ac7d128..762969d 100644
--- a/components/history_clusters/core/on_device_clustering_features.cc
+++ b/components/history_clusters/core/on_device_clustering_features.cc
@@ -30,5 +30,8 @@
 const base::Feature kOnDeviceClusteringKeywordFiltering{
     "JourneysKeywordFiltering", base::FEATURE_DISABLED_BY_DEFAULT};
 
+const base::Feature kOnDeviceClusteringCategoryFiltering{
+    "JourneysCategoryFiltering", base::FEATURE_DISABLED_BY_DEFAULT};
+
 }  // namespace features
 }  // namespace history_clusters
diff --git a/components/history_clusters/core/on_device_clustering_features.h b/components/history_clusters/core/on_device_clustering_features.h
index 9c52f092..fa2e416 100644
--- a/components/history_clusters/core/on_device_clustering_features.h
+++ b/components/history_clusters/core/on_device_clustering_features.h
@@ -29,6 +29,9 @@
 // Specifies how keywords get filtered and added to a cluster.
 extern const base::Feature kOnDeviceClusteringKeywordFiltering;
 
+// Specifies how categories get used for filtering.
+extern const base::Feature kOnDeviceClusteringCategoryFiltering;
+
 }  // namespace features
 }  // namespace history_clusters
 
diff --git a/components/invalidation/impl/fake_ack_handler.cc b/components/invalidation/impl/fake_ack_handler.cc
index 846a8f6..dd50450 100644
--- a/components/invalidation/impl/fake_ack_handler.cc
+++ b/components/invalidation/impl/fake_ack_handler.cc
@@ -42,27 +42,23 @@
 }
 
 bool FakeAckHandler::IsUnacked(const Invalidation& invalidation) const {
-  return base::ranges::find_if(unacked_invalidations_,
-                               AckHandleMatcher(invalidation.ack_handle())) !=
-         unacked_invalidations_.end();
+  return base::ranges::any_of(unacked_invalidations_,
+                              AckHandleMatcher(invalidation.ack_handle()));
 }
 
 bool FakeAckHandler::IsAcknowledged(const Invalidation& invalidation) const {
-  return base::ranges::find_if(acked_invalidations_,
-                               AckHandleMatcher(invalidation.ack_handle())) !=
-         acked_invalidations_.end();
+  return base::ranges::any_of(acked_invalidations_,
+                              AckHandleMatcher(invalidation.ack_handle()));
 }
 
 bool FakeAckHandler::IsDropped(const Invalidation& invalidation) const {
-  return base::ranges::find_if(dropped_invalidations_,
-                               AckHandleMatcher(invalidation.ack_handle())) !=
-         dropped_invalidations_.end();
+  return base::ranges::any_of(dropped_invalidations_,
+                              AckHandleMatcher(invalidation.ack_handle()));
 }
 
 bool FakeAckHandler::IsUnsent(const Invalidation& invalidation) const {
-  return base::ranges::find_if(unsent_invalidations_,
-                               AckHandleMatcher(invalidation.ack_handle())) !=
-         unsent_invalidations_.end();
+  return base::ranges::any_of(unsent_invalidations_,
+                              AckHandleMatcher(invalidation.ack_handle()));
 }
 
 bool FakeAckHandler::AllInvalidationsAccountedFor() const {
diff --git a/components/language/core/browser/ulp_metrics_logger.cc b/components/language/core/browser/ulp_metrics_logger.cc
index 99b58e43..208b389 100644
--- a/components/language/core/browser/ulp_metrics_logger.cc
+++ b/components/language/core/browser/ulp_metrics_logger.cc
@@ -92,13 +92,12 @@
     // Search for base matches of ulp_language in accept_languages (e.g. pt-BR
     // == pt-MZ).
     const std::string base_ulp_language = l10n_util::GetLanguage(ulp_language);
-    std::vector<std::string>::const_iterator base_match = base::ranges::find_if(
-        accept_languages,
-        [&base_ulp_language](const std::string& accept_language) {
-          return base_ulp_language.compare(
-                     l10n_util::GetLanguage(accept_language)) == 0;
-        });
-    if (base_match != accept_languages.end()) {
+    if (base::ranges::any_of(
+            accept_languages,
+            [&base_ulp_language](const std::string& accept_language) {
+              return base_ulp_language.compare(
+                         l10n_util::GetLanguage(accept_language)) == 0;
+            })) {
       ++num_ulp_languages_also_in_accept_languages;
     }
   }
@@ -114,12 +113,11 @@
   for (const auto& language : languages) {
     // Only add languages that do not have a base match in ulp_languages.
     const std::string base_language = l10n_util::GetLanguage(language);
-    std::vector<std::string>::const_iterator base_match = base::ranges::find_if(
-        ulp_languages, [&base_language](const std::string& ulp_language) {
-          return base_language.compare(l10n_util::GetLanguage(ulp_language)) ==
-                 0;
-        });
-    if (base_match == ulp_languages.end()) {
+    if (base::ranges::none_of(
+            ulp_languages, [&base_language](const std::string& ulp_language) {
+              return base_language.compare(
+                         l10n_util::GetLanguage(ulp_language)) == 0;
+            })) {
       filtered_languages.push_back(language);
     }
   }
diff --git a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
index 0fb1318..766452e 100644
--- a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
+++ b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
@@ -468,8 +468,7 @@
         PresentationErrorType::UNKNOWN, "Invalid presentation arguments."));
     return;
   }
-  if (base::ranges::find_if_not(presentation_urls, IsValidPresentationUrl) !=
-      presentation_urls.end()) {
+  if (!base::ranges::all_of(presentation_urls, IsValidPresentationUrl)) {
     std::move(error_cb).Run(
         PresentationError(PresentationErrorType::NO_PRESENTATION_FOUND,
                           "Invalid presentation URL."));
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index a1f1799..446c722 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -53,6 +53,7 @@
 #include "components/omnibox/browser/voice_suggest_provider.h"
 #include "components/omnibox/browser/zero_suggest_provider.h"
 #include "components/omnibox/browser/zero_suggest_verbatim_match_provider.h"
+#include "components/omnibox/common/omnibox_features.h"
 #include "components/open_from_clipboard/clipboard_recent_content.h"
 #include "components/search_engines/template_url.h"
 #include "components/search_engines/template_url_service.h"
@@ -164,6 +165,15 @@
   }
 }
 
+// The feature is checked frequently, so cache it to avoid performance costs.
+bool DebouncingEnabled() {
+  // Wrapped in a function to avoid static initialization. But uses a static
+  // bool cache to avoid re-invoking `FeatureList::IsEnabled()`.
+  static const bool debouncing_enabled =
+      base::FeatureList::IsEnabled(omnibox::kUpdateResultDebounce);
+  return debouncing_enabled;
+}
+
 }  // namespace
 
 // static
@@ -872,6 +882,10 @@
   result_.SetTailSuggestCommonPrefixes();
 }
 
+const AutocompleteResult& AutocompleteController::result() const {
+  return DebouncingEnabled() ? published_result_ : result_;
+}
+
 void AutocompleteController::UpdateResult(
     bool regenerate_result,
     bool force_notify_default_match_changed) {
@@ -1192,6 +1206,10 @@
 }
 
 void AutocompleteController::NotifyChanged() {
+  // `CopyFrom()` does a vector copy, and `NotifyChanged()` is called a lot, so
+  // guard the copy to measure performance regressions.
+  if (DebouncingEnabled())
+    published_result_.CopyFrom(result_);
   for (Observer& obs : observers_)
     obs.OnResultChanged(this, notify_changed_default_match_);
   notify_changed_debouncer_.CancelRequest();
diff --git a/components/omnibox/browser/autocomplete_controller.h b/components/omnibox/browser/autocomplete_controller.h
index 2b4f6cc..1336ae72 100644
--- a/components/omnibox/browser/autocomplete_controller.h
+++ b/components/omnibox/browser/autocomplete_controller.h
@@ -205,7 +205,7 @@
   OpenTabProvider* open_tab_provider() const { return open_tab_provider_; }
 
   const AutocompleteInput& input() const { return input_; }
-  const AutocompleteResult& result() const { return result_; }
+  const AutocompleteResult& result() const;
   bool done() const { return done_; }
   bool in_start() const { return in_start_; }
   // TODO(manukh): Once we have a smarter `expire_timer_` that early runs when
@@ -371,6 +371,14 @@
   // Data from the autocomplete query.
   AutocompleteResult result_;
 
+  // When debouncing is enabled, `result_` may change without invoking
+  // `NotifyChanged()`. To ensure `result()` is stable between `NotifyChanged()`
+  // calls, `published_result_` snapshots `result_` before invoking
+  // `NotifyChanged()`, and observers only see the stable `published_result_`.
+  // When `kUpdateResultDebounce` is disabled, `published_result_` is always
+  // empty and unused.
+  AutocompleteResult published_result_;
+
   // The most recent time the default match (inline match) changed.  This may
   // be earlier than the most recent keystroke if the recent keystrokes didn't
   // change the suggested match in the omnibox.  (For instance, if
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc
index a8d2eb4..c33c72f2 100644
--- a/components/omnibox/browser/autocomplete_result.cc
+++ b/components/omnibox/browser/autocomplete_result.cc
@@ -684,8 +684,8 @@
     }
     return best;
   }
-  return base::ranges::find_if(
-      *matches, [](const auto& m) { return m.allowed_to_be_default_match; });
+  return base::ranges::find_if(*matches,
+                               &AutocompleteMatch::allowed_to_be_default_match);
 }
 
 // static
@@ -1140,9 +1140,8 @@
   // Prevent old matches from this provider from outranking new ones and
   // becoming the default match by capping old matches' scores to be less than
   // the highest-scoring allowed-to-be-default match from this provider.
-  auto i = base::ranges::find_if(new_matches, [](const AutocompleteMatch& m) {
-    return m.allowed_to_be_default_match;
-  });
+  auto i = base::ranges::find_if(
+      new_matches, &AutocompleteMatch::allowed_to_be_default_match);
 
   // If the provider doesn't have any matches that are allowed-to-be-default,
   // cap scores below the global allowed-to-be-default match.
diff --git a/components/omnibox/browser/shortcuts_backend.cc b/components/omnibox/browser/shortcuts_backend.cc
index affe5ea..5cf01c73 100644
--- a/components/omnibox/browser/shortcuts_backend.cc
+++ b/components/omnibox/browser/shortcuts_backend.cc
@@ -323,11 +323,10 @@
 
   ShortcutsDatabase::ShortcutIDs shortcut_ids;
   for (const auto& guid_pair : guid_map_) {
-    if (base::ranges::find_if(
+    if (base::ranges::any_of(
             deletion_info.deleted_rows(),
             history::URLRow::URLRowHasURL(
-                guid_pair.second->second.match_core.destination_url)) !=
-        deletion_info.deleted_rows().end()) {
+                guid_pair.second->second.match_core.destination_url))) {
       shortcut_ids.push_back(guid_pair.first);
     }
   }
diff --git a/components/omnibox/browser/shortcuts_provider_test_util.cc b/components/omnibox/browser/shortcuts_provider_test_util.cc
index fd82ef6..88e97d4 100644
--- a/components/omnibox/browser/shortcuts_provider_test_util.cc
+++ b/components/omnibox/browser/shortcuts_provider_test_util.cc
@@ -113,12 +113,12 @@
   EXPECT_EQ(expected_urls.size(), ac_matches.size()) << debug;
 
   for (const auto& expected_url : expected_urls) {
-    auto iter = base::ranges::find_if(
-        ac_matches, [&expected_url](const AutocompleteMatch& match) {
+    EXPECT_TRUE(base::ranges::any_of(
+        ac_matches,
+        [&expected_url](const AutocompleteMatch& match) {
           return expected_url.first == match.destination_url.spec() &&
                  expected_url.second == match.allowed_to_be_default_match;
-        });
-    EXPECT_TRUE(iter != ac_matches.end())
+        }))
         << debug
         << base::StringPrintf("Expected URL [%s], default [%d]\n",
                               expected_url.first.c_str(), expected_url.second);
diff --git a/components/optimization_guide/core/model_util.cc b/components/optimization_guide/core/model_util.cc
index 9e55207a..f44c0645 100644
--- a/components/optimization_guide/core/model_util.cc
+++ b/components/optimization_guide/core/model_util.cc
@@ -77,6 +77,8 @@
       return "SegmentationShoppingUser";
     case proto::OPTIMIZATION_TARGET_GEOLOCATION_PERMISSION_PREDICTIONS:
       return "GeolocationPermissions";
+    case proto::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2:
+      return "SegmentationChromeStartAndroidV2";
       // Whenever a new value is added, make sure to add it to the OptTarget
       // variant list in
       // //tools/metrics/histograms/metadata/optimization/histograms.xml.
diff --git a/components/optimization_guide/proto/models.proto b/components/optimization_guide/proto/models.proto
index 85885ce..53980a93 100644
--- a/components/optimization_guide/proto/models.proto
+++ b/components/optimization_guide/proto/models.proto
@@ -286,6 +286,8 @@
   OPTIMIZATION_TARGET_GEOLOCATION_PERMISSION_PREDICTIONS = 20;
   // Target for segmentation: Determine users who are interested in shopping.
   OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER = 21;
+  // Target for segmentation: Chrome Android Start user V2.
+  OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2 = 22;
 }
 
 // The model engine versions that can be used to do model inference.
diff --git a/components/password_manager/core/browser/credential_manager_pending_request_task.cc b/components/password_manager/core/browser/credential_manager_pending_request_task.cc
index cb19356d..b09b490 100644
--- a/components/password_manager/core/browser/credential_manager_pending_request_task.cc
+++ b/components/password_manager/core/browser/credential_manager_pending_request_task.cc
@@ -95,9 +95,8 @@
 
   std::vector<std::unique_ptr<PasswordForm>> result;
   for (const PasswordForm* best_match : best_matches) {
-    auto it = base::ranges::find_if(*forms, [best_match](const auto& form) {
-      return best_match == form.get();
-    });
+    auto it = base::ranges::find(*forms, best_match,
+                                 &std::unique_ptr<PasswordForm>::get);
     DCHECK(it != forms->end());
     result.push_back(std::move(*it));
   }
diff --git a/components/password_manager/core/browser/password_manager_test_utils.cc b/components/password_manager/core/browser/password_manager_test_utils.cc
index eb3c9a55..55e2b5ae 100644
--- a/components/password_manager/core/browser/password_manager_test_utils.cc
+++ b/components/password_manager/core/browser/password_manager_test_utils.cc
@@ -93,10 +93,9 @@
 
   bool had_mismatched_actual_form = false;
   for (const auto& actual : actual_values) {
-    auto it_matching_expectation = base::ranges::find_if(
-        remaining_expectations, [&actual](const PasswordForm* expected) {
-          return *expected == *actual;
-        });
+    auto it_matching_expectation = base::ranges::find(
+        remaining_expectations, *actual,
+        [](const PasswordForm* expected) { return *expected; });
     if (it_matching_expectation != remaining_expectations.end()) {
       // Erase the matched expectation by moving the last element to its place.
       *it_matching_expectation = remaining_expectations.back();
diff --git a/components/password_manager/core/browser/password_save_manager_impl.cc b/components/password_manager/core/browser/password_save_manager_impl.cc
index fccb6bc..031d16d 100644
--- a/components/password_manager/core/browser/password_save_manager_impl.cc
+++ b/components/password_manager/core/browser/password_save_manager_impl.cc
@@ -122,10 +122,10 @@
     const std::vector<const PasswordForm*>& matches,
     const PasswordForm& form) {
   DCHECK(base::ranges::all_of(matches, &PasswordForm::IsUsingAccountStore));
-  return base::ranges::find_if(matches, [&form](const PasswordForm* match) {
-           return ArePasswordFormUniqueKeysEqual(*match, form) &&
-                  match->password_value == form.password_value;
-         }) != matches.end();
+  return base::ranges::any_of(matches, [&form](const PasswordForm* match) {
+    return ArePasswordFormUniqueKeysEqual(*match, form) &&
+           match->password_value == form.password_value;
+  });
 }
 
 PendingCredentialsState ResolvePendingCredentialsStates(
diff --git a/components/password_manager/core/browser/votes_uploader.cc b/components/password_manager/core/browser/votes_uploader.cc
index 237d390..5f1b1545 100644
--- a/components/password_manager/core/browser/votes_uploader.cc
+++ b/components/password_manager/core/browser/votes_uploader.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/check_op.h"
+#include "base/containers/contains.h"
 #include "base/hash/hash.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
@@ -225,12 +226,10 @@
   // Check if |username_value| is an already stored username.
   // TODO(crbug.com/959776) Implement checking against usenames stored for all
   // domains and return STORED_FOR_ANOTHER_DOMAIN in that case.
-  auto credential_match = base::ranges::find_if(
-      stored_credentials, [&username_value](const PasswordForm* credential) {
-        return credential->username_value == username_value;
-      });
-  if (credential_match != stored_credentials.end())
+  if (base::Contains(stored_credentials, username_value,
+                     &PasswordForm::username_value)) {
     return AutofillUploadContents::STORED_FOR_CURRENT_DOMAIN;
+  }
 
   if (autofill::MatchesRegex<autofill::kEmailValueRe>(username_value))
     return AutofillUploadContents::EMAIL;
diff --git a/components/payments/content/payment_request.cc b/components/payments/content/payment_request.cc
index cc99347e..65c25f5 100644
--- a/components/payments/content/payment_request.cc
+++ b/components/payments/content/payment_request.cc
@@ -210,12 +210,6 @@
   GURL google_pay_url(methods::kGooglePay);
   GURL android_pay_url(methods::kAndroidPay);
   GURL google_play_billing_url(methods::kGooglePlayBilling);
-  // Looking for payment methods that are NOT google-related payment methods.
-  auto non_google_it = base::ranges::find_if(
-      spec_->url_payment_method_identifiers(), [&](const GURL& url) {
-        return url != google_pay_url && url != android_pay_url &&
-               url != google_play_billing_url;
-      });
   std::vector<JourneyLogger::PaymentMethodCategory> method_categories;
   if (base::Contains(spec_->url_payment_method_identifiers(), google_pay_url) ||
       base::Contains(spec_->url_payment_method_identifiers(),
@@ -231,7 +225,11 @@
     method_categories.push_back(
         JourneyLogger::PaymentMethodCategory::kSecurePaymentConfirmation);
   }
-  if (non_google_it != spec_->url_payment_method_identifiers().end()) {
+  if (base::ranges::any_of(
+          spec_->url_payment_method_identifiers(), [&](const GURL& url) {
+            return url != google_pay_url && url != android_pay_url &&
+                   url != google_play_billing_url;
+          })) {
     method_categories.push_back(JourneyLogger::PaymentMethodCategory::kOther);
   }
   journey_logger_.SetRequestedPaymentMethods(method_categories);
diff --git a/components/payments/content/payment_request_spec.cc b/components/payments/content/payment_request_spec.cc
index 439c1d6..837e6f2 100644
--- a/components/payments/content/payment_request_spec.cc
+++ b/components/payments/content/payment_request_spec.cc
@@ -395,11 +395,9 @@
   // As per the spec, the selected shipping option should initially be the last
   // one in the array that has its selected field set to true. If none are
   // selected by the merchant, |selected_shipping_option_| stays nullptr.
-  auto selected_shipping_option_it = base::ranges::find_if(
-      base::Reversed(*details_->shipping_options),
-      [](const payments::mojom::PaymentShippingOptionPtr& element) {
-        return element->selected;
-      });
+  auto selected_shipping_option_it =
+      base::ranges::find_if(base::Reversed(*details_->shipping_options),
+                            &payments::mojom::PaymentShippingOption::selected);
   if (selected_shipping_option_it != details_->shipping_options->rend()) {
     selected_shipping_option_ = selected_shipping_option_it->get();
   }
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/.group.details.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/.group.details.yaml
new file mode 100644
index 0000000..dd83306
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/.group.details.yaml
@@ -0,0 +1,3 @@
+caption: <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> management settings
+desc: Controls settings specific to <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph>
+  managed <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices.
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml
new file mode 100644
index 0000000..c8cb484
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/ChromadToCloudMigrationEnabled.yaml
@@ -0,0 +1,32 @@
+caption: Enable the migration of Chromad devices into cloud management
+default: false
+desc: |-
+  Enable the migration of <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> managed devices into cloud management. This policy allows for a remote start of a touchless migration of multiple devices in a company. Additionally, the migration will be as transparent as possible to the end users.
+
+        If this policy is enabled and the enrollment ID has already been uploaded to the DMServer, a remote device powerwash will be triggered.
+
+        If this policy is disabled or not set, the remote device powerwash is not triggered, independently of the enrollment ID upload status.
+
+        This check is triggered whenever the login screen is loaded, then retried every hour (if the device stays on the login screen). This prevents the migration from starting in the middle of a user session, causing potential problems to end users.
+device_only: true
+example_value: false
+features:
+  dynamic_refresh: true
+items:
+- caption: Enable the migration of <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph>
+    managed devices into cloud management.
+  value: true
+- caption: Disable the migration of <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph>
+    managed devices into cloud management.
+  value: false
+owners:
+- fsandrade@chromium.org
+- file://chrome/browser/ash/authpolicy/OWNERS
+schema:
+  type: boolean
+supported_chrome_os_management:
+- active_directory
+supported_on:
+- chrome_os:98-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml
new file mode 100644
index 0000000..52f1b114
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceAuthDataCacheLifetime.yaml
@@ -0,0 +1,27 @@
+caption: Authentication data cache lifetime
+desc: |-
+  Setting the policy specifies in hours the authentication data cache lifetime. The cache has data about realms trusted by the machine realm (affiliated realms). So, authentication data caching helps speed up sign-in. User-specific data and data for unaffiliated realms isn't cached.
+
+        Setting the policy to 0 turns authentication data caching off. Realm-specific data is fetched on every sign-in, so turning off authentication data caching can significantly slow down user sign-in.
+
+        Leaving the policy unset means cached authentication data can be reused for up to 73 hours.
+
+        Note: Restarting the device clears the cache. Even ephemeral users' realm data is cached. Turn off the cache to prevent the tracing of an ephemeral user's realm.
+device_only: true
+example_value: 0
+features:
+  dynamic_refresh: true
+owners:
+- fsandrade@chromium.org
+- file://chrome/browser/ash/authpolicy/OWNERS
+schema:
+  maximum: 9999
+  minimum: 0
+  type: integer
+supported_chrome_os_management:
+- active_directory
+supported_on:
+- chrome_os:73-
+tags:
+- admin-sharing
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml
new file mode 100644
index 0000000..4499dfb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceGpoCacheLifetime.yaml
@@ -0,0 +1,26 @@
+caption: GPO cache lifetime
+desc: |-
+  Setting the policy specifies in hours the Group Policy Object (GPO) cache lifetime—the maximum duration GPOs can be reused before they're redownloaded. Instead of redownloading them on every policy fetch, the system reuses cached GPOs as long as their version doesn't change.
+
+        Setting the policy to 0 turns GPO caching off. Doing this increases server load, because GPOs are redownloaded on every policy fetch, even if they didn't change.
+
+        Leaving the policy unset means cached GPOs can be reused for up to 25 hours.
+
+        Note: Restarting and signing out clears the cache.
+device_only: true
+example_value: 0
+features:
+  dynamic_refresh: true
+owners:
+- fsandrade@chromium.org
+- file://chrome/browser/ash/authpolicy/OWNERS
+schema:
+  maximum: 9999
+  minimum: 0
+  type: integer
+supported_chrome_os_management:
+- active_directory
+supported_on:
+- chrome_os:73-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml
new file mode 100644
index 0000000..f639696
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceKerberosEncryptionTypes.yaml
@@ -0,0 +1,43 @@
+caption: Allowed Kerberos encryption types
+desc: |-
+  Setting the policy designates which encryption types are allowed when requesting Kerberos tickets from a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> server.
+
+        Setting the policy to:
+
+        * All allows the AES encryption types aes256-cts-hmac-sha1-96 and aes128-cts-hmac-sha1-96, as well as the RC4 encryption type rc4-hmac. AES takes precedence if the server supports AES and RC4 encryption types.
+
+        * Strong or leaving it unset allows only the AES types.
+
+        * Legacy allows only the RC4 type. RC4 is insecure. It should only be needed in very specific circumstances. If possible, reconfigure the server to support AES encryption.
+
+        Also see https://wiki.samba.org/index.php/Samba_4.6_Features_added/changed#Kerberos_client_encryption_types.
+device_only: true
+example_value: 1
+features:
+  dynamic_refresh: true
+items:
+- caption: All (insecure)
+  name: All
+  value: 0
+- caption: Strong
+  name: Strong
+  value: 1
+- caption: Legacy (insecure)
+  name: Legacy
+  value: 2
+owners:
+- fsandrade@chromium.org
+- file://chrome/browser/ash/authpolicy/OWNERS
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+supported_chrome_os_management:
+- active_directory
+supported_on:
+- chrome_os:66-
+tags:
+- system-security
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml
new file mode 100644
index 0000000..170ef4ff4
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceMachinePasswordChangeRate.yaml
@@ -0,0 +1,27 @@
+caption: Machine password change rate
+desc: |-
+  Setting the policy specifies in days how often a client changes their machine account password. The password is randomly generated by the client and not visible to the user. Disabling this policy or setting a high number of days can negatively impact security, because it gives potential attackers more time to find and use the machine account password.
+
+        Leaving the policy unset means the machine account password is changed every 30 days.
+
+        Setting the policy to 0 turns off machine account password change.
+
+        Note: Passwords might get older than the specified number of days if the client has been offline for a longer period of time.
+device_only: true
+example_value: 0
+features:
+  dynamic_refresh: true
+owners:
+- fsandrade@chromium.org
+- file://chrome/browser/ash/authpolicy/OWNERS
+schema:
+  maximum: 9999
+  minimum: 0
+  type: integer
+supported_chrome_os_management:
+- active_directory
+supported_on:
+- chrome_os:66-
+tags:
+- system-security
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml
new file mode 100644
index 0000000..b40c727
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/DeviceUserPolicyLoopbackProcessingMode.yaml
@@ -0,0 +1,38 @@
+caption: User policy loopback processing mode
+desc: |-
+  Setting the policy specifies whether and how user policy from computer Group Policy Object (GPO) is processed.
+
+        * Default or leaving it unset has user policy read only from user GPOs. Computer GPOs are ignored.
+
+        * Merge will merge user policy in user GPOs with that of computer GPOs. Computer GPOs take precedence.
+
+        * Replace will replace user policy in user GPOs with that of computer GPOs. User GPOs are ignored.
+device_only: true
+example_value: 0
+features:
+  dynamic_refresh: true
+items:
+- caption: Default
+  name: Default
+  value: 0
+- caption: Merge
+  name: Merge
+  value: 1
+- caption: Replace
+  name: Replace
+  value: 2
+owners:
+- fsandrade@chromium.org
+- file://chrome/browser/ash/authpolicy/OWNERS
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+supported_chrome_os_management:
+- active_directory
+supported_on:
+- chrome_os:66-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/policy_atomic_groups.yaml
new file mode 100644
index 0000000..59c1c91
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ActiveDirectoryManagement/policy_atomic_groups.yaml
@@ -0,0 +1,9 @@
+ActiveDirectoryManagement:
+  caption: <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> management settings
+  policies:
+  - DeviceMachinePasswordChangeRate
+  - DeviceUserPolicyLoopbackProcessingMode
+  - DeviceKerberosEncryptionTypes
+  - DeviceGpoCacheLifetime
+  - DeviceAuthDataCacheLifetime
+  - ChromadToCloudMigrationEnabled
diff --git a/components/policy/resources/templates/policy_definitons/Arc/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Arc/.group.details.yaml
new file mode 100644
index 0000000..c72114b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Android settings
+desc: Controls settings for the Android container (ARC) and Android apps.
diff --git a/components/policy/resources/templates/policy_definitons/Arc/AppRecommendationZeroStateEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/AppRecommendationZeroStateEnabled.yaml
new file mode 100644
index 0000000..95ded99
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/AppRecommendationZeroStateEnabled.yaml
@@ -0,0 +1,30 @@
+caption: Enable App Recommendations in Zero State of Search Box
+deprecated: true
+desc: |-
+  This feature has been removed in Chrome 100.
+
+        Setting this policy to Enabled will cause recommendations for apps previously installed by the user on other devices. These recommendations will appear in the launcher after the local app recomendations, if no search text has been entered.
+
+        Setting this policy as Disabled or leaving it unset means these recommendations do not appear.
+
+        If this policy is set, users cannot change it.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Show app recommendations in the <ph name="PRODUCT_OS_NAME">$2<ex>Google
+    ChromeOS</ex></ph> launcher
+  value: true
+- caption: Do not show app recommendations in the <ph name="PRODUCT_OS_NAME">$2<ex>Google
+    ChromeOS</ex></ph> launcher
+  value: false
+owners:
+- robsc@chromium.org
+- bartfab@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:75-99
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcAppInstallEventLoggingEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcAppInstallEventLoggingEnabled.yaml
new file mode 100644
index 0000000..5943fea2
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcAppInstallEventLoggingEnabled.yaml
@@ -0,0 +1,19 @@
+caption: Log events for Android app installs
+desc: Setting the policy to True sends reports of key, policy-triggered Android app
+  installation events to Google. Setting the policy to False means no events are captured.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://components/policy/resources/OWNERS
+- pastarmovj@chromium.org
+schema:
+  type: boolean
+supported_chrome_os_management:
+- google_cloud
+supported_on:
+- chrome_os:67-
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcAppToWebAppSharingEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcAppToWebAppSharingEnabled.yaml
new file mode 100644
index 0000000..950fb25
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcAppToWebAppSharingEnabled.yaml
@@ -0,0 +1,25 @@
+caption: Enable sharing from Android apps to Web apps
+default: true
+desc: |-
+  Setting the policy to True enables sharing text/files from Android apps to supported Web Apps, using the built-in Android sharing system.
+        When enabled, this will send metadata for installed Web Apps to Google to generate and install a shim Android app.
+        Setting the policy to False disables this functionality.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable Android to Web App sharing.
+  value: true
+- caption: Disable Android to Web App sharing.
+  value: false
+owners:
+- tsergeant@chromium.org
+- chromeos-apps-foundation-team@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:94-
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcBackupRestoreEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcBackupRestoreEnabled.yaml
new file mode 100644
index 0000000..637794f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcBackupRestoreEnabled.yaml
@@ -0,0 +1,18 @@
+caption: Enable Android Backup Service
+deprecated: true
+desc: This policy was removed in <ph name="PRODUCT_NAME">$2<ex>Google ChromeOS</ex></ph>
+  68 and replaced by <ph name="ARC_BR_POLICY_NAME">ArcBackupRestoreServiceEnabled</ph>.
+example_value: false
+features:
+  dynamic_refresh: false
+  per_profile: false
+owners:
+- file://components/policy/resources/OWNERS
+- poromov@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:53-67
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcBackupRestoreServiceEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcBackupRestoreServiceEnabled.yaml
new file mode 100644
index 0000000..2c2c5db
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcBackupRestoreServiceEnabled.yaml
@@ -0,0 +1,36 @@
+caption: Control Android backup and restore service
+default_for_enterprise_users: 0
+desc: |-
+  Setting the policy to <ph name="BR_ENABLED">BackupAndRestoreEnabled</ph> means Android backup and restore is initially on. Setting the policy to <ph name="BR_DISABLED">BackupAndRestoreDisabled</ph> or leaving it unset keeps backup and restore off during setup.
+
+        Setting the policy to <ph name="BR_UNDER_USER_CONTROL">BackupAndRestoreUnderUserControl</ph> means users see prompts to use backup and restore. If they turn on backup and restore, Android app data is uploaded to Android backup servers and restored during reinstallations of compatible apps.
+
+        After initial setup, users can turn backup and restore on or off.
+example_value: 1
+features:
+  dynamic_refresh: false
+  per_profile: false
+items:
+- caption: Backup and restore disabled
+  name: BackupAndRestoreDisabled
+  value: 0
+- caption: User decides whether to enable backup and restore
+  name: BackupAndRestoreUnderUserControl
+  value: 1
+- caption: Backup and restore enabled
+  name: BackupAndRestoreEnabled
+  value: 2
+owners:
+- file://components/policy/resources/OWNERS
+- anqing@chromium.org
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+supported_on:
+- chrome_os:68-
+tags:
+- google-sharing
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcCertificatesSyncMode.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcCertificatesSyncMode.yaml
new file mode 100644
index 0000000..06a356b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcCertificatesSyncMode.yaml
@@ -0,0 +1,31 @@
+caption: Set certificate availability for ARC-apps
+desc: |-
+  Setting the policy to CopyCaCerts makes all ONC-installed CA certificates with <ph name="WEB_TRUSTED_BIT">Web TrustBit</ph> available for ARC-apps.
+
+         Setting to None or leaving it unset makes <ph name="PRODUCT_OS_NAME">$2<ex>ChromeOS</ex></ph> certificates unavailable for ARC-apps.
+example_value: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Disable usage of <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph>
+    certificates to ARC-apps
+  name: SyncDisabled
+  value: 0
+- caption: Enable <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> CA certificates
+    to ARC-apps
+  name: CopyCaCerts
+  value: 1
+owners:
+- pbond@chromium.org
+- edmanp@chromium.org
+schema:
+  enum:
+  - 0
+  - 1
+  type: integer
+supported_on:
+- chrome_os:52-
+tags:
+- system-security
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcEnabled.yaml
new file mode 100644
index 0000000..3db4db6
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcEnabled.yaml
@@ -0,0 +1,17 @@
+caption: Enable ARC
+default_for_enterprise_users: false
+desc: Unless Ephemeral mode or multiple sign-in is on during the user's session, setting
+  ArcEnabled to True turns ARC on for the user. Setting the policy to False or leaving
+  it unset means enterprise users can't use ARC.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- pbond@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:50-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcGoogleLocationServicesEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcGoogleLocationServicesEnabled.yaml
new file mode 100644
index 0000000..7fdb201
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcGoogleLocationServicesEnabled.yaml
@@ -0,0 +1,36 @@
+caption: Control Android Google location services
+default_for_enterprise_users: 0
+desc: |-
+  Unless the <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME">DefaultGeolocationSetting</ph> policy is set to <ph name="BLOCK_GEOLOCATION_SETTING">BlockGeolocation</ph>, then setting <ph name="GLS_ENABLED">GoogleLocationServicesEnabled</ph> turns Google location services on during initial setup. Setting the policy to <ph name="GLS_DISABLED">GoogleLocationServicesDisabled</ph> or leaving it unset keeps location services off during setup.
+
+        Setting policy to <ph name="BR_UNDER_USER_CONTROL">BackupAndRestoreUnderUserControl</ph> prompts users about whether or not to use Google location services. If they turn it on, Android apps use the services to search the device location and send anonymous location data to Google.
+
+        After initial setup, users can turn Google location services on or off.
+example_value: 1
+features:
+  dynamic_refresh: false
+  per_profile: false
+items:
+- caption: Google location services disabled
+  name: GoogleLocationServicesDisabled
+  value: 0
+- caption: User decides whether to enable Google location services
+  name: GoogleLocationServicesUnderUserControl
+  value: 1
+- caption: Google location services enabled
+  name: GoogleLocationServicesEnabled
+  value: 2
+owners:
+- file://components/policy/resources/OWNERS
+- atwilson@chromium.org
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+supported_on:
+- chrome_os:68-
+tags:
+- google-sharing
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcLocationServiceEnabled.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcLocationServiceEnabled.yaml
new file mode 100644
index 0000000..bdddaa0
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcLocationServiceEnabled.yaml
@@ -0,0 +1,18 @@
+caption: Enable Android Google Location Service
+deprecated: true
+desc: This policy was removed in <ph name="PRODUCT_NAME">$2<ex>Google ChromeOS</ex></ph>
+  68 and replaced by <ph name="ARC_GLS_POLICY_NAME">ArcGoogleLocationServicesEnabled</ph>.
+example_value: false
+features:
+  dynamic_refresh: false
+  per_profile: false
+owners:
+- file://components/policy/resources/OWNERS
+- emaxx@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:57-67
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Arc/ArcPolicy.yaml b/components/policy/resources/templates/policy_definitons/Arc/ArcPolicy.yaml
new file mode 100644
index 0000000..4176c1a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/ArcPolicy.yaml
@@ -0,0 +1,61 @@
+caption: Configure ARC
+desc: |-
+  Setting the policy specifies a set of policies to hand over to the ARC runtime. Admins can use it to select the Android apps that autoinstall. Enter value in valid JSON format.
+
+        To pin apps to the launcher, see PinnedLauncherApps.
+description_schema:
+  properties:
+    applications:
+      items:
+        properties:
+          defaultPermissionPolicy:
+            description: 'Policy for granting permission requests to apps. PERMISSION_POLICY_UNSPECIFIED:
+              Policy not specified. If no policy is specified for a permission at
+              any level, then the `PROMPT` behavior is used by default. PROMPT: Prompt
+              the user to grant a permission. GRANT: Automatically grant a permission.
+              DENY: Automatically deny a permission.'
+            enum:
+            - PERMISSION_POLICY_UNSPECIFIED
+            - PROMPT
+            - GRANT
+            - DENY
+            type: string
+          installType:
+            description: 'Specifies how an app is installed. OPTIONAL: The app is
+              not installed automatically, but the user can install it. This is the
+              default if this policy is not specified. PRELOAD: The app is installed
+              automatically, but the user can uninstall it. FORCE_INSTALLED: The app
+              is installed automatically and the user cannot uninstall it. BLOCKED:
+              The app is blocked and cannot be installed. If the app was installed
+              under a previous policy it will be uninstalled.'
+            enum:
+            - OPTIONAL
+            - PRELOAD
+            - FORCE_INSTALLED
+            - BLOCKED
+            type: string
+          managedConfiguration:
+            description: 'App-specific JSON configuration object with a set of key-value
+              pairs, e.g. ''"managedConfiguration": { "key1": value1, "key2": value2
+              }''. The keys are defined in the app manifest.'
+            type: object
+          packageName:
+            description: Android app identifier, e.g. "com.google.android.gm" for
+              Gmail
+            type: string
+        type: object
+      type: array
+  type: object
+example_value: '{"applications":[{"packageName":"com.google.android.gm","installType":"FORCE_INSTALLED","defaultPermissionPolicy":"PROMPT","managedConfiguration":{}},{"packageName":"com.google.android.apps.docs","installType":"PRELOAD","defaultPermissionPolicy":"PROMPT","managedConfiguration":{}}]}'
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- file://components/policy/resources/OWNERS
+- bartfab@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome_os:50-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/Arc/DeviceArcDataSnapshotHours.yaml b/components/policy/resources/templates/policy_definitons/Arc/DeviceArcDataSnapshotHours.yaml
new file mode 100644
index 0000000..d3df889
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/DeviceArcDataSnapshotHours.yaml
@@ -0,0 +1,45 @@
+caption: Intervals when ARC data snapshot update process can be started for Managed
+  Guest Sessions
+desc: 'If "DeviceArcDataSnapshotHours" policy is set, then the ARC data snapshotting
+  mechanism is turned on. And the ARC data snapshot update can be started automatically
+  during the defined time intervals. When an interval starts, ARC data snapshot update
+  is required and no user is logged-in, the ARC data snapshot update process is started
+  without user notification. If the user session is active, the UI notification is
+  shown and have to be accepted in order to reboot a device and start ARC data snapshot
+  update process. Note: a device is blocked for usage during the ARC data snapshot
+  update process.'
+device_only: true
+example_value:
+  intervals:
+  - end:
+      day_of_week: MONDAY
+      time: 21720000
+    start:
+      day_of_week: MONDAY
+      time: 12840000
+  - end:
+      day_of_week: FRIDAY
+      time: 57600000
+    start:
+      day_of_week: FRIDAY
+      time: 38640000
+  timezone: GMT
+features:
+  dynamic_refresh: true
+owners:
+- pbond@chromium.org
+- file://components/policy/resources/OWNERS
+- atwilson@chromium.org
+schema:
+  properties:
+    intervals:
+      items:
+        $ref: WeeklyTimeIntervals
+      type: array
+    timezone:
+      type: string
+  type: object
+supported_on:
+- chrome_os:88-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/Arc/UnaffiliatedArcAllowed.yaml b/components/policy/resources/templates/policy_definitons/Arc/UnaffiliatedArcAllowed.yaml
new file mode 100644
index 0000000..df3717f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Arc/UnaffiliatedArcAllowed.yaml
@@ -0,0 +1,17 @@
+caption: Allow unaffiliated users to use ARC
+desc: |-
+  Unless ARC is turned off by other means, then setting the policy to True or leaving it unset lets users use ARC. Setting the policy to False means unaffiliated users may not use ARC.
+
+        Changes to the policy only apply while ARC isn't running, for example, while starting ChromeOS.
+device_only: true
+example_value: false
+features:
+  dynamic_refresh: false
+owners:
+- phweiss@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:64-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Attestation/.group.details.yaml
new file mode 100644
index 0000000..862ed4db
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Remote attestation
+desc: Configure the remote attestation with TPM mechanism.
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/AttestationEnabledForDevice.yaml b/components/policy/resources/templates/policy_definitons/Attestation/AttestationEnabledForDevice.yaml
new file mode 100644
index 0000000..9780aab
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/AttestationEnabledForDevice.yaml
@@ -0,0 +1,20 @@
+caption: Enable remote attestation for the device
+desc: |-
+  Setting the policy to Enabled allows remote attestation for the device. A certificate is automatically generated and uploaded to the Device Management Server.
+
+        Setting the policy to Disabled or leaving it unset means no certificate is generated and calls to the <ph name="ENTERPRISE_PLATFORM_KEYS_API">Enterprise Platform Keys API</ph> fail.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+owners:
+- emaxx@chromium.org
+- file://chrome/browser/ash/attestation/OWNERS
+schema:
+  type: boolean
+supported_chrome_os_management:
+- google_cloud
+supported_on:
+- chrome_os:28-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/AttestationEnabledForUser.yaml b/components/policy/resources/templates/policy_definitons/Attestation/AttestationEnabledForUser.yaml
new file mode 100644
index 0000000..c1b2eec5
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/AttestationEnabledForUser.yaml
@@ -0,0 +1,18 @@
+caption: Enable remote attestation for the user
+desc: |-
+  Setting the policy to Enabled lets users use the hardware on <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices to remotely attest its identity to the privacy CA through the <ph name="ENTERPRISE_PLATFORM_KEYS_API">Enterprise Platform Keys API</ph> using <ph name="CHALLENGE_USER_KEY_FUNCTION">chrome.enterprise.platformKeys.challengeUserKey()</ph>.
+
+        Setting the policy to Disabled or leaving it unset has calls to the API fail with an error code.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- emaxx@chromium.org
+- file://chrome/browser/ash/attestation/OWNERS
+schema:
+  type: boolean
+supported_on:
+- chrome_os:28-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/AttestationExtensionAllowlist.yaml b/components/policy/resources/templates/policy_definitons/Attestation/AttestationExtensionAllowlist.yaml
new file mode 100644
index 0000000..86a0d7c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/AttestationExtensionAllowlist.yaml
@@ -0,0 +1,21 @@
+caption: Extensions allowed to to use the remote attestation API
+desc: |-
+  Setting the policy specifies the allowed extensions to use the <ph name="ENTERPRISE_PLATFORM_KEYS_API">Enterprise Platform Keys API</ph> functions for remote attestation. Extensions must be on this list to use the API.
+
+        If an extension is not in the list, or the list is not set, the call to the API fails with an error code.
+example_value:
+- ghdilpkmfbfdnomkmaiogjhjnggaggoi
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- emaxx@chromium.org
+- file://chrome/browser/extensions/api/enterprise_platform_keys/OWNERS
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:87-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/AttestationForContentProtectionEnabled.yaml b/components/policy/resources/templates/policy_definitons/Attestation/AttestationForContentProtectionEnabled.yaml
new file mode 100644
index 0000000..91b49d1e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/AttestationForContentProtectionEnabled.yaml
@@ -0,0 +1,20 @@
+caption: Enable the use of remote attestation for content protection for the device
+desc: |-
+  Setting the policy to Enabled or leaving it unset lets <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices use remote attestation (Verified Access) to get a certificate issued by the <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> CA that asserts the device is eligible to play protected content. This process involves sending hardware endorsement information to the <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> CA which uniquely identifies the device.
+
+        Setting the policy to Disabled means the device won't use remote attestation for content protection, and the device may not play protected content.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+owners:
+- emaxx@chromium.org
+- file://chrome/browser/ash/attestation/OWNERS
+schema:
+  type: boolean
+supported_chrome_os_management:
+- google_cloud
+supported_on:
+- chrome_os:31-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/DeviceWebBasedAttestationAllowedUrls.yaml b/components/policy/resources/templates/policy_definitons/Attestation/DeviceWebBasedAttestationAllowedUrls.yaml
new file mode 100644
index 0000000..1be5b30a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/DeviceWebBasedAttestationAllowedUrls.yaml
@@ -0,0 +1,31 @@
+caption: URLs that will be granted access to perform the device attestation during
+  SAML authentication
+desc: |-
+  This policy configures which URLs will be granted access to use remote attestation of device identity during the SAML flow on the sign-in screen.
+
+        Specifically, if a URL matches one of the patterns provided through this policy, it will be allowed to receive a HTTP header containing a response to a remote attestation challenge, attesting device identity and device state.
+
+        If this policy is not set or is set to an empty list, no URL is allowed to use remote attestation on the sign-in screen.
+
+        URLs must have HTTPS scheme, e.g. "https://example.com".
+
+        For detailed information on valid url patterns, please see https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns.
+device_only: true
+example_value:
+- https://www.example.com/
+- https://[*.]example.edu/
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- miersh@google.com
+- pmarko@chromium.org
+- file://chrome/browser/ash/login/OWNERS
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:80-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Attestation/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/Attestation/policy_atomic_groups.yaml
new file mode 100644
index 0000000..137dc39f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Attestation/policy_atomic_groups.yaml
@@ -0,0 +1,7 @@
+Attestation:
+  caption: Attestation
+  policies:
+  - AttestationEnabledForDevice
+  - AttestationEnabledForUser
+  - AttestationExtensionAllowlist
+  - AttestationForContentProtectionEnabled
diff --git a/components/policy/resources/templates/policy_definitons/Borealis/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Borealis/.group.details.yaml
new file mode 100644
index 0000000..d8fd870
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Borealis/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Borealis
+desc: Controls policies related to the <ph name="BOREALIS_NAME">Borealis</ph> subsystem.
diff --git a/components/policy/resources/templates/policy_definitons/Borealis/DeviceBorealisAllowed.yaml b/components/policy/resources/templates/policy_definitons/Borealis/DeviceBorealisAllowed.yaml
new file mode 100644
index 0000000..e1925d14
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Borealis/DeviceBorealisAllowed.yaml
@@ -0,0 +1,26 @@
+caption: Allow devices to use <ph name="BOREALIS_NAME">Borealis</ph> on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+  ChromeOS</ex></ph>
+default: true
+desc: |-
+  Controls the availability of <ph name="BOREALIS_NAME">Borealis</ph> for this device.
+
+        If the policy is set to false, <ph name="BOREALIS_NAME">Borealis</ph> will be unavailable for all users of the device. Otherwise (when the policy is unset, or true) <ph name="BOREALIS_NAME">Borealis</ph> will be available if and only if no other policy or setting disables it.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+items:
+- caption: Do not prevent <ph name="BOREALIS_NAME">Borealis</ph> from running on a
+    device
+  value: true
+- caption: Prevent <ph name="BOREALIS_NAME">Borealis</ph> from running on a device
+  value: false
+owners:
+- hollingum@google.com
+- dca@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:91-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Borealis/UserBorealisAllowed.yaml b/components/policy/resources/templates/policy_definitons/Borealis/UserBorealisAllowed.yaml
new file mode 100644
index 0000000..38ed4bfd
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Borealis/UserBorealisAllowed.yaml
@@ -0,0 +1,26 @@
+caption: Allow users to use <ph name="BOREALIS_NAME">Borealis</ph> on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+  ChromeOS</ex></ph>
+default: true
+desc: |-
+  Controls the availability of <ph name="BOREALIS_NAME">Borealis</ph> for this user.
+
+        If the policy is set to false, <ph name="BOREALIS_NAME">Borealis</ph> will be unavailable. Otherwise (when the policy is unset, or true) <ph name="BOREALIS_NAME">Borealis</ph> will be available if and only if no other policy or setting disables it.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Do not prevent <ph name="BOREALIS_NAME">Borealis</ph> from running for
+    a user
+  value: true
+- caption: Prevent <ph name="BOREALIS_NAME">Borealis</ph> from running for a user
+  value: false
+owners:
+- "hollingum@google.com\t"
+- dca@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:91-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/.group.details.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/.group.details.yaml
new file mode 100644
index 0000000..21d6147
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/.group.details.yaml
@@ -0,0 +1,5 @@
+caption: <ph name="LBS_PRODUCT_NAME">Legacy Browser Support</ph>
+desc: |-
+  Configure policies to switch between browsers.
+
+        Configured websites will automatically open in another browser than <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>.
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/AlternativeBrowserParameters.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/AlternativeBrowserParameters.yaml
new file mode 100644
index 0000000..7fc7d34
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/AlternativeBrowserParameters.yaml
@@ -0,0 +1,31 @@
+caption: Command-line parameters for the alternative browser.
+desc: |-
+  Setting the policy to a list of strings means each string is passed to the alternative browser as separate command-line parameters. On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, the parameters are joined with spaces. On <ph name="MAC_OS_NAME">macOS</ph> and <ph name="LINUX_OS_NAME">Linux®</ph>, a parameter can have spaces and still be treated as a single parameter.
+
+        If an parameter contains <ph name="URL_PLACEHOLDER">${url}</ph>, <ph name="URL_PLACEHOLDER">${url}</ph> is replaced with the URL of the page to open. If no parameter contains <ph name="URL_PLACEHOLDER">${url}</ph>, the URL is appended at the end of the command line.
+
+        Environment variables are expanded. On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, <ph name="ENV_VARIABLE_WIN_EXAMPLE">%ABC%</ph> is replaced with the value of the <ph name="ENV_VARIABLE_VALUE">ABC</ph> environment variable. On <ph name="MAC_OS_NAME">macOS</ph> and <ph name="LINUX_OS_NAME">Linux®</ph>, <ph name="ENV_VARIABLE_UNIX_EXAMPLE">${ABC}</ph> is replaced with the value of the <ph name="ENV_VARIABLE_VALUE">ABC</ph> environment variable.
+
+        Leaving the policy unset means only the URL is passed as a command-line parameter.
+example_value:
+- -foreground
+- -new-window
+- ${url}
+- -profile
+- '%HOME%\browser_profile'
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome.*:71-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/AlternativeBrowserPath.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/AlternativeBrowserPath.yaml
new file mode 100644
index 0000000..6bc47862
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/AlternativeBrowserPath.yaml
@@ -0,0 +1,20 @@
+caption: Alternative browser to launch for configured websites.
+desc: |-
+  Setting the policy controls which command to use to open URLs in an alternative browser. The policy can be set to one of <ph name="INTERNET_EXPLORER_VALUE_PLACEHOLDER">${ie}</ph>, <ph name="FIREFOX_VALUE_PLACEHOLDER">${firefox}</ph>, <ph name="SAFARI_VALUE_PLACEHOLDER">${safari}</ph>, <ph name="OPERA_VALUE_PLACEHOLDER">${opera}</ph>, <ph name="EDGE_VALUE_PLACEHOLDER">${edge}</ph> or a file path. When this policy is set to a file path, that file is used as an executable file. <ph name="INTERNET_EXPLORER_VALUE_PLACEHOLDER">${ie}</ph> is only available on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>. <ph name="SAFARI_VALUE_PLACEHOLDER">${safari}</ph> and <ph name="EDGE_VALUE_PLACEHOLDER">${edge}</ph> are only available on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> and <ph name="MAC_OS_NAME">macOS</ph>.
+
+        Leaving the policy unset puts a platform-specific default in use: <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> for <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, or <ph name="SAFARI_PRODUCT_NAME">Safari®</ph> for <ph name="MAC_OS_NAME">macOS</ph>. On <ph name="LINUX_OS_NAME">Linux®</ph>, launching an alternative browser will fail.
+example_value: ${ie}
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:71-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherChromeParameters.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherChromeParameters.yaml
new file mode 100644
index 0000000..53212056
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherChromeParameters.yaml
@@ -0,0 +1,25 @@
+caption: Command-line parameters for switching from the alternative browser.
+desc: |-
+  Setting the policy to a list of strings means the strings are joined with spaces and passed from <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> to <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> as command-line parameters. If an parameter contains <ph name="URL_PLACEHOLDER">${url}</ph>, <ph name="URL_PLACEHOLDER">${url}</ph> is replaced with the URL of the page to open. If no parameter contains <ph name="URL_PLACEHOLDER">${url}</ph>, the URL is appended at the end of the command line.
+
+        Environment variables are expanded. On <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, <ph name="ENV_VARIABLE_WIN_EXAMPLE">%ABC%</ph> is replaced with the value of the <ph name="ENV_VARIABLE_VALUE">ABC</ph> environment variable.
+
+        Leaving the policy unset means <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> only passes the URL to <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> as a command-line parameter.
+
+        Note: If the Legacy Browser Support add-in for <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> isn't installed, this policy has no effect.
+example_value:
+- --force-dark-mode
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome.win:74-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherChromePath.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherChromePath.yaml
new file mode 100644
index 0000000..5bc5e64
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherChromePath.yaml
@@ -0,0 +1,20 @@
+caption: Path to Chrome for switching from the alternative browser.
+desc: |-
+  This policy controls the command to use to open URLs in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> when switching from <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>. This policy can be set to an executable file path or <ph name="PRODUCT_NAME_PLACEHOLDER">${chrome}</ph> to autodetect the location of <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>.
+
+        Leaving the policy unset means <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> autodetects <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>'s own executable path when launching <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> from Internet Explorer.
+
+        Note: If the Legacy Browser Support add-in for <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> isn't installed, this policy has no effect.
+example_value: ${chrome}
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.win:74-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherDelay.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherDelay.yaml
new file mode 100644
index 0000000..98bcac6
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherDelay.yaml
@@ -0,0 +1,20 @@
+caption: Delay before launching alternative browser (milliseconds)
+desc: |-
+  Setting the policy to a number has <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> show a message for that number of milliseconds, then it opens an alternative browser.
+
+        Leaving the policy unset or set to 0 means navigating to a designated URL immediately opens it in an alternative browser.
+example_value: 10000
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: integer
+supported_on:
+- chrome.*:74-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherEnabled.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherEnabled.yaml
new file mode 100644
index 0000000..f650277
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherEnabled.yaml
@@ -0,0 +1,20 @@
+caption: Enable the Legacy Browser Support feature.
+desc: |-
+  Setting the policy to Enabled means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will try to launch some URLs in an alternate browser, such as <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>. This feature is set using the policies in the <ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP">Legacy Browser support</ph> group.
+
+        Setting the policy to Disabled or leaving it unset means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> won't try to launch designated URLs in an alternate browser.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:73-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherExternalGreylistUrl.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherExternalGreylistUrl.yaml
new file mode 100644
index 0000000..9fb793e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherExternalGreylistUrl.yaml
@@ -0,0 +1,23 @@
+caption: URL of an XML file that contains URLs that should never trigger a browser
+  switch.
+desc: |-
+  Setting the policy to a valid URL has <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> download the site list from that URL and apply the rules as if they were set up with the <ph name="BROWSER_SWITCHER_URL_GREYLIST_POLICY_NAME">BrowserSwitcherUrlGreylist</ph> policy. These policies prevent <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and the alternative browser from opening one another.
+
+        Leaving it unset (or set to a invalid URL) means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> doesn't use the policy as a source of rules for not switching browsers.
+
+        Note: This policy points to an XML file in the same format as <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s <ph name="IEEM_SITELIST_POLICY">SiteList</ph> policy. This loads rules from an XML file, without sharing those rules with <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>. Read more on <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s <ph name="IEEM_SITELIST_POLICY">SiteList</ph> policy ( https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode )
+example_value: http://example.com/greylist.xml
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:77-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherExternalSitelistUrl.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherExternalSitelistUrl.yaml
new file mode 100644
index 0000000..b5877f8
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherExternalSitelistUrl.yaml
@@ -0,0 +1,22 @@
+caption: URL of an XML file that contains URLs to load in an alternative browser.
+desc: |-
+  Setting the policy to a valid URL has <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> download the site list from that URL and apply the rules as if they were set up with the <ph name="SITELIST_POLICY_NAME">BrowserSwitcherUrlList</ph> policy.
+
+        Leaving it unset (or set to a invalid URL) means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> doesn't use the policy as a source of rules for switching browsers.
+
+        Note: This policy points to an XML file in the same format as <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s <ph name="IEEM_SITELIST_POLICY">SiteList</ph> policy. This loads rules from an XML file, without sharing those rules with <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>. Read more on <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s <ph name="IEEM_SITELIST_POLICY">SiteList</ph> policy ( https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode)
+example_value: http://example.com/sitelist.xml
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:72-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherKeepLastChromeTab.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherKeepLastChromeTab.yaml
new file mode 100644
index 0000000..8210882
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherKeepLastChromeTab.yaml
@@ -0,0 +1,20 @@
+caption: Keep last tab open in Chrome.
+desc: |-
+  Setting the policy to Enabled or leaving it unset has <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> keep at least one tab open, after switching to an alternate browser.
+
+        Setting the policy to Disabled has <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> close the tab after switching to an alternate browser, even if it was the last tab. This causes <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> to exit completely.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:74-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherParsingMode.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherParsingMode.yaml
new file mode 100644
index 0000000..6321a4f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherParsingMode.yaml
@@ -0,0 +1,38 @@
+caption: Sitelist parsing mode
+default: 0
+desc: |-
+  This policy controls how <ph name="PRODUCT_NAME">Google Chrome</ph> interprets sitelist/greylist policies for the Legacy Browser Support feature. It affects the following policies: <ph name="URL_LIST_POLICY_NAME">BrowserSwitcherUrlList</ph>, <ph name="URL_GREYLIST_POLICY_NAME">BrowserSwitcherUrlGreylist</ph>, <ph name="USE_IE_SITELIST_POLICY_NAME">BrowserSwitcherUseIeSitelist</ph>, <ph name="EXTERNAL_SITELIST_POLICY_NAME">BrowserSwitcherExternalSitelistUrl</ph>, and <ph name="EXTERNAL_GREYLIST_POLICY_NAME">BrowserSwitcherExternalGreylistUrl</ph>.
+
+        If 'Default' (0) or unset, URL matching is less strict. Rules that do not contain "/" look for a substring anywhere in the URL's hostname. Matching the path component of a URL is case-sensitive.
+
+        If 'IESiteListMode' (1), URL matching is more strict. Rules that do not contain "/" only match at the end of the hostname. They must also be at a domain name boundary. Matching the path component of a URL is case-insensitive. This is more compatible with <ph name="MS_IE_PRODUCT_NAME">Microsoft® Internet Explorer®</ph> and <ph name="MS_EDGE_PRODUCT_NAME">Microsoft® Edge®</ph>.
+
+        For example, with the rules "example.com" and "acme.com/abc":
+
+        "http://example.com/", "http://subdomain.example.com/" and "http://acme.com/abc" match regardless of parsing mode.
+
+        "http://notexample.com/", "http://example.com.invalid.com/", "http://example.comabc/" only match in 'Default' mode.
+
+        "http://acme.com/ABC" only matches in 'IESiteListMode'.
+example_value: 1
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Default behavior for LBS.
+  name: Default
+  value: 0
+- caption: More compatible with Microsoft IE/Edge enterprise mode sitelists.
+  name: IESiteListMode
+  value: 1
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: integer
+supported_on:
+- chrome.*:95-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUrlGreylist.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUrlGreylist.yaml
new file mode 100644
index 0000000..1ec3b50
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUrlGreylist.yaml
@@ -0,0 +1,27 @@
+caption: Websites that should never trigger a browser switch.
+desc: |-
+  Setting the policy controls the list of websites that will never cause a browser switch. Each item is treated as a rule. Those rules that match won't open an alternative browser. Unlike the <ph name="URL_LIST_POLICY_NAME">BrowserSwitcherUrlList</ph> policy, rules apply to both directions. When the <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> add-in is on, it also controls whether <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> should open these URLs in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>.
+
+        Leaving the policy unset adds no websites to the list.
+
+        Note: Elements can also be added to this list through the <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME">BrowserSwitcherExternalGreylistUrl</ph> policy.
+example_value:
+- ie.com
+- '!open-in-chrome.ie.com'
+- foobar.com/ie-only/
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome.*:71-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUrlList.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUrlList.yaml
new file mode 100644
index 0000000..75d84cdf
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUrlList.yaml
@@ -0,0 +1,27 @@
+caption: Websites to open in alternative browser
+desc: |-
+  Setting the policy controls the list of websites to open in an alternative browser. Each item is treated as a rule for something to open in an alternative browser. <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> uses those rules when choosing if a URL should open in an alternative browser. When the <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> add-in is on, <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph> switches back to <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> when the rules don't match. If rules contradict each other, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> uses the most specific rule.
+
+        Leaving the policy unset adds no websites to the list.
+
+        Note: Elements can also be added to this list through the <ph name="USE_IE_SITELIST_POLICY_NAME">BrowserSwitcherUseIeSitelist</ph> and <ph name="EXTERNAL_SITELIST_URL_POLICY_NAME">BrowserSwitcherExternalSitelistUrl</ph> policies.
+example_value:
+- ie.com
+- '!open-in-chrome.ie.com'
+- foobar.com/ie-only/
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome.*:71-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUseIeSitelist.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUseIeSitelist.yaml
new file mode 100644
index 0000000..2f85c6aa
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/BrowserSwitcherUseIeSitelist.yaml
@@ -0,0 +1,22 @@
+caption: Use Internet Explorer's SiteList policy for Legacy Browser Support.
+desc: |-
+  This policy controls whether to load rules from <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s SiteList policy.
+
+        When this policy is set to true, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> reads <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s <ph name="IEEM_SITELIST_POLICY">SiteList</ph> to obtain the site list's URL. <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> then downloads the site list from that URL, and applies the rules as if they had been configured with the <ph name="BROWSER_SWITCHER_URL_LIST_POLICY_NAME">BrowserSwitcherUrlList</ph> policy.
+
+        When this policy is false or unset, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> does not use <ph name="IE_PRODUCT_NAME">Internet Explorer®</ph>'s <ph name="IEEM_SITELIST_POLICY">SiteList</ph> policy as a source of rules for switching browsers.
+
+        For more information on Internet Explorer's <ph name="IEEM_SITELIST_POLICY">SiteList</ph> policy: https://docs.microsoft.com/internet-explorer/ie11-deploy-guide/what-is-enterprise-mode
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.win:71-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/BrowserSwitcher/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/policy_atomic_groups.yaml
new file mode 100644
index 0000000..7cd53ba
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/BrowserSwitcher/policy_atomic_groups.yaml
@@ -0,0 +1,15 @@
+BrowserSwitcher:
+  caption: Legacy Browser Support
+  policies:
+  - AlternativeBrowserPath
+  - AlternativeBrowserParameters
+  - BrowserSwitcherChromePath
+  - BrowserSwitcherChromeParameters
+  - BrowserSwitcherDelay
+  - BrowserSwitcherEnabled
+  - BrowserSwitcherExternalSitelistUrl
+  - BrowserSwitcherExternalGreylistUrl
+  - BrowserSwitcherKeepLastChromeTab
+  - BrowserSwitcherUrlList
+  - BrowserSwitcherUrlGreylist
+  - BrowserSwitcherUseIeSitelist
diff --git a/components/policy/resources/templates/policy_definitons/NativeMessaging/.group.details.yaml b/components/policy/resources/templates/policy_definitons/NativeMessaging/.group.details.yaml
new file mode 100644
index 0000000..2e454805
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NativeMessaging/.group.details.yaml
@@ -0,0 +1,3 @@
+caption: Native Messaging
+desc: Configures policies for Native Messaging. Blocked native messaging hosts won't
+  be allowed unless they are whitelisted.
diff --git a/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingAllowlist.yaml b/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingAllowlist.yaml
new file mode 100644
index 0000000..ba1871e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingAllowlist.yaml
@@ -0,0 +1,25 @@
+caption: Configure native messaging allowlist
+desc: |-
+  Setting the policy specifies which native messaging hosts aren't subject to the deny list. A deny list value of <ph name="WILDCARD_VALUE">*</ph> means all native messaging hosts are denied, unless they're explicitly allowed.
+
+        All native messaging hosts are allowed by default. But, if all native messaging hosts are denied by policy, the admin can use the allow list to change that policy.
+example_value:
+- com.native.messaging.host.name1
+- com.native.messaging.host.name2
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+label: Names of the native messaging hosts to exempt from the blocklist
+owners:
+- file://components/policy/resources/OWNERS
+- zmin@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome.*:86-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingBlocklist.yaml b/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingBlocklist.yaml
new file mode 100644
index 0000000..b406d013
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingBlocklist.yaml
@@ -0,0 +1,25 @@
+caption: Configure native messaging blocklist
+desc: |-
+  Setting the policy specifies which native messaging hosts shouldn't be loaded. A deny list value of <ph name="WILDCARD_VALUE">*</ph> means all native messaging hosts are denied, unless they're explicitly allowed.
+
+        Leaving the policy unset means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> loads all installed native messaging hosts.
+example_value:
+- com.native.messaging.host.name1
+- com.native.messaging.host.name2
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+label: Names of the forbidden native messaging hosts (or * for all)
+owners:
+- file://components/policy/resources/OWNERS
+- atwilson@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome.*:86-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingUserLevelHosts.yaml b/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingUserLevelHosts.yaml
new file mode 100644
index 0000000..8f3d13f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NativeMessaging/NativeMessagingUserLevelHosts.yaml
@@ -0,0 +1,25 @@
+caption: Allow user-level Native Messaging hosts (installed without admin permissions)
+desc: |-
+  Setting the policy to Enabled or leaving it unset means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> can use native messaging hosts installed at the user level.
+
+        Setting the policy to Disabled means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> can only use these hosts if installed at the system level.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Allow both user-level and system-level native messaging hosts
+  value: true
+- caption: Allow only system-level native messaging hosts
+  value: false
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:34-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/NativeMessaging/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/NativeMessaging/policy_atomic_groups.yaml
new file mode 100644
index 0000000..48b2f8ec
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NativeMessaging/policy_atomic_groups.yaml
@@ -0,0 +1,8 @@
+NativeMessaging:
+  caption: Native messaging
+  policies:
+  - NativeMessagingBlacklist
+  - NativeMessagingBlocklist
+  - NativeMessagingAllowlist
+  - NativeMessagingWhitelist
+  - NativeMessagingUserLevelHosts
diff --git a/components/policy/resources/templates/policy_definitons/Network/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Network/.group.details.yaml
new file mode 100644
index 0000000..240e343
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Network settings
+desc: Controls device-wide network configuration.
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceDataRoamingEnabled.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceDataRoamingEnabled.yaml
new file mode 100644
index 0000000..8e9c887fb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceDataRoamingEnabled.yaml
@@ -0,0 +1,23 @@
+caption: Enable data roaming
+desc: |-
+  Setting the policy to Enabled allows data roaming for the device.
+
+        Setting the policy to Disabled or leaving it unset renders data roaming unavailable.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+items:
+- caption: Allow mobile data roaming
+  value: true
+- caption: Do not allow mobile data roaming
+  value: false
+owners:
+- file://components/policy/resources/OWNERS
+- poromov@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:12-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceDockMacAddressSource.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceDockMacAddressSource.yaml
new file mode 100644
index 0000000..b748693
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceDockMacAddressSource.yaml
@@ -0,0 +1,38 @@
+caption: Device MAC address source when docked
+desc: |-
+  Setting the policy lets the administrator change the MAC (media access control) address when connecting a device to the dock. When a dock is connected to some device models, by default, the device's designated dock's MAC address helps identify the device on Ethernet.
+
+        If 'DeviceDockMacAddress' is selected or the policy is left unset, the device's designated dock MAC address will be used.
+
+        If 'DeviceNicMacAddress' is selected, the device's NIC (network interface controller) MAC address will be used.
+
+        If 'DockNicMacAddress' is selected, the dock's NIC MAC address will be used.
+
+        Users can't change this setting.
+device_only: true
+example_value: 1
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Device's designated dock MAC address
+  name: DeviceDockMacAddress
+  value: 1
+- caption: Device's built-in NIC MAC address
+  name: DeviceNicMacAddress
+  value: 2
+- caption: Dock's built-in NIC MAC address
+  name: DockNicMacAddress
+  value: 3
+owners:
+- lamzin@google.com
+schema:
+  enum:
+  - 1
+  - 2
+  - 3
+  type: integer
+supported_on:
+- chrome_os:75-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceHostnameTemplate.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceHostnameTemplate.yaml
new file mode 100644
index 0000000..e36182e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceHostnameTemplate.yaml
@@ -0,0 +1,18 @@
+caption: Device network hostname template
+desc: |-
+  Setting the policy to a string applies the string as the device hostname during DHCP request. The string can have variables <ph name="ASSET_ID_PLACEHOLDER">${ASSET_ID}</ph>, <ph name="SERIAL_NUM_PLACEHOLDER">${SERIAL_NUM}</ph>, <ph name="MAC_ADDR_PLACEHOLDER">${MAC_ADDR}</ph>, <ph name="MACHINE_NAME_PLACEHOLDER">${MACHINE_NAME}</ph>, <ph name="LOCATION_PLACEHOLDER">${LOCATION}</ph> to be replaced with values on the device before using it as a hostname. The resulting substitution should be a valid hostname (per RFC 1035, section 3.1).
+
+        Leaving the policy unset or if the value after substitution isn't a valid hostname, no hostname is set in DHCP request.
+device_only: true
+example_value: chromebook-${ASSET_ID}
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- antrim@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome_os:65-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceHostnameUserConfigurable.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceHostnameUserConfigurable.yaml
new file mode 100644
index 0000000..ae7dc1f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceHostnameUserConfigurable.yaml
@@ -0,0 +1,28 @@
+caption: Allow user to configure their device hostname
+default: false
+desc: |-
+  Determine whether a user is allowed to configure the device hostname.
+
+        If <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME">DeviceHostnameTemplate</ph> is set, the admininistrator sets hostname and the user cannot choose regardless of what this policy is set to.
+        If this policy is set to True and <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME">DeviceHostnameTemplate</ph> is not set, the admininistrator does not set hostname and the user can choose one.
+        If this policy is set to False and <ph name="DEVICE_HOSTNAME_TEMPLATE_POLICY_NAME">DeviceHostnameTemplate</ph> is not set, the admininistrator does not set hostname and the user cannot choose one, hence the default name is used.
+device_only: true
+example_value: true
+features:
+  can_be_mandatory: true
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Allow managed user to configure device hostname
+  value: true
+- caption: Prevent managed user from configuring device hostname
+  value: false
+owners:
+- khorimoto@google.com
+- cros-connectivity@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:97-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceOpenNetworkConfiguration.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceOpenNetworkConfiguration.yaml
new file mode 100644
index 0000000..5134304
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceOpenNetworkConfiguration.yaml
@@ -0,0 +1,23 @@
+arc_support: Android apps can use the network configurations and CA certificates set
+  via this policy, but do not have access to some configuration options.
+caption: Device-level network configuration
+desc: Setting the policy allows pushing network configuration for all users of a <ph
+  name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> device. The network configuration
+  is a JSON-formatted string, as defined by the Open Network Configuration format.
+device_only: true
+example_value: '{ "NetworkConfigurations": [ { "GUID": "{4b224dfd-6849-7a63-5e394343244ae9c9}",
+  "Name": "my WiFi", "Type": "WiFi", "WiFi": { "SSID": "my WiFi", "HiddenSSID": false,
+  "Security": "None", "AutoConnect": true } } ] }'
+features:
+  dynamic_refresh: true
+owners:
+- pmarko@chromium.org
+- file://components/policy/resources/OWNERS
+schema:
+  type: string
+supported_on:
+- chrome_os:16-
+tags:
+- full-admin-access
+type: string
+url_schema: https://chromium.googlesource.com/chromium/src/+/HEAD/components/onc/docs/onc_spec.md
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceWiFiAllowed.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceWiFiAllowed.yaml
new file mode 100644
index 0000000..5503d348
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceWiFiAllowed.yaml
@@ -0,0 +1,18 @@
+caption: Enable WiFi
+desc: |-
+  Setting the policy to Disabled means <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> turns off Wi-Fi, and users can't change it.
+
+        Setting the policy to Enabled or leaving it unset lets users turn Wi-Fi on or off.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- apotapchuk@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:75-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Network/DeviceWiFiFastTransitionEnabled.yaml b/components/policy/resources/templates/policy_definitons/Network/DeviceWiFiFastTransitionEnabled.yaml
new file mode 100644
index 0000000..d060031
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/DeviceWiFiFastTransitionEnabled.yaml
@@ -0,0 +1,18 @@
+caption: Enable 802.11r Fast Transition
+desc: |-
+  Setting the policy to Enabled means that Fast Transition is used when the wireless access point supports it. It applies to all users and interfaces on the device.
+
+        Setting the policy to Disabled or leaving it unset means that Fast Transition isn't used.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- matthewmwang@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:72-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Network/NetworkThrottlingEnabled.yaml b/components/policy/resources/templates/policy_definitons/Network/NetworkThrottlingEnabled.yaml
new file mode 100644
index 0000000..04fb974
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/NetworkThrottlingEnabled.yaml
@@ -0,0 +1,37 @@
+caption: Enable throttling network bandwidth
+desc: Setting the policy turns network throttling on or off. This means that the system
+  is throttled to achieve the provided upload and download rates (in kbits/s). It
+  applies to all users and interfaces on the device.
+device_only: true
+example_value:
+  download_rate_kbits: 5600
+  enabled: true
+  upload_rate_kbits: 5600
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- kirtika@chromium.org
+- pmarko@chromium.org
+schema:
+  properties:
+    download_rate_kbits:
+      description: Desired download rate in kbits/s.
+      type: integer
+    enabled:
+      description: A boolean flag indicating if throttling is enabled.
+      type: boolean
+    upload_rate_kbits:
+      description: Desired upload rate in kbits/s.
+      type: integer
+  required:
+  - enabled
+  - upload_rate_kbits
+  - download_rate_kbits
+  type: object
+supported_chrome_os_management:
+- google_cloud
+supported_on:
+- chrome_os:56-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/Network/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/Network/policy_atomic_groups.yaml
new file mode 100644
index 0000000..f0ec85ba
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Network/policy_atomic_groups.yaml
@@ -0,0 +1,5 @@
+WiFi:
+  caption: WiFi
+  policies:
+  - DeviceWiFiFastTransitionEnabled
+  - DeviceWiFiAllowed
diff --git a/components/policy/resources/templates/policy_definitons/NetworkFileShares/.group.details.yaml b/components/policy/resources/templates/policy_definitons/NetworkFileShares/.group.details.yaml
new file mode 100644
index 0000000..95abfe2
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NetworkFileShares/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Network File Shares settings
+desc: Configure Network File Share related policies.
diff --git a/components/policy/resources/templates/policy_definitons/NetworkFileShares/NTLMShareAuthenticationEnabled.yaml b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NTLMShareAuthenticationEnabled.yaml
new file mode 100644
index 0000000..71e9ac1
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NTLMShareAuthenticationEnabled.yaml
@@ -0,0 +1,18 @@
+caption: Controls enabling NTLM as an authentication protocol for SMB mounts
+default_for_enterprise_users: false
+desc: |-
+  Setting the policy to Enabled means the Network File Shares feature for <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> uses NTLM for authentication to SMB shares if necessary. Setting the policy to Disabled turns off NTLM authentication to SMB shares.
+
+        Leaving the policy unset means the behavior defaults to off for managed users and on for other users.
+example_value: true
+features:
+  dynamic_refresh: false
+  per_profile: true
+owners:
+- amistry@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:71-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetBiosShareDiscoveryEnabled.yaml b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetBiosShareDiscoveryEnabled.yaml
new file mode 100644
index 0000000..6724d758
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetBiosShareDiscoveryEnabled.yaml
@@ -0,0 +1,18 @@
+caption: Controls Network File Share discovery via <ph name="NETBIOS_NAME">NetBIOS</ph>
+default_for_enterprise_users: false
+desc: |-
+  Setting the policy to Enabled means share discovery (the Network File Shares feature for <ph name="PRODUCT_NAME">$2<ex>Google ChromeOS</ex></ph>) uses the <ph name="NETBIOS_PROTOCOL">NetBIOS Name Query Request protocol</ph> to discover shares on the network. Setting the policy to Disabled means share discovery won't use this protocol to discover shares.
+
+        Leaving the policy unset means the behavior defaults to off for managed users and on for other users.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- amistry@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:70-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetworkFileSharesAllowed.yaml b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetworkFileSharesAllowed.yaml
new file mode 100644
index 0000000..1ef8bf5
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetworkFileSharesAllowed.yaml
@@ -0,0 +1,15 @@
+caption: Controls Network File Shares for ChromeOS availability
+desc: Setting the policy to Enabled lets users use Network File Shares for <ph name="PRODUCT_NAME">$2<ex>Google
+  ChromeOS</ex></ph>. Setting the policy to Disabled means users can't use this feature.
+example_value: true
+features:
+  dynamic_refresh: false
+  per_profile: true
+owners:
+- amistry@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:70-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetworkFileSharesPreconfiguredShares.yaml b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetworkFileSharesPreconfiguredShares.yaml
new file mode 100644
index 0000000..70030e5
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NetworkFileShares/NetworkFileSharesPreconfiguredShares.yaml
@@ -0,0 +1,40 @@
+caption: List of preconfigured network file shares.
+desc: |-
+  Setting the policy specifies a list of preset network file shares. Each item is an object with 2 properties: <ph name="SHARE_URL_FIELD_NAME">share_url</ph> and <ph name="MODE_FIELD_NAME">mode</ph>.
+
+        The share URL should be <ph name="SHARE_URL_FIELD_NAME">share_url</ph>.
+
+        For <ph name="MODE_FIELD_NAME">mode</ph>, it should be <ph name="MODE_ENUM_DROP_DOWN">drop_down</ph> or <ph name="MODE_ENUM_PRE_MOUNT">pre_mount</ph>:
+
+        * <ph name="MODE_ENUM_DROP_DOWN">drop_down</ph> indicates that <ph name="SHARE_URL_FIELD_NAME">share_url</ph> will be added to the share discovery list.
+
+        * <ph name="MODE_ENUM_PRE_MOUNT">pre_mount</ph> indicates that <ph name="SHARE_URL_FIELD_NAME">share_url</ph> will be mounted.
+example_value:
+- mode: drop_down
+  share_url: smb://server/share
+- mode: drop_down
+  share_url: \\server\share
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- amistry@chromium.org
+schema:
+  items:
+    properties:
+      mode:
+        enum:
+        - drop_down
+        - pre_mount
+        type: string
+      share_url:
+        type: string
+    required:
+    - share_url
+    - mode
+    type: object
+  type: array
+supported_on:
+- chrome_os:71-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/NetworkFileShares/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/NetworkFileShares/policy_atomic_groups.yaml
new file mode 100644
index 0000000..044bc22
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/NetworkFileShares/policy_atomic_groups.yaml
@@ -0,0 +1,7 @@
+NetworkFileShares:
+  caption: Network File Shares settings
+  policies:
+  - NetworkFileSharesAllowed
+  - NetBiosShareDiscoveryEnabled
+  - NTLMShareAuthenticationEnabled
+  - NetworkFileSharesPreconfiguredShares
diff --git a/components/policy/resources/templates/policy_definitons/ParentalSupervision/.group.details.yaml b/components/policy/resources/templates/policy_definitons/ParentalSupervision/.group.details.yaml
new file mode 100644
index 0000000..735bac52
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ParentalSupervision/.group.details.yaml
@@ -0,0 +1,4 @@
+caption: Parental supervision settings
+desc: |-
+  Controls parental supervision policies, that are applied to child accounts only.
+        These policies are not set in the admin console, but configured directly by Kids API Server.
diff --git a/components/policy/resources/templates/policy_definitons/ParentalSupervision/EduCoexistenceToSVersion.yaml b/components/policy/resources/templates/policy_definitons/ParentalSupervision/EduCoexistenceToSVersion.yaml
new file mode 100644
index 0000000..77ad257
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ParentalSupervision/EduCoexistenceToSVersion.yaml
@@ -0,0 +1,26 @@
+caption: The valid version of Edu Coexistence Terms of Service
+desc: |-
+  This policy indicates current valid version of Edu Coexistence Terms of Service.
+        It is compared with the version last accepted by the parent and used to prompt parent permission renewal when needed.
+
+        When this policy is set Terms of Service version can be validated.
+        When this policy is unset it is not possible to verify validity of Edu Coexistence Terms of Service.
+
+        This policy is only used for Family Link users.
+example_value: '333024512'
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- agawronska@chromium.org
+- danan@chromium.org
+- yilkal@chromium.org
+- cros-families-eng@google.com
+schema:
+  description: The valid version of Terms of Service derived from Google3 cl that
+    introduced new Terms version.
+  type: string
+supported_on:
+- chrome_os:89-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/ParentalSupervision/ParentAccessCodeConfig.yaml b/components/policy/resources/templates/policy_definitons/ParentalSupervision/ParentAccessCodeConfig.yaml
new file mode 100644
index 0000000..2e7edbf0
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ParentalSupervision/ParentAccessCodeConfig.yaml
@@ -0,0 +1,50 @@
+caption: Parent Access Code Configuration
+desc: |-
+  This policy specifies configuration that is used to generate and verify Parent Access Code.
+
+        |current_config| is always used for generating access code and should be used for validating access code only when it cannot be validated with |future_config|.
+        |future_config| is the primary config used for validating access code.
+        |old_configs| should be used for validating access code only when it cannot be validated with |future_config| nor |current_config|.
+
+        The expected way of using this policy is to gradually rotate access code configuration. New configuration is always put into |future_config| and at the same
+        time the existing value is moved into |current_config|. |current_config|'s previous values are moved into |old_configs| and removed after rotation cycle is finished.
+
+        This policy applies only to child user.
+        When this policy is set Parent Access Code can be verified on child user's device.
+        When this policy is unset it is not possible to verify Parent Access Code on child user's device.
+example_value:
+  current_config:
+    access_code_ttl: 600
+    clock_drift_tolerance: 300
+    shared_secret: oOA9nX02LdhYdOzwMsGof+QA3wUKP4YMNlk9S/W3o+w=
+  future_config:
+    access_code_ttl: 600
+    clock_drift_tolerance: 300
+    shared_secret: KMsoIjnpvcWmiU1GHchp2blR96mNyJwS
+  old_configs:
+  - access_code_ttl: 600
+    clock_drift_tolerance: 300
+    shared_secret: sTr6jqMTJGCbLhWI5plFTQb/VsqxwX2Q
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- file://chrome/browser/ash/child_accounts/OWNERS
+- agawronska@chromium.org
+schema:
+  properties:
+    current_config:
+      $ref: Config
+      description: Configuration used to generate and verify Parent Access Code.
+    future_config:
+      $ref: Config
+    old_configs:
+      items:
+        $ref: Config
+      type: array
+  sensitiveValue: true
+  type: object
+supported_on:
+- chrome_os:73-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/ParentalSupervision/PerAppTimeLimits.yaml b/components/policy/resources/templates/policy_definitons/ParentalSupervision/PerAppTimeLimits.yaml
new file mode 100644
index 0000000..d138a22
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ParentalSupervision/PerAppTimeLimits.yaml
@@ -0,0 +1,101 @@
+caption: Per-App Time Limits
+desc: |-
+  Allows to set per-app usage restrictions.
+          Usage restrictions can be applied to the apps installed on <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> for the given user.
+          Restrictions should be passed in |app_limits| list. Only one entry per-app is allowed. Apps not included in the list have no restrictions.
+          It is not possible to block apps that are essential for the operating system, the restrictions for such apps will be ignored.
+          App is uniquely identified by |app_id|. Since different types of apps can use different id format |app_type| needs to be specified next to |app_id|.
+          Per-App Time Limits only support |ARC| apps currently. Android package name is used as |app_id|.
+          Support for other types of applications will be added in the future, for now they can be specified in the policy, but the restrictions will take no effect.
+          There are two types of available restrictions: |BLOCK| and |TIME_LIMIT|.
+          |BLOCK| makes app unavailable for the user. If |daily_limit_mins| is specified with |BLOCK| restriction |daily_limit_mins| will be ignored.
+          |TIME_LIMITS| applies daily usage limit and makes app unavailable after the limit is reached on the given day. Usage limit is specified in |daily_limit_mins|. Usage limit is reset daily at the UTC time passed in |reset_at|.
+          This policy is only used for child users.
+          This policy is complementary to 'UsageTimeLimit'. Restrictions specified in 'UsageTimeLimit' like screen time and bedtime will be enforced regardless of 'PerAppTimeLimits'.
+example_value:
+  activity_reporting_enabled: false
+  app_limits:
+  - app_info:
+      app_id: com.example.myapp
+      app_type: ARC
+    daily_limit_mins: 30
+    last_updated_millis: '1570223060437'
+    restriction: TIME_LIMIT
+  - app_info:
+      app_id: pjkljhegncpnkpknbcohdijeoejaedia
+      app_type: EXTENSION
+    daily_limit_mins: 10
+    last_updated_millis: '1570223000000'
+    restriction: TIME_LIMIT
+  - app_info:
+      app_id: iniodglblcgmngkgdipeiclkdjjpnlbn
+      app_type: BUILT-IN
+    last_updated_millis: '1570223000000'
+    restriction: BLOCK
+  reset_at:
+    hour: 6
+    minute: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- agawronska@chromium.org
+- cros-families-eng@google.com
+schema:
+  properties:
+    activity_reporting_enabled:
+      description: The value of app activity collection toggle. If set to true user
+        app activity will be reported to the server with purpose of being displayed
+        in child and parent <ph name="PRODUCT_NAME">$1<ex>Family Link</ex></ph> app.
+        If set to false Per-app time limits feature will still work, but no data will
+        be reported to the server and therefore displayed in <ph name="PRODUCT_NAME">$1<ex>Family
+        Link</ex></ph>.
+      type: boolean
+    app_limits:
+      items:
+        properties:
+          app_info:
+            properties:
+              app_id:
+                type: string
+              app_type:
+                enum:
+                - ARC
+                - BUILT-IN
+                - EXTENSION
+                - WEB
+                - CROSTINI
+                type: string
+            type: object
+          daily_limit_mins:
+            maximum: 1440
+            minimum: 0
+            type: integer
+          last_updated_millis:
+            description: UTC timestamp for the last time this entry was updated. Sent
+              as a string because the timestamp would not fit in an integer
+            type: string
+          restriction:
+            enum:
+            - BLOCK
+            - TIME_LIMIT
+            type: string
+        type: object
+      type: array
+    reset_at:
+      description: The time of the day in local time when usage quota is renewed.
+      properties:
+        hour:
+          maximum: 23
+          minimum: 0
+          type: integer
+        minute:
+          maximum: 59
+          minimum: 0
+          type: integer
+      type: object
+  type: object
+supported_on:
+- 'chrome_os: 80-'
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/ParentalSupervision/PerAppTimeLimitsAllowlist.yaml b/components/policy/resources/templates/policy_definitons/ParentalSupervision/PerAppTimeLimitsAllowlist.yaml
new file mode 100644
index 0000000..9f5c672
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ParentalSupervision/PerAppTimeLimitsAllowlist.yaml
@@ -0,0 +1,55 @@
+caption: Per-App Time Limits Allowlist
+desc: "This policy specifies which applications and URLs should be allowed for per-app\
+  \ usage restrictions.\n        The configured allowlist is applied to the apps installed\
+  \ on <ph name=\"PRODUCT_OS_NAME\">$2<ex>Google ChromeOS</ex></ph> for the given\
+  \ user with per-app time limits.\n        The configured allowlist can only be applied\
+  \ to child user accounts and take effect when <ph name=\"PER_APP_TIME_LIMITS_POLICY_NAME\"\
+  >PerAppTimeLimits</ph> policy is set.\n        The configured allowlist is applied\
+  \ to applications and URLs so that they will not be blocked by per-app time limits.\n\
+  \        Accessing allowed URLs will not count towards the chrome time limit.\n\
+  \        Add url regular expressions to |url_list| to allow urls that match any\
+  \ of the regular expressions in the list.\n        Add an application with its |app_id|\
+  \ and |app_type| to |app_list| to allow the application.\n       "
+example_value:
+  app_list:
+  - app_id: pjkljhegncpnkpknbcohdijeoejaedia
+    app_type: EXTENSION
+  - app_id: iniodglblcgmngkgdipeiclkdjjpnlbn
+    app_type: BUILT-IN
+  url_list:
+  - chrome://*
+  - file://*
+  - https://www.support.google.com
+  - https://www.policies.google.com
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- yilkal@chromium.org
+- cros-families-eng@google.com
+schema:
+  properties:
+    app_list:
+      items:
+        properties:
+          app_id:
+            type: string
+          app_type:
+            enum:
+            - ARC
+            - BUILT-IN
+            - EXTENSION
+            - WEB
+            - CROSTINI
+            type: string
+        type: object
+      type: array
+    url_list:
+      items:
+        type: string
+      type: array
+  type: object
+supported_on:
+- 'chrome_os: 86-'
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/ParentalSupervision/UsageTimeLimit.yaml b/components/policy/resources/templates/policy_definitons/ParentalSupervision/UsageTimeLimit.yaml
new file mode 100644
index 0000000..27cb913
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/ParentalSupervision/UsageTimeLimit.yaml
@@ -0,0 +1,122 @@
+caption: Time Limit
+desc: |-
+  Allows you to lock the user's session based on the client time or the usage quota of the day.
+
+            The |time_window_limit| specifies a daily window in which the user's session should be locked. We only support one rule for each day of the week, therefore the |entries| array may vary from 0-7 in size. |starts_at| and |ends_at| are the beginning and the end of the window limit, when |ends_at| is smaller than |starts_at| it means that the |time_limit_window| ends on the following day. |last_updated_millis| is the UTC timestamp for the last time this entry was updated, it is sent as a string because the timestamp wouldn't fit in an integer.
+
+            The |time_usage_limit| specifies a daily screen quota, so when the user reaches it, the user's session is locked. There is a property for each day of the week, and it should be set only if there is an active quota for that day. |usage_quota_mins| is the amount of time that the managed device can be use in a day and |reset_at| is the time when the usage quota is renewed. The default value for |reset_at| is midnight ({'hour': 0, 'minute': 0}). |last_updated_millis| is the UTC timestamp for the last time this entry was updated, it is sent as a string because the timestamp wouldn't fit in an integer.
+
+            |overrides| is provided to invalidate temporarily one or more of the previous rules.
+            * If neither time_window_limit nor time_usage_limit is active |LOCK| can be used to lock the device.
+            * |LOCK| temporarily locks a user session until the next time_window_limit or time_usage_limit starts.
+            * |UNLOCK| unlocks a user's session locked by time_window_limit or time_usage_limit.
+            |created_time_millis| is the UTC timestamp for the override creation, it is sent as a String because the timestamp wouldn't fit in an integer It is used to determine whether this override should still be applied. If the current active time limit feature (time usage limit or time window limit) started after the override was created, it should not take action. Also if the override was created before the last change of the active time_window_limit or time_usage_window it should not be applied.
+
+            Multiple overrides may be sent, the newest valid entry is the one that is going to be applied.
+example_value:
+  overrides:
+  - action: UNLOCK
+    action_specific_data:
+      duration_mins: 30
+    created_at_millis: '1250000'
+  time_usage_limit:
+    friday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+    monday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+    reset_at:
+      hour: 6
+      minute: 0
+    saturday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+    sunday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+    thursday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+    tuesday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+    wednesday:
+      last_updated_millis: '1200000'
+      usage_quota_mins: 120
+  time_window_limit:
+    entries:
+    - effective_day: WEDNESDAY
+      ends_at:
+        hour: 7
+        minute: 30
+      last_updated_millis: '1000000'
+      starts_at:
+        hour: 21
+        minute: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- hgrandinetti@chromium.org
+- vtrmc@chromium.org
+schema:
+  properties:
+    overrides:
+      items:
+        properties:
+          action:
+            enum:
+            - LOCK
+            - UNLOCK
+            type: string
+          action_specific_data:
+            properties:
+              duration_mins:
+                minimum: 0
+                type: integer
+            type: object
+          created_at_millis:
+            type: string
+        type: object
+      type: array
+    time_usage_limit:
+      properties:
+        friday:
+          $ref: TimeUsageLimitEntry
+        monday:
+          $ref: TimeUsageLimitEntry
+        reset_at:
+          $ref: Time
+        saturday:
+          $ref: TimeUsageLimitEntry
+        sunday:
+          $ref: TimeUsageLimitEntry
+        thursday:
+          $ref: TimeUsageLimitEntry
+        tuesday:
+          $ref: TimeUsageLimitEntry
+        wednesday:
+          $ref: TimeUsageLimitEntry
+      type: object
+    time_window_limit:
+      properties:
+        entries:
+          items:
+            properties:
+              effective_day:
+                $ref: WeekDay
+              ends_at:
+                $ref: Time
+              last_updated_millis:
+                type: string
+              starts_at:
+                $ref: Time
+            type: object
+          type: array
+      type: object
+  type: object
+supported_on:
+- chrome_os:69-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PasswordManager/.group.details.yaml b/components/policy/resources/templates/policy_definitons/PasswordManager/.group.details.yaml
new file mode 100644
index 0000000..fe6ad17
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PasswordManager/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Password manager
+desc: Configures the password manager.
diff --git a/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordDismissCompromisedAlertEnabled.yaml b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordDismissCompromisedAlertEnabled.yaml
new file mode 100644
index 0000000..df36859
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordDismissCompromisedAlertEnabled.yaml
@@ -0,0 +1,28 @@
+caption: Enable dismissing compromised password alerts for entered credentials
+default: true
+desc: |-
+  Setting the policy to Enabled or leaving it unset gives the user the option to dismiss/restore compromised password alerts.
+
+        If you disable this setting, users will not be able to dismiss alerts about compromised passwords. If enabled, users will be able to dismiss alerts about compromised passwords.
+example_value: true
+features:
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Enable dismissing compromised password alerts
+  value: true
+- caption: Disable dismissing compromised password alerts
+  value: false
+owners:
+- file://components/password_manager/OWNERS
+- eliaskh@chromium.org
+schema:
+  type: boolean
+supported_on:
+- 'chrome.*: 100-'
+- 'chrome_os: 100-'
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordLeakDetectionEnabled.yaml b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordLeakDetectionEnabled.yaml
new file mode 100644
index 0000000..da6d895
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordLeakDetectionEnabled.yaml
@@ -0,0 +1,31 @@
+caption: Enable leak detection for entered credentials
+desc: |-
+  Setting the policy to Enabled lets users have <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> check whether usernames and passwords entered were part of a leak.
+
+        If the policy is set, users can't change it in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. If not set, credential leak checking is allowed, but the user can turn it off. 
+
+        This behavior will not trigger if Safe Browsing is disabled (either by policy or by the user). In order to force Safe Browsing on, use the <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME">SafeBrowsingEnabled</ph> policy or the <ph name="SAFE_BROWSING_PROTETION_LEVEL_POLICY_NAME">SafeBrowsingProtectionLevel</ph> policy.
+example_value: true
+features:
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Enable password leak detection
+  value: true
+- caption: Disable password leak detection
+  value: false
+owners:
+- file://components/password_manager/OWNERS
+- mamir@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:79-
+- chrome_os:79-
+- android:79-
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordManagerAllowShowPasswords.yaml b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordManagerAllowShowPasswords.yaml
new file mode 100644
index 0000000..9248fec
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordManagerAllowShowPasswords.yaml
@@ -0,0 +1,24 @@
+caption: Allow users to show passwords in Password Manager (deprecated)
+deprecated: true
+desc: |-
+  The associated setting was used before reauthentication on viewing passwords was introduced. Since then, the setting and hence this policy had no effect on the behavior of Chrome. The current behavior of Chrome is now the same as if the policy was set to disable showing passwords in clear text in the password manager settings page. That means that the settings page contains just a placeholder, and only upon the user clicking "Show" (and reauthenticating, if applicable) Chrome shows the password. Original description of the policy follows below.
+
+            Controls whether the user may show passwords in clear text in the password manager.
+
+            If you disable this setting, the password manager does not allow showing stored passwords in clear text in the password manager window.
+
+            If you enable or do not set this policy, users can view their passwords in clear text in the password manager.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:8-50
+- chrome_os:11-50
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordManagerEnabled.yaml b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordManagerEnabled.yaml
new file mode 100644
index 0000000..a3fc869
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PasswordManager/PasswordManagerEnabled.yaml
@@ -0,0 +1,32 @@
+arc_support: This policy has no effect on Android apps.
+caption: Enable saving passwords to the password manager
+desc: |-
+  Setting the policy to Enabled means users have <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> remember passwords and provide them the next time they sign in to a site.
+
+        Setting the policy to Disabled means users can't save new passwords, but previously saved passwords will still work.
+
+        If the policy is set, users can't change it in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. If not set, the user can turn off password saving.
+example_value: true
+features:
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Enable saving passwords using the password manager
+  value: true
+- caption: Disable saving passwords using the password manager
+  value: false
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:8-
+- chrome_os:11-
+- android:30-
+- ios:88-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PasswordManager/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/PasswordManager/policy_atomic_groups.yaml
new file mode 100644
index 0000000..0df612c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PasswordManager/policy_atomic_groups.yaml
@@ -0,0 +1,5 @@
+PasswordManager:
+  caption: Password manager
+  policies:
+  - PasswordManagerEnabled
+  - PasswordManagerAllowShowPasswords
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/.group.details.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/.group.details.yaml
new file mode 100644
index 0000000..946efeb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: PluginVm
+desc: Configure <ph name="PLUGIN_VM_NAME">PluginVm</ph> related policies.
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmAllowed.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmAllowed.yaml
new file mode 100644
index 0000000..a470aa4
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmAllowed.yaml
@@ -0,0 +1,19 @@
+caption: Allow devices to use a <ph name="PLUGIN_VM_NAME">PluginVm</ph> on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+  ChromeOS</ex></ph>
+desc: |-
+  Setting the policy to Enabled turns on <ph name="PLUGIN_VM_NAME">PluginVm</ph> for the device, as long as other settings also allow it. <ph name="PLUGIN_VM_ALLOWED_POLICY_NAME">PluginVmAllowed</ph> and <ph name="USER_PLUGIN_VM_ALLOWED_POLICY_NAME">UserPluginVmAllowed</ph> must be True, and either <ph name="PLUGIN_VM_LICENSE_KEY_POLICY_NAME">PluginVmLicenseKey</ph> or <ph name="PLUGIN_VM_USER_ID_POLICY_NAME">PluginVmUserId</ph> must be set for <ph name="PLUGIN_VM_NAME">PluginVm</ph> to run.
+
+        Setting the policy to Disabled or leaving it unset means <ph name="PLUGIN_VM_NAME">PluginVm</ph> isn't on for the device.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+owners:
+- okalitova@chromium.org
+- aoldemeier@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:72-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmDataCollectionAllowed.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmDataCollectionAllowed.yaml
new file mode 100644
index 0000000..2890a8059
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmDataCollectionAllowed.yaml
@@ -0,0 +1,19 @@
+caption: Allow <ph name="PLUGIN_VM_NAME">PluginVm</ph> Product Analytics
+desc: |-
+  Allow <ph name="PLUGIN_VM_NAME">PluginVm</ph> to collect <ph name="PLUGIN_VM_NAME">PluginVm</ph> usage data.
+
+        If the policy is set to false or left unset, <ph name="PLUGIN_VM_NAME">PluginVm</ph> is not allowed to collect data.
+        If set to true, <ph name="PLUGIN_VM_NAME">PluginVm</ph> might collect <ph name="PLUGIN_VM_NAME">PluginVm</ph> usage data that is then combined and thoroughly analyzed to improve <ph name="PLUGIN_VM_NAME">PluginVm</ph> experience.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- okalitova@chromium.org
+- janagrill@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:85-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmImage.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmImage.yaml
new file mode 100644
index 0000000..c1eb0a1
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmImage.yaml
@@ -0,0 +1,29 @@
+caption: <ph name="PLUGIN_VM_NAME">PluginVm</ph> image
+desc: Setting the policy specifies the <ph name="PLUGIN_VM_NAME">PluginVm</ph> image
+  for a user. Specify this policy as a JSON format string, with <ph name="URL_PLUGIN_VM_IMAGE_FIELD">URL</ph>
+  stating where to download the image and <ph name="HASH_PLUGIN_VM_IMAGE_FIELD">hash</ph>
+  as a SHA-256 hash used to verify the integrity of the download.
+example_value:
+  hash: 842841a4c75a55ad050d686f4ea5f77e83ae059877fe9b6946aa63d3d057ed32
+  url: https://example.com/plugin_vm_image
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- okalitova@chromium.org
+- aoldemeier@chromium.org
+schema:
+  properties:
+    hash:
+      description: The SHA-256 hash of the <ph name="PLUGIN_VM_NAME">PluginVm</ph>
+        image.
+      type: string
+    url:
+      description: The URL from which the <ph name="PLUGIN_VM_NAME">PluginVm</ph>
+        image can be downloaded.
+      type: string
+  type: object
+supported_on:
+- chrome_os:72-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmLicenseKey.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmLicenseKey.yaml
new file mode 100644
index 0000000..8e4d3fd1
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmLicenseKey.yaml
@@ -0,0 +1,20 @@
+caption: <ph name="PLUGIN_VM_NAME">PluginVm</ph> license key
+deprecated: true
+desc: |-
+  Setting the policy specifies the <ph name="PLUGIN_VM_NAME">PluginVm</ph> license key for this device.
+
+        This policy was removed in M94.
+device_only: true
+example_value: LICENSE_KEY
+features:
+  dynamic_refresh: true
+owners:
+- okalitova@chromium.org
+- aoldemeier@chromium.org
+schema:
+  sensitiveValue: true
+  type: string
+supported_on:
+- chrome_os:73-93
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmRequiredFreeDiskSpace.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmRequiredFreeDiskSpace.yaml
new file mode 100644
index 0000000..da2d2d84
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmRequiredFreeDiskSpace.yaml
@@ -0,0 +1,21 @@
+caption: Required free disk space for <ph name="PLUGIN_VM_NAME">PluginVm</ph>
+desc: |-
+  Free disk space (in GB) required to install <ph name="PLUGIN_VM_NAME">PluginVm</ph>.
+
+        If this policy is left unset, <ph name="PLUGIN_VM_NAME">PluginVm</ph> installation fails if free disk space available on the device is less than 20 GB (default value).
+        If this policy is set, <ph name="PLUGIN_VM_NAME">PluginVm</ph> installation fails if free disk space available on the device is less than required by policy.
+example_value: 20
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- okalitova@chromium.org
+- janagrill@chromium.org
+schema:
+  maximum: 1000
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:85-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmUserId.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmUserId.yaml
new file mode 100644
index 0000000..15d5d0b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/PluginVmUserId.yaml
@@ -0,0 +1,17 @@
+caption: <ph name="PLUGIN_VM_NAME">PluginVm</ph> user id
+desc: This policy specifies the <ph name="PLUGIN_VM_NAME">PluginVm</ph> licensing
+  user id for this device.
+example_value: USER_ID
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- traciechan@google.com
+- zatrudo@google.com
+schema:
+  sensitiveValue: true
+  type: string
+supported_on:
+- chrome_os:84-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/UserPluginVmAllowed.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/UserPluginVmAllowed.yaml
new file mode 100644
index 0000000..877a9af
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/UserPluginVmAllowed.yaml
@@ -0,0 +1,21 @@
+caption: Allow users to use a <ph name="PLUGIN_VM_NAME">PluginVm</ph> on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+  ChromeOS</ex></ph>
+default: false
+desc: |-
+  Allow this user to run PluginVm.
+
+        If the policy is set to false or left unset, <ph name="PLUGIN_VM_NAME">PluginVm</ph> is not enabled for the user.
+        If set to true, <ph name="PLUGIN_VM_NAME">PluginVm</ph> is enabled for the user as long as other settings also allow it. <ph name="PLUGIN_VM_ALLOWED_POLICY_NAME">PluginVmAllowed</ph> and <ph name="USER_PLUGIN_VM_ALLOWED_POLICY_NAME">UserPluginVmAllowed</ph> need to be true, and either <ph name="PLUGIN_VM_LICENSE_KEY_POLICY_NAME">PluginVmLicenseKey</ph> or <ph name="PLUGIN_VM_USER_ID_POLICY_NAME">PluginVmUserId</ph> need to be set for <ph name="PLUGIN_VM_NAME">PluginVm</ph> to be allowed to run.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- okalitova@chromium.org
+- janagrill@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:84-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PluginVm/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/PluginVm/policy_atomic_groups.yaml
new file mode 100644
index 0000000..b7c4914
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PluginVm/policy_atomic_groups.yaml
@@ -0,0 +1,10 @@
+PluginVm:
+  caption: PluginVm
+  policies:
+  - PluginVmAllowed
+  - PluginVmDataCollectionAllowed
+  - PluginVmImage
+  - PluginVmLicenseKey
+  - PluginVmRequiredFreeDiskSpace
+  - PluginVmUserId
+  - UserPluginVmAllowed
diff --git a/components/policy/resources/templates/policy_definitons/PowerAndShutdown/.group.details.yaml b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/.group.details.yaml
new file mode 100644
index 0000000..8fe0911
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Power and shutdown
+desc: Controls settings related to power management and rebooting.
diff --git a/components/policy/resources/templates/policy_definitons/PowerAndShutdown/DeviceLoginScreenPowerManagement.yaml b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/DeviceLoginScreenPowerManagement.yaml
new file mode 100644
index 0000000..c7d91b2b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/DeviceLoginScreenPowerManagement.yaml
@@ -0,0 +1,55 @@
+caption: Power management on the login screen
+desc: |-
+  Setting the policy lets you set how <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> behaves when there is no user activity for some amount of time while the sign-in screen appears. The policy controls multiple settings. For their individual semantics and value ranges, see the corresponding policies that control power management within a session.
+
+        The deviations from these policies are:
+
+        * The actions to take on idle or lid close cannot be to end the session.
+
+        * The default action taken on idle when running on AC power is to shut down.
+
+        Leaving the policy or any of its settings unset results in the use of the default values for the various power settings.
+device_only: true
+example_value:
+  AC:
+    IdleAction: DoNothing
+  Battery:
+    Delays:
+      Idle: 30000
+      ScreenDim: 10000
+      ScreenOff: 20000
+    IdleAction: DoNothing
+  LidCloseAction: Suspend
+  UserActivityScreenDimDelayScale: 110
+features:
+  dynamic_refresh: true
+owners:
+- file://components/policy/resources/OWNERS
+- bartfab@chromium.org
+schema:
+  properties:
+    AC:
+      $ref: DeviceLoginScreenPowerSettings
+      description: Power management settings applicable only when running on AC power
+    Battery:
+      $ref: DeviceLoginScreenPowerSettings
+      description: Power management settings applicable only when running on battery
+        power
+    LidCloseAction:
+      description: Action to take when the lid is closed
+      enum:
+      - Suspend
+      - Shutdown
+      - DoNothing
+      type: string
+    UserActivityScreenDimDelayScale:
+      description: Percentage by which the screen dim delay is scaled when user activity
+        is observed while the screen is dimmed or soon after the screen has been turned
+        off
+      minimum: 100
+      type: integer
+  type: object
+supported_on:
+- chrome_os:30-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PowerAndShutdown/DeviceRebootOnShutdown.yaml b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/DeviceRebootOnShutdown.yaml
new file mode 100644
index 0000000..99537a3
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/DeviceRebootOnShutdown.yaml
@@ -0,0 +1,18 @@
+caption: Automatic reboot on device shutdown
+desc: |-
+  Setting the policy to Enabled means <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> triggers a restart when users shut down the device. <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> replaces all shutdown buttons in the UI with restart buttons. If the users shut down devices using the power button, they won't automatically restart, even if the policy is on.
+
+        Setting the policy to Disabled or leaving it unset means <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> lets them shut down the device.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+owners:
+- file://components/policy/resources/OWNERS
+- emaxx@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:41-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerAndShutdown/UptimeLimit.yaml b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/UptimeLimit.yaml
new file mode 100644
index 0000000..534a1e2
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerAndShutdown/UptimeLimit.yaml
@@ -0,0 +1,22 @@
+caption: Limit device uptime by automatically rebooting
+desc: |-
+  Setting the policy limits the device uptime by scheduling automatic restarts, which you can delay by up to 24 hours if a user is on the device. The policy value should be specified in seconds. Values are clamped to be at least 3,600 (one hour).
+
+        If you set the policy, users can't change it. If not set, the device uptime isn't limited.
+
+        Note: Automatic restarts are only on while the sign-in screen appears or during a kiosk app session.
+device_only: true
+example_value: 86400
+features:
+  dynamic_refresh: true
+owners:
+- file://components/policy/resources/OWNERS
+- bartfab@chromium.org
+schema:
+  type: integer
+supported_chrome_os_management:
+- google_cloud
+supported_on:
+- chrome_os:29-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/.group.details.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/.group.details.yaml
new file mode 100644
index 0000000..8ae82d4e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/.group.details.yaml
@@ -0,0 +1,5 @@
+caption: Power management
+desc: |-
+  Configure power management in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph>.
+
+        These policies let you configure how <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> behaves when the user remains idle for some amount of time.
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/AllowScreenWakeLocks.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/AllowScreenWakeLocks.yaml
new file mode 100644
index 0000000..bb65322
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/AllowScreenWakeLocks.yaml
@@ -0,0 +1,24 @@
+caption: Allow screen wake locks
+default: true
+desc: |-
+  Unless <ph name="ALLOW_WAKE_LOCKS_POLICY_NAME">AllowWakeLocks</ph> is set to Disabled, setting <ph name="ALLOW_SCREEN_WAKE_LOCKS_POLICY_NAME">AllowScreenWakeLocks</ph> to Enabled or leaving it unset allows screen wake locks for power management. Extensions can request screen wake locks through the power management extension API and ARC apps.
+
+        Setting the policy to Disabled demotes screen wake lock requests to system wake lock requests.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Allow screen wake locks for power management
+  value: true
+- caption: Demote screen wake lock requests to system wake lock requests
+  value: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:28-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/AllowWakeLocks.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/AllowWakeLocks.yaml
new file mode 100644
index 0000000..6bb4241a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/AllowWakeLocks.yaml
@@ -0,0 +1,24 @@
+caption: Allow wake locks
+default: true
+desc: |-
+  Setting the policy to Enabled or leaving it unset allows wake locks for power management. Extensions can request wake locks through the power management extension API and ARC apps.
+
+        Setting the policy to Disabled means wake lock requests are ignored.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Allow wake locks for power management
+  value: true
+- caption: Ignore requests for wake locks for power management
+  value: false
+owners:
+- file://chrome/browser/ash/login/demo_mode/OWNERS
+- michaelpg@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:71-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceAdvancedBatteryChargeModeDayConfig.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceAdvancedBatteryChargeModeDayConfig.yaml
new file mode 100644
index 0000000..06ee35f8
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceAdvancedBatteryChargeModeDayConfig.yaml
@@ -0,0 +1,51 @@
+caption: Set advanced battery charge mode day config
+desc: |-
+  If <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME">DeviceAdvancedBatteryChargeModeEnabled</ph> is set to Enabled, then setting <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME">DeviceAdvancedBatteryChargeModeDayConfig</ph> lets you set up advanced battery charge mode. The value for <ph name="CHARGE_START_TIME_FIELD_NAME">charge_start_time</ph> must be less than <ph name="CHARGE_END_TIME_FIELD_NAME">charge_end_time</ph>.
+
+        Leaving the policy unset keeps advanced battery charge mode off.
+
+        Valid values for <ph name="MINUTE_FIELD_NAME">minute</ph> field in <ph name="CHARGE_START_TIME_FIELD_NAME">charge_start_time</ph> and <ph name="CHARGE_END_TIME_FIELD_NAME">charge_end_time</ph> are 0, 15, 30, 45.
+device_only: true
+example_value:
+  entries:
+  - charge_end_time:
+      hour: 23
+      minute: 0
+    charge_start_time:
+      hour: 20
+      minute: 30
+    day: TUESDAY
+  - charge_end_time:
+      hour: 6
+      minute: 45
+    charge_start_time:
+      hour: 4
+      minute: 15
+    day: FRIDAY
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  properties:
+    entries:
+      items:
+        properties:
+          charge_end_time:
+            $ref: Time
+            description: Time when the device will stop charging, interpreted in the
+              device's local time zone.
+          charge_start_time:
+            $ref: Time
+            description: Time when the device will start charging, interpreted in
+              the device's local time zone.
+          day:
+            $ref: WeekDay
+        type: object
+      type: array
+  type: object
+supported_on:
+- chrome_os:75-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceAdvancedBatteryChargeModeEnabled.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceAdvancedBatteryChargeModeEnabled.yaml
new file mode 100644
index 0000000..a5ad0d2d
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceAdvancedBatteryChargeModeEnabled.yaml
@@ -0,0 +1,20 @@
+caption: Enable advanced battery charge mode
+desc: |-
+  If <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_DAY_CONFIG_POLICY_NAME">DeviceAdvancedBatteryChargeModeDayConfig</ph> is set, setting <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME">DeviceAdvancedBatteryChargeModeEnabled</ph> to Enabled keeps advanced battery charge mode power management policy on (if supported on the device). Using a standard charging algorithm and other techniques outside work hours, this mode lets users maximize battery health. During work hours, the system uses an express charge, which lets the battery charge faster. Specify the time when the system is used most each day by the start time and the duration.
+
+        Setting the policy to Disabled or leaving it unset keeps advanced battery charge mode off.
+
+        Users are unable to change this setting.
+device_only: true
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:75-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeCustomStartCharging.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeCustomStartCharging.yaml
new file mode 100644
index 0000000..2667365
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeCustomStartCharging.yaml
@@ -0,0 +1,20 @@
+caption: Set battery charge custom start charging in percent
+desc: |-
+  If <ph name="DEVICE_BATTERY_CHARGE_MODE_NAME">DeviceBatteryChargeMode</ph> is set to <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME">"custom"</ph>, then setting <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStartCharging</ph> customizes when the battery starts charging, based the percentage of battery charge. The value must be at least 5 percentage points below <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStopCharging</ph>.
+
+        Leaving the policy unset applies the standard battery charge mode.
+device_only: true
+example_value: 60
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  maximum: 95
+  minimum: 50
+  type: integer
+supported_on:
+- chrome_os:75-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeCustomStopCharging.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeCustomStopCharging.yaml
new file mode 100644
index 0000000..c7aeebcb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeCustomStopCharging.yaml
@@ -0,0 +1,20 @@
+caption: Set battery charge custom stop charging in percent
+desc: |-
+  If <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME">DeviceBatteryChargeMode</ph> is set to <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_MODE_NAME">"custom"</ph>, then setting <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStopCharging</ph> customizes when the battery stops charging, based on the percentage of battery charge. <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStartCharging</ph> must be at least 5 percentage points below <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStopCharging</ph>.
+
+        Leaving the policy unset applies the <ph name="DEVICE_BATTERY_CHARGE_STANDARD_MODE_NAME">"standard"</ph> battery charge mode.
+device_only: true
+example_value: 90
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  maximum: 100
+  minimum: 55
+  type: integer
+supported_on:
+- chrome_os:75-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeMode.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeMode.yaml
new file mode 100644
index 0000000..504319c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBatteryChargeMode.yaml
@@ -0,0 +1,43 @@
+caption: Battery charge mode
+desc: |-
+  Unless <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_POLICY_NAME">DeviceAdvancedBatteryChargeModeEnabled</ph> is specified, which overrides <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME">DeviceBatteryChargeMode</ph>, then setting <ph name="DEVICE_BATTERY_CHARGE_MODE_POLICY_NAME">DeviceBatteryChargeMode</ph> specifies battery charge mode power management policy (if supported on the device). To extend battery life, the policy dynamically controls battery charging by minimizing stress and wear-out.
+
+        Leaving the policy unset (if supported on the device) applies the standard battery charge mode, and users can't change it.
+
+        Note: If Custom battery charge mode is selected, then also specify <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_START_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStartCharging</ph> and <ph name="DEVICE_BATTERY_CHARGE_CUSTOM_STOP_CHARGING_POLICY_NAME">DeviceBatteryChargeCustomStopCharging</ph>.
+device_only: true
+example_value: 1
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Fully charge battery at a standard rate.
+  name: Standard
+  value: 1
+- caption: Charge battery using fast charging technology.
+  name: ExpressCharge
+  value: 2
+- caption: Charge battery for devices that are primarily connected to an external
+    power source.
+  name: PrimarilyAcUse
+  value: 3
+- caption: Adaptive charge battery based on battery usage pattern.
+  name: Adaptive
+  value: 4
+- caption: Charge battery while it is within a fixed range.
+  name: Custom
+  value: 5
+owners:
+- lamzin@google.com
+schema:
+  enum:
+  - 1
+  - 2
+  - 3
+  - 4
+  - 5
+  type: integer
+supported_on:
+- chrome_os:75-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBootOnAcEnabled.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBootOnAcEnabled.yaml
new file mode 100644
index 0000000..9749d61
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceBootOnAcEnabled.yaml
@@ -0,0 +1,20 @@
+caption: Enable boot on AC (alternating current)
+desc: |-
+  Setting the policy to Enabled keeps boot on AC on, if supported on the device. Boot on AC provides an opportunity for the system to restart from Off or Hibernate after inserting the line power.
+
+        Setting the policy to Disabled keeps boot on AC off.
+
+        If you set this policy, users can't change it. If not set, boot on AC is off, and users can't turn it on.
+device_only: true
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:75-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerAdaptiveChargingEnabled.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerAdaptiveChargingEnabled.yaml
new file mode 100644
index 0000000..a2c64b9
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerAdaptiveChargingEnabled.yaml
@@ -0,0 +1,30 @@
+caption: Enable adaptive charging model to hold charging process to extend battery
+  life
+default: true
+default_for_enterprise_users: false
+desc: |-
+  Specifies whether an adaptive charging model is allowed to hold charging process to extend battery life.
+
+        When the device is on AC, the adaptive charging model evaluates if charging process should be hold to extend battery life. If the adaptive charging model holds the charging process, it'll keep the battery at a certain level (i.e. 80%) and then charge the device to 100% when the user needs it.
+        If this policy is set to True, the adaptive charging model will be enabled and allowed to hold the charging process to extend battery life. If this policy is set to False or unset, the adaptive charging model will not influence the charging process.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Enable adaptive charging model on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+    ChromeOS</ex></ph>
+  value: true
+- caption: Disable adaptive charging model on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+    ChromeOS</ex></ph>
+  value: false
+owners:
+- thanhdng@chromium.org
+- napper@chromium.org
+- dbasehore@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:102-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftBatteryThreshold.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftBatteryThreshold.yaml
new file mode 100644
index 0000000..d38dce8
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftBatteryThreshold.yaml
@@ -0,0 +1,20 @@
+caption: Set power peak shift battery threshold in percent
+desc: |-
+  If <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_POLICY_NAME">DevicePowerPeakShiftEnabled</ph> is Enabled, then setting <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME">DevicePowerPeakShiftBatteryThreshold</ph> sets power peak shift battery threshold in percent.
+
+         Leaving the policy unset keeps power peak shift off.
+device_only: true
+example_value: 20
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  maximum: 100
+  minimum: 15
+  type: integer
+supported_on:
+- chrome_os:75-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftDayConfig.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftDayConfig.yaml
new file mode 100644
index 0000000..806d5e4
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftDayConfig.yaml
@@ -0,0 +1,61 @@
+caption: Set power peak shift day config
+desc: |-
+  If <ph name="DEVICE_POWER_PEAK_SHIFT_ENABLED_POLICY_NAME">DevicePowerPeakShiftEnabled</ph> is Enabled, setting <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME">DevicePowerPeakShiftDayConfig</ph> sets power peak shift day configuration.
+
+        Leaving the policy unset keeps power peak shift off.
+
+        Valid values for the <ph name="MINUTE_FIELD_NAME">minute</ph> field in <ph name="START_TIME_FIELD_NAME">start_time</ph>, <ph name="END_TIME_FIELD_NAME">end_time</ph> and <ph name="CHARGE_START_TIME_FIELD_NAME">charge_start_time</ph> are 0, 15, 30, 45.
+device_only: true
+example_value:
+  entries:
+  - charge_start_time:
+      hour: 20
+      minute: 45
+    day: MONDAY
+    end_time:
+      hour: 15
+      minute: 15
+    start_time:
+      hour: 9
+      minute: 0
+  - charge_start_time:
+      hour: 23
+      minute: 45
+    day: FRIDAY
+    end_time:
+      hour: 21
+      minute: 0
+    start_time:
+      hour: 2
+      minute: 30
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  properties:
+    entries:
+      items:
+        properties:
+          charge_start_time:
+            $ref: Time
+            description: Time when the device will use alternating current to charge
+              battery, interpreted in the device's local time zone.
+          day:
+            $ref: WeekDay
+          end_time:
+            $ref: Time
+            description: Time when the device will run from alternating current, interpreted
+              in the device's local time zone.
+          start_time:
+            $ref: Time
+            description: Time when the device will start running from the battery,
+              interpreted in the device's local time zone.
+        type: object
+      type: array
+  type: object
+supported_on:
+- chrome_os:75-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftEnabled.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftEnabled.yaml
new file mode 100644
index 0000000..fd4c53b8
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DevicePowerPeakShiftEnabled.yaml
@@ -0,0 +1,20 @@
+caption: Enable peak shift power management
+desc: |-
+  Setting the policy to Enabled and setting <ph name="DEVICE_POWER_PEAK_SHIFT_BATTERY_THRESHOLD_POLICY_NAME">DevicePowerPeakShiftBatteryThreshold</ph> and <ph name="DEVICE_POWER_PEAK_SHIFT_DAY_CONFIG_POLICY_NAME">DevicePowerPeakShiftDayConfig</ph> keeps power peak shift on, if supported on the device. Power peak shift power management policy is a power-saving policy that minimizes alternating current usage during peak times. For each weekday, you can set a start and end time to run in power peak shift mode. As long as the battery stays above the threshold specified, during these times, the device runs from the battery (even if the alternating current is attached). After the specified end time, the device runs from alternating current (if attached), but won't charge the battery. The device will again function normally using alternating current and recharging the battery after the specified charge start time.
+
+        Setting the policy to Disabled keeps power peak shift off.
+
+        If unset, power peak shift is off at first. Users can't change this setting.
+device_only: true
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:75-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceUsbPowerShareEnabled.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceUsbPowerShareEnabled.yaml
new file mode 100644
index 0000000..623d242
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/DeviceUsbPowerShareEnabled.yaml
@@ -0,0 +1,24 @@
+caption: Enable USB power share
+desc: |-
+  Setting the policy to Enabled turns on the USB power share power management policy.
+
+        Certain devices have a specific USB port with a lightning bolt or battery icon for charging devices using the system battery. This policy affects the charging behavior of this port while the system is in sleep and shut down modes. It doesn't affect the other USB ports and the charging behavior while the system is awake, when the USB port always provides power.
+
+        When sleeping, power is supplied to the USB port when the device is plugged in to the wall charger or if the battery level exceeds 50%. When shut down, power is supplied to the USB port when the device is plugged in to the wall charger.
+
+        Setting the policy to Disabled means no power is supplied.
+
+        Leaving the policy unset means the policy is on, and users can't turn it off.
+device_only: true
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:75-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleAction.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleAction.yaml
new file mode 100644
index 0000000..6295cbcc47
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleAction.yaml
@@ -0,0 +1,39 @@
+caption: Action to take when the idle delay is reached
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            This policy provides a fallback value for the more-specific <ph name="IDLE_ACTION_AC_POLICY_NAME">IdleActionAC</ph> and <ph name="IDLE_ACTION_BATTERY_POLICY_NAME">IdleActionBattery</ph> policies. If this policy is set, its value gets used if the respective more-specific policy is not set.
+
+            When this policy is unset, behavior of the more-specific policies remains unaffected.
+example_value: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Suspend
+  name: IdleActionSuspend
+  value: 0
+- caption: Log the user out
+  name: IdleActionLogout
+  value: 1
+- caption: Shut down
+  name: IdleActionShutdown
+  value: 2
+- caption: Do nothing
+  name: IdleActionDoNothing
+  value: 3
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  - 3
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleActionAC.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleActionAC.yaml
new file mode 100644
index 0000000..9ac23677
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleActionAC.yaml
@@ -0,0 +1,41 @@
+caption: Action to take when the idle delay is reached while running on AC power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            When this policy is set, it specifies the action that <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> takes when the user remains idle for the length of time given by the idle delay, which can be configured separately.
+
+            When this policy is unset, the default action is taken, which is suspend.
+
+            If the action is suspend, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> can separately be configured to either lock or not lock the screen before suspending.
+example_value: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Suspend
+  name: IdleActionSuspend
+  value: 0
+- caption: Log the user out
+  name: IdleActionLogout
+  value: 1
+- caption: Shut down
+  name: IdleActionShutdown
+  value: 2
+- caption: Do nothing
+  name: IdleActionDoNothing
+  value: 3
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  - 3
+  type: integer
+supported_on:
+- chrome_os:30-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleActionBattery.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleActionBattery.yaml
new file mode 100644
index 0000000..a891ec4
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleActionBattery.yaml
@@ -0,0 +1,41 @@
+caption: Action to take when the idle delay is reached while running on battery power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            When this policy is set, it specifies the action that <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> takes when the user remains idle for the length of time given by the idle delay, which can be configured separately.
+
+            When this policy is unset, the default action is taken, which is suspend.
+
+            If the action is suspend, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> can separately be configured to either lock or not lock the screen before suspending.
+example_value: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Suspend
+  name: IdleActionSuspend
+  value: 0
+- caption: Log the user out
+  name: IdleActionLogout
+  value: 1
+- caption: Shut down
+  name: IdleActionShutdown
+  value: 2
+- caption: Do nothing
+  name: IdleActionDoNothing
+  value: 3
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  - 3
+  type: integer
+supported_on:
+- chrome_os:30-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleDelayAC.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleDelayAC.yaml
new file mode 100644
index 0000000..156561f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleDelayAC.yaml
@@ -0,0 +1,26 @@
+caption: Idle delay when running on AC power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which the idle action is taken when running on AC power.
+
+            When this policy is set, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> takes the idle action, which can be configured separately.
+
+            When this policy is unset, a default length of time is used.
+
+            The policy value should be specified in milliseconds.
+example_value: 1800000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleDelayBattery.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleDelayBattery.yaml
new file mode 100644
index 0000000..f83c9c69
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleDelayBattery.yaml
@@ -0,0 +1,26 @@
+caption: Idle delay when running on battery power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which the idle action is taken when running on battery power.
+
+            When this policy is set, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> takes the idle action, which can be configured separately.
+
+            When this policy is unset, a default length of time is used.
+
+            The policy value should be specified in milliseconds.
+example_value: 600000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleWarningDelayAC.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleWarningDelayAC.yaml
new file mode 100644
index 0000000..080c4c5d
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleWarningDelayAC.yaml
@@ -0,0 +1,28 @@
+caption: Idle warning delay when running on AC power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which a warning dialog is shown when running on AC power.
+
+            When this policy is set, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> shows a warning dialog telling the user that the idle action is about to be taken.
+
+            When this policy is unset, no warning dialog is shown.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.
+
+            The warning message is only shown if the idle action is to logout or shut down.
+example_value: 545000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:27-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/IdleWarningDelayBattery.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleWarningDelayBattery.yaml
new file mode 100644
index 0000000..ba6322a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/IdleWarningDelayBattery.yaml
@@ -0,0 +1,28 @@
+caption: Idle warning delay when running on battery power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which a warning dialog is shown when running on battery power.
+
+            When this policy is set, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> shows a warning dialog telling the user that the idle action is about to be taken.
+
+            When this policy is unset, no warning dialog is shown.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.
+
+            The warning message is only shown if the idle action is to logout or shut down.
+example_value: 545000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:27-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/LidCloseAction.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/LidCloseAction.yaml
new file mode 100644
index 0000000..985a9df
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/LidCloseAction.yaml
@@ -0,0 +1,38 @@
+caption: Action to take when the user closes the lid
+desc: |-
+  Setting the policy specifies the action that <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> takes when the user closes the device's lid.
+
+        Leaving the policy unset means the Suspend action is taken.
+
+        Note: If the action is Suspend, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> can separately be set up to lock or not lock the screen before suspending.
+example_value: 0
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: Suspend
+  name: LidCloseActionSuspend
+  value: 0
+- caption: Log the user out
+  name: LidCloseActionLogout
+  value: 1
+- caption: Shut down
+  name: LidCloseActionShutdown
+  value: 2
+- caption: Do nothing
+  name: LidCloseActionDoNothing
+  value: 3
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  - 3
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementIdleSettings.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementIdleSettings.yaml
new file mode 100644
index 0000000..9b126993
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementIdleSettings.yaml
@@ -0,0 +1,64 @@
+caption: Power management settings when the user becomes idle
+desc: |-
+  Setting the policy controls the power management strategy when the user idles.
+
+        There are 4 actions:
+
+        * The screen dims if the user is idle for the time specified by <ph name="SCREEN_DIM_FIELD_NAME">ScreenDim</ph>.
+
+        * The screen turns off if the user is idle for the time specified by <ph name="SCREEN_OFF_FIELD_NAME">ScreenOff</ph>.
+
+        * A warning dialog appears if the user remains idle for the time specified by <ph name="IDLE_WARNING_FIELD_NAME">IdleWarning</ph>. It warns the user that the idle action will be taken and only appears if the idle action is to sign out or shut down.
+
+        * The action specified by <ph name="IDLE_ACTION_FIELD_NAME">IdleAction</ph> is taken if the user is idle for the time specified by <ph name="IDLE_FIELD_NAME">Idle</ph>.
+
+        For each of the above actions, the delay should be specified in milliseconds and must be set to a value greater than zero to trigger the corresponding action. If the delay is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> won't take the corresponding action.
+
+        For each of the above delays, when the time is unset, a default value is used.
+
+        <ph name="SCREEN_DIM_FIELD_NAME">ScreenDim</ph> values will be clamped to be less than or equal to <ph name="SCREEN_OFF_FIELD_NAME">ScreenOff</ph>. <ph name="SCREEN_OFF_FIELD_NAME">ScreenOff</ph> and <ph name="IDLE_WARNING_FIELD_NAME">IdleWarning</ph> will be clamped to be less than or equal to <ph name="IDLE_FIELD_NAME">Idle</ph>.
+
+        <ph name="IDLE_ACTION_FIELD_NAME">IdleAction</ph> can be one of 4 actions:
+
+        * <ph name="IDLE_ACTION_ENUM_SUSPEND">Suspend</ph>
+
+        * <ph name="IDLE_ACTION_ENUM_LOGOUT">Logout</ph>
+
+        * <ph name="IDLE_ACTION_ENUM_SHUTDOWN">Shutdown</ph>
+
+        * <ph name="IDLE_ACTION_ENUM_DO_NOTHING">DoNothing</ph>
+
+        If the <ph name="IDLE_ACTION_FIELD_NAME">IdleAction</ph> is not set, <ph name="IDLE_ACTION_ENUM_SUSPEND">Suspend</ph> is taken.
+
+        Note: There are separate settings for AC power and battery.
+example_value:
+  AC:
+    IdleAction: DoNothing
+  Battery:
+    Delays:
+      Idle: 30000
+      IdleWarning: 5000
+      ScreenDim: 10000
+      ScreenOff: 20000
+    IdleAction: DoNothing
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  properties:
+    AC:
+      $ref: PowerManagementDelays
+      description: Delays and actions to take when the device is idle and running
+        on AC power
+    Battery:
+      $ref: PowerManagementDelays
+      description: Delays and actions to take when the device is idle and running
+        on battery
+  type: object
+supported_on:
+- chrome_os:35-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementUsesAudioActivity.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementUsesAudioActivity.yaml
new file mode 100644
index 0000000..90f674f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementUsesAudioActivity.yaml
@@ -0,0 +1,18 @@
+caption: Specify whether audio activity affects power management
+desc: |-
+  Setting the policy to Enabled or leaving it unset means the user is not considered idle while audio plays. This prevents the idle timeout from being reached and the idle action from being taken. However, screen dimming, screen off, and screen lock will still occur after their configured timeouts despite audio activity.
+
+        Setting the policy to Disabled means the system can consider users idle despite audio activity.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:26-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementUsesVideoActivity.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementUsesVideoActivity.yaml
new file mode 100644
index 0000000..80a3ed20
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerManagementUsesVideoActivity.yaml
@@ -0,0 +1,20 @@
+arc_support: Video playing in Android apps is not taken into consideration, even if
+  this policy is set to <ph name="TRUE">True</ph>.
+caption: Specify whether video activity affects power management
+desc: |-
+  Setting the policy to Enabled or leaving it unset means the user is not considered idle while video plays. This prevents the idle delay, screen dim delay, screen off delay, and screen lock delay from being reached and the corresponding actions from being taken.
+
+        Setting the policy to Disabled means the system can consider users idle despite video activity.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:26-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/PowerSmartDimEnabled.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerSmartDimEnabled.yaml
new file mode 100644
index 0000000..924407bb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/PowerSmartDimEnabled.yaml
@@ -0,0 +1,18 @@
+caption: Enable smart dim model to extend the time until the screen is dimmed
+desc: |-
+  Setting the policy to Enabled or leaving it unset turns the smart dim model on and can extend the time until the screen dims. If it delays the time, the screen off, screen lock, and idle delays adjust to maintain the same distances from the screen dim delay as originally set.
+
+        Setting the policy to Disabled means the smart dim model won't influence screen dimming.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- jiameng@chromium.org
+- ejcaruso@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:70-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/PresentationIdleDelayScale.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/PresentationIdleDelayScale.yaml
new file mode 100644
index 0000000..1ce58f7
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/PresentationIdleDelayScale.yaml
@@ -0,0 +1,17 @@
+caption: Percentage by which to scale the idle delay in presentation mode (deprecated)
+deprecated: true
+desc: This policy has been retired as of <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph>
+  version 29. Please use the PresentationScreenDimDelayScale policy instead.
+example_value: 200
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: integer
+supported_on:
+- chrome_os:26-28
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/PresentationScreenDimDelayScale.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/PresentationScreenDimDelayScale.yaml
new file mode 100644
index 0000000..e201e74
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/PresentationScreenDimDelayScale.yaml
@@ -0,0 +1,20 @@
+caption: Percentage by which to scale the screen dim delay in presentation mode
+desc: |-
+  If <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME">PowerSmartDimEnabled</ph> is Disabled, then setting <ph name="PRESENTATION_SCREEN_DIM_DELAY_SCALE_POLICY_NAME">PresentationScreenDimDelayScale</ph> specifies the percent that the screen dim delay scales when the device is presenting. When the screen dim delay scales, the screen off, screen lock, and idle delays adjust to maintain the same distances from the screen dim delay as originally set.
+
+        Leaving the policy unset puts a default scale factor in use.
+
+        Note: The scale factor must be 100% or more.
+example_value: 200
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: integer
+supported_on:
+- chrome_os:29-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenBrightnessPercent.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenBrightnessPercent.yaml
new file mode 100644
index 0000000..7786ec9
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenBrightnessPercent.yaml
@@ -0,0 +1,33 @@
+caption: Screen brightness percent
+desc: |-
+  Setting the policy specifies screen brightness percent, turning autobrightness features off. Initial screen brightness adjusts to the policy value, but users can change it.
+
+        Leaving the policy unset doesn't affect user screen controls or autobrightness features.
+
+        Note: The policy values should be specified in percents from 0 to 100.
+example_value:
+  BrightnessAC: 90
+  BrightnessBattery: 75
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- file://chrome/browser/ash/login/demo_mode/OWNERS
+- agawronska@chromium.org
+schema:
+  properties:
+    BrightnessAC:
+      description: Screen brightness percent when running on AC power
+      maximum: 100
+      minimum: 0
+      type: integer
+    BrightnessBattery:
+      description: Screen brightness percent when running on battery power
+      maximum: 100
+      minimum: 0
+      type: integer
+  type: object
+supported_on:
+- chrome_os:72-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenDimDelayAC.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenDimDelayAC.yaml
new file mode 100644
index 0000000..f286f86
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenDimDelayAC.yaml
@@ -0,0 +1,28 @@
+caption: Screen dim delay when running on AC power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which the screen is dimmed when running on AC power.
+
+            When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> dims the screen.
+
+            When this policy is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> does not dim the screen when the user becomes idle.
+
+            When this policy is unset, a default length of time is used.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than or equal the screen off delay (if set) and the idle delay.
+example_value: 420000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenDimDelayBattery.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenDimDelayBattery.yaml
new file mode 100644
index 0000000..7f8ea61b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenDimDelayBattery.yaml
@@ -0,0 +1,28 @@
+caption: Screen dim delay when running on battery power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which the screen is dimmed when running on battery power.
+
+            When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> dims the screen.
+
+            When this policy is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> does not dim the screen when the user becomes idle.
+
+            When this policy is unset, a default length of time is used.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than or equal the screen off delay (if set) and the idle delay.
+example_value: 300000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelayAC.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelayAC.yaml
new file mode 100644
index 0000000..0048000
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelayAC.yaml
@@ -0,0 +1,30 @@
+caption: Screen lock delay when running on AC power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME">ScreenLockDelays</ph> instead.
+
+            Specifies the length of time without user input after which the screen is locked when running on AC power.
+
+            When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> locks the screen.
+
+            When this policy is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> does not lock the screen when the user becomes idle.
+
+            When this policy is unset, a default length of time is used.
+
+            The recommended way to lock the screen on idle is to enable screen locking on suspend and have <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> suspend after the idle delay. This policy should only be used when screen locking should occur a significant amount of time sooner than suspend or when suspend on idle is not desired at all.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than the idle delay.
+example_value: 600000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelayBattery.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelayBattery.yaml
new file mode 100644
index 0000000..4006407f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelayBattery.yaml
@@ -0,0 +1,30 @@
+caption: Screen lock delay when running on battery power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="SCREEN_LOCK_DELAYS_POLICY_NAME">ScreenLockDelays</ph> instead.
+
+            Specifies the length of time without user input after which the screen is locked when running on battery power.
+
+            When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> locks the screen.
+
+            When this policy is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> does not lock the screen when the user becomes idle.
+
+            When this policy is unset, a default length of time is used.
+
+            The recommended way to lock the screen on idle is to enable screen locking on suspend and have <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> suspend after the idle delay. This policy should only be used when screen locking should occur a significant amount of time sooner than suspend or when suspend on idle is not desired at all.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than the idle delay.
+example_value: 600000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelays.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelays.yaml
new file mode 100644
index 0000000..ba6ce5f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenLockDelays.yaml
@@ -0,0 +1,33 @@
+caption: Screen lock delays
+desc: |-
+  Setting the policy specifies the length of time in milliseconds without user input after which the screen locks when running on AC power or battery. Values are clamped to be less than the idle delay in <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph>.
+
+        When set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> doesn't lock the screen when the user becomes idle. If unset, a default time is used.
+
+        Recommendation: Lock the screen on idle by turning on screen locking on suspend and have <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> suspend after the idle delay. Only use this policy when screen locking should occur a significant amount of time sooner than suspend or when you don't want suspend on idle.
+example_value:
+  AC: 600000
+  Battery: 300000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  properties:
+    AC:
+      description: The length of time without user input after which the screen is
+        locked when running on AC power, in milliseconds
+      minimum: 0
+      type: integer
+    Battery:
+      description: The length of time without user input after which the screen is
+        locked when running on battery, in milliseconds
+      minimum: 0
+      type: integer
+  type: object
+supported_on:
+- chrome_os:35-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenOffDelayAC.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenOffDelayAC.yaml
new file mode 100644
index 0000000..2c324c0
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenOffDelayAC.yaml
@@ -0,0 +1,28 @@
+caption: Screen off delay when running on AC power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which the screen is turned off when running on AC power.
+
+            When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> turns off the screen.
+
+            When this policy is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> does not turn off the screen when the user becomes idle.
+
+            When this policy is unset, a default length of time is used.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.
+example_value: 480000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenOffDelayBattery.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenOffDelayBattery.yaml
new file mode 100644
index 0000000..0278d852
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/ScreenOffDelayBattery.yaml
@@ -0,0 +1,28 @@
+caption: Screen off delay when running on battery power
+deprecated: true
+desc: |-
+  Note that this policy is deprecated and will be removed in <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> version 85. Please use <ph name="POWER_MANAGEMENT_IDLE_SETTINGS_POLICY_NAME">PowerManagementIdleSettings</ph> instead.
+
+            Specifies the length of time without user input after which the screen is turned off when running on battery power.
+
+            When this policy is set to a value greater than zero, it specifies the length of time that the user must remain idle before <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> turns off the screen.
+
+            When this policy is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> does not turn off the screen when the user becomes idle.
+
+            When this policy is unset, a default length of time is used.
+
+            The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.
+example_value: 360000
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome_os:26-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/UserActivityScreenDimDelayScale.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/UserActivityScreenDimDelayScale.yaml
new file mode 100644
index 0000000..7f222e7
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/UserActivityScreenDimDelayScale.yaml
@@ -0,0 +1,21 @@
+caption: Percentage by which to scale the screen dim delay if the user becomes active
+  after dimming
+desc: |-
+  If <ph name="POWER_SMART_DIM_ENABLED_POLICY_NAME">PowerSmartDimEnabled</ph> is Disabled, then setting <ph name="USER_ACTIVITY_SCREEN_DIM_DELAY_SCALE_POLICY_NAME">UserActivityScreenDimDelayScale</ph> specifies the percent that the screen dim delay scales when there's user activity while the screen dims or soon after the screen turns off. When the dim delay scales, the screen off, screen lock and idle delays adjust to maintain the same distances from the screen dim delay as originally set.
+
+        Leaving the policy unset puts a default scale factor in use.
+
+        Note: The scale factor must be 100% or more.
+example_value: 200
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: integer
+supported_on:
+- chrome_os:29-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/PowerManagement/WaitForInitialUserActivity.yaml b/components/policy/resources/templates/policy_definitons/PowerManagement/WaitForInitialUserActivity.yaml
new file mode 100644
index 0000000..d28beaf
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PowerManagement/WaitForInitialUserActivity.yaml
@@ -0,0 +1,18 @@
+caption: Wait for initial user activity
+desc: |-
+  Setting the policy to Enabled means that power management delays and session length limits don't start until after the first user activity occurs in a session.
+
+        Setting the policy to Disabled or leaving it unset means power management delays and the time limit begin immediately at session start.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- reinauer@google.com
+- chromeos-power@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:32-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Printing/.group.details.yaml
new file mode 100644
index 0000000..49be1e1
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Printing
+desc: Controls printing settings.
diff --git a/components/policy/resources/templates/policy_definitons/Printing/CloudPrintProxyEnabled.yaml b/components/policy/resources/templates/policy_definitons/Printing/CloudPrintProxyEnabled.yaml
new file mode 100644
index 0000000..aa7b43a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/CloudPrintProxyEnabled.yaml
@@ -0,0 +1,25 @@
+caption: Enable <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> proxy
+desc: |-
+  Setting the policy to Enabled or leaving it unset lets <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> act as a proxy between <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> and legacy printers connected to the machine. Using their Google Account, users may turn on the cloud print proxy by authentication.
+
+        Setting the policy to Disabled means users can't turn on the proxy, and the machine can't share its printers with <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph>.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Enable <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> proxy
+  value: true
+- caption: Disable <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> proxy
+  value: false
+owners:
+- file://printing/OWNERS
+- rbpotter@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:17-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/CloudPrintSubmitEnabled.yaml b/components/policy/resources/templates/policy_definitons/Printing/CloudPrintSubmitEnabled.yaml
new file mode 100644
index 0000000..c793d1b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/CloudPrintSubmitEnabled.yaml
@@ -0,0 +1,29 @@
+caption: Enable submission of documents to <ph name="CLOUD_PRINT_NAME">Google Cloud
+  Print</ph>
+deprecated: true
+desc: |-
+  Setting the policy to Enabled or leaving it unset lets users print to <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> from the <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> print dialog. <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> can submit documents to <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> for printing. This doesn't prevent users from submitting print jobs on websites.
+
+        Setting the policy to Disabled means users can't print to <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> from the <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> print dialog.
+
+        In order to keep <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> destinations discoverable, this policy must be set to Enabled and <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD">cloud</ph> must not be included in the <ph name="PRINTER_TYPE_DENY_LIST_POLICY_NAME">PrinterTypeDenyList</ph> policy.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable submission of documents to <ph name="CLOUD_PRINT_NAME">Google Cloud
+    Print</ph>
+  value: true
+- caption: Disable submission of documents to <ph name="CLOUD_PRINT_NAME">Google Cloud
+    Print</ph>
+  value: false
+owners:
+- file://printing/OWNERS
+- weili@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:17-101
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/CloudPrintWarningsSuppressed.yaml b/components/policy/resources/templates/policy_definitons/Printing/CloudPrintWarningsSuppressed.yaml
new file mode 100644
index 0000000..d7bc10e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/CloudPrintWarningsSuppressed.yaml
@@ -0,0 +1,27 @@
+caption: Suppress <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> deprecation
+  messages
+default: false
+deprecated: true
+desc: |-
+  This policy controls whether <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> deprecation warnings are shown to users in the print preview dialog or settings pages.
+        Setting this policy to True will hide the deprecation warnings.
+        Setting this policy to False or leaving it unset will show the deprecation warnings.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Hide <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> deprecation warnings
+  value: true
+- caption: Show <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> deprecation warnings
+  value: false
+owners:
+- file://printing/OWNERS
+- rbpotter@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:86-87
+- chrome_os:86-87
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DefaultPrinterSelection.yaml b/components/policy/resources/templates/policy_definitons/Printing/DefaultPrinterSelection.yaml
new file mode 100644
index 0000000..c16bc7c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DefaultPrinterSelection.yaml
@@ -0,0 +1,43 @@
+arc_support: This policy has no effect on Android apps.
+caption: Default printer selection rules
+desc: |-
+  Setting the policy sets the rules for selecting the default printer in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>, overriding the default rules. Printer selection occurs the first time users try to print, when <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> seeks a printer matching the specified attributes. In case of a less than perfect match, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> can be set to select any matching printer, depending on the order printers are discovered.
+
+        Leaving the policy unset or set to attributes for which there's no match means the built-in PDF printer is the default. If there's no PDF printer, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> defaults to none.
+
+        Printers connected to <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> are considered <ph name="PRINTER_TYPE_CLOUD">"cloud"</ph>, the rest of the printers are classified as <ph name="PRINTER_TYPE_LOCAL">"local"</ph>.
+
+        Note: Omitting a field means all values match. For example, not specifying connectivity causes Print Preview to start discovery of all kinds of printers, <ph name="PRINTER_TYPE_LOCAL">"local"</ph> and <ph name="PRINTER_TYPE_CLOUD">"cloud"</ph>. Regular expression patterns must follow the JavaScript RegExp syntax, and matches are case sensistive.
+example_value: '{ "kind": "cloud", "idPattern": ".*public", "namePattern": ".*Color"
+  }'
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- file://printing/OWNERS
+- thestig@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:48-
+- chrome_os:48-
+tags: []
+type: string
+validation_schema:
+  properties:
+    idPattern:
+      description: Regular expression to match printer id.
+      type: string
+    kind:
+      description: Whether to limit the search of the matching printer to a specific
+        set of printers.
+      enum:
+      - local
+      - cloud
+      type: string
+    namePattern:
+      description: Regular expression to match printer display name.
+      type: string
+  type: object
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DeletePrintJobHistoryAllowed.yaml b/components/policy/resources/templates/policy_definitons/Printing/DeletePrintJobHistoryAllowed.yaml
new file mode 100644
index 0000000..94840f3
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DeletePrintJobHistoryAllowed.yaml
@@ -0,0 +1,23 @@
+caption: Allow print job history to be deleted
+default: true
+desc: |-
+  Controls whether print job history can be deleted.
+
+        Locally stored print jobs can be deleted through the print management app or through deleting the users's browser history.
+
+        When this policy is enabled or unset, the user will be able to delete their print job history through the print mangement app or through deleting their browser history.
+
+        When this policy is disabled, the user will not be able to delete their print job history through the print management app or through deleting their browser history.
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- jimmyxgong@chromium.org
+- file://printing/OWNERS
+schema:
+  type: boolean
+supported_on:
+- chrome_os:85-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DeviceExternalPrintServers.yaml b/components/policy/resources/templates/policy_definitons/Printing/DeviceExternalPrintServers.yaml
new file mode 100644
index 0000000..e7e096dc
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DeviceExternalPrintServers.yaml
@@ -0,0 +1,40 @@
+caption: External print servers
+desc: "Provides configurations of available print servers.\n\n      This policy allows\
+  \ you to provide configuration of external print servers to <ph name=\"PRODUCT_OS_NAME\"\
+  >$2<ex>Google ChromeOS</ex></ph> devices as JSON file.\n\n      The size of the\
+  \ file must not exceed 1MB and must contain an array of records (JSON objects).\
+  \ Each record must contain fields \"id\", \"url\" and \"display_name\" with strings\
+  \ as values. Values of \"id\" fields must be unique.\n\n      The file is downloaded\
+  \ and cached. The cryptographic hash is used to verify the integrity of the download.\
+  \ The file will be re-downloaded whenever the URL or the hash changes.\n\n     \
+  \ When this policy is set to correct value, devices will try to query specified\
+  \ print servers for available printers using IPP protocol.\n\n      If this policy\
+  \ is unset or set to incorrect value, none of the provided server printers are visible\
+  \ to users.\n\n      Currently, the number of print servers is limited to 16. Only\
+  \ the first 16 print servers from the list will be queried.\n\n      This policy\
+  \ is similar to <ph name=\"EXTERNAL_PRINT_SERVERS_POLICY\">ExternalPrintServers</ph>,\
+  \ except this policy is applied by device.\n      "
+device_only: true
+example_value:
+  hash: deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef
+  url: https://example.com/printserverpolicy
+features:
+  dynamic_refresh: true
+  per_profile: false
+future_on:
+- chrome_os
+max_size: 1048576
+owners:
+- mattme@google.com
+- file://chromeos/printing/OWNERS
+schema:
+  properties:
+    hash:
+      description: The SHA-256 hash of the file.
+      type: string
+    url:
+      description: URL to a JSON file with a list of print servers.
+      type: string
+  type: object
+tags: []
+type: external
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DeviceExternalPrintServersAllowlist.yaml b/components/policy/resources/templates/policy_definitons/Printing/DeviceExternalPrintServersAllowlist.yaml
new file mode 100644
index 0000000..4d1dc40
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DeviceExternalPrintServersAllowlist.yaml
@@ -0,0 +1,28 @@
+caption: Enabled external print servers
+desc: |-
+  Specifies the subset of print servers that will be queried for server printers. This applies only to the <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY">DeviceExternalPrintServers</ph> policy.
+
+        If this policy is used, only the server printers with ids matching the values in this policy are available to the user through device policy.
+
+        The ids must correspond to the "id" field in the file specified in <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY">DeviceExternalPrintServers</ph>.
+
+        If this policy is not set, filtering is omitted and all print servers provided by <ph name="DEVICE_EXTERNAL_PRINT_SERVERS_POLICY">DeviceExternalPrintServers</ph> are taken into account.
+device_only: true
+example_value:
+- id1
+- id2
+- id3
+features:
+  dynamic_refresh: true
+  per_profile: false
+future_on:
+- chrome_os
+owners:
+- mattme@google.com
+- file://chromeos/printing/OWNERS
+schema:
+  items:
+    type: string
+  type: array
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DeviceNativePrinters.yaml b/components/policy/resources/templates/policy_definitons/Printing/DeviceNativePrinters.yaml
new file mode 100644
index 0000000..878d34a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DeviceNativePrinters.yaml
@@ -0,0 +1,36 @@
+caption: Enterprise printer configuration file for devices
+deprecated: true
+desc: |-
+  Setting the policy provides configurations for enterprise printers bound to devices. Its format matches the <ph name="NATIVE_PRINTERS_POLICY_NAME">NativePrinters</ph> dictionary, with an additional required "id" or "guid" field for each printer for allow listing or deny listing. The file size can't exceed 5MB and is in JSON format. A file with about 21,000 printers encodes as a 5MB file. The cryptographic hash helps verify download integrity. The file is downloaded, cached, and redownloaded when the URL or the hash changes. <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> downloads the file for printer configurations and makes printers available along with <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME">DevicePrintersAccessMode</ph>, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME">DevicePrintersAllowlist</ph>, and <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME">DevicePrintersBlocklist</ph>.
+
+        This policy:
+
+        * doesn't affect whether users can configure printers on individual devices
+
+        * supplements <ph name="BULK_PRINTERS_POLICY_NAME">NativePrintersBulkConfiguration</ph> and individual users' printer setups
+
+        If unset, there are no device printers, and the other <ph name="DEVICE_NATIVE_PRINTERS_POLICY_PATTERN">DeviceNativePrinter*</ph> policies are ignored.
+
+        This policy is deprecated, please use <ph name="DEVICE_PRINTERS_POLICY_NAME">DevicePrinters</ph> instead.
+device_only: true
+example_value:
+  hash: deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef
+  url: https://example.com/printerpolicy
+features:
+  dynamic_refresh: true
+  per_profile: false
+max_size: 5242880
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  properties:
+    hash:
+      type: string
+    url:
+      type: string
+  type: object
+supported_on:
+- chrome_os:73-100
+tags: []
+type: external
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DevicePrinters.yaml b/components/policy/resources/templates/policy_definitons/Printing/DevicePrinters.yaml
new file mode 100644
index 0000000..606c6467
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DevicePrinters.yaml
@@ -0,0 +1,33 @@
+caption: Enterprise printer configuration file for devices
+desc: |-
+  Setting the policy provides configurations for enterprise printers bound to devices. Its format matches the <ph name="PRINTERS_POLICY_NAME">Printers</ph> dictionary, with an additional required "id" or "guid" field for each printer for allow listing or deny listing. The file size can't exceed 5MB and is in JSON format. A file with about 21,000 printers encodes as a 5MB file. The cryptographic hash helps verify download integrity. The file is downloaded, cached, and redownloaded when the URL or the hash changes. <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> downloads the file for printer configurations and makes printers available along with <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME">DevicePrintersAccessMode</ph>, <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME">DevicePrintersAllowlist</ph>, and <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME">DevicePrintersBlocklist</ph>.
+
+        This policy:
+
+        * doesn't affect whether users can configure printers on individual devices
+
+        * supplements <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME">PrintersBulkConfiguration</ph> and individual users' printer setups
+
+        If unset, there are no device printers, and the other <ph name="DEVICE_PRINTERS_POLICY_PATTERN">DevicePrinter*</ph> policies are ignored.
+device_only: true
+example_value:
+  hash: deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef
+  url: https://example.com/printerpolicy
+features:
+  dynamic_refresh: true
+  per_profile: false
+max_size: 5242880
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  properties:
+    hash:
+      type: string
+    url:
+      type: string
+  type: object
+supported_on:
+- chrome_os:87-
+tags: []
+type: external
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersAccessMode.yaml b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersAccessMode.yaml
new file mode 100644
index 0000000..417536f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersAccessMode.yaml
@@ -0,0 +1,39 @@
+caption: Device printers configuration access policy.
+desc: |-
+  Setting the policy designates which access policy applies to bulk printer configuration, controlling which printers from <ph name="DEVICE_PRINTERS_POLICY_NAME">DevicePrinters</ph> are available for users.
+
+        * <ph name="POLICY_ENUM_DEVICEPRINTERSACCESSMODE_BLOCKLISTRESTRICTIONS">BlocklistRestriction</ph> (value 0), <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME">DevicePrintersBlocklist</ph> can restrict access to the specified printers
+
+        * <ph name="POLICY_ENUM_DEVICEPRINTERSACCESSMODE_ALLOWLISTPRINTERSONLY">AllowlistPrintersOnly</ph> (value 1), <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME">DevicePrintersAllowlist</ph> designates only those printers which are selectable
+
+        * <ph name="POLICY_ENUM_DEVICEPRINTERSACCESSMODE_ALLOWALL">AllowAll</ph> (value 2), all printers are allowed.
+
+        Leaving the policy unset applies <ph name="PRINTERS_ALLOW_ALL">AllowAll</ph>.
+device_only: true
+example_value: 1
+features:
+  dynamic_refresh: true
+  per_profile: false
+items:
+- caption: All printers are shown except those in the blocklist.
+  name: BlocklistRestriction
+  value: 0
+- caption: Only printers in the allowlist are shown to users
+  name: AllowlistPrintersOnly
+  value: 1
+- caption: Allow all printers from the configuration file.
+  name: AllowAll
+  value: 2
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+supported_on:
+- chrome_os:87-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersAllowlist.yaml b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersAllowlist.yaml
new file mode 100644
index 0000000..19e6954
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersAllowlist.yaml
@@ -0,0 +1,27 @@
+caption: Enabled enterprise device printers
+desc: If <ph name="PRINTERS_ALLOWLIST">AllowlistPrintersOnly</ph> is chosen for <ph
+  name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME">DevicePrintersAccessMode</ph>, then
+  setting <ph name="DEVICE_PRINTERS_ALLOWLIST_POLICY_NAME">DevicePrintersAllowlist</ph>
+  specifies which printers users can use. Only the printers with IDs matching the
+  values in this policy are available to users. The IDs must correspond to the <ph
+  name="ID_FIELD">"id"</ph> or <ph name="GUID_FIELD">"guid"</ph> fields in the file
+  specified in <ph name="DEVICE_PRINTERS_POLICY_NAME">DevicePrinters</ph>
+device_only: true
+example_value:
+- id1
+- id2
+- id3
+features:
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:87-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersBlocklist.yaml b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersBlocklist.yaml
new file mode 100644
index 0000000..792bd179
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintersBlocklist.yaml
@@ -0,0 +1,25 @@
+caption: Disabled enterprise device printers
+desc: If <ph name="PRINTERS_BLOCKLIST">BlocklistRestriction</ph> is chosen for <ph
+  name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME">DevicePrintersAccessMode</ph>, then
+  setting <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME">DevicePrintersBlocklist</ph>
+  specifies which printers users can't use. All printers are provided to users, except
+  for the IDs listed in this policy. The IDs must correspond to the <ph name="ID_FIELD">"id"</ph>
+  or <ph name="GUID_FIELD">"guid"</ph> fields in the file specified in <ph name="DEVICE_PRINTERS_POLICY_NAME">DevicePrinters</ph>.
+device_only: true
+example_value:
+- id1
+- id2
+- id3
+features:
+  dynamic_refresh: true
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:87-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DevicePrintingClientNameTemplate.yaml b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintingClientNameTemplate.yaml
new file mode 100644
index 0000000..036bbf2
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DevicePrintingClientNameTemplate.yaml
@@ -0,0 +1,38 @@
+caption: Printing 'client-name' IPP attribute template
+desc: "This policy controls the value of the <ph name=\"CLIENT_INFO_IPP_ATTRIBUTE\"\
+  >'client-info'</ph> IPP (Internet Printing Protocol) attribute in print jobs.\n\n\
+  \      Setting the policy to a string has the effect of adding an additional <ph\
+  \ name=\"CLIENT_INFO_IPP_ATTRIBUTE\">'client-info'</ph> item to every print job.\
+  \ The <ph name=\"CLIENT_NAME_IPP_ATTRIBUTE\">'client-name'</ph> member of the added\
+  \ <ph name=\"CLIENT_INFO_IPP_ATTRIBUTE\">'client-info'</ph> item will be set to\
+  \ the value of the policy after substitution of variables.\n\n      Supported variables\
+  \ are <ph name=\"DIRECTORY_ID_PLACEHOLDER\">${DEVICE_DIRECTORY_ID}</ph>, <ph name=\"\
+  SERIAL_NUMBER_PLACEHOLDER\">${DEVICE_SERIAL_NUMBER}</ph>, <ph name=\"ASSET_ID_PLACEHOLDER\"\
+  >${DEVICE_ASSET_ID}</ph>, <ph name=\"ANNOTATED_LOCATION_PLACEHOLDER\">${DEVICE_ANNOTATED_LOCATION}</ph>,\
+  \ <ph name=\"USER_EMAIL_PLACEHOLDER\">${USER_EMAIL}</ph>, <ph name=\"USER_EMAIL_NAME_PLACEHOLDER\"\
+  >${USER_EMAIL_NAME}</ph>, <ph name=\"USER_EMAIL_DOMAIN\">${USER_EMAIL_DOMAIN}</ph>.\
+  \ Unsupported placeholder variables will not be expanded.\n\n      The resulting\
+  \ value after substitution of variables is considered valid if it consists only\
+  \ of <ph name=\"ASCII\">ASCII</ph> printable characters and its length does not\
+  \ exceed 255.\n\n      Note that, for privacy reasons, this policy applies only\
+  \ when communicating with a printer using <ph name=\"IPPS_PROTOCOL\">IPPS</ph>,\
+  \ <ph name=\"HTTPS_PROTOCOL\">HTTPS</ph>, <ph name=\"USB_PROTOCOL\">USB</ph> or\
+  \ <ph name=\"IPP_USB_PROTOCOL\">IPP-over-USB</ph> protocols. Also, note that this\
+  \ policy only applies to printers that support <ph name=\"CLIENT_NAME_IPP_ATTRIBUTE\"\
+  >'client-name'</ph>.\n\n      If the policy is unset, set to an empty or invalid\
+  \ value, an additional <ph name=\"CLIENT_INFO_PLACEHOLDER\">'client-info'</ph> will\
+  \ not be added to print job requests.\n      "
+device_only: true
+example_value: chromebook-${DEVICE_ASSET_ID}
+features:
+  dynamic_refresh: true
+  per_profile: false
+future_on:
+- chrome_os
+owners:
+- srad@google.com
+- ust@google.com
+schema:
+  type: string
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/Printing/DisablePrintPreview.yaml b/components/policy/resources/templates/policy_definitons/Printing/DisablePrintPreview.yaml
new file mode 100644
index 0000000..70b16f7
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/DisablePrintPreview.yaml
@@ -0,0 +1,26 @@
+caption: Disable Print Preview
+desc: |-
+  Setting the policy to Enabled has <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> open the system print dialog instead of the built-in print preview when users request a printout.
+
+        Setting the policy to Disabled or leaving it unset has print commands trigger the print preview screen.
+example_value: false
+features:
+  dynamic_refresh: false
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Disable print preview
+  value: true
+- caption: Enable print preview
+  value: false
+owners:
+- file://printing/OWNERS
+- rbpotter@chomium.org
+- thestig@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:18-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/ExternalPrintServers.yaml b/components/policy/resources/templates/policy_definitons/Printing/ExternalPrintServers.yaml
new file mode 100644
index 0000000..61ebc835
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/ExternalPrintServers.yaml
@@ -0,0 +1,37 @@
+caption: External print servers
+desc: "Provides configurations of available print servers.\n\n      This policy allows\
+  \ you to provide configuration of external print servers to <ph name=\"PRODUCT_OS_NAME\"\
+  >$2<ex>Google ChromeOS</ex></ph> devices as JSON file.\n\n      The size of the\
+  \ file must not exceed 1MB and must contain an array of records (JSON objects).\
+  \ Each record must contain fields \"id\", \"url\" and \"display_name\" with strings\
+  \ as values. Values of \"id\" fields must be unique.\n\n      The file is downloaded\
+  \ and cached. The cryptographic hash is used to verify the integrity of the download.\
+  \ The file will be re-downloaded whenever the URL or the hash changes.\n\n     \
+  \ When this policy is set to correct value, devices will try to query specified\
+  \ print servers for available printers using IPP protocol.\n\n      If this policy\
+  \ is unset or set to incorrect value, none of the provided server printers are visible\
+  \ to users.\n\n      Currently, the number of print servers is limited to 16. Only\
+  \ the first 16 print servers from the list will be queried.\n      "
+example_value:
+  hash: deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef
+  url: https://example.com/printserverpolicy
+features:
+  dynamic_refresh: true
+  per_profile: true
+max_size: 1048576
+owners:
+- file://chromeos/printing/OWNERS
+- luum@chromium.org
+schema:
+  properties:
+    hash:
+      description: The SHA-256 hash of the file.
+      type: string
+    url:
+      description: URL to a JSON file with a list of print servers.
+      type: string
+  type: object
+supported_on:
+- chrome_os:79-
+tags: []
+type: external
diff --git a/components/policy/resources/templates/policy_definitons/Printing/ExternalPrintServersAllowlist.yaml b/components/policy/resources/templates/policy_definitons/Printing/ExternalPrintServersAllowlist.yaml
new file mode 100644
index 0000000..252b570
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/ExternalPrintServersAllowlist.yaml
@@ -0,0 +1,27 @@
+caption: Enabled external print servers
+desc: |-
+  Specifies the subset of print servers that will be queried for server printers.
+
+        If this policy is used, only the server printers with ids matching the values in this policy are available to the user.
+
+        The ids must correspond to the "id" field in the file specified in <ph name="EXTERNAL_PRINT_SERVERS_POLICY">ExternalPrintServers</ph>.
+
+        If this policy is not set, filtering is omitted and all print servers are taken into account.
+example_value:
+- id1
+- id2
+- id3
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://chromeos/printing/OWNERS
+- thestig@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:86-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/NativePrinters.yaml b/components/policy/resources/templates/policy_definitons/Printing/NativePrinters.yaml
new file mode 100644
index 0000000..2357979
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/NativePrinters.yaml
@@ -0,0 +1,75 @@
+caption: Native Printing
+deprecated: true
+desc: |-
+  Setting the policy lets administrators set up a list of printers for their users. Printer selection occurs the first time users try to print.
+
+        Using the policy:
+
+        * Customize free-form <ph name="PRINTER_DISPLAY_NAME">display_name</ph> and <ph name="PRINTER_DESCRIPTION">description</ph> for ease of printer selection.
+
+        * Help users identify printers using <ph name="PRINTER_MANUFACTURER">manufacturer</ph> and <ph name="PRINTER_MODEL">model</ph>.
+
+        * <ph name="PRINTER_URI">uri</ph> should be an address reachable from a client computer, including the <ph name="URI_SCHEME">scheme</ph>, <ph name="URI_PORT">port</ph>, and <ph name="URI_QUEUE">queue</ph>.
+
+        * Optionally provide <ph name="PRINTER_UUID">uuid</ph> to help deduplicate <ph name="ZEROCONF_DISCOVERY">zeroconf</ph> printers.
+
+        * Either use the model name for <ph name="PRINTER_EFFECTIVE_MODEL">effective_model</ph> or set <ph name="PRINTER_AUTOCONF">autoconf</ph> to True. Printers with both or no properties get ignored.
+
+        PPDs are downloaded after the printer is used, and frequently used PPDs are cached. This policy doesn't affect whether users can configure printers on individual devices.
+
+        Note: For <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> managed devices, this policy supports expansion of <ph name="MACHINE_NAME_VARIABLE">${MACHINE_NAME[,pos[,count]]}</ph> to the <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> machine name or a substring of it. For example, if the machine name is <ph name="MACHINE_NAME_EXAMPLE">CHROMEBOOK</ph>, then <ph name="MACHINE_NAME_VARIABLE_EXAMPLE">${MACHINE_NAME,6,4}</ph> gets replaced by the 4 characters starting after the 6th position, in other words, <ph name="MACHINE_NAME_PART_EXAMPLE">BOOK</ph>. The position is zero-based.
+
+        This policy is deprecated, please use <ph name="PRINTERS_POLICY_NAME">Printers</ph> instead.
+example_value:
+- '{ "display_name": "Color Laser", "description": "The printer next to the water
+  cooler.", "manufacturer": "Printer Manufacturer", "model": "Color Laser 2004", "uri":
+  "ipps://print-server.intranet.example.com:443/ipp/cl2k4", "uuid": "1c395fdb-5d93-4904-b246-b2c046e79d12",
+  "ppd_resource": { "effective_model": "Printer Manufacturer ColorLaser2k4", "autoconf":
+  false } }'
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://chromeos/printing/OWNERS
+- skau@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:57-100
+tags: []
+type: list
+validation_schema:
+  items:
+    id: PrinterType
+    properties:
+      description:
+        type: string
+      display_name:
+        type: string
+      manufacturer:
+        type: string
+      model:
+        type: string
+      ppd_resource:
+        id: PpdResource
+        properties:
+          autoconf:
+            description: Boolean flag indicating whether IPP Everywhere should be
+              used to set up the printer. This flag is supported on <ph name="PRODUCT_OS_NAME">$2<ex>Google
+              ChromeOS</ex></ph> version 76 and higher.
+            type: boolean
+          effective_model:
+            description: This field must match one of the strings which represent
+              a <ph name="PRODUCT_NAME">$2<ex>Google ChromeOS</ex></ph> supported
+              printer. The string will be used to identify and install the appropriate
+              PPD for the printer. More information can be found at https://support.google.com/chrome?p=noncloudprint.
+            type: string
+        type: object
+      uri:
+        type: string
+      uuid:
+        type: string
+    type: object
+  type: array
diff --git a/components/policy/resources/templates/policy_definitons/Printing/NativePrintersBulkConfiguration.yaml b/components/policy/resources/templates/policy_definitons/Printing/NativePrintersBulkConfiguration.yaml
new file mode 100644
index 0000000..dfc19d5
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/NativePrintersBulkConfiguration.yaml
@@ -0,0 +1,32 @@
+caption: Enterprise printer configuration file
+deprecated: true
+desc: |-
+  Setting this policy configure enterprise printers. Its format matches the <ph name="NATIVE_PRINTERS_POLICY_NAME">NativePrinters</ph> dictionary, with an additional required <ph name="ID_FIELD">"id"</ph> or <ph name="GUID_FIELD">"guid"</ph> field for each printer for allow listing or deny listing. The file size can't exceed 5MB and is in JSON format. A file with about 21,000 printers encodes as a 5MB file. The cryptographic hash helps verify download integrity. The file is downloaded, cached, and redownloaded when the URL or the hash changes. <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> downloads the file for printer configurations and makes printers available along with <ph name="BULK_PRINTERS_ACCESS_MODE_POLICY_NAME">NativePrintersBulkAccessMode</ph>, <ph name="BULK_PRINTERS_WHITELIST">NativePrintersBulkWhitelist</ph>, and <ph name="BULK_PRINTERS_BLACKLIST">NativePrintersBulkBlacklist</ph>.
+
+        This policy has no effect on whether users can configure printers on individual devices. It is intended to be supplementary to the configuration of printers by individual users.
+
+        If you set the policy, users can't change it.
+
+        This policy is deprecated, please use <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME">PrintersBulkConfiguration</ph> instead.
+example_value:
+  hash: deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef
+  url: https://example.com/printerpolicy
+features:
+  dynamic_refresh: true
+  per_profile: true
+max_size: 5242880
+owners:
+- file://chromeos/printing/OWNERS
+- luum@chromium.org
+- skau@chromium.org
+schema:
+  properties:
+    hash:
+      type: string
+    url:
+      type: string
+  type: object
+supported_on:
+- chrome_os:65-100
+tags: []
+type: external
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintHeaderFooter.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintHeaderFooter.yaml
new file mode 100644
index 0000000..5cda26b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintHeaderFooter.yaml
@@ -0,0 +1,30 @@
+caption: Print Headers and Footers
+default: null
+desc: |-
+  Setting the policy to Enabled turns headers and footers on in print preview. Setting the policy to Disabled turns them off in print preview.
+
+        If you set the policy, users can't change it. If unset, users decides whether headers and footers appear.
+example_value: false
+features:
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Show headers and footers in print preview
+  value: true
+- caption: Hide headers and footers in print preview
+  value: false
+- caption: Allow the user to decide
+  value: null
+owners:
+- nicolaso@chromium.org
+- pastarmovj@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:70-
+- chrome.*:70-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintJobHistoryExpirationPeriod.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintJobHistoryExpirationPeriod.yaml
new file mode 100644
index 0000000..61f209446
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintJobHistoryExpirationPeriod.yaml
@@ -0,0 +1,23 @@
+caption: Set the time period in days for storing print jobs metadata
+desc: |-
+  This policy controls how long print jobs metadata is stored on the device, in days.
+
+        When this policy is set to a value of -1, the print jobs metadata is stored indefinitely. When this policy is set to a value of 0, the print jobs metadata is not stored at all. When this policy is set to any other value, it specifies the period of time during which the metadata of completed print jobs is stored on the device.
+
+        If not set, the default period of 90 days is used for <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> devices.
+
+        The policy value should be specified in days.
+example_value: 90
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  minimum: -1
+  type: integer
+supported_on:
+- chrome_os:79-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintPdfAsImageAvailability.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintPdfAsImageAvailability.yaml
new file mode 100644
index 0000000..379db6b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintPdfAsImageAvailability.yaml
@@ -0,0 +1,30 @@
+caption: Print PDF as Image Available
+default: false
+desc: |-
+  Controls how <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> makes the Print as image option available on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> and <ph name="MAC_OS_NAME">macOS</ph> when printing PDFs.
+
+        When printing a PDF on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> or <ph name="MAC_OS_NAME">macOS</ph>, sometimes print jobs need to be rasterized to an image for certain printers to get correct looking output.
+
+        When this policy is set to Enabled, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will make the Print as image option available in the Print Preview when printing a PDF.
+
+        When this policy is set to Disabled or not set <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> the Print as image option will not be available to users in Print Preview and PDFs will be printed as usual without being rasterized to an image before being sent to the destination.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Print as image option available to user to allow PDF rasterization prior
+    to sending print job to destination.
+  value: true
+- caption: Print as image option not available for user selection.
+  value: false
+owners:
+- awscreen@chromium.org
+- file://printing/OWNERS
+schema:
+  type: boolean
+supported_on:
+- chrome.win:94-
+- chrome.mac:94-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintPdfAsImageDefault.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintPdfAsImageDefault.yaml
new file mode 100644
index 0000000..51d9317
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintPdfAsImageDefault.yaml
@@ -0,0 +1,35 @@
+caption: Print PDF as Image Default
+default: false
+desc: |-
+  Controls if <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> makes the Print as image option default to set when printing PDFs.
+
+        When this policy is set to Enabled, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will default to setting the Print as image option in the Print Preview when printing a PDF.
+
+        When this policy is set to Disabled or not set <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> then the user selection for Print as image option will be initially unset.  The user will be allowed to select it for each individual PDFs print job, if the option is available.
+
+        For <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> or <ph name="MAC_OS_NAME">macOS</ph> this policy only has an effect if <ph name="PRINT_PDF_AS_IMAGE_AVAILABILITY_POLICY_NAME">PrintPdfAsImageAvailability</ph> is also enabled.
+example_value: true
+features:
+  can_be_mandatory: false
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Print as image option defaults to set for print previews of PDF documents
+    when it is available.
+  value: true
+- caption: Print as image option defaults to unset for print previews of PDF documents
+    when it is available.
+  value: false
+owners:
+- awscreen@chromium.org
+- file://printing/OWNERS
+schema:
+  type: boolean
+supported_on:
+- chrome.*:95-
+- chrome_os:95-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintPostScriptMode.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintPostScriptMode.yaml
new file mode 100644
index 0000000..6f13174
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintPostScriptMode.yaml
@@ -0,0 +1,35 @@
+caption: Print PostScript Mode
+default: 0
+desc: |-
+  Controls how <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> prints on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>.
+
+        When printing to a PostScript printer on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph> different PostScript generation methods can affect printing performance.
+
+        When this policy is set to Default, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will use a set of default options when generating PostScript. For text in particular, text will always be rendered using Type 3 fonts.
+
+        When this policy is set to Type42, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will render text using Type 42 fonts if possible. This should increase printing speed for some PostScript printers.
+
+        When this policy is not set, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will be in Default mode.
+example_value: 1
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Default
+  name: Default
+  value: 0
+- caption: Type42
+  name: Type42
+  value: 1
+owners:
+- thestig@chromium.org
+- file://printing/OWNERS
+schema:
+  enum:
+  - 0
+  - 1
+  type: integer
+supported_on:
+- chrome.win:95-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintPreviewUseSystemDefaultPrinter.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintPreviewUseSystemDefaultPrinter.yaml
new file mode 100644
index 0000000..0b8bd0f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintPreviewUseSystemDefaultPrinter.yaml
@@ -0,0 +1,28 @@
+caption: Use System Default Printer as Default
+default: false
+desc: |-
+  Setting the policy to Enabled means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> uses the OS default printer as the default destination for print preview.
+
+        Setting the policy to Disabled or leaving it unset means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> uses the most recently used printer as the default destination for print preview.
+example_value: false
+features:
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Use the system default printer as the default choice in Print Preview
+  value: true
+- caption: Use the most recently used printer as the default choice in Print Preview
+  value: false
+owners:
+- file://printing/OWNERS
+- thestig@chromium.org
+- rbpotter@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:61-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintRasterizationMode.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintRasterizationMode.yaml
new file mode 100644
index 0000000..ad63efd
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintRasterizationMode.yaml
@@ -0,0 +1,35 @@
+caption: Print Rasterization Mode
+default: 0
+desc: |-
+  Controls how <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> prints on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>.
+
+        When printing to a non-PostScript printer on <ph name="MS_WIN_NAME">Microsoft® Windows®</ph>, sometimes print jobs need to be rasterized to print correctly.
+
+        When this policy is set to Full, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will do full page rasterization if necessary.
+
+        When this policy is set to Fast, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will avoid rasterization if possible, reducing the amount of rasterization can help reduce print job sizes and increase printing speed.
+
+        When this policy is not set, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will be in Full mode.
+example_value: 1
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Full
+  name: Full
+  value: 0
+- caption: Fast
+  name: Fast
+  value: 1
+owners:
+- thestig@chromium.org
+- file://printing/OWNERS
+schema:
+  enum:
+  - 0
+  - 1
+  type: integer
+supported_on:
+- chrome.win:84-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintRasterizePdfDpi.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintRasterizePdfDpi.yaml
new file mode 100644
index 0000000..9464c25
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintRasterizePdfDpi.yaml
@@ -0,0 +1,27 @@
+caption: Print Rasterize PDF DPI
+default: 0
+desc: |-
+  Controls print image resolution when <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> prints PDFs with rasterization.
+
+        When printing a PDF using the Print to image option, it can be beneficial to specify a print resolution other than a device's printer setting or the PDF default.  A high resolution will significantly increase the processing and printing time while a low resolution can lead to poor imaging quality.
+
+        This policy allows a particular resolution to be specified for use when rasterizing PDFs for printing.
+
+        If this policy is set to zero or not set at all then the system default resolution will be used during rasterization of page images.
+example_value: 300
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- awscreen@chromium.org
+- file://printing/OWNERS
+schema:
+  minimum: 0
+  type: integer
+supported_on:
+- chrome.*:94-
+- chrome_os:94-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrinterTypeDenyList.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrinterTypeDenyList.yaml
new file mode 100644
index 0000000..67d38716
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrinterTypeDenyList.yaml
@@ -0,0 +1,62 @@
+caption: Disable printer types on the deny list
+desc: |-
+  The printers of types placed on the deny list will be disabled from being discovered or having their capabilities fetched.
+
+        Placing all printer types on the deny list effectively disables printing, as there would be no available destinations to send a document for printing.
+
+        In versions before 102, including <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD">cloud</ph> on the deny list has the same effect as setting the <ph name="POLICY_CLOUDPRINTSUBMITENABLED">CloudPrintSubmitEnabled</ph> policy to false. In order to keep <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> destinations discoverable, the <ph name="POLICY_CLOUDPRINTSUBMITENABLED">CloudPrintSubmitEnabled</ph> policy must be set to true and <ph name="POLICY_ENUM_PRINTERTYPEDENYLIST_CLOUD">cloud</ph> must not be on the deny list. Beginning in version 102, <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> destinations are not supported and will not appear regardless of policy values.
+
+        If the policy is not set, or is set to an empty list, all printer types will be available for discovery.
+
+        Extension printers are also known as print provider destinations, and include any destination that belongs to a <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> extension.
+
+        Local printers are also known as native printing destinations, and include destinations available to the local machine and shared network printers.
+example_value:
+- local
+- pdf
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Zeroconf-based (mDNS + DNS-SD) protocol destinations (Deprecated)
+  name: privet
+  supported_on:
+  - chrome_os:80-101
+  - chrome.*:80-101
+  value: privet
+- caption: Extension-based destinations
+  name: extension
+  value: extension
+- caption: The 'Save as PDF' destination
+  name: pdf
+  value: pdf
+- caption: Local printer destinations
+  name: local
+  value: local
+- caption: <ph name="CLOUD_PRINT_NAME">Google Cloud Print</ph> and 'Save to Google
+    Drive' destinations (Deprecated)
+  name: cloud
+  supported_on:
+  - chrome_os:80-101
+  - chrome.*:80-101
+  value: cloud
+owners:
+- file://printing/OWNERS
+- weili@chromium.org
+schema:
+  items:
+    enum:
+    - privet
+    - extension
+    - pdf
+    - local
+    - cloud
+    type: string
+  type: array
+supported_on:
+- chrome_os:80-
+- chrome.*:80-
+tags: []
+type: string-enum-list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/Printers.yaml b/components/policy/resources/templates/policy_definitons/Printing/Printers.yaml
new file mode 100644
index 0000000..22e074e
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/Printers.yaml
@@ -0,0 +1,71 @@
+caption: Configures a list of printers
+desc: |-
+  Setting the policy lets administrators set up a list of printers for their users. Printer selection occurs the first time users try to print.
+
+        Using the policy:
+
+        * Customize free-form <ph name="PRINTER_DISPLAY_NAME">display_name</ph> and <ph name="PRINTER_DESCRIPTION">description</ph> for ease of printer selection.
+
+        * Help users identify printers using <ph name="PRINTER_MANUFACTURER">manufacturer</ph> and <ph name="PRINTER_MODEL">model</ph>.
+
+        * <ph name="PRINTER_URI">uri</ph> should be an address reachable from a client computer, including the <ph name="URI_SCHEME">scheme</ph>, <ph name="URI_PORT">port</ph>, and <ph name="URI_QUEUE">queue</ph>.
+
+        * Optionally provide <ph name="PRINTER_UUID">uuid</ph> to help deduplicate <ph name="ZEROCONF_DISCOVERY">zeroconf</ph> printers.
+
+        * Either use the model name for <ph name="PRINTER_EFFECTIVE_MODEL">effective_model</ph> or set <ph name="PRINTER_AUTOCONF">autoconf</ph> to True. Printers with both or no properties get ignored.
+
+        PPDs are downloaded after the printer is used, and frequently used PPDs are cached. This policy doesn't affect whether users can configure printers on individual devices.
+
+        Note: For <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> managed devices, this policy supports expansion of <ph name="MACHINE_NAME_VARIABLE">${MACHINE_NAME[,pos[,count]]}</ph> to the <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> machine name or a substring of it. For example, if the machine name is <ph name="MACHINE_NAME_EXAMPLE">CHROMEBOOK</ph>, then <ph name="MACHINE_NAME_VARIABLE_EXAMPLE">${MACHINE_NAME,6,4}</ph> gets replaced by the 4 characters starting after the 6th position, in other words, <ph name="MACHINE_NAME_PART_EXAMPLE">BOOK</ph>. The position is zero-based.
+example_value:
+- '{ "display_name": "Color Laser", "description": "The printer next to the water
+  cooler.", "manufacturer": "Printer Manufacturer", "model": "Color Laser 2004", "uri":
+  "ipps://print-server.intranet.example.com:443/ipp/cl2k4", "uuid": "1c395fdb-5d93-4904-b246-b2c046e79d12",
+  "ppd_resource": { "effective_model": "Printer Manufacturer ColorLaser2k4", "autoconf":
+  false } }'
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://chromeos/printing/OWNERS
+- skau@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:86-
+tags: []
+type: list
+validation_schema:
+  items:
+    id: PrinterTypeInclusive
+    properties:
+      description:
+        type: string
+      display_name:
+        type: string
+      manufacturer:
+        type: string
+      model:
+        type: string
+      ppd_resource:
+        id: PpdResourceInclusive
+        properties:
+          autoconf:
+            description: Boolean flag indicating whether IPP Everywhere should be
+              used to set up the printer.
+            type: boolean
+          effective_model:
+            description: This field must match one of the strings which represent
+              a <ph name="PRODUCT_NAME">$2<ex>Google ChromeOS</ex></ph> supported
+              printer. The string will be used to identify and install the appropriate
+              PPD for the printer. More information can be found at https://support.google.com/chrome?p=noncloudprint.
+            type: string
+        type: object
+      uri:
+        type: string
+      uuid:
+        type: string
+    type: object
+  type: array
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkAccessMode.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkAccessMode.yaml
new file mode 100644
index 0000000..bdc0223
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkAccessMode.yaml
@@ -0,0 +1,40 @@
+caption: Printer configuration access policy.
+desc: |-
+  Setting the policy designates which access policy applies to bulk printer configuration, controlling which printers from <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME">PrintersBulkConfiguration</ph> are available for users.
+
+        * <ph name="PRINTERS_BLOCKLIST">BlocklistRestriction</ph> (value 0) uses <ph name="PRINTERS_BULK_BLOCKLIST">PrintersBulkBlocklist</ph> to restrict access to the specified printers
+
+        * <ph name="PRINTERS_ALLOWLIST">AllowlistPrintersOnly</ph> (value 1) uses <ph name="PRINTERS_BULK_ALLOWLIST">PrintersBulkAllowlist</ph> to designate only those printers which are selectable
+
+        * <ph name="PRINTERS_ALLOW_ALL">AllowAll</ph> (value 2) displays all printers
+
+        Leaving the policy unset puts <ph name="PRINTERS_ALLOW_ALL">AllowAll</ph> in use.
+example_value: 1
+features:
+  can_be_recommended: true
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: All printers are shown except those in the blocklist.
+  name: BlocklistRestriction
+  value: 0
+- caption: Only printers in the allowlist are shown to users
+  name: AllowlistPrintersOnly
+  value: 1
+- caption: Allow all printers from the configuration file.
+  name: AllowAll
+  value: 2
+owners:
+- file://chromeos/printing/OWNERS
+- zentaro@chromium.org
+- thestig@chromium.org
+schema:
+  enum:
+  - 0
+  - 1
+  - 2
+  type: integer
+supported_on:
+- chrome_os:86-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkAllowlist.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkAllowlist.yaml
new file mode 100644
index 0000000..0780f22
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkAllowlist.yaml
@@ -0,0 +1,25 @@
+caption: Enabled enterprise printers
+desc: If <ph name="PRINTERS_ALLOWLIST">AllowlistPrintersOnly</ph> is chosen for <ph
+  name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME">PrintersBulkAccessMode</ph>, then setting
+  <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME">PRINTERS_BULK_ALLOWLIST</ph> specifies
+  which printers users can use. Only the printers with IDs matching the values in
+  this policy are available to the user. The IDs must correspond to the <ph name="ID_FIELD">"id"</ph>
+  or <ph name="GUID_FIELD">"guid"</ph> fields in the file specified in <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME">PrintersBulkConfiguration</ph>.
+example_value:
+- id1
+- id2
+- id3
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://chromeos/printing/OWNERS
+- thestig@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:86-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkBlocklist.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkBlocklist.yaml
new file mode 100644
index 0000000..cbb11672
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkBlocklist.yaml
@@ -0,0 +1,25 @@
+caption: Disabled enterprise printers
+desc: If <ph name="PRINTERS_BLOCKLIST">BlocklistRestriction</ph> is chosen for <ph
+  name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME">PrintersBulkAccessMode</ph>, then setting
+  <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME">PrintersBulkBlocklist</ph> specifies
+  which printers users can't use. All printers are provided to the user, except for
+  the IDs listed in this policy. The IDs must correspond to the <ph name="ID_FIELD">"id"</ph>
+  or <ph name="GUID_FIELD">"guid"</ph> fields in the file specified in <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME">PrintersBulkConfiguration</ph>.
+example_value:
+- id1
+- id2
+- id3
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://chromeos/printing/OWNERS
+- thestig@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:86-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkConfiguration.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkConfiguration.yaml
new file mode 100644
index 0000000..f7706c7
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintersBulkConfiguration.yaml
@@ -0,0 +1,28 @@
+caption: Enterprise printer configuration file
+desc: |-
+  Setting this policy configure enterprise printers. Its format matches the <ph name="PRINTERS_POLICY_NAME">Printers</ph> dictionary, with an additional required <ph name="ID_FIELD">"id"</ph> or <ph name="GUID_FIELD">"guid"</ph> field for each printer for allow listing or deny listing. The file size can't exceed 5MB and is in JSON format. A file with about 21,000 printers encodes as a 5MB file. The cryptographic hash helps verify download integrity. The file is downloaded, cached, and redownloaded when the URL or the hash changes. <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> downloads the file for printer configurations and makes printers available along with <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME">PrintersBulkAccessMode</ph>, <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME">PrintersBulkAllowlist</ph>, and <ph name="PRINTERS_BULK_BLOCKLIST_POLICY_NAME">PrintersBulkBlocklist</ph>.
+
+        This policy has no effect on whether users can configure printers on individual devices. It is intended to be supplementary to the configuration of printers by individual users.
+
+        If you set the policy, users can't change it.
+example_value:
+  hash: deadbeefdeadbeefdeadbeefdeadbeefdeafdeadbeefdeadbeef
+  url: https://example.com/printerpolicy
+features:
+  dynamic_refresh: true
+  per_profile: true
+max_size: 5242880
+owners:
+- file://chromeos/printing/OWNERS
+- luum@chromium.org
+schema:
+  properties:
+    hash:
+      type: string
+    url:
+      type: string
+  type: object
+supported_on:
+- chrome_os:86-
+tags: []
+type: external
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingAPIExtensionsAllowlist.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingAPIExtensionsAllowlist.yaml
new file mode 100644
index 0000000..e8827455a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingAPIExtensionsAllowlist.yaml
@@ -0,0 +1,22 @@
+caption: Extensions allowed to skip confirmation dialog when sending print jobs via
+  chrome.printing API
+desc: |-
+  This policy specifies the allowed extensions to skip print job confirmation dialog when they use the <ph name="PRINTING_API">Printing API</ph> function <ph name="SUBMIT_JOB_FUNCTION">chrome.printing.submitJob()</ph> for sending a print job.
+
+        If an extension is not in the list, or the list is not set, the print job confirmation dialog will be shown to the user for every <ph name="SUBMIT_JOB_FUNCTION">chrome.printing.submitJob()</ph> function call.
+example_value:
+- abcdefghabcdefghabcdefghabcdefgh
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  items:
+    type: string
+  type: array
+supported_on:
+- chrome_os:87-
+tags: []
+type: list
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedBackgroundGraphicsModes.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedBackgroundGraphicsModes.yaml
new file mode 100644
index 0000000..2be8bb4a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedBackgroundGraphicsModes.yaml
@@ -0,0 +1,33 @@
+caption: Restrict background graphics printing mode
+desc: Restricts background graphics printing mode. Unset policy is treated as no restriction.
+example_value: enabled
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Allow printing both with and without background graphics
+  name: any
+  value: any
+- caption: Allow printing only with background graphics
+  name: enabled
+  value: enabled
+- caption: Allow printing only without background graphics
+  name: disabled
+  value: disabled
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - any
+  - enabled
+  - disabled
+  type: string
+supported_on:
+- chrome_os:79-
+- chrome.*:80-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedColorModes.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedColorModes.yaml
new file mode 100644
index 0000000..dd6a23c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedColorModes.yaml
@@ -0,0 +1,31 @@
+caption: Restrict printing color mode
+desc: Setting the policy sets printing to color only, monochrome only, or no color
+  mode restriction. Leaving the policy unset results in no restriction.
+example_value: monochrome
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Allow all color modes
+  name: any
+  value: any
+- caption: Color printing only
+  name: color
+  value: color
+- caption: Monochrome printing only
+  name: monochrome
+  value: monochrome
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - any
+  - color
+  - monochrome
+  type: string
+supported_on:
+- chrome_os:71-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedDuplexModes.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedDuplexModes.yaml
new file mode 100644
index 0000000..daf24e3
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedDuplexModes.yaml
@@ -0,0 +1,33 @@
+caption: Restrict printing duplex mode
+desc: |-
+  Setting the policy restricts printing duplex mode.
+
+        Leaving the policy unset or empty results in no restriction.
+example_value: duplex
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Allow all duplex modes
+  name: any
+  value: any
+- caption: Simplex printing only
+  name: simplex
+  value: simplex
+- caption: Duplex printing only
+  name: duplex
+  value: duplex
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - any
+  - simplex
+  - duplex
+  type: string
+supported_on:
+- chrome_os:71-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedPinModes.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedPinModes.yaml
new file mode 100644
index 0000000..87a942a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingAllowedPinModes.yaml
@@ -0,0 +1,32 @@
+caption: Restrict PIN printing mode
+desc: Restricts PIN printing mode. Unset policy is treated as no restriction. If the
+  mode is unavailable this policy is ignored. Note that PIN printing feature is enabled
+  only for printers that use one of IPPS, HTTPS, USB or IPP-over-USB protocols.
+example_value: pin
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Allow printing both with and without PIN
+  name: any
+  value: any
+- caption: Allow printing only with PIN
+  name: pin
+  value: pin
+- caption: Allow printing only without PIN
+  name: no_pin
+  value: no_pin
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - any
+  - pin
+  - no_pin
+  type: string
+supported_on:
+- chrome_os:75-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingBackgroundGraphicsDefault.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingBackgroundGraphicsDefault.yaml
new file mode 100644
index 0000000..6a0b8ea7
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingBackgroundGraphicsDefault.yaml
@@ -0,0 +1,29 @@
+caption: Default background graphics printing mode
+desc: Overrides default background graphics printing mode.
+example_value: enabled
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Enable background graphics printing mode by default
+  name: enabled
+  value: enabled
+- caption: Disable background graphics printing mode by default
+  name: disabled
+  value: disabled
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - enabled
+  - disabled
+  type: string
+supported_on:
+- chrome_os:79-
+- chrome.*:80-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingColorDefault.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingColorDefault.yaml
new file mode 100644
index 0000000..a8b915b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingColorDefault.yaml
@@ -0,0 +1,27 @@
+caption: Default printing color mode
+desc: Setting the policy overrides the default printing color mode. If the mode is
+  unavailable, this policy is ignored.
+example_value: monochrome
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable color printing
+  name: color
+  value: color
+- caption: Enable monochrome printing
+  name: monochrome
+  value: monochrome
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - color
+  - monochrome
+  type: string
+supported_on:
+- chrome_os:72-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingDuplexDefault.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingDuplexDefault.yaml
new file mode 100644
index 0000000..0a572c0
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingDuplexDefault.yaml
@@ -0,0 +1,31 @@
+caption: Default printing duplex mode
+desc: Setting the policy overrides the default printing duplex mode. If the mode is
+  unavailable, this policy is ignored.
+example_value: long-edge
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable simplex printing
+  name: simplex
+  value: simplex
+- caption: Enable short edge duplex printing
+  name: short-edge
+  value: short-edge
+- caption: Enable long edge duplex printing
+  name: long-edge
+  value: long-edge
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - simplex
+  - short-edge
+  - long-edge
+  type: string
+supported_on:
+- chrome_os:72-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingEnabled.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingEnabled.yaml
new file mode 100644
index 0000000..41c80ffb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingEnabled.yaml
@@ -0,0 +1,30 @@
+arc_support: This policy has no effect on Android apps.
+caption: Enable printing
+desc: |-
+  Setting the policy to Enabled or leaving it unset lets users print in <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>, and users can't change this setting.
+
+        Setting the policy to Disabled means users can't print from <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph>. Printing is off in the three dots menu, extensions, and JavaScript applications.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Enable printing
+  value: true
+- caption: Disable printing
+  value: false
+owners:
+- file://printing/OWNERS
+- thestig@chromium.org
+- rbpotter@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome.*:8-
+- chrome_os:11-
+- android:39-
+- ios:88-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingMaxSheetsAllowed.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingMaxSheetsAllowed.yaml
new file mode 100644
index 0000000..3af60bb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingMaxSheetsAllowed.yaml
@@ -0,0 +1,19 @@
+caption: Maximal number of sheets allowed to use for a single print job
+desc: |-
+  Specifies the maximal number of sheets user is allowed to print for a single print job.
+
+        If not set, no limitations are applied and user can print any documents.
+example_value: 10
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  minimum: 1
+  type: integer
+supported_on:
+- chrome_os:84-
+tags: []
+type: int
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingPaperSizeDefault.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingPaperSizeDefault.yaml
new file mode 100644
index 0000000..82c8a16
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingPaperSizeDefault.yaml
@@ -0,0 +1,181 @@
+caption: Default printing page size
+desc: |-
+  Overrides default printing page size.
+
+        <ph name="PAGE_SIZE_NAME">name</ph> should contain one of the listed formats or 'custom' if required paper size is not in the list. If 'custom' value is provided <ph name="PAGE_SIZE_CUSTOM_SIZE">custom_size</ph> property should be specified. It describes the desired height and width in micrometers. Otherwise <ph name="PAGE_SIZE_CUSTOM_SIZE">custom_size</ph> property shouldn't be specified. Policy that violates these rules is ignored.
+
+        If the page size is unavailable on the printer chosen by the user this policy is ignored.
+example_value:
+  custom_size:
+    height: 297000
+    width: 210000
+  name: custom
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  properties:
+    custom_size:
+      properties:
+        height:
+          description: Height of the page in micrometers
+          type: integer
+        width:
+          description: Width of the page in micrometers
+          type: integer
+      required:
+      - width
+      - height
+      type: object
+    name:
+      enum:
+      - custom
+      - asme_f_28x40in
+      - iso_2a0_1189x1682mm
+      - iso_a0_841x1189mm
+      - iso_a10_26x37mm
+      - iso_a1_594x841mm
+      - iso_a2_420x594mm
+      - iso_a3_297x420mm
+      - iso_a4-extra_235.5x322.3mm
+      - iso_a4-tab_225x297mm
+      - iso_a4_210x297mm
+      - iso_a5-extra_174x235mm
+      - iso_a5_148x210mm
+      - iso_a6_105x148mm
+      - iso_a7_74x105mm
+      - iso_a8_52x74mm
+      - iso_a9_37x52mm
+      - iso_b0_1000x1414mm
+      - iso_b10_31x44mm
+      - iso_b1_707x1000mm
+      - iso_b2_500x707mm
+      - iso_b3_353x500mm
+      - iso_b4_250x353mm
+      - iso_b5-extra_201x276mm
+      - iso_b5_176x250mm
+      - iso_b6_125x176mm
+      - iso_b6c4_125x324mm
+      - iso_b7_88x125mm
+      - iso_b8_62x88mm
+      - iso_b9_44x62mm
+      - iso_c0_917x1297mm
+      - iso_c10_28x40mm
+      - iso_c1_648x917mm
+      - iso_c2_458x648mm
+      - iso_c3_324x458mm
+      - iso_c4_229x324mm
+      - iso_c5_162x229mm
+      - iso_c6_114x162mm
+      - iso_c6c5_114x229mm
+      - iso_c7_81x114mm
+      - iso_c7c6_81x162mm
+      - iso_c8_57x81mm
+      - iso_c9_40x57mm
+      - iso_dl_110x220mm
+      - jis_exec_216x330mm
+      - jpn_chou2_111.1x146mm
+      - jpn_chou3_120x235mm
+      - jpn_chou4_90x205mm
+      - jpn_hagaki_100x148mm
+      - jpn_kahu_240x322.1mm
+      - jpn_kaku2_240x332mm
+      - jpn_oufuku_148x200mm
+      - jpn_you4_105x235mm
+      - na_10x11_10x11in
+      - na_10x13_10x13in
+      - na_10x14_10x14in
+      - na_10x15_10x15in
+      - na_11x12_11x12in
+      - na_11x15_11x15in
+      - na_12x19_12x19in
+      - na_5x7_5x7in
+      - na_6x9_6x9in
+      - na_7x9_7x9in
+      - na_9x11_9x11in
+      - na_a2_4.375x5.75in
+      - na_arch-a_9x12in
+      - na_arch-b_12x18in
+      - na_arch-c_18x24in
+      - na_arch-d_24x36in
+      - na_arch-e_36x48in
+      - na_b-plus_12x19.17in
+      - na_c5_6.5x9.5in
+      - na_c_17x22in
+      - na_d_22x34in
+      - na_e_34x44in
+      - na_edp_11x14in
+      - na_eur-edp_12x14in
+      - na_f_44x68in
+      - na_fanfold-eur_8.5x12in
+      - na_fanfold-us_11x14.875in
+      - na_foolscap_8.5x13in
+      - na_govt-legal_8x13in
+      - na_govt-letter_8x10in
+      - na_index-3x5_3x5in
+      - na_index-4x6-ext_6x8in
+      - na_index-4x6_4x6in
+      - na_index-5x8_5x8in
+      - na_invoice_5.5x8.5in
+      - na_ledger_11x17in
+      - na_legal-extra_9.5x15in
+      - na_legal_8.5x14in
+      - na_letter-extra_9.5x12in
+      - na_letter-plus_8.5x12.69in
+      - na_letter_8.5x11in
+      - na_number-10_4.125x9.5in
+      - na_number-11_4.5x10.375in
+      - na_number-12_4.75x11in
+      - na_number-14_5x11.5in
+      - na_personal_3.625x6.5in
+      - na_super-a_8.94x14in
+      - na_super-b_13x19in
+      - na_wide-format_30x42in
+      - om_dai-pa-kai_275x395mm
+      - om_folio-sp_215x315mm
+      - om_invite_220x220mm
+      - om_italian_110x230mm
+      - om_juuro-ku-kai_198x275mm
+      - om_large-photo_200x300
+      - om_pa-kai_267x389mm
+      - om_postfix_114x229mm
+      - om_small-photo_100x150mm
+      - prc_10_324x458mm
+      - prc_16k_146x215mm
+      - prc_1_102x165mm
+      - prc_2_102x176mm
+      - prc_32k_97x151mm
+      - prc_3_125x176mm
+      - prc_4_110x208mm
+      - prc_5_110x220mm
+      - prc_6_120x320mm
+      - prc_7_160x230mm
+      - prc_8_120x309mm
+      - roc_16k_7.75x10.75in
+      - roc_8k_10.75x15.5in
+      - jis_b0_1030x1456mm
+      - jis_b1_728x1030mm
+      - jis_b2_515x728mm
+      - jis_b3_364x515mm
+      - jis_b4_257x364mm
+      - jis_b5_182x257mm
+      - jis_b6_128x182mm
+      - jis_b7_91x128mm
+      - jis_b8_64x91mm
+      - jis_b9_45x64mm
+      - jis_b10_32x45mm
+      type: string
+  required:
+  - name
+  type: object
+supported_on:
+- chrome.*:84-
+- chrome_os:84-
+tags: []
+type: dict
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingPinDefault.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingPinDefault.yaml
new file mode 100644
index 0000000..36815bf
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingPinDefault.yaml
@@ -0,0 +1,27 @@
+caption: Default PIN printing mode
+desc: Overrides default PIN printing mode. If the mode is unavailable this policy
+  is ignored.
+example_value: pin
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable PIN printing by default
+  name: pin
+  value: pin
+- caption: Disable PIN printing by default
+  name: no_pin
+  value: no_pin
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  enum:
+  - pin
+  - no_pin
+  type: string
+supported_on:
+- chrome_os:75-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Printing/PrintingSendUsernameAndFilenameEnabled.yaml b/components/policy/resources/templates/policy_definitons/Printing/PrintingSendUsernameAndFilenameEnabled.yaml
new file mode 100644
index 0000000..e646b20
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/PrintingSendUsernameAndFilenameEnabled.yaml
@@ -0,0 +1,24 @@
+caption: Send username and filename to native printers
+desc: |-
+  Send username and filename to native printers server with every print job. The default is not to send.
+
+        Setting this policy to true also disables printers that use protocols other than IPPS, USB, or IPP-over-USB since username and filename shouldn't be sent over the network openly.
+example_value: true
+features:
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable sending username and filename to native printers
+  value: true
+- caption: Disable sending username and filename to native printers
+  value: false
+owners:
+- srad@google.com
+- pawliczek@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:72-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/UserNativePrintersAllowed.yaml b/components/policy/resources/templates/policy_definitons/Printing/UserNativePrintersAllowed.yaml
new file mode 100644
index 0000000..594a3a9
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/UserNativePrintersAllowed.yaml
@@ -0,0 +1,22 @@
+caption: Allow access to native CUPS printers
+deprecated: true
+desc: "Allows you to control if users can access non-enterprise printers\n\n     \
+  \ If the policy is set to True, or not set at all, users will be able to add, configure,\
+  \ and print using their own native printers.\n\n      If the policy is set to False,\
+  \ users will not be able to add and configure their own native printers. They will\
+  \ also not be able to print using any previously configured native printers.\n\n\
+  \      This policy is deprecated, please use <ph name=\"USER_PRINTERS_ALLOWED\"\
+  >UserPrintersAllowed</ph> instead.\n      "
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- valleau@chromium.org
+- skau@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:67-100
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Printing/UserPrintersAllowed.yaml b/components/policy/resources/templates/policy_definitons/Printing/UserPrintersAllowed.yaml
new file mode 100644
index 0000000..f52f02c
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Printing/UserPrintersAllowed.yaml
@@ -0,0 +1,19 @@
+caption: Allow access to CUPS printers
+desc: "Allows you to control if users can access non-enterprise printers\n\n     \
+  \ If the policy is set to True, or not set at all, users will be able to add, configure,\
+  \ and print using their own printers.\n\n      If the policy is set to False, users\
+  \ will not be able to add and configure their own printers. They will also not be\
+  \ able to print using any previously configured printers.\n      "
+example_value: false
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- valleau@chromium.org
+- skau@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:86-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PrivacyScreen/.group.details.yaml b/components/policy/resources/templates/policy_definitons/PrivacyScreen/.group.details.yaml
new file mode 100644
index 0000000..291311a7
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PrivacyScreen/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Privacy screen settings
+desc: Controls user and device policies for the privacy screen feature.
diff --git a/components/policy/resources/templates/policy_definitons/PrivacyScreen/DeviceLoginScreenPrivacyScreenEnabled.yaml b/components/policy/resources/templates/policy_definitons/PrivacyScreen/DeviceLoginScreenPrivacyScreenEnabled.yaml
new file mode 100644
index 0000000..7e854bb
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PrivacyScreen/DeviceLoginScreenPrivacyScreenEnabled.yaml
@@ -0,0 +1,28 @@
+caption: Set the state of privacy screen on the login screen
+default: null
+desc: |-
+  Set the state of the privacy screen feature on the login screen.
+
+  If this policy is set to True, privacy screen will be enabled when the login screen is shown.
+
+  If this policy is set to False, privacy screen will be disabled when the login screen is shown.
+
+  When this policy is set, the user cannot override the value when the login screen is shown.
+
+  If this policy is left unset, the privacy screen is disabled initially, but remains controllable by the user when the login screen is shown.
+device_only: true
+example_value: true
+features:
+  can_be_mandatory: true
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+- gildekel@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:83-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/PrivacyScreen/PrivacyScreenEnabled.yaml b/components/policy/resources/templates/policy_definitons/PrivacyScreen/PrivacyScreenEnabled.yaml
new file mode 100644
index 0000000..e433aab
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/PrivacyScreen/PrivacyScreenEnabled.yaml
@@ -0,0 +1,27 @@
+caption: Enable privacy screen
+default: null
+desc: |-
+  Enable/disable the privacy screen feature.
+
+  If this policy is set to True, privacy screen will always be enabled.
+
+  If this policy is set to False, privacy screen will always be disabled.
+
+  When this policy is set, the user cannot override the value.
+
+  If this policy is left unset, privacy screen is disabled initially but can be controlled by the user.
+example_value: true
+features:
+  can_be_mandatory: true
+  can_be_recommended: false
+  dynamic_refresh: true
+  per_profile: false
+owners:
+- lamzin@google.com
+- gildekel@chromium.org
+schema:
+  type: boolean
+supported_on:
+- chrome_os:83-
+tags: []
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Projector/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Projector/.group.details.yaml
new file mode 100644
index 0000000..b8abcb1
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Projector/.group.details.yaml
@@ -0,0 +1,2 @@
+caption: Screencast
+desc: Controls policies for Screencast.
diff --git a/components/policy/resources/templates/policy_definitons/Projector/ProjectorDogfoodForFamilyLinkEnabled.yaml b/components/policy/resources/templates/policy_definitons/Projector/ProjectorDogfoodForFamilyLinkEnabled.yaml
new file mode 100644
index 0000000..7f950614
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Projector/ProjectorDogfoodForFamilyLinkEnabled.yaml
@@ -0,0 +1,30 @@
+caption: Enable Screencast dogfood for Family Link users
+default: false
+desc: |-
+  This policy enables Screencast feature for Family Link users and gives it permission to create and transcribe screen recording and upload to Drive.
+        This policy does not affect other types of users.
+        This policy does not affect <ph name="PROJECTOR_ENABLED_POLICY_NAME">ProjectorEnabled</ph> policy for enterprise users.
+
+        If the policy is enabled, Screencast dogfood will be enabled for Family Link users.
+        If the policy is disabled, Screencast dogfood will be disabled for Family Link users.
+        If the policy is not set, Screencast dogfood will be by default disabled for Family Link users.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable Screencast dogfood for Family Link users
+  value: true
+- caption: Disable Screencast dogfood for Family Link users
+  value: false
+owners:
+- agawronska@google.com
+- llin@google.com
+- cros-projector@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:102-
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Projector/ProjectorEnabled.yaml b/components/policy/resources/templates/policy_definitons/Projector/ProjectorEnabled.yaml
new file mode 100644
index 0000000..87c1c2f
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Projector/ProjectorEnabled.yaml
@@ -0,0 +1,28 @@
+caption: Enable Screencast
+default: true
+desc: |-
+  This policy gives Screencast permission to create and transcribe screen recording and upload to Drive for enterprise users.
+        This policy does not affect Family Link users.
+        This policy does not affect <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME">ProjectorDogfoodForFamilyLinkEnabled</ph> policy for Family Link users.
+
+        If the policy is unset or enabled, Screencast will be enabled.
+        If the policy is disabled, Screencast will be disabled.
+example_value: true
+features:
+  dynamic_refresh: true
+  per_profile: true
+items:
+- caption: Enable Screencast
+  value: true
+- caption: Disable Screencast
+  value: false
+owners:
+- llin@google.com
+- cros-projector@google.com
+schema:
+  type: boolean
+supported_on:
+- chrome_os:99-
+tags:
+- google-sharing
+type: main
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/.group.details.yaml b/components/policy/resources/templates/policy_definitons/Proxy/.group.details.yaml
new file mode 100644
index 0000000..8033178
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/.group.details.yaml
@@ -0,0 +1,14 @@
+caption: Proxy server
+desc: |-
+  Allows you to specify the proxy server used by <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and prevents users from changing proxy settings.
+
+        If you choose to never use a proxy server and always connect directly, all other options are ignored.
+
+        If you choose to auto detect the proxy server, all other options are ignored.
+
+        For detailed examples, visit:
+        <ph name="PROXY_HELP_URL">https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett<ex>https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett</ex></ph>.
+
+        If you enable this setting, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and ARC-apps ignore all proxy-related options specified from the command line.
+
+        Leaving these policies not set will allow the users to choose the proxy settings on their own.
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/ProxyBypassList.yaml b/components/policy/resources/templates/policy_definitons/Proxy/ProxyBypassList.yaml
new file mode 100644
index 0000000..65a4585
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/ProxyBypassList.yaml
@@ -0,0 +1,29 @@
+arc_support: You cannot force Android apps to use a proxy. A subset of proxy settings
+  is made available to Android apps, which they may voluntarily choose to honor. See
+  the <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph> policy for more details.
+caption: Proxy bypass rules
+deprecated: true
+desc: |-
+  This policy is deprecated, please use <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> instead.
+
+         Setting the policy means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> bypasses any proxy for the list of hosts given here. This policy only takes effect if the <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> policy isn't specified and you specified either <ph name="PROXY_MODE_ENUM_FIXED_SERVERS">fixed_servers</ph> or <ph name="PROXY_MODE_ENUM_PAC_SCRIPT">pac_script</ph> for <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph>.
+
+         Leave this policy unset if you selected any other mode for setting proxy policies.
+
+         Note: For more detailed examples, visit The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).
+example_value: https://www.example1.com,https://www.example2.com,https://internalsite/
+features:
+  dynamic_refresh: true
+  per_profile: true
+label: Comma-separated list of proxy bypass rules
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:8-
+- chrome_os:11-
+- android:30-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/ProxyMode.yaml b/components/policy/resources/templates/policy_definitons/Proxy/ProxyMode.yaml
new file mode 100644
index 0000000..a1110e4
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/ProxyMode.yaml
@@ -0,0 +1,58 @@
+caption: Choose how to specify proxy server settings
+deprecated: true
+desc: |-
+  This policy is deprecated, please use <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> instead.
+
+         Setting the policy to Enabled lets you specify the proxy server Chrome uses and prevents users from changing proxy settings. Chrome and ARC-apps ignore all proxy-related options specified from the command line. The policy only takes effect if the <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> policy isn't specified.
+
+         Other options are ignored if you choose:
+           * <ph name="PROXY_MODE_ENUM_DIRECT">direct</ph> = Never use a proxy server and always connect directly
+           * <ph name="PROXY_MODE_ENUM_SYSTEM">system</ph> = Use system proxy settings
+           * <ph name="PROXY_MODE_ENUM_AUTO_DETECT">auto_detect</ph> = Auto detect the proxy server
+
+         If you choose to use:
+           * <ph name="PROXY_MODE_ENUM_FIXED_SERVERS">fixed_servers</ph> = Fixed proxy servers. You can specify further options with <ph name="PROXY_SERVER_POLICY_NAME">ProxyServer</ph> and <ph name="PROXY_BYPASS_LIST_POLICY_NAME">ProxyBypassList</ph>. Only the HTTP proxy server with the highest priority is available for ARC-apps.
+           * <ph name="PROXY_MODE_ENUM_PAC_SCRIPT">pac_script</ph> =  A .pac proxy script. Use <ph name="PROXY_PAC_URL_POLICY_NAME">ProxyPacUrl</ph> to set the URL to a proxy .pac file.
+
+        Leaving the policy unset lets users choose the proxy settings.
+
+        Note: For detailed examples, visit The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).
+example_value: direct
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Never use a proxy
+  name: ProxyDisabled
+  value: direct
+- caption: Auto detect proxy settings
+  name: ProxyAutoDetect
+  value: auto_detect
+- caption: Use a .pac proxy script
+  name: ProxyPacScript
+  value: pac_script
+- caption: Use fixed proxy servers
+  name: ProxyFixedServers
+  value: fixed_servers
+- caption: Use system proxy settings
+  name: ProxyUseSystem
+  value: system
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  enum:
+  - direct
+  - auto_detect
+  - pac_script
+  - fixed_servers
+  - system
+  type: string
+supported_on:
+- chrome.*:10-
+- chrome_os:11-
+- android:30-
+tags: []
+type: string-enum
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/ProxyPacUrl.yaml b/components/policy/resources/templates/policy_definitons/Proxy/ProxyPacUrl.yaml
new file mode 100644
index 0000000..ef7215b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/ProxyPacUrl.yaml
@@ -0,0 +1,28 @@
+arc_support: You cannot force Android apps to use a proxy. A subset of proxy settings
+  is made available to Android apps, which they may voluntarily choose to honor. See
+  the <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph> policy for more details.
+caption: URL to a proxy .pac file
+deprecated: true
+desc: |-
+  This policy is deprecated, please use <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> instead.
+
+         Setting the policy lets you specify a URL to a proxy .pac file. This policy only takes effect if the <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> policy isn't specified and you selected <ph name="PROXY_MODE_ENUM_PAC_SCRIPT">pac_script</ph> with <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph>.
+
+         Leave this policy unset if you selected any other mode for setting proxy policies.
+
+         Note: For detailed examples, visit The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).
+example_value: https://internal.site/example.pac
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:8-
+- chrome_os:11-
+- android:30-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/ProxyServer.yaml b/components/policy/resources/templates/policy_definitons/Proxy/ProxyServer.yaml
new file mode 100644
index 0000000..da7aa43b
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/ProxyServer.yaml
@@ -0,0 +1,28 @@
+arc_support: You cannot force Android apps to use a proxy. A subset of proxy settings
+  is made available to Android apps, which they may voluntarily choose to honor. See
+  the <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph> policy for more details.
+caption: Address or URL of proxy server
+deprecated: true
+desc: |-
+  This policy is deprecated, please use <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> instead.
+
+         Setting the policy lets you specify the URL of the proxy server. This policy only takes effect if the <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> policy isn't specified and you selected <ph name="PROXY_MODE_ENUM_FIXED_SERVERS">fixed_servers</ph> with <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph>.
+
+         Leave this policy unset if you selected any other mode for setting proxy policies.
+
+        Note: For detailed examples, visit The Chromium Projects ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett ).
+example_value: 123.123.123.123:8080
+features:
+  dynamic_refresh: true
+  per_profile: true
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  type: string
+supported_on:
+- chrome.*:8-
+- chrome_os:11-
+- android:30-
+tags: []
+type: string
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/ProxyServerMode.yaml b/components/policy/resources/templates/policy_definitons/Proxy/ProxyServerMode.yaml
new file mode 100644
index 0000000..1714752a
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/ProxyServerMode.yaml
@@ -0,0 +1,54 @@
+arc_support: You cannot force Android apps to use a proxy. A subset of proxy settings
+  is made available to Android apps, which they may voluntarily choose to honor. See
+  the <ph name="PROXY_MODE_POLICY_NAME">ProxyMode</ph> policy for more details.
+caption: Choose how to specify proxy server settings
+deprecated: true
+desc: |-
+  This policy is deprecated, use ProxyMode instead.
+
+            Allows you to specify the proxy server used by <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> and prevents users from changing proxy settings.
+
+            This policy only takes effect  if the <ph name="PROXY_SETTINGS_POLICY_NAME">ProxySettings</ph> policy has not been specified.
+
+            If you choose to never use a proxy server and always connect directly, all other options are ignored.
+
+            If you choose to use system proxy settings or auto detect the proxy server, all other options are ignored.
+
+            If you choose manual proxy settings, you can specify further options in 'Address or URL of proxy server', 'URL to a proxy .pac file' and 'Comma-separated list of proxy bypass rules'. Only the HTTP proxy server with the highest priority is available for ARC-apps.
+
+            For detailed examples, visit:
+            <ph name="PROXY_HELP_URL">https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett<ex>https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett</ex></ph>.
+
+            If you enable this setting, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> ignores all proxy-related options specified from the command line.
+
+            Leaving this policy not set will allow the users to choose the proxy settings on their own.
+example_value: 2
+features:
+  dynamic_refresh: true
+  per_profile: true
+future_on:
+- fuchsia
+items:
+- caption: Never use a proxy
+  name: ProxyServerDisabled
+  value: 0
+- caption: Auto detect proxy settings
+  name: ProxyServerAutoDetect
+  value: 1
+- caption: Manually specify proxy settings
+  name: ProxyServerManual
+  value: 2
+- caption: Use system proxy settings
+  name: ProxyServerUseSystem
+  value: 3
+owners:
+- file://components/policy/resources/OWNERS
+- rsorokin@chromium.org
+schema:
+  $ref: ProxyServerMode
+supported_on:
+- chrome.*:8-
+- chrome_os:11-
+- android:30-
+tags: []
+type: int-enum
diff --git a/components/policy/resources/templates/policy_definitons/Proxy/policy_atomic_groups.yaml b/components/policy/resources/templates/policy_definitons/Proxy/policy_atomic_groups.yaml
new file mode 100644
index 0000000..a5e22bd
--- /dev/null
+++ b/components/policy/resources/templates/policy_definitons/Proxy/policy_atomic_groups.yaml
@@ -0,0 +1,9 @@
+Proxy:
+  caption: Proxy
+  policies:
+  - ProxyMode
+  - ProxyServerMode
+  - ProxyServer
+  - ProxyPacUrl
+  - ProxyBypassList
+  - ProxySettings
diff --git a/components/remote_cocoa/app_shim/immersive_mode_controller.h b/components/remote_cocoa/app_shim/immersive_mode_controller.h
index 5df29cc6..d264fab1 100644
--- a/components/remote_cocoa/app_shim/immersive_mode_controller.h
+++ b/components/remote_cocoa/app_shim/immersive_mode_controller.h
@@ -11,6 +11,7 @@
 #include "base/mac/scoped_nsobject.h"
 #include "components/remote_cocoa/app_shim/remote_cocoa_app_shim_export.h"
 
+@class ClearTitlebarViewController;
 @class ImmersiveModeMapper;
 @class ImmersiveModeTitlebarViewController;
 @class ImmersiveModeWindowObserver;
@@ -58,6 +59,8 @@
 
   base::scoped_nsobject<ImmersiveModeTitlebarViewController>
       immersive_mode_titlebar_view_controller_;
+  base::scoped_nsobject<ClearTitlebarViewController>
+      clear_titlebar_view_controller_;
   base::scoped_nsobject<ImmersiveModeMapper> immersive_mode_mapper_;
   base::scoped_nsobject<ImmersiveModeWindowObserver>
       immersive_mode_window_observer_;
diff --git a/components/remote_cocoa/app_shim/immersive_mode_controller.mm b/components/remote_cocoa/app_shim/immersive_mode_controller.mm
index 60074efd..22ca440d 100644
--- a/components/remote_cocoa/app_shim/immersive_mode_controller.mm
+++ b/components/remote_cocoa/app_shim/immersive_mode_controller.mm
@@ -60,6 +60,25 @@
 
 @end
 
+@interface ClearTitlebarViewController : NSTitlebarAccessoryViewController
+@end
+
+@implementation ClearTitlebarViewController
+
+- (void)viewWillAppear {
+  [super viewWillAppear];
+  NSSize size = self.view.frame.size;
+  size.height = self.fullScreenMinHeight;
+  [self.view setFrameSize:size];
+
+  // Hide the controller before it is appears but after the view's frame is set.
+  // This will extend the NSTitlebarAccessoryViewController mouse tracking area
+  // over the entirety of the window stopping the Title Bar from auto hiding.
+  self.hidden = YES;
+}
+
+@end
+
 // An NSView that will set the ImmersiveModeDelegate on the AppKit created
 // window that ends up hosting this view via the
 // NSTitlebarAccessoryViewController API.
@@ -224,10 +243,18 @@
     immersive_mode_titlebar_view_controller_.get().fullScreenMinHeight =
         immersive_mode_titlebar_view_controller_.get().view.frame.size.height;
     browser_widget_.styleMask &= ~NSWindowStyleMaskFullSizeContentView;
+
+    // Toggling the controller will allow the content view to resize below Top
+    // Chrome.
+    immersive_mode_titlebar_view_controller_.get().hidden = YES;
+    immersive_mode_titlebar_view_controller_.get().hidden = NO;
   } else {
     immersive_mode_titlebar_view_controller_.get().fullScreenMinHeight = 0;
     browser_widget_.styleMask |= NSWindowStyleMaskFullSizeContentView;
   }
+
+  // Unpin the Title Bar.
+  SetTitleBarPinned(false);
 }
 
 // This function will pin or unpin the Title Bar (holder of the traffic
@@ -236,9 +263,24 @@
 // helpful when displaying sub-widgets. When the Title Bar is not pinned it will
 // reveal and auto-hide itself based on mouse movement (controlled by AppKit).
 void ImmersiveModeController::SetTitleBarPinned(bool pinned) {
-  // TODO(bur): Provide a mechanism to acomplish Title Bar pinning that looks
-  // and feels native. The use of a NSToolbar is an option but undesirable
-  // because of the +10 pixel height it adds to the blank Title Bar.
+  // Remove the current, if any, clear controller from the window.
+  [clear_titlebar_view_controller_.get() removeFromParentViewController];
+
+  if (!pinned) {
+    clear_titlebar_view_controller_.reset();
+    return;
+  }
+
+  clear_titlebar_view_controller_.reset(
+      [[ClearTitlebarViewController alloc] init]);
+  clear_titlebar_view_controller_.get().view =
+      [[[NSView alloc] init] autorelease];
+  clear_titlebar_view_controller_.get().layoutAttribute =
+      NSLayoutAttributeBottom;
+  clear_titlebar_view_controller_.get().fullScreenMinHeight =
+      browser_widget_.contentView.frame.size.height;
+  [browser_widget_
+      addTitlebarAccessoryViewController:clear_titlebar_view_controller_];
 }
 
 void ImmersiveModeController::ObserveOverlayChildWindows() {
diff --git a/components/search_engines/android/template_url_service_android.cc b/components/search_engines/android/template_url_service_android.cc
index 44729a6..3e83bb6 100644
--- a/components/search_engines/android/template_url_service_android.cc
+++ b/components/search_engines/android/template_url_service_android.cc
@@ -319,9 +319,8 @@
   // Check if there is already a search engine created from Play API.
   TemplateURLService::TemplateURLVector template_urls =
       template_url_service_->GetTemplateURLs();
-  auto existing_play_api_turl = base::ranges::find_if(
-      template_urls,
-      [](const TemplateURL* turl) { return turl->created_from_play_api(); });
+  auto existing_play_api_turl =
+      base::ranges::find_if(template_urls, &TemplateURL::created_from_play_api);
   if (existing_play_api_turl != template_urls.cend()) {
     // Migrate old Play API database entries that were incorrectly marked as
     // safe_for_autoreplace() before M89.
@@ -398,9 +397,7 @@
   // Clean up duplication between a Play API template URL and a corresponding
   // prepopulated template URL.
   auto play_api_it =
-      base::ranges::find_if(template_urls, [](TemplateURL* template_url) {
-        return template_url->created_from_play_api();
-      });
+      base::ranges::find_if(template_urls, &TemplateURL::created_from_play_api);
   TemplateURL* play_api_turl =
       play_api_it != template_urls.end() ? *play_api_it : nullptr;
 
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter
index 68186b9..863f05b 100644
--- a/components/segmentation_platform/components_unittests.filter
+++ b/components/segmentation_platform/components_unittests.filter
@@ -1,4 +1,5 @@
 ConfigParserTest.*
+CrossDeviceUserModelTest.*
 CustomInputProcessorTest.*
 DatabaseMaintenanceImplTest.*
 DefaultModelManagerTest.*
@@ -30,7 +31,6 @@
 SegmentationResultPrefsTest.*
 SegmentationUkmHelperTest.*
 SegmentInfoCacheTest.*
-SegmentInfoDatabaseTest.*
 SegmentResultProviderTest.*
 SegmentScoreProviderTest.*
 SegmentSelectorTest.*
diff --git a/components/segmentation_platform/internal/stats.cc b/components/segmentation_platform/internal/stats.cc
index c78991b..24b6004 100644
--- a/components/segmentation_platform/internal/stats.cc
+++ b/components/segmentation_platform/internal/stats.cc
@@ -8,7 +8,6 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/notreached.h"
 #include "base/strings/strcat.h"
-#include "components/segmentation_platform/public/config.h"
 #include "components/segmentation_platform/public/constants.h"
 #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h"
 #include "components/segmentation_platform/public/proto/types.pb.h"
@@ -43,7 +42,8 @@
   kChromeLowUserEngagement = 16,
   kFeedUserSegment = 17,
   kContextualPageActionPriceTracking = 18,
-  kMaxValue = kContextualPageActionPriceTracking,
+  kChromeStartAndroidV2 = 22,
+  kMaxValue = kChromeStartAndroidV2,
 };
 
 AdaptiveToolbarButtonVariant OptimizationTargetToAdaptiveToolbarButtonVariant(
@@ -67,6 +67,7 @@
   // Please keep in sync with BooleanModel variant in
   // //tools/metrics/histograms/metadata/segmentation_platform/histograms.xml.
   return segmentation_key == kChromeStartAndroidSegmentationKey ||
+         segmentation_key == kChromeStartAndroidV2SegmentationKey ||
          segmentation_key == kQueryTilesSegmentationKey ||
          segmentation_key == kChromeLowUserEngagementSegmentationKey ||
          segmentation_key == kFeedUserSegmentationKey ||
@@ -172,6 +173,8 @@
       return SegmentationModel::kFeedUserSegment;
     case SegmentId::OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING:
       return SegmentationModel::kContextualPageActionPriceTracking;
+    case SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2:
+      return SegmentationModel::kChromeStartAndroidV2;
     default:
       return SegmentationModel::kUnknown;
   }
diff --git a/components/segmentation_platform/public/constants.cc b/components/segmentation_platform/public/constants.cc
index 65fed04..2f02fd5 100644
--- a/components/segmentation_platform/public/constants.cc
+++ b/components/segmentation_platform/public/constants.cc
@@ -20,6 +20,8 @@
     return kDummyFeatureUmaName;
   } else if (segmentation_key == kChromeStartAndroidSegmentationKey) {
     return kChromeStartAndroidUmaName;
+  } else if (segmentation_key == kChromeStartAndroidV2SegmentationKey) {
+    return kChromeStartAndroidV2UmaName;
   } else if (segmentation_key == kQueryTilesSegmentationKey) {
     return kQueryTilesUmaName;
   } else if (segmentation_key == kChromeLowUserEngagementSegmentationKey) {
@@ -86,6 +88,9 @@
       return "IntentionalUser";
     case proto::SegmentId::RESUME_HEAVY_USER_SEGMENT:
       return "ResumeHeavyUserSegment";
+    case proto::SegmentId::
+        OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2:
+      return "ChromeStartAndroidV2";
     default:
       // This case is reached when UNKNOWN segment is valid, in case of boolean
       // segment results.
diff --git a/components/segmentation_platform/public/constants.h b/components/segmentation_platform/public/constants.h
index fcc67471..d04a723 100644
--- a/components/segmentation_platform/public/constants.h
+++ b/components/segmentation_platform/public/constants.h
@@ -24,6 +24,10 @@
 const char kChromeStartAndroidSegmentationKey[] = "chrome_start_android";
 const char kChromeStartAndroidUmaName[] = "ChromeStartAndroid";
 
+// The key is used to decide how long to wait before showing Chrome Start.
+const char kChromeStartAndroidV2SegmentationKey[] = "chrome_start_android_v2";
+const char kChromeStartAndroidV2UmaName[] = "ChromeStartAndroidV2";
+
 // The key is used to decide whether to show query tiles.
 const char kQueryTilesSegmentationKey[] = "query_tiles";
 const char kQueryTilesUmaName[] = "QueryTiles";
diff --git a/components/segmentation_platform/public/proto/segmentation_platform.proto b/components/segmentation_platform/public/proto/segmentation_platform.proto
index aaf8c042..5603f76f0 100644
--- a/components/segmentation_platform/public/proto/segmentation_platform.proto
+++ b/components/segmentation_platform/public/proto/segmentation_platform.proto
@@ -59,6 +59,8 @@
   OPTIMIZATION_TARGET_TEXT_CLASSIFIER = 19;
   // Target for segmentation: Determine users who are interested in shopping.
   OPTIMIZATION_TARGET_SEGMENTATION_SHOPPING_USER = 21;
+  // Target for segmentation: Chrome Android Start user V2.
+  OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2 = 22;
   // Add new entries to OptimizationTarget proto.
 
   // New entries should start from a 1000 if OptimizationTarget does not
diff --git a/components/signin/core/browser/account_investigator.cc b/components/signin/core/browser/account_investigator.cc
index f4b74ce1..79472175 100644
--- a/components/signin/core/browser/account_investigator.cc
+++ b/components/signin/core/browser/account_investigator.cc
@@ -189,28 +189,27 @@
   if (signed_in_accounts.empty() && signed_out_accounts.empty()) {
     return AccountRelation::EMPTY_COOKIE_JAR;
   }
-  auto signed_in_match_iter = base::ranges::find_if(
-      signed_in_accounts,
-      [&info](const ListedAccount& account) { return AreSame(info, account); });
-  auto signed_out_match_iter = base::ranges::find_if(
-      signed_out_accounts,
-      [&info](const ListedAccount& account) { return AreSame(info, account); });
-  if (signed_in_match_iter != signed_in_accounts.end()) {
+  if (base::ranges::any_of(signed_in_accounts,
+                           [&info](const ListedAccount& account) {
+                             return AreSame(info, account);
+                           })) {
     if (signed_in_accounts.size() == 1) {
       return signed_out_accounts.empty()
                  ? AccountRelation::SINGLE_SIGNED_IN_MATCH_NO_SIGNED_OUT
                  : AccountRelation::SINGLE_SINGED_IN_MATCH_WITH_SIGNED_OUT;
-    } else {
-      return AccountRelation::ONE_OF_SIGNED_IN_MATCH_ANY_SIGNED_OUT;
     }
-  } else if (signed_out_match_iter != signed_out_accounts.end()) {
+    return AccountRelation::ONE_OF_SIGNED_IN_MATCH_ANY_SIGNED_OUT;
+  }
+  if (base::ranges::any_of(signed_out_accounts,
+                           [&info](const ListedAccount& account) {
+                             return AreSame(info, account);
+                           })) {
     if (signed_in_accounts.empty()) {
       return signed_out_accounts.size() == 1
                  ? AccountRelation::NO_SIGNED_IN_SINGLE_SIGNED_OUT_MATCH
                  : AccountRelation::NO_SIGNED_IN_ONE_OF_SIGNED_OUT_MATCH;
-    } else {
-      return AccountRelation::WITH_SIGNED_IN_ONE_OF_SIGNED_OUT_MATCH;
     }
+    return AccountRelation::WITH_SIGNED_IN_ONE_OF_SIGNED_OUT_MATCH;
   }
 
   return signed_in_accounts.empty()
diff --git a/components/spellcheck/browser/windows_spell_checker_unittest.cc b/components/spellcheck/browser/windows_spell_checker_unittest.cc
index 3c96b65..01a1f8a 100644
--- a/components/spellcheck/browser/windows_spell_checker_unittest.cc
+++ b/components/spellcheck/browser/windows_spell_checker_unittest.cc
@@ -163,13 +163,10 @@
   } else {
     const std::u16string suggested_word(
         base::ASCIIToUTF16(test_case.expected_suggestion));
-    auto position = base::ranges::find_if(
-        suggestions, [&](const std::u16string& suggestion) {
-          return suggestion.compare(suggested_word) == 0;
-        });
-
-    ASSERT_FALSE(position == suggestions.end())
-        << "RequestTextCheck: Expected suggestion not found";
+    ASSERT_TRUE(base::ranges::any_of(suggestions, [&](const std::u16string&
+                                                          suggestion) {
+      return suggestion.compare(suggested_word) == 0;
+    })) << "RequestTextCheck: Expected suggestion not found";
   }
 }
 
diff --git a/components/spellcheck/renderer/spellcheck.cc b/components/spellcheck/renderer/spellcheck.cc
index 5c2f3c67..ff84fc1 100644
--- a/components/spellcheck/renderer/spellcheck.cc
+++ b/components/spellcheck/renderer/spellcheck.cc
@@ -467,8 +467,7 @@
   DCHECK(param);
 
   if (languages_.empty() ||
-      base::ranges::find_if_not(languages_, &SpellcheckLanguage::IsEnabled) !=
-          languages_.end()) {
+      !base::ranges::all_of(languages_, &SpellcheckLanguage::IsEnabled)) {
     param->completion()->DidCancelCheckingText();
   } else {
     WebVector<blink::WebTextCheckingResult> results;
@@ -622,7 +621,7 @@
 }
 
 bool SpellCheck::IsWordInSupportedScript(const std::u16string& word) const {
-  return base::ranges::find_if(languages_, [word](const auto& language) {
-           return language->IsTextInSameScript(word);
-         }) != languages_.end();
+  return base::ranges::any_of(languages_, [word](const auto& language) {
+    return language->IsTextInSameScript(word);
+  });
 }
diff --git a/components/subresource_filter/core/browser/subresource_filter_features.cc b/components/subresource_filter/core/browser/subresource_filter_features.cc
index 6430e49..b809c20 100644
--- a/components/subresource_filter/core/browser/subresource_filter_features.cc
+++ b/components/subresource_filter/core/browser/subresource_filter_features.cc
@@ -43,10 +43,10 @@
   CommaSeparatedStrings& operator=(const CommaSeparatedStrings&) = delete;
 
   bool CaseInsensitiveContains(base::StringPiece lowercase_key) const {
-    return base::ranges::find_if(pieces_, [lowercase_key](
-                                              base::StringPiece element) {
-             return base::EqualsCaseInsensitiveASCII(element, lowercase_key);
-           }) != pieces_.end();
+    return base::ranges::any_of(
+        pieces_, [lowercase_key](base::StringPiece element) {
+          return base::EqualsCaseInsensitiveASCII(element, lowercase_key);
+        });
   }
 
  private:
diff --git a/components/test/data/autofill/heuristics/output/016_misc_phones.out b/components/test/data/autofill/heuristics/output/016_misc_phones.out
index 3c77b671..611e37c 100644
--- a/components/test/data/autofill/heuristics/output/016_misc_phones.out
+++ b/components/test/data/autofill/heuristics/output/016_misc_phones.out
@@ -5,13 +5,13 @@
 ADDRESS_HOME_STATE | state | State: |  | firstname_1
 ADDRESS_HOME_ZIP | zip | Zip: |  | firstname_1
 PHONE_HOME_WHOLE_NUMBER | phone | Phone: |  | firstname_1
-PHONE_HOME_CITY_CODE | areacode1 | Area Code: |  | firstname_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | areacode1 | Area Code: |  | firstname_1
 PHONE_HOME_NUMBER | phone1 | Phone: |  | firstname_1
-PHONE_HOME_CITY_CODE | hphone1 | Phone: |  | firstname_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | hphone1 | Phone: |  | firstname_1
 PHONE_HOME_NUMBER_PREFIX | hphone2 |  |  | firstname_1
 PHONE_HOME_NUMBER_SUFFIX | hphone3 |  |  | firstname_1
 PHONE_HOME_EXTENSION | hphone4 | ext.: |  | firstname_1
-PHONE_HOME_CITY_CODE | hphone1a | Phone:        ( |  | firstname_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | hphone1a | Phone:        ( |  | firstname_1
 PHONE_HOME_NUMBER_PREFIX | hphone2a |  |  | firstname_1
 PHONE_HOME_NUMBER_SUFFIX | hphone3a |  |  | firstname_1
 PHONE_HOME_EXTENSION | hphone4a | ext.: |  | firstname_1
diff --git a/components/test/data/autofill/heuristics/output/017_checkout_advanceautoparts.com.out b/components/test/data/autofill/heuristics/output/017_checkout_advanceautoparts.com.out
index 0d4788a..6f02908 100644
--- a/components/test/data/autofill/heuristics/output/017_checkout_advanceautoparts.com.out
+++ b/components/test/data/autofill/heuristics/output/017_checkout_advanceautoparts.com.out
@@ -9,7 +9,7 @@
 ADDRESS_HOME_CITY | billCity | *City: |  | billingShippingSame_1
 ADDRESS_HOME_STATE | billState | *State: | AL | billingShippingSame_1
 ADDRESS_HOME_ZIP | billZipCode | *Zip Code: |  | billingShippingSame_1
-PHONE_HOME_CITY_CODE | billDayPhonePart1 | *Day Phone: |  | billingShippingSame_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | billDayPhonePart1 | *Day Phone: |  | billingShippingSame_1
 PHONE_HOME_NUMBER_PREFIX | billDayPhonePart2 | *Day Phone: |  | billingShippingSame_1
 PHONE_HOME_NUMBER_SUFFIX | billDayPhonePart3 | *Day Phone: |  | billingShippingSame_1
 EMAIL_ADDRESS | billEmail | *Email Address: |  | billingShippingSame_1
@@ -23,10 +23,10 @@
 ADDRESS_HOME_CITY | shipCity | *City: |  | shipFirstName_2
 ADDRESS_HOME_STATE | shipState | *State: | AL | shipFirstName_2
 ADDRESS_HOME_ZIP | shipZipCode | *Zip Code: |  | shipFirstName_2
-PHONE_HOME_CITY_CODE | shipDayPhonePart1 | *Day Phone: |  | shipFirstName_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | shipDayPhonePart1 | *Day Phone: |  | shipFirstName_2
 PHONE_HOME_NUMBER_PREFIX | shipDayPhonePart2 | *Day Phone: |  | shipFirstName_2
 PHONE_HOME_NUMBER_SUFFIX | shipDayPhonePart3 | *Day Phone: |  | shipFirstName_2
-PHONE_HOME_CITY_CODE | shipNightPhonePart1 | Night Phone: |  | shipFirstName_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | shipNightPhonePart1 | Night Phone: |  | shipFirstName_2
 PHONE_HOME_NUMBER_PREFIX | shipNightPhonePart2 | Night Phone: |  | shipFirstName_2
 PHONE_HOME_NUMBER_SUFFIX | shipNightPhonePart3 | Night Phone: |  | shipFirstName_2
 UNKNOWN_TYPE | zipCode |  |  | zipCode_1
diff --git a/components/test/data/autofill/heuristics/output/019_checkout_bedbathandbeyond.com.out b/components/test/data/autofill/heuristics/output/019_checkout_bedbathandbeyond.com.out
index 6e21484..fb4a876 100644
--- a/components/test/data/autofill/heuristics/output/019_checkout_bedbathandbeyond.com.out
+++ b/components/test/data/autofill/heuristics/output/019_checkout_bedbathandbeyond.com.out
@@ -7,13 +7,13 @@
 ADDRESS_HOME_CITY | city | *City |  | first_nm_1
 ADDRESS_HOME_STATE | addr_state | *State |  | first_nm_1
 ADDRESS_HOME_ZIP | zip | *Zip Code |  | first_nm_1
-PHONE_HOME_CITY_CODE | day_phone_part1 | *Day phone |  | first_nm_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | day_phone_part1 | *Day phone |  | first_nm_1
 PHONE_HOME_NUMBER_PREFIX | day_phone_part2 | *Day phone |  | first_nm_1
 PHONE_HOME_NUMBER_SUFFIX | day_phone_part3 | *Day phone |  | first_nm_1
-PHONE_HOME_CITY_CODE | eve_phone_part1 | Evening phone |  | first_nm_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | eve_phone_part1 | Evening phone |  | first_nm_1
 PHONE_HOME_NUMBER_PREFIX | eve_phone_part2 | Evening phone |  | first_nm_1
 PHONE_HOME_NUMBER_SUFFIX | eve_phone_part3 | Evening phone |  | first_nm_1
-PHONE_HOME_CITY_CODE | mob_phone_part1 | Mobile phone |  | first_nm_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | mob_phone_part1 | Mobile phone |  | first_nm_1
 PHONE_HOME_NUMBER_PREFIX | mob_phone_part2 | Mobile phone |  | first_nm_1
 PHONE_HOME_NUMBER_SUFFIX | mob_phone_part3 | Mobile phone |  | first_nm_1
 EMAIL_ADDRESS | email_addr | *Email |  | first_nm_1
@@ -30,10 +30,10 @@
 ADDRESS_HOME_CITY | ship_city | *City |  | ship_first_nm_2
 ADDRESS_HOME_STATE | ship_addr_state | *State |  | ship_first_nm_2
 ADDRESS_HOME_ZIP | ship_zip | *Zip Code |  | ship_first_nm_2
-PHONE_HOME_CITY_CODE | ship_day_phone_part1 | *Day phone |  | ship_first_nm_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | ship_day_phone_part1 | *Day phone |  | ship_first_nm_2
 PHONE_HOME_NUMBER_PREFIX | ship_day_phone_part2 | *Day phone |  | ship_first_nm_2
 PHONE_HOME_NUMBER_SUFFIX | ship_day_phone_part3 | *Day phone |  | ship_first_nm_2
-PHONE_HOME_CITY_CODE | ship_eve_phone_part1 | Evening phone |  | ship_first_nm_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | ship_eve_phone_part1 | Evening phone |  | ship_first_nm_2
 PHONE_HOME_NUMBER_PREFIX | ship_eve_phone_part2 | Evening phone |  | ship_first_nm_2
 PHONE_HOME_NUMBER_SUFFIX | ship_eve_phone_part3 | Evening phone |  | ship_first_nm_2
 UNKNOWN_TYPE | email | Privacy policy - Your Privacy Rights | enter your email address | email_1
diff --git a/components/test/data/autofill/heuristics/output/024_checkout_homedepot.com.out b/components/test/data/autofill/heuristics/output/024_checkout_homedepot.com.out
index b3017c71..12eca03 100644
--- a/components/test/data/autofill/heuristics/output/024_checkout_homedepot.com.out
+++ b/components/test/data/autofill/heuristics/output/024_checkout_homedepot.com.out
@@ -5,10 +5,10 @@
 ADDRESS_HOME_CITY | city_1 | *City: |  | firstName_1_1
 ADDRESS_HOME_STATE | state_1 | *State: |  | firstName_1_1
 ADDRESS_HOME_ZIP | zipCode_1 | *ZIP Code: |  | firstName_1_1
-PHONE_HOME_CITY_CODE | fieldphone1_1 | *Phone Number on Record: |  | firstName_1_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | fieldphone1_1 | *Phone Number on Record: |  | firstName_1_1
 PHONE_HOME_NUMBER_PREFIX | fieldphone2_1 | *Phone Number on Record: |  | firstName_1_1
 PHONE_HOME_NUMBER_SUFFIX | fieldphone3_1 | *Phone Number on Record: |  | firstName_1_1
-PHONE_HOME_CITY_CODE | altfieldphone1_1 | Alternate Phone: |  | firstName_1_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | altfieldphone1_1 | Alternate Phone: |  | firstName_1_1
 PHONE_HOME_NUMBER_PREFIX | altfieldphone2_1 | Alternate Phone: |  | firstName_1_1
 PHONE_HOME_NUMBER_SUFFIX | altfieldphone3_1 | Alternate Phone: |  | firstName_1_1
 UNKNOWN_TYPE | isBillingAddress_1 | Check here if the above shipping address is | on | firstName_1_1
diff --git a/components/test/data/autofill/heuristics/output/029_checkout_kohls.com.out b/components/test/data/autofill/heuristics/output/029_checkout_kohls.com.out
index 3aa2ee73..876eba6 100644
--- a/components/test/data/autofill/heuristics/output/029_checkout_kohls.com.out
+++ b/components/test/data/autofill/heuristics/output/029_checkout_kohls.com.out
@@ -7,7 +7,7 @@
 ADDRESS_HOME_CITY | BILL_TO_ADDRESS<>city | City: |  | BILL_TO_ADDRESS<>firstName_1
 ADDRESS_HOME_STATE | BILL_TO_ADDRESS<>state_cd | State: |  | BILL_TO_ADDRESS<>firstName_1
 ADDRESS_HOME_ZIP | BILL_TO_ADDRESS<>postal | ZIP Code: |  | BILL_TO_ADDRESS<>firstName_1
-PHONE_HOME_CITY_CODE | BILL_PHONE<>areacode | Area Code |  | BILL_TO_ADDRESS<>firstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BILL_PHONE<>areacode | Area Code |  | BILL_TO_ADDRESS<>firstName_1
 PHONE_HOME_NUMBER | BILL_PHONE<>exchange | Exchange |  | BILL_TO_ADDRESS<>firstName_1
 PHONE_HOME_EXTENSION | BILL_PHONE<>extension | Extension |  | BILL_TO_ADDRESS<>firstName_1
 PHONE_HOME_WHOLE_NUMBER | bill_phone | Contact Phone: |  | BILL_TO_ADDRESS<>firstName_1
@@ -22,7 +22,7 @@
 ADDRESS_HOME_CITY | SHIP_TO_ADDRESS<>city | City: |  | SHIP_TO_ADDRESS<>firstName_2
 ADDRESS_HOME_STATE | SHIP_TO_ADDRESS<>state_cd | State: |  | SHIP_TO_ADDRESS<>firstName_2
 ADDRESS_HOME_ZIP | SHIP_TO_ADDRESS<>postal | ZIP Code: |  | SHIP_TO_ADDRESS<>firstName_2
-PHONE_HOME_CITY_CODE | SHIP_PHONE<>areacode | Area Code |  | SHIP_TO_ADDRESS<>firstName_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | SHIP_PHONE<>areacode | Area Code |  | SHIP_TO_ADDRESS<>firstName_2
 PHONE_HOME_NUMBER | SHIP_PHONE<>exchange | Exchange |  | SHIP_TO_ADDRESS<>firstName_2
 PHONE_HOME_EXTENSION | SHIP_PHONE<>extension | Extension |  | SHIP_TO_ADDRESS<>firstName_2
 PHONE_HOME_WHOLE_NUMBER | ship_phone | Contact Phone: |  | SHIP_TO_ADDRESS<>firstName_2
diff --git a/components/test/data/autofill/heuristics/output/030_checkout_lowes.com.out b/components/test/data/autofill/heuristics/output/030_checkout_lowes.com.out
index 7c320c9..138466d 100644
--- a/components/test/data/autofill/heuristics/output/030_checkout_lowes.com.out
+++ b/components/test/data/autofill/heuristics/output/030_checkout_lowes.com.out
@@ -13,7 +13,7 @@
 ADDRESS_HOME_CITY | taxGeoCode | Municipality: As an additional way to make sure you receive your order, we ask that you select the name of your municipality (city, town, borough, village, etc.) followed by the county, township, or parish in which you reside. |  | taxGeoCode_3
 UNKNOWN_TYPE | billingAddress | This is also my billing address. | on | taxGeoCode_3
 EMAIL_ADDRESS | email1 | E-mail Address: |  | taxGeoCode_3
-PHONE_HOME_CITY_CODE | billphone1 | Contact Phone: |  | taxGeoCode_3
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | billphone1 | Contact Phone: |  | taxGeoCode_3
 PHONE_HOME_NUMBER_PREFIX | billphone2 | Contact Phone: |  | taxGeoCode_3
 PHONE_HOME_NUMBER_SUFFIX | billphone3 | Contact Phone: |  | taxGeoCode_3
 EMAIL_ADDRESS | selfAddress | Please enter the phone number and e-mail address associated with this billing address.E-mail Address: Contact Phone: | 0 | selfAddress_4
diff --git a/components/test/data/autofill/heuristics/output/031_checkout_macys.com.out b/components/test/data/autofill/heuristics/output/031_checkout_macys.com.out
index 9bd57e8..db5e110 100644
--- a/components/test/data/autofill/heuristics/output/031_checkout_macys.com.out
+++ b/components/test/data/autofill/heuristics/output/031_checkout_macys.com.out
@@ -6,6 +6,6 @@
 ADDRESS_HOME_CITY | currentShipment.shipmentAddress.city | City: |  | selectedShippingAddress_1
 ADDRESS_HOME_STATE | currentShipment.shipmentAddress.state | State: | NOSELECTION | selectedShippingAddress_1
 ADDRESS_HOME_ZIP | currentShipment.shipmentAddress.zipCode | ZipCode: |  | selectedShippingAddress_1
-PHONE_HOME_CITY_CODE | currentShipment.shipmentAddress.dayPhone.areaCode | Phone: |  | selectedShippingAddress_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | currentShipment.shipmentAddress.dayPhone.areaCode | Phone: |  | selectedShippingAddress_1
 PHONE_HOME_NUMBER | currentShipment.shipmentAddress.dayPhone.exchangeNbr | * Phone: |  | selectedShippingAddress_1
 PHONE_HOME_WHOLE_NUMBER | currentShipment.shipmentAddress.dayPhone.subscriberNbr | * Phone: |  | selectedShippingAddress_1
diff --git a/components/test/data/autofill/heuristics/output/035_checkout_petco.com.out b/components/test/data/autofill/heuristics/output/035_checkout_petco.com.out
index ab9e354..e60ceaf 100644
--- a/components/test/data/autofill/heuristics/output/035_checkout_petco.com.out
+++ b/components/test/data/autofill/heuristics/output/035_checkout_petco.com.out
@@ -7,7 +7,7 @@
 ADDRESS_HOME_CITY | ctl00$ctl00$cphBody$cphBody$txtSA_City | City * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
 ADDRESS_HOME_STATE | ctl00$ctl00$cphBody$cphBody$ddlSA_State | State * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
 ADDRESS_HOME_ZIP | ctl00$ctl00$cphBody$cphBody$txtSA_Zip | ZIP Code * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
-PHONE_HOME_CITY_CODE | ctl00$ctl00$cphBody$cphBody$txtSA_Phone1 | Phone Number * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | ctl00$ctl00$cphBody$cphBody$txtSA_Phone1 | Phone Number * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
 PHONE_HOME_NUMBER_PREFIX | ctl00$ctl00$cphBody$cphBody$txtSA_Phone2 | ZIP Code * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
 PHONE_HOME_NUMBER_SUFFIX | ctl00$ctl00$cphBody$cphBody$txtSA_Phone3 | ZIP Code * |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
 PHONE_HOME_EXTENSION | ctl00$ctl00$cphBody$cphBody$txtSA_PhoneExt | Ext. |  | ctl00$ctl00$cphBody$cphBody$txtSA_FirstName_1
diff --git a/components/test/data/autofill/heuristics/output/037_checkout_qvc.com.out b/components/test/data/autofill/heuristics/output/037_checkout_qvc.com.out
index fd4b384..95d0363 100644
--- a/components/test/data/autofill/heuristics/output/037_checkout_qvc.com.out
+++ b/components/test/data/autofill/heuristics/output/037_checkout_qvc.com.out
@@ -11,10 +11,10 @@
 ADDRESS_HOME_STATE | BilltoState | State/Province: | AL | EmailAddress_1
 ADDRESS_HOME_ZIP | BilltoZipCode | * ZIP/Postal Code: |  | EmailAddress_1
 ADDRESS_HOME_COUNTRY | BilltoCountry | * Country: | US | EmailAddress_1
-PHONE_HOME_CITY_CODE | BilltoHpArea | * Home Phone: |  | EmailAddress_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BilltoHpArea | * Home Phone: |  | EmailAddress_1
 PHONE_HOME_NUMBER | BilltoHpExchange | * Home Phone: |  | EmailAddress_1
 PHONE_HOME_EXTENSION | BilltoHpExt | * Home Phone: |  | EmailAddress_1
-PHONE_HOME_CITY_CODE | BilltoWpArea | Work Phone: |  | EmailAddress_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BilltoWpArea | Work Phone: |  | EmailAddress_1
 PHONE_HOME_NUMBER | BilltoWpExchange | Work Phone: |  | EmailAddress_1
 PHONE_HOME_EXTENSION | BilltoWpExt | Work Phone: |  | EmailAddress_1
 UNKNOWN_TYPE | SameAsBilltoCheckbox | Same as Bill-To: | 1 | EmailAddress_1
diff --git a/components/test/data/autofill/heuristics/output/049_register_ebay.com.out b/components/test/data/autofill/heuristics/output/049_register_ebay.com.out
index 6e818d4..2129d35 100644
--- a/components/test/data/autofill/heuristics/output/049_register_ebay.com.out
+++ b/components/test/data/autofill/heuristics/output/049_register_ebay.com.out
@@ -6,7 +6,7 @@
 ADDRESS_HOME_STATE | state | State / Province | default | firstname_1
 ADDRESS_HOME_ZIP | zip | ZIP / Postal code |  | firstname_1
 ADDRESS_HOME_COUNTRY | countryId | Country or region | 1 | firstname_1
-PHONE_HOME_CITY_CODE | dayphone1 | Primary telephone number |  | firstname_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | dayphone1 | Primary telephone number |  | firstname_1
 PHONE_HOME_NUMBER_PREFIX | dayphone2 | Primary telephone number |  | firstname_1
 PHONE_HOME_NUMBER_SUFFIX | dayphone3 | Primary telephone number |  | firstname_1
 PHONE_HOME_EXTENSION | dayphone4 | ext.: |  | firstname_1
@@ -21,7 +21,7 @@
 ADDRESS_HOME_STATE | state | State / Province | default | firstname_2
 ADDRESS_HOME_ZIP | zip | ZIP / Postal code |  | firstname_2
 ADDRESS_HOME_COUNTRY | countryId | Country or region | 1 | firstname_2
-PHONE_HOME_CITY_CODE | dayphone1 | Primary telephone number |  | firstname_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | dayphone1 | Primary telephone number |  | firstname_2
 PHONE_HOME_NUMBER_PREFIX | dayphone2 | Primary telephone number |  | firstname_2
 PHONE_HOME_NUMBER_SUFFIX | dayphone3 | Primary telephone number |  | firstname_2
 PHONE_HOME_EXTENSION | dayphone4 | ext.: |  | firstname_2
@@ -55,7 +55,7 @@
 ADDRESS_HOME_STATE | state | State / Province | default | firstname_3
 ADDRESS_HOME_ZIP | zip | ZIP / Postal code |  | firstname_3
 ADDRESS_HOME_COUNTRY | countryId | Country or region | 1 | firstname_3
-PHONE_HOME_CITY_CODE | dayphone1 | Primary telephone number |  | firstname_3
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | dayphone1 | Primary telephone number |  | firstname_3
 PHONE_HOME_NUMBER_PREFIX | dayphone2 | Primary telephone number |  | firstname_3
 PHONE_HOME_NUMBER_SUFFIX | dayphone3 | Primary telephone number |  | firstname_3
 PHONE_HOME_EXTENSION | dayphone4 | ext.: |  | firstname_3
diff --git a/components/test/data/autofill/heuristics/output/059_register_macys.com.out b/components/test/data/autofill/heuristics/output/059_register_macys.com.out
index 61578d6..b6cdeb6e 100644
--- a/components/test/data/autofill/heuristics/output/059_register_macys.com.out
+++ b/components/test/data/autofill/heuristics/output/059_register_macys.com.out
@@ -13,7 +13,7 @@
 UNKNOWN_TYPE | Gender | Gender | NOSELECTION | FirstName_1
 UNKNOWN_TYPE | NewsLetter | We'll let you know about exclusive sales and events,both online and in-store. | NewsLetter | FirstName_1
 UNKNOWN_TYPE | MobileMarketing | Yes, please text me about exclusive sales and events, both online and in-store. We'll send your first text message within 48 hours. | MobileMarketing | FirstName_1
-PHONE_HOME_CITY_CODE | MobilePhoneAreaCode |  |  | FirstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | MobilePhoneAreaCode |  |  | FirstName_1
 PHONE_HOME_NUMBER | MobilePhoneExchangeNbr |  |  | FirstName_1
 PHONE_HOME_WHOLE_NUMBER | MobilePhoneSubscriberNbr |  |  | FirstName_1
 UNKNOWN_TYPE | addacard | Yes, I'd like to add my Macy's Card to my profile. | on | FirstName_1
diff --git a/components/test/data/autofill/heuristics/output/062_register_newegg.com.out b/components/test/data/autofill/heuristics/output/062_register_newegg.com.out
index 20f0c6f..7f81ca8 100644
--- a/components/test/data/autofill/heuristics/output/062_register_newegg.com.out
+++ b/components/test/data/autofill/heuristics/output/062_register_newegg.com.out
@@ -12,11 +12,11 @@
 ADDRESS_HOME_CITY | BCity | City* |  | LoginName_1
 ADDRESS_HOME_STATE | BState | State* | AK | LoginName_1
 ADDRESS_HOME_ZIP | BZip | Zip Code* |  | LoginName_1
-PHONE_HOME_CITY_CODE | BNightPhone_tel1 | Shipping Phone* |  | LoginName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BNightPhone_tel1 | Shipping Phone* |  | LoginName_1
 PHONE_HOME_NUMBER_PREFIX | BNightPhone_tel2 | Exchange |  | LoginName_1
 PHONE_HOME_NUMBER_SUFFIX | BNightPhone_tel3 | Last four digits |  | LoginName_1
 PHONE_HOME_EXTENSION | BNightPhone_ext1 | Ext |  | LoginName_1
-PHONE_HOME_CITY_CODE | BDayPhone_tel1 | Daytime Phone |  | LoginName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BDayPhone_tel1 | Daytime Phone |  | LoginName_1
 PHONE_HOME_NUMBER_PREFIX | BDayPhone_tel2 | Exchange |  | LoginName_1
 PHONE_HOME_NUMBER_SUFFIX | BDayPhone_tel3 | Last four digits |  | LoginName_1
 PHONE_HOME_EXTENSION | BDayPhone_ext1 | Ext |  | LoginName_1
@@ -31,7 +31,7 @@
 ADDRESS_HOME_CITY | SCity | City* |  | SFirstName_2
 ADDRESS_HOME_STATE | SState | State* | AK | SFirstName_2
 ADDRESS_HOME_ZIP | SZip | Zip Code* |  | SFirstName_2
-PHONE_HOME_CITY_CODE | ShippingPhone_tel1 | Shipping Phone* |  | SFirstName_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | ShippingPhone_tel1 | Shipping Phone* |  | SFirstName_2
 PHONE_HOME_NUMBER_PREFIX | ShippingPhone_tel2 |  |  | SFirstName_2
 PHONE_HOME_NUMBER_SUFFIX | ShippingPhone_tel3 |  |  | SFirstName_2
 PHONE_HOME_EXTENSION | ShippingPhone_ext1 | Ext |  | SFirstName_2
diff --git a/components/test/data/autofill/heuristics/output/063_register_officedepot.com.out b/components/test/data/autofill/heuristics/output/063_register_officedepot.com.out
index 411dafb..5fe5bd1 100644
--- a/components/test/data/autofill/heuristics/output/063_register_officedepot.com.out
+++ b/components/test/data/autofill/heuristics/output/063_register_officedepot.com.out
@@ -8,7 +8,7 @@
 ADDRESS_HOME_CITY | addrsForm[0].city | *City |  | addrsForm[0].firstName_1
 ADDRESS_HOME_STATE | addrsForm[0].state | *State | {blank} | addrsForm[0].firstName_1
 ADDRESS_HOME_ZIP | addrsForm[0].postalCode1 | *Zip Code |  | addrsForm[0].firstName_1
-PHONE_HOME_CITY_CODE | addrsForm[0].phoneNumber1 | *Phone Number: |  | addrsForm[0].firstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | addrsForm[0].phoneNumber1 | *Phone Number: |  | addrsForm[0].firstName_1
 PHONE_HOME_NUMBER_PREFIX | addrsForm[0].phoneNumber2 | *Phone Number: |  | addrsForm[0].firstName_1
 PHONE_HOME_NUMBER_SUFFIX | addrsForm[0].phoneNumber3 | *Phone Number: |  | addrsForm[0].firstName_1
 PHONE_HOME_EXTENSION | addrsForm[0].phoneNumber4 | ext. |  | addrsForm[0].firstName_1
@@ -31,7 +31,7 @@
 ADDRESS_HOME_CITY | addrsForm[2].city | *City |  | addrsForm[2].firstName_3
 ADDRESS_HOME_STATE | addrsForm[2].state | *State | {blank} | addrsForm[2].firstName_3
 ADDRESS_HOME_ZIP | addrsForm[2].postalCode1 | *Zip Code |  | addrsForm[2].firstName_3
-PHONE_HOME_CITY_CODE | addrsForm[2].phoneNumber1 | *Phone Number: |  | addrsForm[2].firstName_3
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | addrsForm[2].phoneNumber1 | *Phone Number: |  | addrsForm[2].firstName_3
 PHONE_HOME_NUMBER_PREFIX | addrsForm[2].phoneNumber2 | *Phone Number: |  | addrsForm[2].firstName_3
 PHONE_HOME_NUMBER_SUFFIX | addrsForm[2].phoneNumber3 | *Phone Number: |  | addrsForm[2].firstName_3
 PHONE_HOME_EXTENSION | addrsForm[2].phoneNumber4 | ext. |  | addrsForm[2].firstName_3
diff --git a/components/test/data/autofill/heuristics/output/072_register_supershuttle.com.out b/components/test/data/autofill/heuristics/output/072_register_supershuttle.com.out
index eda224d..e9b61ce 100644
--- a/components/test/data/autofill/heuristics/output/072_register_supershuttle.com.out
+++ b/components/test/data/autofill/heuristics/output/072_register_supershuttle.com.out
@@ -5,7 +5,7 @@
 NAME_LAST | ctl00$cphRight$Registration1$txtLastName | Last Name |  | ctl00$cphRight$Registration1$txtEmailAddress_2
 PHONE_HOME_WHOLE_NUMBER | ctl00$cphRight$Registration1$txtCellPhone | Contact or Cell Phone Number |  | ctl00$cphRight$Registration1$txtEmailAddress_2
 PHONE_HOME_COUNTRY_CODE | ctl00$cphRight$Registration1$txtCountryCode | If outside the US (Country Code/Phone Number) |  | ctl00$cphRight$Registration1$txtEmailAddress_2
-PHONE_HOME_CITY_AND_NUMBER | ctl00$cphRight$Registration1$txtIntPhoneNumber | Contact or Cell Phone Number |  | ctl00$cphRight$Registration1$txtEmailAddress_2
+PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX | ctl00$cphRight$Registration1$txtIntPhoneNumber | Contact or Cell Phone Number |  | ctl00$cphRight$Registration1$txtEmailAddress_2
 UNKNOWN_TYPE | ctl00$cphRight$Registration1$txtPassword | Password |  | ctl00$cphRight$Registration1$txtEmailAddress_2
 UNKNOWN_TYPE | ctl00$cphRight$Registration1$txtConfirmPassword | Confirm Password |  | ctl00$cphRight$Registration1$txtEmailAddress_2
 UNKNOWN_TYPE | ctl00$cphRight$Registration1$chkAcceptSpecialOffers | Email me regarding SuperShuttle special offers and promotions | on | ctl00$cphRight$Registration1$txtEmailAddress_2
diff --git a/components/test/data/autofill/heuristics/output/086_crbug_98269.out b/components/test/data/autofill/heuristics/output/086_crbug_98269.out
index dab645c..748112e 100644
--- a/components/test/data/autofill/heuristics/output/086_crbug_98269.out
+++ b/components/test/data/autofill/heuristics/output/086_crbug_98269.out
@@ -1,5 +1,5 @@
 UNKNOWN_TYPE | PaymentMethod | BL | BL | PaymentMethod_1
-PHONE_HOME_CITY_CODE | txtHomePhone1 | * Home Phone: |  | PaymentMethod_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | txtHomePhone1 | * Home Phone: |  | PaymentMethod_1
 PHONE_HOME_NUMBER_PREFIX | txtHomePhone2 | * Home Phone: |  | PaymentMethod_1
 PHONE_HOME_NUMBER_SUFFIX | txtHomePhone3 | * Home Phone: |  | PaymentMethod_1
 EMAIL_ADDRESS | txtEmail | * Email Address: |  | PaymentMethod_1
diff --git a/components/test/data/autofill/heuristics/output/092_checkout_alaskaair.com.out b/components/test/data/autofill/heuristics/output/092_checkout_alaskaair.com.out
index d9566b5f..99def10 100644
--- a/components/test/data/autofill/heuristics/output/092_checkout_alaskaair.com.out
+++ b/components/test/data/autofill/heuristics/output/092_checkout_alaskaair.com.out
@@ -20,7 +20,7 @@
 UNKNOWN_TYPE | CreditCardInformation.BillingAddressEntry.OtherStates_Selected | State/Province |  | MyWalletInformation.UseMyWalletFunds_1
 ADDRESS_HOME_ZIP | CreditCardInformation.BillingAddressEntry.PostalCode | Zip/Postal Code |  | MyWalletInformation.UseMyWalletFunds_1
 PHONE_HOME_COUNTRY_CODE | CreditCardInformation.BillingPhoneNumberEntry.CountryCode_Selected | Country Code | 1 | MyWalletInformation.UseMyWalletFunds_1
-PHONE_HOME_CITY_AND_NUMBER | CreditCardInformation.BillingPhoneNumberEntry.Number | Phone (with area code) |  | MyWalletInformation.UseMyWalletFunds_1
+PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX | CreditCardInformation.BillingPhoneNumberEntry.Number | Phone (with area code) |  | MyWalletInformation.UseMyWalletFunds_1
 UNKNOWN_TYPE | TripInsurance.QuoteID | Yes, add trip protection for a total of $21.00. | 657566350481481886 | MyWalletInformation.UseMyWalletFunds_1
 UNKNOWN_TYPE | TripInsurance.QuoteID | No, I choose not to protect my purchase. | 657566350481481887 | MyWalletInformation.UseMyWalletFunds_1
 CREDIT_CARD_NUMBER | AncillaryCreditCardInformation.BillingCreditCardEntry.CardNumber | Card Number |  | CreditCardInformation.BillingCreditCardEntry.CardNumber_2
@@ -37,4 +37,4 @@
 UNKNOWN_TYPE | AncillaryCreditCardInformation.BillingAddressEntry.OtherStates_Selected | State/Province |  | AncillaryCreditCardInformation.BillingAddressEntry.Countries_Selected_3
 ADDRESS_HOME_ZIP | AncillaryCreditCardInformation.BillingAddressEntry.PostalCode | Zip/Postal Code |  | AncillaryCreditCardInformation.BillingAddressEntry.Countries_Selected_3
 PHONE_HOME_COUNTRY_CODE | AncillaryCreditCardInformation.BillingPhoneNumberEntry.CountryCode_Selected | Country Code | 1 | AncillaryCreditCardInformation.BillingAddressEntry.Countries_Selected_3
-PHONE_HOME_CITY_AND_NUMBER | AncillaryCreditCardInformation.BillingPhoneNumberEntry.Number | Phone (with area code) |  | AncillaryCreditCardInformation.BillingAddressEntry.Countries_Selected_3
+PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX | AncillaryCreditCardInformation.BillingPhoneNumberEntry.Number | Phone (with area code) |  | AncillaryCreditCardInformation.BillingAddressEntry.Countries_Selected_3
diff --git a/components/test/data/autofill/heuristics/output/097_register_alaskaair.com.out b/components/test/data/autofill/heuristics/output/097_register_alaskaair.com.out
index 84036e1..b94f345a 100644
--- a/components/test/data/autofill/heuristics/output/097_register_alaskaair.com.out
+++ b/components/test/data/autofill/heuristics/output/097_register_alaskaair.com.out
@@ -24,7 +24,7 @@
 ADDRESS_HOME_STATE | FormUserControl$_mailingAddress$_stateXX | State/Province Other |  | FormUserControl$_guardianInformation$_lastName$_name_3
 ADDRESS_HOME_ZIP | FormUserControl$_mailingAddress$_zip | Zip/Postal Code* |  | FormUserControl$_guardianInformation$_lastName$_name_3
 PHONE_HOME_COUNTRY_CODE | FormUserControl$_contactInformation$_phoneNumber$_countryCode | Country Code | 1 | FormUserControl$_guardianInformation$_lastName$_name_3
-PHONE_HOME_CITY_AND_NUMBER | FormUserControl$_contactInformation$_phoneNumber$_phoneNumberTextBox | Country Code |  | FormUserControl$_guardianInformation$_lastName$_name_3
+PHONE_HOME_CITY_AND_NUMBER_WITHOUT_TRUNK_PREFIX | FormUserControl$_contactInformation$_phoneNumber$_phoneNumberTextBox | Country Code |  | FormUserControl$_guardianInformation$_lastName$_name_3
 PHONE_HOME_EXTENSION | FormUserControl$_contactInformation$_phoneNumber$_extensionTextBox | Ext. |  | FormUserControl$_guardianInformation$_lastName$_name_3
 EMAIL_ADDRESS | FormUserControl$_contactInformation$_emailAddress$_emailAddressTextBox | Email Address* |  | FormUserControl$_contactInformation$_emailAddress$_emailAddressTextBox_4
 UNKNOWN_TYPE | FormUserControl$_userIdPassword$_userId$_userId | Create a User ID* |  | FormUserControl$_contactInformation$_emailAddress$_emailAddressTextBox_4
diff --git a/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out b/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out
index 100d145..02d9c76c 100644
--- a/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out
+++ b/components/test/data/autofill/heuristics/output/102_checkout_m_macys.com.out
@@ -12,7 +12,7 @@
 ADDRESS_HOME_STATE | creditCard.billingContact.address.state | State: | -1 | creditCard.billingContact.shippingAddressAsBillingAddress_2
 ADDRESS_HOME_ZIP | creditCard.billingContact.address.postalCode | Zip code: |  | creditCard.billingContact.shippingAddressAsBillingAddress_2
 EMAIL_ADDRESS | user.email | email address: |  | creditCard.billingContact.shippingAddressAsBillingAddress_2
-PHONE_HOME_CITY_CODE | user.phone.areaCode | phone: |  | creditCard.billingContact.shippingAddressAsBillingAddress_2
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | user.phone.areaCode | phone: |  | creditCard.billingContact.shippingAddressAsBillingAddress_2
 PHONE_HOME_NUMBER | user.phone.exchangeNumber | phone:Please enter your phone number |  | creditCard.billingContact.shippingAddressAsBillingAddress_2
 PHONE_HOME_WHOLE_NUMBER | user.phone.subscriberNumber | phone:Please enter your phone number |  | creditCard.billingContact.shippingAddressAsBillingAddress_2
 UNKNOWN_TYPE | user.profile.createAccount | Yes! Create an account for me at macys.com | true | creditCard.billingContact.shippingAddressAsBillingAddress_2
diff --git a/components/test/data/autofill/heuristics/output/103_checkout_peapod.com.out b/components/test/data/autofill/heuristics/output/103_checkout_peapod.com.out
index 5d3ad78..56f0527 100644
--- a/components/test/data/autofill/heuristics/output/103_checkout_peapod.com.out
+++ b/components/test/data/autofill/heuristics/output/103_checkout_peapod.com.out
@@ -7,7 +7,7 @@
 ADDRESS_HOME_CITY | billCity | City: | Agawam | _1
 ADDRESS_HOME_STATE | billState | MA | MA | _1
 ADDRESS_HOME_ZIP | billZip | Zip Code: | 01001 | _1
-PHONE_HOME_CITY_CODE | HomeArea | Contact Phone: | 310 | _1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | HomeArea | Contact Phone: | 310 | _1
 PHONE_HOME_NUMBER_PREFIX | HomePrefix | Contact Phone: | 555 | _1
 PHONE_HOME_NUMBER_SUFFIX | HomeSuffix | Contact Phone: | 1212 | _1
 CREDIT_CARD_TYPE | /peapod/handler/iditarod/CheckoutRegistrationHandler.creditCardType | Card Type: |  | /peapod/handler/iditarod/CheckoutRegistrationHandler.creditCardType_2
diff --git a/components/test/data/autofill/heuristics/output/107_checkout_m_apple.com.out b/components/test/data/autofill/heuristics/output/107_checkout_m_apple.com.out
index 73eb27b..57dd302 100644
--- a/components/test/data/autofill/heuristics/output/107_checkout_m_apple.com.out
+++ b/components/test/data/autofill/heuristics/output/107_checkout_m_apple.com.out
@@ -1,8 +1,8 @@
 NAME_FIRST | payment-credit-user-address-firstName | First Name |  | payment-credit-user-address-firstName_1
 NAME_LAST | payment-credit-user-address-lastName | Last Name |  | payment-credit-user-address-firstName_1
-PHONE_HOME_CITY_CODE | payment-credit-user-address-daytimePhoneAreaCode | Area Code |  | payment-credit-user-address-firstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | payment-credit-user-address-daytimePhoneAreaCode | Area Code |  | payment-credit-user-address-firstName_1
 PHONE_HOME_NUMBER | payment-credit-user-address-daytimePhone | Primary Phone |  | payment-credit-user-address-firstName_1
-PHONE_HOME_CITY_CODE | payment-credit-user-address-eveningPhoneAreaCode | Area Code |  | payment-credit-user-address-firstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | payment-credit-user-address-eveningPhoneAreaCode | Area Code |  | payment-credit-user-address-firstName_1
 PHONE_HOME_NUMBER | payment-credit-user-address-eveningPhone | Alternate Phone (optional) |  | payment-credit-user-address-firstName_1
 EMAIL_ADDRESS | payment-credit-user-address-emailAddress | Email Address |  | payment-credit-user-address-firstName_1
 COMPANY_NAME | payment-credit-user-address-companyName | Company Name (optional) |  | payment-credit-user-address-firstName_1
diff --git a/components/test/data/autofill/heuristics/output/113_guest_checkout_peapod.com.out b/components/test/data/autofill/heuristics/output/113_guest_checkout_peapod.com.out
index 76b1e30..ad03631 100644
--- a/components/test/data/autofill/heuristics/output/113_guest_checkout_peapod.com.out
+++ b/components/test/data/autofill/heuristics/output/113_guest_checkout_peapod.com.out
@@ -7,10 +7,10 @@
 ADDRESS_HOME_CITY | delivCity | City: | New York | delivTitle_1
 ADDRESS_HOME_STATE | delivState | NY | NY | delivTitle_1
 ADDRESS_HOME_ZIP | delivZipCode | Zip Code: | 10011 | delivTitle_1
-PHONE_HOME_CITY_CODE | HomeArea |  |  | delivTitle_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | HomeArea |  |  | delivTitle_1
 PHONE_HOME_NUMBER_PREFIX | HomePrefix |  |  | delivTitle_1
 PHONE_HOME_NUMBER_SUFFIX | HomeSuffix |  |  | delivTitle_1
-PHONE_HOME_CITY_CODE | WorkArea |  |  | delivTitle_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | WorkArea |  |  | delivTitle_1
 PHONE_HOME_NUMBER_PREFIX | WorkPrefix |  |  | delivTitle_1
 PHONE_HOME_NUMBER_SUFFIX | WorkSuffix |  |  | delivTitle_1
 PHONE_HOME_EXTENSION | delivWorkPhoneExt | Ext: |  | delivTitle_1
diff --git a/components/test/data/autofill/heuristics/output/146_checkout_store.scholastic.com.out b/components/test/data/autofill/heuristics/output/146_checkout_store.scholastic.com.out
index 3797bba..3a35ad9 100644
--- a/components/test/data/autofill/heuristics/output/146_checkout_store.scholastic.com.out
+++ b/components/test/data/autofill/heuristics/output/146_checkout_store.scholastic.com.out
@@ -5,7 +5,7 @@
 ADDRESS_HOME_CITY | city | *City |  | firstName_1
 ADDRESS_HOME_STATE | state | *State |  | firstName_1
 ADDRESS_HOME_ZIP | zipcode | *Zip Code |  | firstName_1
-PHONE_HOME_CITY_CODE | phoneAreaCode | *Phone |  | firstName_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | phoneAreaCode | *Phone |  | firstName_1
 PHONE_HOME_NUMBER | phoneExchange | *Phone |  | firstName_1
 PHONE_HOME_WHOLE_NUMBER | phoneNumber | *Phone |  | firstName_1
 UNKNOWN_TYPE | label | *Address Label |  | firstName_1
diff --git a/components/test/data/autofill/heuristics/output/149_checkout_qvc.com_non_hidden.out b/components/test/data/autofill/heuristics/output/149_checkout_qvc.com_non_hidden.out
index fd4b384..95d0363 100644
--- a/components/test/data/autofill/heuristics/output/149_checkout_qvc.com_non_hidden.out
+++ b/components/test/data/autofill/heuristics/output/149_checkout_qvc.com_non_hidden.out
@@ -11,10 +11,10 @@
 ADDRESS_HOME_STATE | BilltoState | State/Province: | AL | EmailAddress_1
 ADDRESS_HOME_ZIP | BilltoZipCode | * ZIP/Postal Code: |  | EmailAddress_1
 ADDRESS_HOME_COUNTRY | BilltoCountry | * Country: | US | EmailAddress_1
-PHONE_HOME_CITY_CODE | BilltoHpArea | * Home Phone: |  | EmailAddress_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BilltoHpArea | * Home Phone: |  | EmailAddress_1
 PHONE_HOME_NUMBER | BilltoHpExchange | * Home Phone: |  | EmailAddress_1
 PHONE_HOME_EXTENSION | BilltoHpExt | * Home Phone: |  | EmailAddress_1
-PHONE_HOME_CITY_CODE | BilltoWpArea | Work Phone: |  | EmailAddress_1
+PHONE_HOME_CITY_CODE_WITH_TRUNK_PREFIX | BilltoWpArea | Work Phone: |  | EmailAddress_1
 PHONE_HOME_NUMBER | BilltoWpExchange | Work Phone: |  | EmailAddress_1
 PHONE_HOME_EXTENSION | BilltoWpExt | Work Phone: |  | EmailAddress_1
 UNKNOWN_TYPE | SameAsBilltoCheckbox | Same as Bill-To: | 1 | EmailAddress_1
diff --git a/components/update_client/utils.cc b/components/update_client/utils.cc
index 8fba68a..b28f257 100644
--- a/components/update_client/utils.cc
+++ b/components/update_client/utils.cc
@@ -95,11 +95,9 @@
 
 bool IsValidBrand(const std::string& brand) {
   const size_t kMaxBrandSize = 4;
-  if (!brand.empty() && brand.size() != kMaxBrandSize)
-    return false;
-
-  return base::ranges::find_if_not(brand, &base::IsAsciiAlpha<char>) ==
-         brand.end();
+  return brand.empty() ||
+         (brand.size() == kMaxBrandSize &&
+          base::ranges::all_of(brand, &base::IsAsciiAlpha<char>));
 }
 
 // Helper function.
@@ -110,10 +108,10 @@
                                    size_t min_length,
                                    size_t max_length) {
   return part.size() >= min_length && part.size() <= max_length &&
-         base::ranges::find_if_not(part, [&special_chars](char ch) {
+         base::ranges::all_of(part, [&special_chars](char ch) {
            return base::IsAsciiAlpha(ch) || base::IsAsciiDigit(ch) ||
                   base::Contains(special_chars, ch);
-         }) == part.end();
+         });
 }
 
 // Returns true if the |name| parameter matches ^[-_a-zA-Z0-9]{1,256}$ .
diff --git a/components/url_matcher/url_matcher_factory.cc b/components/url_matcher/url_matcher_factory.cc
index 513ef4c7..6452b27d 100644
--- a/components/url_matcher/url_matcher_factory.cc
+++ b/components/url_matcher/url_matcher_factory.cc
@@ -177,7 +177,7 @@
 
 // Returns true if some alphabetic characters in this string are upper case.
 bool ContainsUpperCase(const std::string& str) {
-  return base::ranges::find_if(str, ::isupper) != str.end();
+  return base::ranges::any_of(str, ::isupper);
 }
 
 }  // namespace
diff --git a/components/variations/active_field_trials.cc b/components/variations/active_field_trials.cc
index 22a55d8..f4c612b9e 100644
--- a/components/variations/active_field_trials.cc
+++ b/components/variations/active_field_trials.cc
@@ -87,11 +87,10 @@
   variations::GetSyntheticTrialGroupIdsAsString(&synthetic_trials);
   std::string trial_hash =
       base::StringPrintf("%x", variations::HashName(trial_name));
-  return base::ranges::find_if(
-             synthetic_trials, [trial_hash](const auto& trial) {
-               return base::StartsWith(trial, trial_hash,
-                                       base::CompareCase::SENSITIVE);
-             }) != synthetic_trials.end();
+  return base::ranges::any_of(synthetic_trials, [trial_hash](
+                                                    const auto& trial) {
+    return base::StartsWith(trial, trial_hash, base::CompareCase::SENSITIVE);
+  });
 }
 
 bool IsInSyntheticTrialGroup(const std::string& trial_name,
diff --git a/components/variations/study_filtering.cc b/components/variations/study_filtering.cc
index 81e1887f..2260c48 100644
--- a/components/variations/study_filtering.cc
+++ b/components/variations/study_filtering.cc
@@ -28,9 +28,9 @@
 template <typename Collection>
 bool ContainsStringIgnoreCaseASCII(const Collection& collection,
                                    const std::string& value) {
-  return base::ranges::find_if(collection, [&value](const std::string& s) {
-           return base::EqualsCaseInsensitiveASCII(s, value);
-         }) != std::end(collection);
+  return base::ranges::any_of(collection, [&value](const std::string& s) {
+    return base::EqualsCaseInsensitiveASCII(s, value);
+  });
 }
 
 }  // namespace
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index db7ee6e..cf3c69b 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -178,9 +178,12 @@
       "Conversions.ImpressionsDeletedInDataClearOperation", count);
 }
 
-void RecordReportsDeleted(int count) {
-  UMA_HISTOGRAM_COUNTS_1000("Conversions.ReportsDeletedInDataClearOperation",
-                            count);
+void RecordReportsDeleted(int event_count, int aggregatable_count) {
+  UMA_HISTOGRAM_COUNTS_1000(
+      "Conversions.ReportsDeletedInDataClearOperation.Event", event_count);
+  UMA_HISTOGRAM_COUNTS_1000(
+      "Conversions.ReportsDeletedInDataClearOperation.Aggregatable",
+      aggregatable_count);
 }
 
 int64_t SerializeUint64(uint64_t data) {
@@ -1617,7 +1620,7 @@
   // opaque/untrustworthy origins.
 
   std::vector<StoredSource::Id> source_ids_to_delete;
-  int num_reports_deleted = 0;
+  int num_event_reports_deleted = 0;
   while (statement.Step()) {
     if (filter.is_null() ||
         filter.Run(
@@ -1633,7 +1636,7 @@
           return;
         }
 
-        ++num_reports_deleted;
+        ++num_event_reports_deleted;
       }
     }
   }
@@ -1650,10 +1653,14 @@
   if (!transaction.Begin())
     return;
 
-  if (!ClearAggregatableAttributionsForOriginsInRange(
-          delete_begin, delete_end, filter, source_ids_to_delete)) {
+  int aggregatable_maybe_deleted =
+      ClearAggregatableAttributionsForOriginsInRange(
+          delete_begin, delete_end, filter, source_ids_to_delete);
+
+  if (aggregatable_maybe_deleted < 0) {
     return;
   }
+  int num_aggregatable_reports_deleted = aggregatable_maybe_deleted;
 
   // Since multiple reports can be associated with a single source,
   // deduplicate source IDs using a set to avoid redundant DB operations
@@ -1681,13 +1688,17 @@
     if (!delete_vestigial_statement.Run())
       return;
 
-    num_reports_deleted += db_->GetLastChangeCount();
+    num_event_reports_deleted += db_->GetLastChangeCount();
   }
 
   // Careful! At this point we can still have some vestigial entries in the DB.
   // See comments above for event-level reports.
-  if (!ClearAggregatableAttributionsForSourceIds(source_ids_to_delete))
+  aggregatable_maybe_deleted =
+      ClearAggregatableAttributionsForSourceIds(source_ids_to_delete);
+
+  if (aggregatable_maybe_deleted < 0)
     return;
+  num_aggregatable_reports_deleted += aggregatable_maybe_deleted;
 
   if (delete_rate_limit_data && !rate_limit_table_.ClearDataForSourceIds(
                                     db_.get(), source_ids_to_delete)) {
@@ -1704,7 +1715,8 @@
     return;
 
   RecordSourcesDeleted(static_cast<int>(source_ids_to_delete.size()));
-  RecordReportsDeleted(num_reports_deleted);
+  RecordReportsDeleted(num_event_reports_deleted,
+                       num_aggregatable_reports_deleted);
 }
 
 void AttributionStorageSql::ClearAllDataAllTime(bool delete_rate_limit_data) {
@@ -1718,7 +1730,7 @@
       db_->GetCachedStatement(SQL_FROM_HERE, kDeleteAllReportsSql));
   if (!delete_all_reports_statement.Run())
     return;
-  int num_reports_deleted = db_->GetLastChangeCount();
+  int num_event_reports_deleted = db_->GetLastChangeCount();
 
   static constexpr char kDeleteAllSourcesSql[] = "DELETE FROM sources";
   sql::Statement delete_all_sources_statement(
@@ -1746,6 +1758,7 @@
       db_->GetCachedStatement(SQL_FROM_HERE, kDeleteAllContributionsSql));
   if (!delete_all_contributions_statement.Run())
     return;
+  int num_aggregatable_reports_deleted = db_->GetLastChangeCount();
 
   if (delete_rate_limit_data &&
       !rate_limit_table_.ClearAllDataAllTime(db_.get()))
@@ -1755,7 +1768,8 @@
     return;
 
   RecordSourcesDeleted(num_sources_deleted);
-  RecordReportsDeleted(num_reports_deleted);
+  RecordReportsDeleted(num_event_reports_deleted,
+                       num_aggregatable_reports_deleted);
 }
 
 bool AttributionStorageSql::HasCapacityForStoringSource(
@@ -2358,7 +2372,7 @@
   return transaction.Commit();
 }
 
-bool AttributionStorageSql::ClearAggregatableAttributionsForOriginsInRange(
+int AttributionStorageSql::ClearAggregatableAttributionsForOriginsInRange(
     base::Time delete_begin,
     base::Time delete_end,
     StoragePartition::StorageKeyMatcherFunction filter,
@@ -2367,7 +2381,7 @@
 
   sql::Transaction transaction(db_.get());
   if (!transaction.Begin())
-    return false;
+    return -1;
 
   // TODO(linnan): Considering optimizing SQL query by moving some logic to C++.
   // See the comment in crrev.com/c/3379484 for more information.
@@ -2384,6 +2398,7 @@
   statement.BindTime(0, delete_begin);
   statement.BindTime(1, delete_end);
 
+  int num_aggregate_reports_deleted = 0;
   while (statement.Step()) {
     if (filter.is_null() ||
         filter.Run(
@@ -2393,19 +2408,21 @@
         filter.Run(
             blink::StorageKey(DeserializeOrigin(statement.ColumnString(2))))) {
       source_ids_to_delete.emplace_back(statement.ColumnInt64(3));
-      if (statement.GetColumnType(4) != sql::ColumnType::kNull &&
-          !DeleteReportInternal(
-              AttributionReport::AggregatableAttributionData::Id(
-                  statement.ColumnInt64(4)))) {
-        return false;
+      if (statement.GetColumnType(4) != sql::ColumnType::kNull) {
+        if (!DeleteReportInternal(
+                AttributionReport::AggregatableAttributionData::Id(
+                    statement.ColumnInt64(4)))) {
+          return -1;
+        }
+        ++num_aggregate_reports_deleted;
       }
     }
   }
 
-  if (!statement.Succeeded())
-    return false;
+  if (!statement.Succeeded() || !transaction.Commit())
+    return -1;
 
-  return transaction.Commit();
+  return num_aggregate_reports_deleted;
 }
 
 bool AttributionStorageSql::DeleteReportInternal(
@@ -2441,7 +2458,7 @@
   return statement.Run();
 }
 
-bool AttributionStorageSql::ClearAggregatableAttributionsForSourceIds(
+int AttributionStorageSql::ClearAggregatableAttributionsForSourceIds(
     const std::vector<StoredSource::Id>& source_ids) {
   sql::Transaction transaction(db_.get());
   if (!transaction.Begin())
@@ -2455,6 +2472,8 @@
   sql::Statement statement(
       db_->GetCachedStatement(SQL_FROM_HERE, kDeleteAggregationsSql));
 
+  int num_aggregatable_reports_deleted = 0;
+
   for (StoredSource::Id id : source_ids) {
     statement.Reset(/*clear_bound_vars=*/true);
     statement.BindInt64(0, *id);
@@ -2463,15 +2482,20 @@
       if (!DeleteAggregatableContributions(
               AttributionReport::AggregatableAttributionData::Id(
                   statement.ColumnInt64(0)))) {
-        return false;
+        return -1;
       }
     }
 
     if (!statement.Succeeded())
-      return false;
+      return -1;
+
+    num_aggregatable_reports_deleted += db_->GetLastChangeCount();
   }
 
-  return transaction.Commit();
+  if (!transaction.Commit())
+    return -1;
+
+  return num_aggregatable_reports_deleted;
 }
 
 std::vector<AttributionReport>
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h
index a4820508..e97fd601 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.h
+++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -285,15 +285,15 @@
   //    attributed to the aggregatable attribution are also deleted.
   //
   // All sources to be deleted are updated in `source_ids_to_delete`.
-  // Returns false on failure.
-  [[nodiscard]] bool ClearAggregatableAttributionsForOriginsInRange(
+  // Returns number of aggregatable attributions deleted, or -1 for failure.
+  [[nodiscard]] int ClearAggregatableAttributionsForOriginsInRange(
       base::Time delete_begin,
       base::Time delete_end,
       StoragePartition::StorageKeyMatcherFunction filter,
       std::vector<StoredSource::Id>& source_ids_to_delete)
       VALID_CONTEXT_REQUIRED(sequence_checker_);
 
-  [[nodiscard]] bool ClearAggregatableAttributionsForSourceIds(
+  [[nodiscard]] int ClearAggregatableAttributionsForSourceIds(
       const std::vector<StoredSource::Id>& source_ids)
       VALID_CONTEXT_REQUIRED(sequence_checker_);
 
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc
index ba947b3..2e1da18f 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc
@@ -342,7 +342,9 @@
   histograms.ExpectUniqueSample(
       "Conversions.ImpressionsDeletedInDataClearOperation", 1, 1);
   histograms.ExpectUniqueSample(
-      "Conversions.ReportsDeletedInDataClearOperation", 3, 1);
+      "Conversions.ReportsDeletedInDataClearOperation.Event", 3, 1);
+  histograms.ExpectUniqueSample(
+      "Conversions.ReportsDeletedInDataClearOperation.Aggregatable", 3, 1);
 }
 
 //  Create a source with two triggers resulting in two event-level reports (C1
@@ -394,7 +396,9 @@
   histograms.ExpectUniqueSample(
       "Conversions.ImpressionsDeletedInDataClearOperation", 1, 1);
   histograms.ExpectUniqueSample(
-      "Conversions.ReportsDeletedInDataClearOperation", 2, 1);
+      "Conversions.ReportsDeletedInDataClearOperation.Event", 2, 1);
+  histograms.ExpectUniqueSample(
+      "Conversions.ReportsDeletedInDataClearOperation.Aggregatable", 2, 1);
 }
 
 // Same as the above test, but with a null filter.
@@ -439,7 +443,9 @@
   histograms.ExpectUniqueSample(
       "Conversions.ImpressionsDeletedInDataClearOperation", 1, 1);
   histograms.ExpectUniqueSample(
-      "Conversions.ReportsDeletedInDataClearOperation", 2, 1);
+      "Conversions.ReportsDeletedInDataClearOperation.Event", 2, 1);
+  histograms.ExpectUniqueSample(
+      "Conversions.ReportsDeletedInDataClearOperation.Aggregatable", 2, 1);
 }
 
 // The max time range with a null filter should delete everything.
@@ -485,7 +491,9 @@
   histograms.ExpectUniqueSample(
       "Conversions.ImpressionsDeletedInDataClearOperation", 1, 1);
   histograms.ExpectUniqueSample(
-      "Conversions.ReportsDeletedInDataClearOperation", 2, 1);
+      "Conversions.ReportsDeletedInDataClearOperation.Event", 2, 1);
+  histograms.ExpectUniqueSample(
+      "Conversions.ReportsDeletedInDataClearOperation.Aggregatable", 2, 1);
 }
 
 TEST_F(AttributionStorageSqlTest, ClearData_KeepRateLimitData) {
diff --git a/content/browser/background_fetch/background_fetch_service_unittest.cc b/content/browser/background_fetch/background_fetch_service_unittest.cc
index aa8ba61..7dd162e 100644
--- a/content/browser/background_fetch/background_fetch_service_unittest.cc
+++ b/content/browser/background_fetch/background_fetch_service_unittest.cc
@@ -66,10 +66,9 @@
 
 bool ContainsHeader(const base::flat_map<std::string, std::string>& headers,
                     const std::string& target) {
-  return headers.cend() !=
-         base::ranges::find_if(headers, [target](const auto& pair) {
-           return base::EqualsCaseInsensitiveASCII(pair.first, target);
-         });
+  return base::ranges::any_of(headers, [target](const auto& pair) {
+    return base::EqualsCaseInsensitiveASCII(pair.first, target);
+  });
 }
 
 std::vector<blink::mojom::FetchAPIRequestPtr> CloneRequestVector(
diff --git a/content/browser/bluetooth/web_bluetooth_service_impl.cc b/content/browser/bluetooth/web_bluetooth_service_impl.cc
index 0f76e98..4b470df 100644
--- a/content/browser/bluetooth/web_bluetooth_service_impl.cc
+++ b/content/browser/bluetooth/web_bluetooth_service_impl.cc
@@ -395,12 +395,11 @@
 
       // Check to see if there is a service uuid match
       if (filter->services.has_value()) {
-        auto it = base::ranges::find_if(
-            filter->services.value(),
-            [&filtered_event](const BluetoothUUID& filter_uuid) {
-              return base::Contains(filtered_event->uuids, filter_uuid);
-            });
-        if (it == filter->services.value().end())
+        if (base::ranges::none_of(
+                filter->services.value(),
+                [&filtered_event](const BluetoothUUID& filter_uuid) {
+                  return base::Contains(filtered_event->uuids, filter_uuid);
+                }))
           continue;
       }
 
diff --git a/content/browser/file_system_access/file_system_access_manager_impl.cc b/content/browser/file_system_access/file_system_access_manager_impl.cc
index fe12364c..d63a7c9c6 100644
--- a/content/browser/file_system_access/file_system_access_manager_impl.cc
+++ b/content/browser/file_system_access/file_system_access_manager_impl.cc
@@ -233,8 +233,7 @@
 }
 
 bool IsValidId(const std::string& id) {
-  return id.size() <= 32 &&
-         base::ranges::find_if_not(id, &IsValidIdChar) == id.end();
+  return id.size() <= 32 && base::ranges::all_of(id, &IsValidIdChar);
 }
 
 ui::SelectFileDialog::Type GetSelectFileDialogType(
diff --git a/content/browser/first_party_sets/database/first_party_sets_database.cc b/content/browser/first_party_sets/database/first_party_sets_database.cc
index 773e1dc..cdb54eca 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database.cc
+++ b/content/browser/first_party_sets/database/first_party_sets_database.cc
@@ -36,14 +36,23 @@
 [[nodiscard]] bool InitSchema(sql::Database& db) {
   static constexpr char kPublicSetsSql[] =
       "CREATE TABLE IF NOT EXISTS public_sets("
+      "version TEXT NOT NULL,"
       "site TEXT NOT NULL,"
       "primary_site TEXT NOT NULL,"
       "site_type INTEGER NOT NULL,"
-      "PRIMARY KEY(site)"
+      "PRIMARY KEY(version,site)"
       ")WITHOUT ROWID";
   if (!db.Execute(kPublicSetsSql))
     return false;
 
+  static constexpr char kBrowserContextSetsVersionSql[] =
+      "CREATE TABLE IF NOT EXISTS browser_context_sets_version("
+      "browser_context_id TEXT PRIMARY KEY NOT NULL,"
+      "public_sets_version TEXT NOT NULL"
+      ")WITHOUT ROWID";
+  if (!db.Execute(kBrowserContextSetsVersionSql))
+    return false;
+
   static constexpr char kBrowserContextSitesToClearSql[] =
       "CREATE TABLE IF NOT EXISTS browser_context_sites_to_clear("
       "browser_context_id TEXT NOT NULL,"
@@ -113,6 +122,8 @@
 }
 
 bool FirstPartySetsDatabase::SetPublicSets(
+    const std::string& browser_context_id,
+    const std::string& version,
     const FirstPartySetsDatabase::FlattenedSets& sets) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -123,27 +134,38 @@
   if (!transaction.Begin())
     return false;
 
-  static constexpr char kDeleteSql[] = "DELETE FROM public_sets";
-  sql::Statement delete_statement(
-      db_->GetCachedStatement(SQL_FROM_HERE, kDeleteSql));
-  if (!delete_statement.Run())
-    return false;
-
   for (const auto& [site, entry] : sets) {
     DCHECK(!site.opaque());
     DCHECK(!entry.primary().opaque());
     static constexpr char kInsertSql[] =
-        "INSERT INTO public_sets(site,primary_site,site_type)"
-        "VALUES(?,?,?)";
+        "INSERT INTO public_sets(version,site,primary_site,site_type)"
+        "VALUES(?,?,?,?)";
     sql::Statement insert_statement(
         db_->GetCachedStatement(SQL_FROM_HERE, kInsertSql));
-    insert_statement.BindString(0, site.Serialize());
-    insert_statement.BindString(1, entry.primary().Serialize());
-    insert_statement.BindInt(2, static_cast<int>(entry.site_type()));
+    insert_statement.BindString(0, version);
+    insert_statement.BindString(1, site.Serialize());
+    insert_statement.BindString(2, entry.primary().Serialize());
+    insert_statement.BindInt(3, static_cast<int>(entry.site_type()));
 
     if (!insert_statement.Run())
       return false;
   }
+
+  // Keeps track of the version used by the given `browser_context_id`.
+  static constexpr char kInsertSql[] =
+      "INSERT OR REPLACE INTO browser_context_sets_version"
+      "(browser_context_id,public_sets_version)VALUES(?,?)";
+  sql::Statement insert_statement(
+      db_->GetCachedStatement(SQL_FROM_HERE, kInsertSql));
+  insert_statement.BindString(0, browser_context_id);
+  insert_statement.BindString(1, version);
+
+  if (!insert_statement.Run())
+    return false;
+
+  // TODO(shuuran): Garbage collect the public sets no longer used by any
+  // browser_context_id.
+
   return transaction.Commit();
 }
 
@@ -243,16 +265,30 @@
   return transaction.Commit();
 }
 
-FirstPartySetsDatabase::FlattenedSets FirstPartySetsDatabase::GetPublicSets() {
+FirstPartySetsDatabase::FlattenedSets FirstPartySetsDatabase::GetPublicSets(
+    const std::string& browser_context_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!LazyInit())
     return {};
 
+  static constexpr char kVersionSql[] =
+      "SELECT public_sets_version FROM browser_context_sets_version "
+      "WHERE browser_context_id=?";
+  sql::Statement version_statement(
+      db_->GetCachedStatement(SQL_FROM_HERE, kVersionSql));
+  version_statement.BindString(0, browser_context_id);
+
+  if (!version_statement.Step())
+    return {};
+
+  const std::string version = version_statement.ColumnString(0);
+
   std::vector<std::pair<net::SchemefulSite, net::FirstPartySetEntry>> results;
   static constexpr char kSelectSql[] =
-      "SELECT site,primary_site,site_type FROM public_sets";
+      "SELECT site,primary_site,site_type FROM public_sets WHERE version=?";
   sql::Statement statement(db_->GetCachedStatement(SQL_FROM_HERE, kSelectSql));
+  statement.BindString(0, version);
 
   while (statement.Step()) {
     absl::optional<net::SchemefulSite> site =
diff --git a/content/browser/first_party_sets/database/first_party_sets_database.h b/content/browser/first_party_sets/database/first_party_sets_database.h
index f568985d..62c27e49 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database.h
+++ b/content/browser/first_party_sets/database/first_party_sets_database.h
@@ -67,10 +67,11 @@
   FirstPartySetsDatabase& operator=(const FirstPartySetsDatabase&&) = delete;
   ~FirstPartySetsDatabase();
 
-  // Stores the public First-Party Sets into database, and returns true on
-  // success.  Note that calling this method will wipe out the pre-existing
-  // data in the table.
-  [[nodiscard]] bool SetPublicSets(const FlattenedSets& sets);
+  // Stores the public First-Party Sets into database, and updates the sets
+  // version used by `browser_context_id`. Returns true on success.
+  [[nodiscard]] bool SetPublicSets(const std::string& browser_context_id,
+                                   const std::string& version,
+                                   const FlattenedSets& sets);
 
   // Stores the `sites` to be cleared for the `browser_context_id` into
   // database, and returns true on success.
@@ -95,7 +96,9 @@
   // TODO(crbug.com/1219656): Consider returning absl::nullopt for all the
   // fetching methods when having query errors
 
-  [[nodiscard]] FlattenedSets GetPublicSets();
+  // Gets the public First-Party Sets used by `browser_context_id`.
+  [[nodiscard]] FlattenedSets GetPublicSets(
+      const std::string& browser_context_id);
 
   // Gets the list of sites to clear for the `browser_context_id`.
   [[nodiscard]] std::vector<net::SchemefulSite> FetchSitesToClear(
diff --git a/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc b/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc
index a7c8dba..06dc765 100644
--- a/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc
+++ b/content/browser/first_party_sets/database/first_party_sets_database_unittest.cc
@@ -25,7 +25,7 @@
 
 namespace {
 
-static const size_t kTableCount = 5u;
+static const size_t kTableCount = 6u;
 
 int VersionFromMetaTable(sql::Database& db) {
   // Get version.
@@ -71,6 +71,13 @@
     return size;
   }
 
+  size_t CountBrowserContextSetsVersionEntries(sql::Database* db) {
+    size_t size = 0;
+    EXPECT_TRUE(
+        sql::test::CountTableRows(db, "browser_context_sets_version", &size));
+    return size;
+  }
+
   size_t CountBrowserContextSitesToClearEntries(sql::Database* db) {
     size_t size = 0;
     EXPECT_TRUE(
@@ -124,15 +131,18 @@
   // Create a db handle to the existing db file to verify schemas.
   sql::Database db;
   EXPECT_TRUE(db.Open(db_path()));
-  // [public_sets], [policy_modifications], [browser_context_sites_to_clear],
-  // [browser_contexts_cleared], and [meta].
+  // [public_sets], [browser_context_sets_version], [policy_modifications],
+  // [browser_context_sites_to_clear], [browser_contexts_cleared], and [meta].
   EXPECT_EQ(kTableCount, sql::test::CountSQLTables(&db));
   EXPECT_EQ(1, VersionFromMetaTable(db));
   // [idx_marked_at_run_sites], [idx_cleared_at_run_browser_contexts], and
   // [sqlite_autoindex_meta_1].
   EXPECT_EQ(3u, sql::test::CountSQLIndices(&db));
-  // `site`, `primary`, `site_type`.
-  EXPECT_EQ(3u, sql::test::CountTableColumns(&db, "public_sets"));
+  // `version`, `site`, `primary`, `site_type`.
+  EXPECT_EQ(4u, sql::test::CountTableColumns(&db, "public_sets"));
+  // `browser_context_id`, `public_sets_version`.
+  EXPECT_EQ(2u,
+            sql::test::CountTableColumns(&db, "browser_context_sets_version"));
   // `browser_context_id`, `site`, `marked_at_run`.
   EXPECT_EQ(
       3u, sql::test::CountTableColumns(&db, "browser_context_sites_to_clear"));
@@ -141,6 +151,7 @@
   // `browser_context_id`, `site`, `site_owner`.
   EXPECT_EQ(3u, sql::test::CountTableColumns(&db, "policy_modifications"));
   EXPECT_EQ(0u, CountPublicSetsEntries(&db));
+  EXPECT_EQ(0u, CountBrowserContextSetsVersionEntries(&db));
   EXPECT_EQ(0u, CountBrowserContextSitesToClearEntries(&db));
   EXPECT_EQ(0u, CountBrowserContextsClearedEntries(&db));
   EXPECT_EQ(0u, CountPolicyModificationsEntries(&db));
@@ -160,6 +171,7 @@
   EXPECT_TRUE(db.Open(db_path()));
   EXPECT_EQ(kTableCount, sql::test::CountSQLTables(&db));
   EXPECT_EQ(2u, CountPublicSetsEntries(&db));
+  EXPECT_EQ(1u, CountBrowserContextSetsVersionEntries(&db));
   EXPECT_EQ(1, VersionFromMetaTable(db));
   EXPECT_EQ(2u, CountBrowserContextSitesToClearEntries(&db));
   EXPECT_EQ(1u, CountBrowserContextsClearedEntries(&db));
@@ -241,6 +253,8 @@
 }
 
 TEST_F(FirstPartySetsDatabaseTest, SetPublicSets_NoPreExistingDB) {
+  const std::string version = "0.0.1";
+  const std::string browser_context_id = "b";
   const std::string site = "https://aaa.test";
   const std::string primary = "https://bbb.test";
 
@@ -254,7 +268,7 @@
 
   OpenDatabase();
   // Trigger the lazy-initialization.
-  EXPECT_TRUE(db()->SetPublicSets(input));
+  EXPECT_TRUE(db()->SetPublicSets(browser_context_id, version, input));
   CloseDatabase();
 
   sql::Database db;
@@ -262,19 +276,31 @@
   EXPECT_EQ(2u, CountPublicSetsEntries(&db));
 
   static constexpr char kSelectSql[] =
-      "SELECT site,primary_site,site_type FROM public_sets";
+      "SELECT version,site,primary_site,site_type FROM public_sets";
   sql::Statement s(db.GetUniqueStatement(kSelectSql));
   EXPECT_TRUE(s.Step());
-  EXPECT_EQ(site, s.ColumnString(0));
-  EXPECT_EQ(primary, s.ColumnString(1));
-  EXPECT_EQ(1, s.ColumnInt(2));
+  EXPECT_EQ(version, s.ColumnString(0));
+  EXPECT_EQ(site, s.ColumnString(1));
+  EXPECT_EQ(primary, s.ColumnString(2));
+  EXPECT_EQ(1, s.ColumnInt(3));
 
   EXPECT_TRUE(s.Step());
-  EXPECT_EQ(primary, s.ColumnString(0));
+  EXPECT_EQ(version, s.ColumnString(0));
   EXPECT_EQ(primary, s.ColumnString(1));
-  EXPECT_EQ(0, s.ColumnInt(2));
+  EXPECT_EQ(primary, s.ColumnString(2));
+  EXPECT_EQ(0, s.ColumnInt(3));
 
   EXPECT_FALSE(s.Step());
+
+  static constexpr char kVersionSql[] =
+      "SELECT browser_context_id,public_sets_version "
+      "FROM browser_context_sets_version";
+  sql::Statement s_version(db.GetUniqueStatement(kVersionSql));
+  EXPECT_TRUE(s_version.Step());
+  EXPECT_EQ(browser_context_id, s_version.ColumnString(0));
+  EXPECT_EQ(version, s_version.ColumnString(1));
+
+  EXPECT_FALSE(s_version.Step());
 }
 
 TEST_F(FirstPartySetsDatabaseTest, SetPublicSets_PreExistingDB) {
@@ -289,19 +315,22 @@
     ASSERT_EQ(2u, CountPublicSetsEntries(&db));
 
     static constexpr char kSelectSql[] =
-        "SELECT site,primary_site,site_type FROM public_sets";
+        "SELECT version,site,primary_site,site_type FROM public_sets";
     sql::Statement s(db.GetUniqueStatement(kSelectSql));
     ASSERT_TRUE(s.Step());
-    ASSERT_EQ("https://aaa.test", s.ColumnString(0));
-    ASSERT_EQ("https://bbb.test", s.ColumnString(1));
-    ASSERT_EQ(1, s.ColumnInt(2));
+    ASSERT_EQ("0.0.1", s.ColumnString(0));
+    ASSERT_EQ("https://aaa.test", s.ColumnString(1));
+    ASSERT_EQ("https://bbb.test", s.ColumnString(2));
+    ASSERT_EQ(1, s.ColumnInt(3));
 
     ASSERT_TRUE(s.Step());
-    ASSERT_EQ("https://bbb.test", s.ColumnString(0));
+    ASSERT_EQ("0.0.1", s.ColumnString(0));
     ASSERT_EQ("https://bbb.test", s.ColumnString(1));
-    ASSERT_EQ(0, s.ColumnInt(2));
+    ASSERT_EQ("https://bbb.test", s.ColumnString(2));
+    ASSERT_EQ(0, s.ColumnInt(3));
   }
-
+  const std::string version = "0.0.2";
+  const std::string browser_context_id = "b";
   const std::string site = "https://site1.test";
   const std::string primary = "https://site2.test";
 
@@ -315,17 +344,19 @@
 
   OpenDatabase();
   // Trigger the lazy-initialization.
-  EXPECT_TRUE(db()->SetPublicSets(input));
+  EXPECT_TRUE(db()->SetPublicSets(browser_context_id, version, input));
   CloseDatabase();
 
-  // Verify the inserted data overwrote the pre-existing data.
+  // Verify data is inserted.
   sql::Database db;
   EXPECT_TRUE(db.Open(db_path()));
-  EXPECT_EQ(2u, CountPublicSetsEntries(&db));
+  EXPECT_EQ(4u, CountPublicSetsEntries(&db));
 
   static constexpr char kSelectSql[] =
-      "SELECT site,primary_site,site_type FROM public_sets";
+      "SELECT site,primary_site,site_type FROM public_sets "
+      "WHERE version=?";
   sql::Statement s(db.GetUniqueStatement(kSelectSql));
+  s.BindString(0, version);
   EXPECT_TRUE(s.Step());
   EXPECT_EQ(site, s.ColumnString(0));
   EXPECT_EQ(primary, s.ColumnString(1));
@@ -337,6 +368,16 @@
   EXPECT_EQ(0, s.ColumnInt(2));
 
   EXPECT_FALSE(s.Step());
+
+  static constexpr char kVersionSql[] =
+      "SELECT public_sets_version FROM browser_context_sets_version "
+      "WHERE browser_context_id=?";
+  sql::Statement s_version(db.GetUniqueStatement(kVersionSql));
+  s_version.BindString(0, browser_context_id);
+  EXPECT_TRUE(s_version.Step());
+  EXPECT_EQ(version, s_version.ColumnString(0));
+
+  EXPECT_FALSE(s_version.Step());
 }
 
 TEST_F(FirstPartySetsDatabaseTest, InsertSitesToClear_NoPreExistingDB) {
@@ -762,7 +803,7 @@
 
 TEST_F(FirstPartySetsDatabaseTest, GetPublicSets_NoPreExistingDB) {
   OpenDatabase();
-  EXPECT_THAT(db()->GetPublicSets(), IsEmpty());
+  EXPECT_THAT(db()->GetPublicSets("b"), IsEmpty());
 }
 
 TEST_F(FirstPartySetsDatabaseTest, GetPublicSets) {
@@ -774,6 +815,7 @@
     sql::Database db;
     EXPECT_TRUE(db.Open(db_path()));
     EXPECT_EQ(2u, CountPublicSetsEntries(&db));
+    EXPECT_EQ(1u, CountBrowserContextSetsVersionEntries(&db));
   }
   FirstPartySetsDatabase::FlattenedSets res = {
       {net::SchemefulSite(GURL("https://aaa.test")),
@@ -784,7 +826,7 @@
                                net::SiteType::kPrimary, absl::nullopt)},
   };
   OpenDatabase();
-  EXPECT_THAT(db()->GetPublicSets(), res);
+  EXPECT_THAT(db()->GetPublicSets("b0"), res);
 }
 
 }  // namespace content
\ No newline at end of file
diff --git a/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc b/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc
index 15debf9..7d19b15 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_database_helper.cc
@@ -6,6 +6,7 @@
 
 #include "base/containers/contains.h"
 #include "base/logging.h"
+#include "base/version.h"
 #include "content/browser/first_party_sets/database/first_party_sets_database.h"
 #include "net/base/schemeful_site.h"
 #include "net/first_party_sets/first_party_set_entry.h"
@@ -93,10 +94,11 @@
     const FlattenedSets& current_sets,
     const PolicyCustomization& current_policy) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  base::flat_set<net::SchemefulSite> diff = ComputeSetsDiff(
-      db_->GetPublicSets(), db_->FetchPolicyModifications(browser_context_id),
-      current_sets, current_policy);
+  DCHECK(!browser_context_id.empty());
+  base::flat_set<net::SchemefulSite> diff =
+      ComputeSetsDiff(db_->GetPublicSets(browser_context_id),
+                      db_->FetchPolicyModifications(browser_context_id),
+                      current_sets, current_policy);
 
   if (!db_->InsertSitesToClear(browser_context_id, diff)) {
     DVLOG(1) << "Failed to update the sites to clear for browser_context_id="
@@ -116,17 +118,23 @@
 }
 
 void FirstPartySetsHandlerDatabaseHelper::PersistPublicSets(
+    const std::string& browser_context_id,
+    const base::Version& version,
     const FirstPartySetsHandlerDatabaseHelper::FlattenedSets& sets) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  if (!db_->SetPublicSets(sets)) {
+  DCHECK(!browser_context_id.empty());
+  DCHECK(version.IsValid());
+  if (!db_->SetPublicSets(browser_context_id, version.GetString(), sets)) {
     DVLOG(1) << "Failed to write public sets into the database.";
   }
 }
 
 FirstPartySetsHandlerDatabaseHelper::FlattenedSets
-FirstPartySetsHandlerDatabaseHelper::GetPersistedPublicSets() {
+FirstPartySetsHandlerDatabaseHelper::GetPersistedPublicSets(
+    const std::string& browser_context_id) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return db_->GetPublicSets();
+  DCHECK(!browser_context_id.empty());
+  return db_->GetPublicSets(browser_context_id);
 }
 
 }  // namespace content
diff --git a/content/browser/first_party_sets/first_party_sets_handler_database_helper.h b/content/browser/first_party_sets/first_party_sets_handler_database_helper.h
index f96bc2f..37aea62 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_database_helper.h
+++ b/content/browser/first_party_sets/first_party_sets_handler_database_helper.h
@@ -16,6 +16,10 @@
 #include "content/common/content_export.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+namespace base {
+class Version;
+}  // namespace base
+
 namespace net {
 class SchemefulSite;
 class FirstPartySetEntry;
@@ -82,10 +86,12 @@
   void UpdateClearStatusForContext(const std::string& browser_context_id);
 
   // Wraps FirstPartySetsDatabase::SetPublicSets.
-  void PersistPublicSets(const FlattenedSets& sets);
+  void PersistPublicSets(const std::string& browser_context_id,
+                         const base::Version& version,
+                         const FlattenedSets& sets);
 
   // Wraps FirstPartySetsDatabase::GetPublicSets.
-  FlattenedSets GetPersistedPublicSets();
+  FlattenedSets GetPersistedPublicSets(const std::string& browser_context_id);
 
  private:
   std::unique_ptr<FirstPartySetsDatabase> db_
diff --git a/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc
index e6c33b1..fbc12f3 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_database_helper_unittest.cc
@@ -8,6 +8,7 @@
 
 #include "base/files/scoped_temp_dir.h"
 #include "base/test/task_environment.h"
+#include "base/version.h"
 #include "net/base/schemeful_site.h"
 #include "net/first_party_sets/first_party_set_entry.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
@@ -431,22 +432,26 @@
        UpdateAndGetSitesToClearForContext) {
   const std::string& browser_context_id = "b";
 
-  db_helper_->PersistPublicSets(/*old_sets=*/{
-      {net::SchemefulSite(GURL("https://example.test")),
-       net::FirstPartySetEntry(net::SchemefulSite(GURL("https://example.test")),
-                               net::SiteType::kPrimary, absl::nullopt)},
-      {net::SchemefulSite(GURL("https://member1.test")),
-       net::FirstPartySetEntry(net::SchemefulSite(GURL("https://example.test")),
-                               net::SiteType::kAssociated, 0)},
-      {net::SchemefulSite(GURL("https://member3.test")),
-       net::FirstPartySetEntry(net::SchemefulSite(GURL("https://example.test")),
-                               net::SiteType::kAssociated, 1)},
-      {net::SchemefulSite(GURL("https://foo.test")),
-       net::FirstPartySetEntry(net::SchemefulSite(GURL("https://foo.test")),
-                               net::SiteType::kPrimary, absl::nullopt)},
-      {net::SchemefulSite(GURL("https://member2.test")),
-       net::FirstPartySetEntry(net::SchemefulSite(GURL("https://foo.test")),
-                               net::SiteType::kAssociated, 0)}});
+  db_helper_->PersistPublicSets(
+      browser_context_id, base::Version("0.0.1"),
+      {{net::SchemefulSite(GURL("https://example.test")),
+        net::FirstPartySetEntry(
+            net::SchemefulSite(GURL("https://example.test")),
+            net::SiteType::kPrimary, absl::nullopt)},
+       {net::SchemefulSite(GURL("https://member1.test")),
+        net::FirstPartySetEntry(
+            net::SchemefulSite(GURL("https://example.test")),
+            net::SiteType::kAssociated, 0)},
+       {net::SchemefulSite(GURL("https://member3.test")),
+        net::FirstPartySetEntry(
+            net::SchemefulSite(GURL("https://example.test")),
+            net::SiteType::kAssociated, 1)},
+       {net::SchemefulSite(GURL("https://foo.test")),
+        net::FirstPartySetEntry(net::SchemefulSite(GURL("https://foo.test")),
+                                net::SiteType::kPrimary, absl::nullopt)},
+       {net::SchemefulSite(GURL("https://member2.test")),
+        net::FirstPartySetEntry(net::SchemefulSite(GURL("https://foo.test")),
+                                net::SiteType::kAssociated, 0)}});
 
   FirstPartySetsHandlerDatabaseHelper::FlattenedSets current_sets = {
       {net::SchemefulSite(GURL("https://example.test")),
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.cc b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
index 3444d90..83fec66 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_impl.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
@@ -210,8 +210,7 @@
   DCHECK(enabled_);
   DCHECK(embedder_will_provide_public_sets_);
 
-  // TODO(crbug.com/1219656): Use this value to compute sets diff and then
-  // persisting to DB if valid.
+  // TODO(crbug.com/1219656): Use this value to compute sets diff.
   version_ = version;
   sets_loader_->SetComponentSets(std::move(sets_file));
 }
@@ -236,15 +235,18 @@
 }
 
 void FirstPartySetsHandlerImpl::GetPersistedPublicSetsForTesting(
+    const std::string& browser_context_id,
     base::OnceCallback<void(
         absl::optional<FirstPartySetsHandlerImpl::FlattenedSets>)> callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!browser_context_id.empty());
   if (db_helper_.is_null()) {
     std::move(callback).Run(absl::nullopt);
     return;
   }
   db_helper_
       .AsyncCall(&FirstPartySetsHandlerDatabaseHelper::GetPersistedPublicSets)
+      .WithArgs(browser_context_id)
       .Then(std::move(callback));
 }
 
@@ -297,11 +299,12 @@
   DCHECK(public_sets_.has_value());
   DCHECK(!browser_context_id.empty());
 
-  if (!db_helper_.is_null()) {
+  if (!db_helper_.is_null() && version_.has_value() && version_->IsValid()) {
     // TODO(crbug.com/1219656): Call site state clearing.
     db_helper_
         .AsyncCall(&FirstPartySetsHandlerDatabaseHelper::PersistPublicSets)
-        .WithArgs(public_sets_->entries());
+        .WithArgs(browser_context_id, version_.value(),
+                  public_sets_->entries());
   }
   std::move(callback).Run();
 }
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.h b/content/browser/first_party_sets/first_party_sets_handler_impl.h
index bc9d93da..fb97afb 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_impl.h
+++ b/content/browser/first_party_sets/first_party_sets_handler_impl.h
@@ -110,6 +110,7 @@
   }
 
   void GetPersistedPublicSetsForTesting(
+      const std::string& browser_context_id,
       base::OnceCallback<void(
           absl::optional<FirstPartySetsHandlerImpl::FlattenedSets>)> callback);
 
@@ -158,6 +159,9 @@
 
   // The version of the public First-Party Sets. This is nullopt until the
   // `SetPublicFirstPartySets()` is called.
+  //
+  // TODO(crbug.com/1219656): bundle `version_` with `public_sets_` to
+  // guarantee that we have both or neither.
   absl::optional<base::Version> version_;
 
   bool enabled_ GUARDED_BY_CONTEXT(sequence_checker_);
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
index 741fe1e..92e5a32ac 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
@@ -85,12 +85,12 @@
 
 // TODO(shuuran): Return `net::PublicSets` type instead.
 absl::optional<FirstPartySetsHandlerImpl::FlattenedSets>
-GetPersistedPublicSetsAndWait() {
+GetPersistedPublicSetsAndWait(const std::string& browser_context_id) {
   base::test::TestFuture<
       absl::optional<FirstPartySetsHandlerImpl::FlattenedSets>>
       future;
   FirstPartySetsHandlerImpl::GetInstance()->GetPersistedPublicSetsForTesting(
-      future.GetCallback());
+      browser_context_id, future.GetCallback());
   return future.Get();
 }
 
@@ -252,12 +252,13 @@
 
   FirstPartySetsHandlerImpl::GetInstance()
       ->SetEmbedderWillProvidePublicSetsForTesting(true);
+  const std::string browser_context_id = "profile";
   const std::string input =
       R"({"primary": "https://foo.test", )"
       R"("associatedSites": ["https://associatedsite.test"]})";
   ASSERT_TRUE(base::JSONReader::Read(input));
   FirstPartySetsHandlerImpl::GetInstance()->SetPublicFirstPartySets(
-      base::Version(), WritePublicSetsFile(input));
+      base::Version("0.0.1"), WritePublicSetsFile(input));
 
   FirstPartySetsHandlerImpl::GetInstance()->Init(scoped_dir_.GetPath(),
                                                  LocalSetDeclaration());
@@ -271,12 +272,12 @@
 
   FirstPartySetsHandlerImpl::GetInstance()
       ->ClearSiteDataOnChangedSetsForContext(
-          base::BindRepeating(&FakeBrowserContextGetter), "profile",
+          base::BindRepeating(&FakeBrowserContextGetter), browser_context_id,
           /*context_config=*/nullptr, base::DoNothing());
 
   env().RunUntilIdle();
 
-  EXPECT_THAT(GetPersistedPublicSetsAndWait(),
+  EXPECT_THAT(GetPersistedPublicSetsAndWait(browser_context_id),
               Optional(UnorderedElementsAre(
                   Pair(foo, net::FirstPartySetEntry(
                                 foo, net::SiteType::kPrimary, absl::nullopt)),
@@ -292,12 +293,13 @@
 
   FirstPartySetsHandlerImpl::GetInstance()
       ->SetEmbedderWillProvidePublicSetsForTesting(true);
+  const std::string browser_context_id = "profile";
   const std::string input =
       R"({"primary": "https://foo.test", )"
       R"("associatedSites": ["https://associatedsite.test"]})";
   ASSERT_TRUE(base::JSONReader::Read(input));
   FirstPartySetsHandlerImpl::GetInstance()->SetPublicFirstPartySets(
-      base::Version(), WritePublicSetsFile(input));
+      base::Version("0.0.1"), WritePublicSetsFile(input));
 
   FirstPartySetsHandlerImpl::GetInstance()->Init(
       /*user_data_dir=*/{}, LocalSetDeclaration());
@@ -311,12 +313,38 @@
 
   FirstPartySetsHandlerImpl::GetInstance()
       ->ClearSiteDataOnChangedSetsForContext(
-          base::BindRepeating(&FakeBrowserContextGetter), "profile",
+          base::BindRepeating(&FakeBrowserContextGetter), browser_context_id,
           /*context_config=*/nullptr, base::DoNothing());
 
   env().RunUntilIdle();
 
-  EXPECT_THAT(GetPersistedPublicSetsAndWait(), absl::nullopt);
+  EXPECT_THAT(GetPersistedPublicSetsAndWait(browser_context_id), absl::nullopt);
+}
+
+TEST_F(FirstPartySetsHandlerImplEnabledTest,
+       ClearSiteDataOnChangedSetsForContext_InvalidPublicSetsVersion) {
+  FirstPartySetsHandlerImpl::GetInstance()
+      ->SetEmbedderWillProvidePublicSetsForTesting(true);
+  const std::string browser_context_id = "profile";
+  const base::Version invalid_version = base::Version();
+  DCHECK(!invalid_version.IsValid());
+
+  const std::string input = "";
+  FirstPartySetsHandlerImpl::GetInstance()->SetPublicFirstPartySets(
+      invalid_version, WritePublicSetsFile(input));
+
+  FirstPartySetsHandlerImpl::GetInstance()->Init(scoped_dir_.GetPath(),
+                                                 LocalSetDeclaration());
+  env().RunUntilIdle();
+
+  FirstPartySetsHandlerImpl::GetInstance()
+      ->ClearSiteDataOnChangedSetsForContext(
+          base::BindRepeating(&FakeBrowserContextGetter), browser_context_id,
+          /*context_config=*/nullptr, base::DoNothing());
+
+  // Public sets with invalid version was not persisted.
+  EXPECT_THAT(GetPersistedPublicSetsAndWait(browser_context_id),
+              Optional(IsEmpty()));
 }
 
 TEST_F(FirstPartySetsHandlerImplEnabledTest,
diff --git a/content/browser/reduce_accept_language/reduce_accept_language_utils.cc b/content/browser/reduce_accept_language/reduce_accept_language_utils.cc
index bd6c6aea..cda6dc18 100644
--- a/content/browser/reduce_accept_language/reduce_accept_language_utils.cc
+++ b/content/browser/reduce_accept_language/reduce_accept_language_utils.cc
@@ -127,11 +127,9 @@
     return false;
 
   // Only parse and persist if the Variants headers include Accept-Language.
-  auto variants_accept_lang_iter = base::ranges::find_if(
-      parsed_headers->variants_headers.value(),
-      [](const VariantsHeaderPtr& variants_header) {
-        return variants_header->name == kAcceptLanguageLowerCase;
-      });
+  auto variants_accept_lang_iter = base::ranges::find(
+      parsed_headers->variants_headers.value(), kAcceptLanguageLowerCase,
+      &::network::mojom::VariantsHeader::name);
   if (variants_accept_lang_iter ==
       parsed_headers->variants_headers.value().end()) {
     return false;
@@ -184,12 +182,11 @@
   //
   // TODO(crbug.com/1323776) make sure the delegate clears its cache if the
   // user's preferences changed.
-  auto iter = base::ranges::find_if(
-      user_accept_languages, [&](const std::string& language) {
-        return DoesAcceptLanguageMatchContentLanguage(
-            language, preferred_language.value());
-      });
-  return iter != user_accept_languages.end()
+  return base::ranges::any_of(user_accept_languages,
+                              [&](const std::string& language) {
+                                return DoesAcceptLanguageMatchContentLanguage(
+                                    language, preferred_language.value());
+                              })
              ? preferred_language
              : GetFirstUserAcceptLanguage(user_accept_languages);
 }
@@ -241,13 +238,12 @@
 
   // If the response content-language matches the initial accept language
   // values, no need to resend the request.
-  auto iter = base::ranges::find_if(content_languages, [&](const std::string&
-                                                               language) {
-    return ReduceAcceptLanguageUtils::DoesAcceptLanguageMatchContentLanguage(
-        initial_accept_language, language);
-  });
   std::string selected_language;
-  if (iter != content_languages.end()) {
+  if (base::ranges::any_of(content_languages, [&](const std::string& language) {
+        return ReduceAcceptLanguageUtils::
+            DoesAcceptLanguageMatchContentLanguage(initial_accept_language,
+                                                   language);
+      })) {
     selected_language = initial_accept_language;
   } else {
     // If content-language doesn't match initial accept-language and the site
@@ -262,12 +258,11 @@
       // Only resend request if the `matched_language` doesn't match any
       // content languages in current response header because otherwise
       // resending the request won't get a better result.
-      auto matched_iter = base::ranges::find_if(
+      result.should_resend_request = base::ranges::none_of(
           content_languages, [&](const std::string& language) {
             return base::EqualsCaseInsensitiveASCII(language,
                                                     matched_language.value());
           });
-      result.should_resend_request = (matched_iter == content_languages.end());
     }
   }
 
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 54724fa..a3955758 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -169,10 +169,8 @@
   }
 
   bool HasNonBackForwardCachedInstances() const {
-    return base::ranges::find_if_not(
-               render_view_host_instances_,
-               &RenderViewHostImpl::is_in_back_forward_cache) !=
-           render_view_host_instances_.end();
+    return !base::ranges::all_of(render_view_host_instances_,
+                                 &RenderViewHostImpl::is_in_back_forward_cache);
   }
 
  private:
diff --git a/content/browser/site_info.cc b/content/browser/site_info.cc
index 8488edd..1314683 100644
--- a/content/browser/site_info.cc
+++ b/content/browser/site_info.cc
@@ -234,8 +234,6 @@
           ? GURL()
           : GetSiteURLForGuestPartitionConfig(partition_config);
 
-  // TODO(crbug.com/1340662): Investigate whether we want fenced frames
-  // isolated within guests. If we do, we need to plumb the value for is_fenced.
   return SiteInfo(
       guest_site_url, guest_site_url, false /* requires_origin_keyed_process */,
       false /* is_sandboxed */, UrlInfo::kInvalidUniqueSandboxId,
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index ba58c3c..f591ec3e 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -210,8 +210,6 @@
   DCHECK(browser_context);
   DCHECK(!partition_config.is_default());
 
-  // TODO(crbug.com/1340662): Figure out if is_fenced needs to be set here for
-  // fenced frames inside guests.
   auto guest_site_info =
       SiteInfo::CreateForGuest(browser_context, partition_config);
   scoped_refptr<SiteInstanceImpl> site_instance =
@@ -229,12 +227,6 @@
     SiteInstanceImpl* embedder_site_instance) {
   DCHECK(embedder_site_instance);
   BrowserContext* browser_context = embedder_site_instance->GetBrowserContext();
-
-  if (embedder_site_instance->IsGuest()) {
-    return CreateForGuest(browser_context,
-                          embedder_site_instance->GetStoragePartitionConfig());
-  }
-
   bool should_isolate_fenced_frames =
       SiteIsolationPolicy::IsProcessIsolationForFencedFramesEnabled();
   scoped_refptr<SiteInstanceImpl> site_instance =
@@ -255,7 +247,21 @@
   // have a SiteInfo with is_fenced set to true).
   if (!embedder_site_instance->IsDefaultSiteInstance()) {
     site_instance->SetSite(embedder_site_instance->GetSiteInfo());
+  } else if (embedder_site_instance->IsGuest()) {
+    // For guests, in the case where the embedder is not a default SiteInstance,
+    // we reuse the embedder's SiteInfo above. When the embedder is
+    // a default SiteInstance, we explicitly create a SiteInfo through
+    // CreateForGuest.
+    // TODO(crbug.com/1340662): When we support fenced frame process isolation
+    // with partial or no site isolation modes, we will be able to reach this
+    // code path and will need to also set is_fenced for the SiteInfo created
+    // below.
+    DCHECK(!should_isolate_fenced_frames);
+    DCHECK(SiteIsolationPolicy::IsSiteIsolationForGuestsEnabled());
+    site_instance->SetSite(SiteInfo::CreateForGuest(
+        browser_context, embedder_site_instance->GetStoragePartitionConfig()));
   }
+  DCHECK_EQ(embedder_site_instance->IsGuest(), site_instance->IsGuest());
   site_instance->ReuseCurrentProcessIfPossible(
       embedder_site_instance->GetProcess());
   return site_instance;
@@ -380,7 +386,6 @@
 
 void SiteInstanceImpl::ReuseCurrentProcessIfPossible(
     RenderProcessHost* current_process) {
-  DCHECK(!IsGuest());
   if (HasProcess())
     return;
 
diff --git a/content/test/data/first_party_sets/v0.init_too_old.sql b/content/test/data/first_party_sets/v0.init_too_old.sql
index 57c0eb1..bbd11db 100644
--- a/content/test/data/first_party_sets/v0.init_too_old.sql
+++ b/content/test/data/first_party_sets/v0.init_too_old.sql
@@ -3,10 +3,16 @@
 BEGIN TRANSACTION;
 
 CREATE TABLE IF NOT EXISTS public_sets(
+  version TEXT NOT NULL,
   site TEXT NOT NULL,
   primary_site TEXT NOT NULL,
   site_type INTEGER NOT NULL,
-  PRIMARY KEY(site)
+  PRIMARY KEY(version, site)
+) WITHOUT ROWID;
+
+CREATE TABLE IF NOT EXISTS browser_context_sets_version (
+   browser_context_id TEXT PRIMARY KEY NOT NULL,
+   public_sets_version TEXT NOT NULL
 ) WITHOUT ROWID;
 
 CREATE TABLE IF NOT EXISTS policy_modifications (
@@ -38,8 +44,9 @@
 INSERT INTO meta VALUES('last_compatible_version','1');
 INSERT INTO meta VALUES('run_count','1');
 
-INSERT INTO public_sets VALUES('https://aaa.test', 'https://bbb.test', 1),
-                              ('https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
+                              ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/data/first_party_sets/v1.init_invalid_run_count.sql b/content/test/data/first_party_sets/v1.init_invalid_run_count.sql
index 04f6704..d37d2c3 100644
--- a/content/test/data/first_party_sets/v1.init_invalid_run_count.sql
+++ b/content/test/data/first_party_sets/v1.init_invalid_run_count.sql
@@ -3,10 +3,16 @@
 BEGIN TRANSACTION;
 
 CREATE TABLE IF NOT EXISTS public_sets(
+  version TEXT NOT NULL,
   site TEXT NOT NULL,
   primary_site TEXT NOT NULL,
   site_type INTEGER NOT NULL,
-  PRIMARY KEY(site)
+  PRIMARY KEY(version, site)
+) WITHOUT ROWID;
+
+CREATE TABLE IF NOT EXISTS browser_context_sets_version (
+   browser_context_id TEXT PRIMARY KEY NOT NULL,
+   public_sets_version TEXT NOT NULL
 ) WITHOUT ROWID;
 
 CREATE TABLE IF NOT EXISTS policy_modifications (
@@ -38,8 +44,9 @@
 INSERT INTO meta VALUES('last_compatible_version','1');
 INSERT INTO meta VALUES('run_count','0');
 
-INSERT INTO public_sets VALUES('https://aaa.test', 'https://bbb.test', 1),
-                              ('https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
+                              ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/data/first_party_sets/v1.init_too_new.sql b/content/test/data/first_party_sets/v1.init_too_new.sql
index 6e709e4..f8dcb69 100644
--- a/content/test/data/first_party_sets/v1.init_too_new.sql
+++ b/content/test/data/first_party_sets/v1.init_too_new.sql
@@ -3,10 +3,16 @@
 BEGIN TRANSACTION;
 
 CREATE TABLE IF NOT EXISTS public_sets(
+  version TEXT NOT NULL,
   site TEXT NOT NULL,
   primary_site TEXT NOT NULL,
   site_type INTEGER NOT NULL,
-  PRIMARY KEY(site)
+  PRIMARY KEY(version, site)
+) WITHOUT ROWID;
+
+CREATE TABLE IF NOT EXISTS browser_context_sets_version (
+   browser_context_id TEXT PRIMARY KEY NOT NULL,
+   public_sets_version TEXT NOT NULL
 ) WITHOUT ROWID;
 
 CREATE TABLE IF NOT EXISTS policy_modifications (
@@ -38,8 +44,9 @@
 INSERT INTO meta VALUES('last_compatible_version','2');
 INSERT INTO meta VALUES('run_count','2');
 
-INSERT INTO public_sets VALUES('https://aaa.test', 'https://bbb.test', 1),
-                              ('https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
+                              ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/data/first_party_sets/v1.sql b/content/test/data/first_party_sets/v1.sql
index c3fc4c4f..2fb4172 100644
--- a/content/test/data/first_party_sets/v1.sql
+++ b/content/test/data/first_party_sets/v1.sql
@@ -3,10 +3,16 @@
 BEGIN TRANSACTION;
 
 CREATE TABLE IF NOT EXISTS public_sets(
+  version TEXT NOT NULL,
   site TEXT NOT NULL,
   primary_site TEXT NOT NULL,
   site_type INTEGER NOT NULL,
-  PRIMARY KEY(site)
+  PRIMARY KEY(version, site)
+) WITHOUT ROWID;
+
+CREATE TABLE IF NOT EXISTS browser_context_sets_version (
+   browser_context_id TEXT PRIMARY KEY NOT NULL,
+   public_sets_version TEXT NOT NULL
 ) WITHOUT ROWID;
 
 CREATE TABLE IF NOT EXISTS policy_modifications (
@@ -38,8 +44,9 @@
 INSERT INTO meta VALUES('last_compatible_version','1');
 INSERT INTO meta VALUES('run_count','1');
 
-INSERT INTO public_sets VALUES('https://aaa.test', 'https://bbb.test', 1),
-                              ('https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO public_sets VALUES('0.0.1', 'https://aaa.test', 'https://bbb.test', 1),
+                              ('0.0.1', 'https://bbb.test', 'https://bbb.test', 0);
+INSERT INTO browser_context_sets_version VALUES('b0', '0.0.1');
 
 -- b0: has sites to clear and has performed the clearing.
 -- b1: has sites to clear but has not performed the clearing.
diff --git a/content/test/gpu/flake_suppressor/gpu_queries_unittest.py b/content/test/gpu/flake_suppressor/gpu_queries_unittest.py
index dec59ffb..31e2dcd 100755
--- a/content/test/gpu/flake_suppressor/gpu_queries_unittest.py
+++ b/content/test/gpu/flake_suppressor/gpu_queries_unittest.py
@@ -11,6 +11,7 @@
 
 from flake_suppressor import gpu_queries as queries
 from flake_suppressor import gpu_tag_utils as tag_utils
+from flake_suppressor import gpu_results as results_module
 from flake_suppressor_common import unittest_utils as uu
 from flake_suppressor_common import tag_utils as common_tag_utils
 
@@ -18,7 +19,9 @@
 class GpuQueriesUnittest(unittest.TestCase):
   def setUp(self) -> None:
     common_tag_utils.SetTagUtilsImplementation(tag_utils.GpuTagUtils)
-    self._querier_instance = queries.GpuBigQueryQuerier(1, 'project')
+    result_processor = results_module.GpuResultProcessor()
+    self._querier_instance = queries.GpuBigQueryQuerier(1, 'project',
+                                                        result_processor)
     self._querier_instance._submitted_builds = set(['build-1234', 'build-2345'])
     self._subprocess_patcher = mock.patch(
         'flake_suppressor_common.queries.subprocess.run')
diff --git a/content/test/gpu/flake_suppressor/gpu_results.py b/content/test/gpu/flake_suppressor/gpu_results.py
new file mode 100644
index 0000000..48dea4a
--- /dev/null
+++ b/content/test/gpu/flake_suppressor/gpu_results.py
@@ -0,0 +1,14 @@
+# Copyright 2022 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from typing import Tuple
+
+from flake_suppressor_common import results as results_module
+
+
+class GpuResultProcessor(results_module.ResultProcessor):
+  def GetTestSuiteAndNameFromResultDbName(self, result_db_name: str
+                                          ) -> Tuple[str, str]:
+    _, suite, __, test_name = result_db_name.split('.', 3)
+    return suite, test_name
diff --git a/content/test/gpu/flake_suppressor/gpu_results_unittest.py b/content/test/gpu/flake_suppressor/gpu_results_unittest.py
new file mode 100755
index 0000000..c7603cc33
--- /dev/null
+++ b/content/test/gpu/flake_suppressor/gpu_results_unittest.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env vpython3
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# pylint: disable=protected-access
+
+import unittest
+import unittest.mock as mock
+
+from flake_suppressor import gpu_results
+from flake_suppressor import gpu_tag_utils as tag_utils
+
+from flake_suppressor_common import data_types
+from flake_suppressor_common import tag_utils as common_tag_utils
+
+GENERIC_EXPECTATION_FILE_CONTENTS = """\
+# tags: [ win ]
+# results: [ Failure ]
+crbug.com/1111 [ win ] foo_test [ Failure ]
+"""
+
+GPU_EXPECTATION_FILE_CONTENTS = """\
+# tags: [ win ]
+# tags: [ amd nvidia ]
+# results: [ Failure ]
+crbug.com/1111 [ win nvidia ] conformance/textures/misc/video-rotation.html [ Failure ]
+"""
+
+
+class GPUResultsUnittest(unittest.TestCase):
+  def setUp(self) -> None:
+    common_tag_utils.SetTagUtilsImplementation(tag_utils.GpuTagUtils)
+    self._results = gpu_results.GpuResultProcessor()
+    self._local_patcher = mock.patch(
+        'flake_suppressor_common.results.expectations.'
+        'GetExpectationFilesFromLocalCheckout')
+    self._local_mock = self._local_patcher.start()
+    self._local_mock.return_value = {}
+    self.addCleanup(self._local_patcher.stop)
+
+
+class AggregateResultsUnittest(GPUResultsUnittest):
+  def testWithFiltering(self) -> None:
+    """Tests that results are properly filtered out."""
+    self._local_mock.return_value = {
+        'webgl_conformance_expectations.txt': GPU_EXPECTATION_FILE_CONTENTS,
+    }
+    query_results = [
+        # Expected to be removed.
+        {
+            'name': ('gpu_tests.webgl_conformance_integration_test.'
+                     'WebGLConformanceIntegrationTest.'
+                     'conformance/textures/misc/video-rotation.html'),
+            'id':
+            'build-1111',
+            'typ_tags': ['win', 'nvidia'],
+        },
+        # Expected to be removed.
+        {
+            'name': ('gpu_tests.webgl_conformance_integration_test.'
+                     'WebGLConformanceIntegrationTest.'
+                     'conformance/textures/misc/video-rotation.html'),
+            'id':
+            'build-2222',
+            'typ_tags': ['win', 'nvidia'],
+        },
+        {
+            'name': ('gpu_tests.webgl_conformance_integration_test.'
+                     'WebGLConformanceIntegrationTest.'
+                     'conformance/textures/misc/video-rotation.html'),
+            'id':
+            'build-3333',
+            'typ_tags': ['win', 'amd'],
+        },
+        {
+            'name': ('gpu_tests.webgl_conformance_integration_test.'
+                     'WebGLConformanceIntegrationTest.'
+                     'conformance/textures/misc/texture-npot-video.html'),
+            'id':
+            'build-4444',
+            'typ_tags': ['win', 'nvidia'],
+        },
+        {
+            'name': ('gpu_tests.pixel_integration_test.PixelIntegrationTest.'
+                     'Pixel_CSS3DBlueBox'),
+            'id':
+            'build-5555',
+            'typ_tags': ['win', 'nvidia'],
+        },
+    ]
+
+    expected_output = {
+        'webgl_conformance_integration_test': {
+            'conformance/textures/misc/video-rotation.html': {
+                ('amd', 'win'): ['http://ci.chromium.org/b/3333'],
+            },
+            'conformance/textures/misc/texture-npot-video.html': {
+                ('nvidia', 'win'): ['http://ci.chromium.org/b/4444'],
+            },
+        },
+        'pixel_integration_test': {
+            'Pixel_CSS3DBlueBox': {
+                ('nvidia', 'win'): ['http://ci.chromium.org/b/5555'],
+            },
+        },
+    }
+
+    self.assertEqual(self._results.AggregateResults(query_results),
+                     expected_output)
+
+
+class ConvertJsonResultsToResultObjectsUnittest(GPUResultsUnittest):
+  def testDuplicateResults(self) -> None:
+    """Tests that duplicate results are not merged."""
+    r = [
+        {
+            'name': ('gpu_tests.webgl_conformance_integration_test.'
+                     'WebGLConformanceIntegrationTest.'
+                     'conformance/textures/misc/video-rotation.html'),
+            'id':
+            'build-1111',
+            'typ_tags': ['win', 'nvidia'],
+        },
+        {
+            'name': ('gpu_tests.webgl_conformance_integration_test.'
+                     'WebGLConformanceIntegrationTest.'
+                     'conformance/textures/misc/video-rotation.html'),
+            'id':
+            'build-1111',
+            'typ_tags': ['win', 'nvidia'],
+        },
+    ]
+    expected_results = [
+        data_types.Result('webgl_conformance_integration_test',
+                          'conformance/textures/misc/video-rotation.html',
+                          ('nvidia', 'win'), '1111'),
+        data_types.Result('webgl_conformance_integration_test',
+                          'conformance/textures/misc/video-rotation.html',
+                          ('nvidia', 'win'), '1111'),
+    ]
+    self.assertEqual(self._results._ConvertJsonResultsToResultObjects(r),
+                     expected_results)
+
+
+if __name__ == '__main__':
+  unittest.main(verbosity=2)
diff --git a/content/test/gpu/suppress_flakes.py b/content/test/gpu/suppress_flakes.py
index c3527a8..5a794267 100755
--- a/content/test/gpu/suppress_flakes.py
+++ b/content/test/gpu/suppress_flakes.py
@@ -30,6 +30,7 @@
 from flake_suppressor_common import tag_utils as common_tag_utils
 from flake_suppressor import gpu_queries
 from flake_suppressor import gpu_tag_utils as tag_utils
+from flake_suppressor import gpu_results as results_module
 # pylint: enable=wrong-import-position
 
 
@@ -113,11 +114,15 @@
   common_tag_utils.SetTagUtilsImplementation(tag_utils.GpuTagUtils)
   if not args.bypass_up_to_date_check:
     expectations.AssertCheckoutIsUpToDate()
+
+  results_processor = results_module.GpuResultProcessor()
   querier_instance = gpu_queries.GpuBigQueryQuerier(args.sample_period,
-                                                    args.project)
+                                                    args.project,
+                                                    results_processor)
+
   results = querier_instance.GetFlakyOrFailingCiTests()
   results.extend(querier_instance.GetFlakyOrFailingTryTests())
-  aggregated_results = results_module.AggregateResults(results)
+  aggregated_results = results_processor.AggregateResults(results)
   if args.result_output_file:
     with open(args.result_output_file, 'w') as outfile:
       result_output.GenerateHtmlOutputFile(aggregated_results, outfile)
diff --git a/content/web_test/renderer/fake_subresource_filter.cc b/content/web_test/renderer/fake_subresource_filter.cc
index 9a6e39f3..5fe6aed 100644
--- a/content/web_test/renderer/fake_subresource_filter.cc
+++ b/content/web_test/renderer/fake_subresource_filter.cc
@@ -42,13 +42,13 @@
   GURL gurl(url);
   base::StringPiece path(gurl.path_piece());
 
-  auto it = base::ranges::find_if(
-      disallowed_path_suffixes_, [&path](const std::string& suffix) {
-        return base::EndsWith(path, suffix, base::CompareCase::SENSITIVE);
-      });
   // Allows things not listed in |disallowed_path_suffixes_|.
-  if (it == disallowed_path_suffixes_.end())
+  if (base::ranges::none_of(
+          disallowed_path_suffixes_, [&path](const std::string& suffix) {
+            return base::EndsWith(path, suffix, base::CompareCase::SENSITIVE);
+          })) {
     return kAllow;
+  }
   // Disallows everything in |disallowed_path_suffixes_| only if
   // |block_subresources| is true.
   if (block_subresources_)
diff --git a/content/web_test/renderer/web_test_grammar_checker.cc b/content/web_test/renderer/web_test_grammar_checker.cc
index 57c535f..970caa8 100644
--- a/content/web_test/renderer/web_test_grammar_checker.cc
+++ b/content/web_test/renderer/web_test_grammar_checker.cc
@@ -27,7 +27,7 @@
     std::vector<blink::WebTextCheckingResult>* results) {
   DCHECK(results);
   std::u16string string_text = text.Utf16();
-  if (base::ranges::find_if(string_text, IsASCIIAlpha) == string_text.end())
+  if (base::ranges::none_of(string_text, IsASCIIAlpha))
     return true;
 
   // Find matching grammatical errors from known ones. This function has to
diff --git a/gpu/command_buffer/client/shared_image_interface.h b/gpu/command_buffer/client/shared_image_interface.h
index f82ecd8..68370527 100644
--- a/gpu/command_buffer/client/shared_image_interface.h
+++ b/gpu/command_buffer/client/shared_image_interface.h
@@ -111,6 +111,7 @@
                             SkAlphaType alpha_type,
                             uint32_t usage);
 
+  // TODO(sunnyps): DEPRECATED - remove after migrating all uses.
   // Similar to above, but creates backings for all planes in one shot. Needed
   // on platforms where the planes need to share some state on initialization.
   // Only implemented on Windows.
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
index 761e060..2dab0e0b 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing.cc
@@ -22,6 +22,7 @@
 #include "gpu/command_buffer/service/shared_memory_region_wrapper.h"
 #include "third_party/libyuv/include/libyuv/planar_functions.h"
 #include "ui/gfx/buffer_format_util.h"
+#include "ui/gl/gl_bindings.h"
 #include "ui/gl/gl_image_shared_memory.h"
 #include "ui/gl/trace_util.h"
 
@@ -133,10 +134,10 @@
     const gfx::Size& size,
     const gfx::ColorSpace& color_space,
     Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
-    Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = nullptr,
     GLenum texture_target = GL_TEXTURE_2D,
     unsigned array_slice = 0u,
-    unsigned plane_index = 0u) {
+    unsigned plane_index = 0u,
+    Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = nullptr) {
   gl::GLApi* const api = gl::g_current_gl_context;
   ScopedRestoreTexture scoped_restore(api, texture_target);
 
@@ -210,7 +211,8 @@
     Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
     bool is_back_buffer) {
   auto gl_texture =
-      CreateGLTexture(format, size, color_space, d3d11_texture, swap_chain);
+      CreateGLTexture(format, size, color_space, d3d11_texture, GL_TEXTURE_2D,
+                      /*array_slice=*/0u, /*plane_index=*/0u, swap_chain);
   if (!gl_texture) {
     LOG(ERROR) << "Failed to create GL texture";
     return nullptr;
@@ -218,11 +220,12 @@
   return base::WrapUnique(new D3DImageBacking(
       mailbox, format, size, color_space, surface_origin, alpha_type, usage,
       std::move(d3d11_texture), std::move(gl_texture),
-      /*dxgi_shared_handle_state=*/{}, std::move(swap_chain), is_back_buffer));
+      /*dxgi_shared_handle_state=*/nullptr, GL_TEXTURE_2D, /*array_slice=*/0u,
+      /*plane_index=*/0u, std::move(swap_chain), is_back_buffer));
 }
 
 // static
-std::unique_ptr<D3DImageBacking> D3DImageBacking::CreateFromDXGISharedHandle(
+std::unique_ptr<D3DImageBacking> D3DImageBacking::Create(
     const Mailbox& mailbox,
     viz::ResourceFormat format,
     const gfx::Size& size,
@@ -231,13 +234,15 @@
     SkAlphaType alpha_type,
     uint32_t usage,
     Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
-    scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state) {
-  DCHECK(dxgi_shared_handle_state);
-
+    scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state,
+    GLenum texture_target,
+    size_t array_slice,
+    size_t plane_index) {
   const bool has_webgpu_usage = !!(usage & SHARED_IMAGE_USAGE_WEBGPU);
   // Keyed mutexes are required for Dawn interop but are not used for XR
   // composition where fences are used instead.
-  DCHECK(!has_webgpu_usage || dxgi_shared_handle_state->has_keyed_mutex());
+  DCHECK(!has_webgpu_usage || (dxgi_shared_handle_state &&
+                               dxgi_shared_handle_state->has_keyed_mutex()));
 
   // Do not cache a GL texture in the backing if it could be owned by WebGPU
   // since there's no GL context to MakeCurrent in the destructor.
@@ -245,7 +250,8 @@
   if (!has_webgpu_usage) {
     // Creating the GL texture doesn't require exclusive access to the
     // underlying D3D11 texture.
-    gl_texture = CreateGLTexture(format, size, color_space, d3d11_texture);
+    gl_texture = CreateGLTexture(format, size, color_space, d3d11_texture,
+                                 texture_target, array_slice, plane_index);
     if (!gl_texture) {
       LOG(ERROR) << "Failed to create GL texture";
       return nullptr;
@@ -254,7 +260,8 @@
   auto backing = base::WrapUnique(new D3DImageBacking(
       mailbox, format, size, color_space, surface_origin, alpha_type, usage,
       std::move(d3d11_texture), std::move(gl_texture),
-      std::move(dxgi_shared_handle_state)));
+      std::move(dxgi_shared_handle_state), texture_target, array_slice,
+      plane_index));
   return backing;
 }
 
@@ -308,47 +315,37 @@
     // value from default-construction.
     constexpr gfx::ColorSpace kInvalidColorSpace;
 
-    auto gl_texture = CreateGLTexture(
-        plane_format, plane_size, kInvalidColorSpace, d3d11_texture,
-        /*swap_chain=*/nullptr, GL_TEXTURE_EXTERNAL_OES, array_slice,
-        plane_index);
-    if (!gl_texture) {
-      LOG(ERROR) << "Failed to create GL texture";
-      return {};
+    // TODO(sunnyps): Switch to GL_TEXTURE_2D since it's now supported by ANGLE.
+    constexpr GLenum kTextureTarget = GL_TEXTURE_EXTERNAL_OES;
+
+    // Do not cache a GL texture in the backing if it could be owned by WebGPU
+    // since there's no GL context to MakeCurrent in the destructor.
+    scoped_refptr<gles2::TexturePassthrough> gl_texture;
+    if (!has_webgpu_usage) {
+      // Creating the GL texture doesn't require exclusive access to the
+      // underlying D3D11 texture.
+      gl_texture = CreateGLTexture(plane_format, plane_size, kInvalidColorSpace,
+                                   d3d11_texture, kTextureTarget, array_slice,
+                                   plane_index);
+      if (!gl_texture) {
+        LOG(ERROR) << "Failed to create GL texture";
+        return {};
+      }
     }
 
     shared_images[plane_index] = base::WrapUnique(new D3DImageBacking(
         mailbox, plane_format, plane_size, kInvalidColorSpace,
         kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, usage, d3d11_texture,
-        std::move(gl_texture), dxgi_shared_handle_state));
+        std::move(gl_texture), dxgi_shared_handle_state, kTextureTarget,
+        array_slice, plane_index));
+    if (!shared_images[plane_index])
+      return {};
     shared_images[plane_index]->SetCleared();
   }
 
   return shared_images;
 }
 
-// static
-std::unique_ptr<D3DImageBacking> D3DImageBacking::CreateForSharedMemory(
-    const Mailbox& mailbox,
-    viz::ResourceFormat format,
-    const gfx::Size& size,
-    const gfx::ColorSpace& color_space,
-    GrSurfaceOrigin surface_origin,
-    SkAlphaType alpha_type,
-    uint32_t usage,
-    Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture) {
-  auto gl_texture = CreateGLTexture(format, size, color_space, d3d11_texture);
-  if (!gl_texture) {
-    LOG(ERROR) << "Failed to create GL texture";
-    return nullptr;
-  }
-  auto backing = base::WrapUnique(new D3DImageBacking(
-      mailbox, format, size, color_space, surface_origin, alpha_type, usage,
-      std::move(d3d11_texture), std::move(gl_texture),
-      /*dxgi_shared_handle_state=*/{}));
-  return backing;
-}
-
 D3DImageBacking::D3DImageBacking(
     const Mailbox& mailbox,
     viz::ResourceFormat format,
@@ -360,6 +357,9 @@
     Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
     scoped_refptr<gles2::TexturePassthrough> gl_texture,
     scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state,
+    GLenum texture_target,
+    size_t array_slice,
+    size_t plane_index,
     Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
     bool is_back_buffer)
     : ClearTrackingSharedImageBacking(
@@ -377,6 +377,9 @@
       d3d11_texture_(std::move(d3d11_texture)),
       gl_texture_(std::move(gl_texture)),
       dxgi_shared_handle_state_(std::move(dxgi_shared_handle_state)),
+      texture_target_(texture_target),
+      array_slice_(array_slice),
+      plane_index_(plane_index),
       swap_chain_(std::move(swap_chain)),
       is_back_buffer_(is_back_buffer) {
   const bool has_webgpu_usage = !!(usage & SHARED_IMAGE_USAGE_WEBGPU);
@@ -660,7 +663,8 @@
   pmd->AddOwnershipEdge(client_guid, service_guid, kOwningEdgeImportance);
 
   // Swap chain textures only have one level backed by an image.
-  GetGLImage()->OnMemoryDump(pmd, client_tracing_id, dump_name);
+  if (auto* gl_image = GetGLImage())
+    gl_image->OnMemoryDump(pmd, client_tracing_id, dump_name);
 }
 
 bool D3DImageBacking::BeginAccessD3D12() {
@@ -688,7 +692,8 @@
 }
 
 gl::GLImage* D3DImageBacking::GetGLImage() const {
-  return gl_texture_->GetLevelImage(gl_texture_->target(), 0u);
+  return gl_texture_ ? gl_texture_->GetLevelImage(gl_texture_->target(), 0u)
+                     : nullptr;
 }
 
 bool D3DImageBacking::PresentSwapChain() {
@@ -716,6 +721,7 @@
   ScopedRestoreTexture scoped_restore(api, GL_TEXTURE_2D);
 
   api->glBindTextureFn(GL_TEXTURE_2D, gl_texture_->service_id());
+  DCHECK(GetGLImage());
   if (!GetGLImage()->BindTexImage(GL_TEXTURE_2D)) {
     LOG(ERROR) << "GLImage::BindTexImage failed";
     return false;
@@ -734,8 +740,9 @@
   // Lazily create a GL texture if it wasn't provided on initialization.
   auto gl_texture = gl_texture_;
   if (!gl_texture) {
-    gl_texture =
-        CreateGLTexture(format(), size(), color_space(), d3d11_texture_);
+    gl_texture = CreateGLTexture(format(), size(), color_space(),
+                                 d3d11_texture_, texture_target_, array_slice_,
+                                 plane_index_, swap_chain_);
     if (!gl_texture) {
       LOG(ERROR) << "Failed to create GL texture";
       return nullptr;
@@ -758,8 +765,18 @@
     SharedImageManager* manager,
     MemoryTypeTracker* tracker) {
   TRACE_EVENT0("gpu", "D3DImageBacking::ProduceOverlay");
+  scoped_refptr<gl::GLImage> gl_image = GetGLImage();
+  // Lazily create a GL image if it wasn't provided on initialization. There's
+  // no need to bind to a GL texture since the image is only used for overlay.
+  if (!gl_image) {
+    const auto internal_format = viz::GLInternalFormat(format());
+    const auto data_type = viz::GLDataType(format());
+    gl_image = base::MakeRefCounted<gl::GLImageD3D>(
+        size(), internal_format, data_type, color_space(), d3d11_texture_,
+        array_slice_, plane_index_, swap_chain_);
+  }
   return std::make_unique<OverlayD3DImageRepresentation>(manager, this, tracker,
-                                                         GetGLImage());
+                                                         std::move(gl_image));
 }
 
 }  // namespace gpu
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing.h b/gpu/command_buffer/service/shared_image/d3d_image_backing.h
index e82b447..c0e1d6b 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing.h
@@ -42,6 +42,24 @@
 class GPU_GLES2_EXPORT D3DImageBacking
     : public ClearTrackingSharedImageBacking {
  public:
+  // Create a backing wrapping given D3D11 texture, optionally with a shared
+  // handle and keyed mutex state. Array slice is used to specify index in
+  // texture array used by video decoder and plane index is used to specify the
+  // plane (Y/0 or UV/1) in NV12/P010 video textures.
+  static std::unique_ptr<D3DImageBacking> Create(
+      const Mailbox& mailbox,
+      viz::ResourceFormat format,
+      const gfx::Size& size,
+      const gfx::ColorSpace& color_space,
+      GrSurfaceOrigin surface_origin,
+      SkAlphaType alpha_type,
+      uint32_t usage,
+      Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
+      scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state = nullptr,
+      GLenum texture_target = GL_TEXTURE_2D,
+      size_t array_slice = 0u,
+      size_t plane_index = 0u);
+
   static std::unique_ptr<D3DImageBacking> CreateFromSwapChainBuffer(
       const Mailbox& mailbox,
       viz::ResourceFormat format,
@@ -54,17 +72,6 @@
       Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain,
       bool is_back_buffer);
 
-  static std::unique_ptr<D3DImageBacking> CreateFromDXGISharedHandle(
-      const Mailbox& mailbox,
-      viz::ResourceFormat format,
-      const gfx::Size& size,
-      const gfx::ColorSpace& color_space,
-      GrSurfaceOrigin surface_origin,
-      SkAlphaType alpha_type,
-      uint32_t usage,
-      Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
-      scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state);
-
   // TODO(sunnyps): Remove this after migrating DXVA decoder to EGLImage.
   static std::unique_ptr<D3DImageBacking> CreateFromGLTexture(
       const Mailbox& mailbox,
@@ -77,6 +84,7 @@
       Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
       scoped_refptr<gles2::TexturePassthrough> gl_texture);
 
+  // Helper used by D3D11VideoDecoder to create backings directly.
   static std::vector<std::unique_ptr<SharedImageBacking>>
   CreateFromVideoTexture(
       base::span<const Mailbox> mailboxes,
@@ -87,16 +95,6 @@
       unsigned array_slice,
       scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state = nullptr);
 
-  static std::unique_ptr<D3DImageBacking> CreateForSharedMemory(
-      const Mailbox& mailbox,
-      viz::ResourceFormat format,
-      const gfx::Size& size,
-      const gfx::ColorSpace& color_space,
-      GrSurfaceOrigin surface_origin,
-      SkAlphaType alpha_type,
-      uint32_t usage,
-      Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture);
-
   D3DImageBacking(const D3DImageBacking&) = delete;
   D3DImageBacking& operator=(const D3DImageBacking&) = delete;
 
@@ -158,7 +156,10 @@
       uint32_t usage,
       Microsoft::WRL::ComPtr<ID3D11Texture2D> d3d11_texture,
       scoped_refptr<gles2::TexturePassthrough> gl_texture,
-      scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state = {},
+      scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state = nullptr,
+      GLenum texture_target = GL_TEXTURE_2D,
+      size_t array_slice = 0u,
+      size_t plane_index = 0u,
       Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = nullptr,
       bool is_back_buffer = false);
 
@@ -180,6 +181,16 @@
   // backings created from duplicated handles that refer to the same texture.
   scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state_;
 
+  // GL texture target. Can be GL_TEXTURE_2D or GL_TEXTURE_EXTERNAL_OES.
+  // TODO(sunnyps): Switch to GL_TEXTURE_2D for all cases.
+  GLenum texture_target_;
+
+  // Index of texture slice in texture array e.g. those used by video decoder.
+  const size_t array_slice_;
+
+  // Texture plane index corresponding to this image.
+  const size_t plane_index_;
+
   // Swap chain corresponding to this backing.
   Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain_;
 
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
index b68c367..692701b3 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.cc
@@ -9,10 +9,12 @@
 #include "base/memory/shared_memory_mapping.h"
 #include "base/win/scoped_handle.h"
 #include "components/viz/common/resources/resource_format_utils.h"
+#include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
 #include "gpu/command_buffer/common/shared_image_usage.h"
 #include "gpu/command_buffer/service/dxgi_shared_handle_manager.h"
 #include "gpu/command_buffer/service/shared_image/d3d_image_backing.h"
 #include "ui/gfx/buffer_format_util.h"
+#include "ui/gfx/buffer_types.h"
 #include "ui/gl/direct_composition_support.h"
 #include "ui/gl/gl_angle_util_win.h"
 #include "ui/gl/gl_bindings.h"
@@ -82,7 +84,6 @@
     case gfx::BufferFormat::YUV_420_BIPLANAR:
       return DXGI_FORMAT_NV12;
     default:
-      NOTREACHED();
       return DXGI_FORMAT_UNKNOWN;
   }
 }
@@ -370,9 +371,9 @@
 
   if (is_shm_gmb) {
     // Early return before creating DXGI keyed mutex.
-    return D3DImageBacking::CreateForSharedMemory(
-        mailbox, format, size, color_space, surface_origin, alpha_type, usage,
-        std::move(d3d11_texture));
+    return D3DImageBacking::Create(mailbox, format, size, color_space,
+                                   surface_origin, alpha_type, usage,
+                                   std::move(d3d11_texture));
   }
 
   Microsoft::WRL::ComPtr<IDXGIResource1> dxgi_resource;
@@ -397,7 +398,7 @@
       dxgi_shared_handle_manager_->CreateAnonymousSharedHandleState(
           base::win::ScopedHandle(shared_handle), d3d11_texture);
 
-  return D3DImageBacking::CreateFromDXGISharedHandle(
+  return D3DImageBacking::Create(
       mailbox, format, size, color_space, surface_origin, alpha_type, usage,
       std::move(d3d11_texture), std::move(dxgi_shared_handle_state));
 }
@@ -428,12 +429,17 @@
     SkAlphaType alpha_type,
     uint32_t usage) {
   DCHECK_EQ(handle.type, gfx::DXGI_SHARED_HANDLE);
+  DCHECK_NE(GetDXGIFormat(format), DXGI_FORMAT_UNKNOWN);
 
-  if (plane != gfx::BufferPlane::DEFAULT) {
-    LOG(ERROR) << "Invalid plane " << gfx::BufferPlaneToString(plane);
+  if (!IsPlaneValidForGpuMemoryBufferFormat(plane, format)) {
+    LOG(ERROR) << "Invalid plane " << gfx::BufferPlaneToString(plane)
+               << " for format " << gfx::BufferFormatToString(format);
     return nullptr;
   }
 
+  DCHECK(plane == gfx::BufferPlane::DEFAULT || plane == gfx::BufferPlane::Y ||
+         plane == gfx::BufferPlane::UV);
+
   scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state =
       ValidateAndOpenSharedHandle(dxgi_shared_handle_manager_.get(),
                                   std::move(handle), format, size);
@@ -442,41 +448,25 @@
 
   auto d3d11_texture = dxgi_shared_handle_state->d3d11_texture();
 
-  auto backing = D3DImageBacking::CreateFromDXGISharedHandle(
-      mailbox, viz::GetResourceFormat(format), size, color_space,
-      surface_origin, alpha_type, usage, std::move(d3d11_texture),
-      std::move(dxgi_shared_handle_state));
+  const gfx::Size plane_size = GetPlaneSize(plane, size);
+  const viz::ResourceFormat plane_format =
+      viz::GetResourceFormat(GetPlaneBufferFormat(plane, format));
+  // TODO(sunnyps): Use GL_TEXTURE_2D for all cases since it's allowed by ANGLE.
+  const GLenum texture_target = plane == gfx::BufferPlane::DEFAULT
+                                    ? GL_TEXTURE_2D
+                                    : GL_TEXTURE_EXTERNAL_OES;
+  const size_t plane_index = plane == gfx::BufferPlane::UV ? 1 : 0;
+
+  auto backing = D3DImageBacking::Create(
+      mailbox, plane_format, plane_size, color_space, surface_origin,
+      alpha_type, usage, std::move(d3d11_texture),
+      std::move(dxgi_shared_handle_state), texture_target, /*array_slice=*/0u,
+      /*plane_index=*/plane_index);
   if (backing)
     backing->SetCleared();
   return backing;
 }
 
-std::vector<std::unique_ptr<SharedImageBacking>>
-D3DImageBackingFactory::CreateSharedImageVideoPlanes(
-    base::span<const Mailbox> mailboxes,
-    gfx::GpuMemoryBufferHandle handle,
-    gfx::BufferFormat format,
-    const gfx::Size& size,
-    uint32_t usage) {
-  // Only supports NV12 for now.
-  if (format != gfx::BufferFormat::YUV_420_BIPLANAR) {
-    LOG(ERROR) << "Unsupported format: " << gfx::BufferFormatToString(format);
-    return {};
-  }
-
-  scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state =
-      ValidateAndOpenSharedHandle(dxgi_shared_handle_manager_.get(),
-                                  std::move(handle), format, size);
-  if (!dxgi_shared_handle_state)
-    return {};
-
-  auto d3d11_texture = dxgi_shared_handle_state->d3d11_texture();
-
-  return D3DImageBacking::CreateFromVideoTexture(
-      mailboxes, GetDXGIFormat(format), size, usage, std::move(d3d11_texture),
-      /*array_slice=*/0, std::move(dxgi_shared_handle_state));
-}
-
 bool D3DImageBackingFactory::UseMapOnDefaultTextures() {
   if (!map_on_default_textures_.has_value()) {
     D3D11_FEATURE_DATA_D3D11_OPTIONS2 features;
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.h b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.h
index 14f0851..0cda07b 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.h
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory.h
@@ -103,12 +103,6 @@
       GrSurfaceOrigin surface_origin,
       SkAlphaType alpha_type,
       uint32_t usage) override;
-  std::vector<std::unique_ptr<SharedImageBacking>> CreateSharedImageVideoPlanes(
-      base::span<const Mailbox> mailboxes,
-      gfx::GpuMemoryBufferHandle handle,
-      gfx::BufferFormat format,
-      const gfx::Size& size,
-      uint32_t usage) override;
 
   bool IsSupported(uint32_t usage,
                    viz::ResourceFormat format,
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
index 0bb21bd..149438f 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
@@ -1330,7 +1330,7 @@
     hr = d3d11_texture.As(&dxgi_resource);
     DCHECK_EQ(hr, S_OK);
 
-    HANDLE handle;
+    HANDLE handle = nullptr;
     hr = dxgi_resource->CreateSharedHandle(
         nullptr, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE,
         nullptr, &handle);
@@ -1338,7 +1338,7 @@
       return {};
 
     shared_handle.Set(handle);
-    DCHECK(shared_handle.IsValid());
+    DCHECK(shared_handle.is_valid());
 
     usage |= gpu::SHARED_IMAGE_USAGE_WEBGPU;
   }
@@ -1347,15 +1347,42 @@
   const gpu::Mailbox mailboxes[kNumPlanes] = {
       gpu::Mailbox::GenerateForSharedImage(),
       gpu::Mailbox::GenerateForSharedImage()};
+  const gfx::BufferPlane planes[kNumPlanes] = {gfx::BufferPlane::Y,
+                                               gfx::BufferPlane::UV};
+
   std::vector<std::unique_ptr<SharedImageBacking>> shared_image_backings;
   if (use_factory) {
-    gfx::GpuMemoryBufferHandle gmb_handle;
-    gmb_handle.type = gfx::DXGI_SHARED_HANDLE;
-    gmb_handle.dxgi_handle = std::move(shared_handle);
-    gmb_handle.dxgi_token = gfx::DXGIHandleToken();
-    shared_image_backings = shared_image_factory_->CreateSharedImageVideoPlanes(
-        mailboxes, std::move(gmb_handle), gfx::BufferFormat::YUV_420_BIPLANAR,
-        size, usage);
+    HANDLE dup_handle = nullptr;
+    if (!::DuplicateHandle(::GetCurrentProcess(), shared_handle.get(),
+                           ::GetCurrentProcess(), &dup_handle, 0, false,
+                           DUPLICATE_SAME_ACCESS)) {
+      return {};
+    }
+
+    gfx::GpuMemoryBufferHandle gmb_handles[kNumPlanes];
+
+    gmb_handles[0].type = gfx::DXGI_SHARED_HANDLE;
+    gmb_handles[1].type = gfx::DXGI_SHARED_HANDLE;
+
+    gmb_handles[0].dxgi_handle = std::move(shared_handle);
+    DCHECK(gmb_handles[0].dxgi_handle.IsValid());
+
+    gmb_handles[1].dxgi_handle.Set(dup_handle);
+    DCHECK(gmb_handles[1].dxgi_handle.IsValid());
+
+    gmb_handles[0].dxgi_token = gfx::DXGIHandleToken();
+    gmb_handles[1].dxgi_token = gmb_handles[0].dxgi_token;
+
+    for (size_t plane = 0; plane < kNumPlanes; plane++) {
+      auto backing = shared_image_factory_->CreateSharedImage(
+          mailboxes[plane], 0, std::move(gmb_handles[plane]),
+          gfx::BufferFormat::YUV_420_BIPLANAR, planes[plane],
+          kNullSurfaceHandle, size, gfx::ColorSpace(), kTopLeft_GrSurfaceOrigin,
+          kPremul_SkAlphaType, usage);
+      if (!backing)
+        return {};
+      shared_image_backings.push_back(std::move(backing));
+    }
   } else {
     scoped_refptr<DXGISharedHandleState> dxgi_shared_handle_state;
     if (use_shared_handle) {
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 842b16b..decd9f2 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -4370,7 +4370,6 @@
     projects {
       name: "chromium/src"
       ref_regexp: "refs/branch-heads/.*"
-      ref_regexp_exclude: "refs/branch-heads/4664"
       ref_regexp_exclude: "refs/branch-heads/4692"
       ref_regexp_exclude: "refs/branch-heads/4896"
       ref_regexp_exclude: "refs/branch-heads/5005"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 58c00942..f0b9c9f 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -74016,6 +74016,10 @@
         value: 100
       }
       experiments {
+        key: "weetbix.enable_weetbix_exonerations"
+        value: 100
+      }
+      experiments {
         key: "weetbix.retry_weak_exonerations"
         value: 100
       }
@@ -75736,6 +75740,10 @@
         value: 100
       }
       experiments {
+        key: "weetbix.enable_weetbix_exonerations"
+        value: 100
+      }
+      experiments {
         key: "weetbix.retry_weak_exonerations"
         value: 100
       }
@@ -76596,6 +76604,10 @@
         value: 100
       }
       experiments {
+        key: "weetbix.enable_weetbix_exonerations"
+        value: 100
+      }
+      experiments {
         key: "weetbix.retry_weak_exonerations"
         value: 100
       }
@@ -77838,6 +77850,10 @@
         value: 100
       }
       experiments {
+        key: "weetbix.enable_weetbix_exonerations"
+        value: 100
+      }
+      experiments {
         key: "weetbix.retry_weak_exonerations"
         value: 100
       }
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 7f89228..32ce8474 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -850,10 +850,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -1619,10 +1615,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -2132,10 +2124,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -2495,10 +2483,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -3219,10 +3203,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -3563,10 +3543,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -4180,10 +4156,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -4602,10 +4574,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -5015,10 +4983,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -5466,10 +5430,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -6034,10 +5994,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -6507,10 +6463,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -6892,10 +6844,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -7285,10 +7233,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -7782,10 +7726,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -8720,10 +8660,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -9155,10 +9091,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -9564,10 +9496,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -9968,10 +9896,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -10629,10 +10553,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -11047,10 +10967,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -11480,10 +11396,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -11938,10 +11850,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -12306,10 +12214,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -12764,10 +12668,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -13123,10 +13023,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -13506,10 +13402,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -13994,10 +13886,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -14372,10 +14260,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -14791,10 +14675,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -15189,10 +15069,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -15598,10 +15474,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -15940,10 +15812,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
@@ -16296,10 +16164,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m96"
-        url: "/p/chromium-m96/g/main/console"
-      }
-      links {
         text: "m97"
         url: "/p/chromium-m97/g/main/console"
       }
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index b4edb37..d948a02 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -407,7 +407,6 @@
     principals: "project:chromium-m105"
     principals: "project:chromium-m106"
     principals: "project:chromium-m107"
-    principals: "project:chromium-m96"
     principals: "project:chromium-m97"
     principals: "user:chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
     principals: "user:findit-for-me@appspot.gserviceaccount.com"
@@ -461,7 +460,6 @@
     principals: "project:chromium-m105"
     principals: "project:chromium-m106"
     principals: "project:chromium-m107"
-    principals: "project:chromium-m96"
     principals: "project:chromium-m97"
     principals: "user:chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
     principals: "user:infra-try-recipes-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/milestones.json b/infra/config/milestones.json
index 28dac47..65661c9 100644
--- a/infra/config/milestones.json
+++ b/infra/config/milestones.json
@@ -1,9 +1,4 @@
 {
-    "96": {
-        "name": "m96",
-        "project": "chromium-m96",
-        "ref": "refs/branch-heads/4664"
-    },
     "97": {
         "name": "m97",
         "project": "chromium-m97",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index ebf1bda5..3054f739 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -212,6 +212,7 @@
     experiments = {
         "enable_weetbix_queries": 100,
         "weetbix.retry_weak_exonerations": 100,
+        "weetbix.enable_weetbix_exonerations": 100,
     },
 )
 
@@ -310,6 +311,7 @@
     experiments = {
         "enable_weetbix_queries": 100,
         "weetbix.retry_weak_exonerations": 100,
+        "weetbix.enable_weetbix_exonerations": 100,
     },
 )
 
@@ -373,6 +375,7 @@
         "remove_src_checkout_experiment": 100,
         "enable_weetbix_queries": 100,
         "weetbix.retry_weak_exonerations": 100,
+        "weetbix.enable_weetbix_exonerations": 100,
     },
     use_orchestrator_pool = True,
 )
@@ -535,6 +538,7 @@
         "remove_src_checkout_experiment": 100,
         "enable_weetbix_queries": 100,
         "weetbix.retry_weak_exonerations": 100,
+        "weetbix.enable_weetbix_exonerations": 100,
     },
     use_orchestrator_pool = True,
 )
diff --git a/ios/chrome/browser/autofill/form_structure_browsertest.mm b/ios/chrome/browser/autofill/form_structure_browsertest.mm
index ed10b46..36597bd 100644
--- a/ios/chrome/browser/autofill/form_structure_browsertest.mm
+++ b/ios/chrome/browser/autofill/form_structure_browsertest.mm
@@ -199,28 +199,34 @@
   feature_list_.InitWithFeatures(
       // Enabled
       {// TODO(crbug.com/1098943): Remove once experiment is over.
-       autofill::features::kAutofillEnableSupportForMoreStructureInNames,
+       features::kAutofillEnableSupportForMoreStructureInNames,
        // TODO(crbug.com/1125978): Remove once launched.
-       autofill::features::kAutofillEnableSupportForMoreStructureInAddresses,
+       features::kAutofillEnableSupportForMoreStructureInAddresses,
        // TODO(crbug.com/1076175) Remove once launched.
-       autofill::features::kAutofillUseNewSectioningMethod,
+       features::kAutofillUseNewSectioningMethod,
        // TODO(crbug.com/1150890) Remove once launched
-       autofill::features::kAutofillEnableAugmentedPhoneCountryCode,
+       features::kAutofillEnableAugmentedPhoneCountryCode,
        // TODO(crbug.com/1157405) Remove once launched.
-       autofill::features::kAutofillEnableDependentLocalityParsing,
+       features::kAutofillEnableDependentLocalityParsing,
        // TODO(crbug.com/1165780): Remove once shared labels are launched.
-       autofill::features::kAutofillEnableSupportForParsingWithSharedLabels,
+       features::kAutofillEnableSupportForParsingWithSharedLabels,
        // TODO(crbug.com/1150895) Remove once launched.
-       autofill::features::kAutofillParsingPatternProvider,
-       autofill::features::kAutofillPageLanguageDetection,
+       features::kAutofillParsingPatternProvider,
+       features::kAutofillPageLanguageDetection,
        // TODO(crbug.com/1277480): Remove once launched.
-       autofill::features::kAutofillEnableNameSurenameParsing,
+       features::kAutofillEnableNameSurenameParsing,
        // TODO(crbug.com/1190334): Remove once launched.
        autofill::features::kAutofillParseMerchantPromoCodeFields,
        // TODO(crbug.com/1335549): Remove once launched.
-       autofill::features::kAutofillParseIBANFields},
+       features::kAutofillParseIBANFields,
+       // TODO(crbug.com/1311937): Remove once launched.
+       features::kAutofillEnableSupportForPhoneNumberTrunkTypes,
+       features::kAutofillInferCountryCallingCode},
       // Disabled
-      {});
+      // TODO(crbug.com/1311937): Remove once launched.
+      // This feature is part of the AutofillRefinedPhoneNumberTypes rollout. As
+      // it is not supported on iOS yet, it is disabled.
+      {features::kAutofillConsiderPhoneNumberSeparatorsValidLabels});
 }
 
 void FormStructureBrowserTest::SetUp() {
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler_unittest.mm
index a9fdd0d..e577773 100644
--- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler_unittest.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/common/infobar_banner_interaction_handler.h"
 
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h"
 #import "ios/chrome/browser/infobars/test/fake_infobar_ios.h"
@@ -28,7 +29,8 @@
     web_state_.SetNavigationManager(
         std::make_unique<web::FakeNavigationManager>());
     InfoBarManagerImpl::CreateForWebState(&web_state_);
-    InfobarOverlayRequestInserter::CreateForWebState(&web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        &web_state_, &DefaultInfobarOverlayRequestFactory);
 
     std::unique_ptr<InfoBarIOS> infobar = std::make_unique<InfoBarIOS>(
         InfobarType::kInfobarTypePasswordSave,
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm/confirm_infobar_banner_interaction_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm/confirm_infobar_banner_interaction_handler_unittest.mm
index f96c719..cb54ffd 100644
--- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm/confirm_infobar_banner_interaction_handler_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/confirm/confirm_infobar_banner_interaction_handler_unittest.mm
@@ -6,6 +6,7 @@
 
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/infobars/infobar_type.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/test/fake_infobar_ios.h"
 #import "ios/chrome/browser/infobars/test/mock_infobar_delegate.h"
@@ -24,7 +25,8 @@
   ConfirmInfobarBannerInteractionHandlerTest() {
     web_state_.SetNavigationManager(
         std::make_unique<web::FakeNavigationManager>());
-    InfobarOverlayRequestInserter::CreateForWebState(&web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        &web_state_, &DefaultInfobarOverlayRequestFactory);
     InfoBarManagerImpl::CreateForWebState(&web_state_);
 
     std::unique_ptr<InfoBarIOS> infobar =
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_banner_interaction_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_banner_interaction_handler_unittest.mm
index 0f7ac94..2991711 100644
--- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_banner_interaction_handler_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_banner_interaction_handler_unittest.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/passwords/password_infobar_banner_interaction_handler.h"
 
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h"
 #import "ios/chrome/browser/infobars/test/fake_infobar_ios.h"
@@ -27,7 +28,8 @@
             SavePasswordInfobarBannerOverlayRequestConfig::RequestSupport()) {
     web_state_.SetNavigationManager(
         std::make_unique<web::FakeNavigationManager>());
-    InfobarOverlayRequestInserter::CreateForWebState(&web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        &web_state_, &DefaultInfobarOverlayRequestFactory);
     InfoBarManagerImpl::CreateForWebState(&web_state_);
     std::unique_ptr<InfoBarIOS> infobar = std::make_unique<InfoBarIOS>(
         InfobarType::kInfobarTypePasswordSave,
diff --git a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/tailored_security/tailored_security_infobar_banner_interaction_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/tailored_security/tailored_security_infobar_banner_interaction_handler_unittest.mm
index c8a30fa1..6993756 100644
--- a/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/tailored_security/tailored_security_infobar_banner_interaction_handler_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/tailored_security/tailored_security_infobar_banner_interaction_handler_unittest.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/infobars/overlays/browser_agent/interaction_handlers/tailored_security/tailored_security_infobar_banner_interaction_handler.h"
 
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/test/fake_infobar_ios.h"
 #import "ios/chrome/browser/overlays/public/infobar_banner/tailored_security_service_infobar_banner_overlay_request_config.h"
@@ -27,7 +28,8 @@
                 TailoredSecurityServiceBannerRequestConfig::RequestSupport()) {
     web_state_.SetNavigationManager(
         std::make_unique<web::FakeNavigationManager>());
-    InfobarOverlayRequestInserter::CreateForWebState(&web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        &web_state_, &DefaultInfobarOverlayRequestFactory);
     InfoBarManagerImpl::CreateForWebState(&web_state_);
     std::unique_ptr<InfoBarIOS> infobar = std::make_unique<InfoBarIOS>(
         InfobarType::kInfobarTypeTailoredSecurityService,
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h
index 58c9eace9..1bd2076 100644
--- a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h
+++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h
@@ -49,12 +49,6 @@
 class InfobarOverlayRequestInserter
     : public web::WebStateUserData<InfobarOverlayRequestInserter> {
  public:
-  // Creates an inserter for `web_state` that uses `request_factory` to create
-  // inserted requests.
-  static void CreateForWebState(
-      web::WebState* web_state,
-      InfobarOverlayRequestFactory request_factory = nullptr);
-
   ~InfobarOverlayRequestInserter() override;
 
   // Creates an OverlayRequest with `params` configurations.
@@ -85,8 +79,8 @@
   WEB_STATE_USER_DATA_KEY_DECL();
 
   // Constructor for an inserter that uses `factory` to construct
-  // OverlayRequests to insert into `web_state`'s OverlayRequestQueues.  Both
-  // `web_state` and `factory` must be non-null.
+  // OverlayRequests to insert into `web_state`'s OverlayRequestQueues.
+  // Both `web_state` and `factory` must be non-null.
   InfobarOverlayRequestInserter(web::WebState* web_state,
                                 InfobarOverlayRequestFactory factory);
 
diff --git a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm
index 4ac982b..901e004 100644
--- a/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm
+++ b/ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.mm
@@ -7,7 +7,6 @@
 #import "base/check_op.h"
 #import "base/memory/ptr_util.h"
 #import "ios/chrome/browser/infobars/infobar_ios.h"
-#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_banner_overlay_request_cancel_handler.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_modal_completion_notifier.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_modal_overlay_request_cancel_handler.h"
@@ -25,21 +24,6 @@
 
 WEB_STATE_USER_DATA_KEY_IMPL(InfobarOverlayRequestInserter)
 
-// static
-void InfobarOverlayRequestInserter::CreateForWebState(
-    web::WebState* web_state,
-    InfobarOverlayRequestFactory request_factory) {
-  DCHECK(web_state);
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(
-        UserDataKey(),
-        base::WrapUnique(new InfobarOverlayRequestInserter(
-            web_state, request_factory
-                           ? request_factory
-                           : &DefaultInfobarOverlayRequestFactory)));
-  }
-}
-
 InsertParams::InsertParams(InfoBarIOS* infobar) : infobar(infobar) {}
 
 InfobarOverlayRequestInserter::InfobarOverlayRequestInserter(
diff --git a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm
index ae27788..4fcb7a9 100644
--- a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm
@@ -11,6 +11,7 @@
 #import "components/infobars/core/infobar_manager.h"
 #import "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/permissions_overlay_infobar_delegate.h"
 #import "ios/web/common/features.h"
@@ -39,7 +40,8 @@
     web_state_.SetNavigationManager(
         std::make_unique<web::FakeNavigationManager>());
     InfoBarManagerImpl::CreateForWebState(&web_state_);
-    InfobarOverlayRequestInserter::CreateForWebState(&web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        &web_state_, &DefaultInfobarOverlayRequestFactory);
     PermissionsOverlayTabHelper::CreateForWebState(&web_state_);
   }
 
diff --git a/ios/chrome/browser/infobars/overlays/translate_infobar_placeholder_overlay_request_cancel_handler_unittest.mm b/ios/chrome/browser/infobars/overlays/translate_infobar_placeholder_overlay_request_cancel_handler_unittest.mm
index 362c209..3b48899bf 100644
--- a/ios/chrome/browser/infobars/overlays/translate_infobar_placeholder_overlay_request_cancel_handler_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/translate_infobar_placeholder_overlay_request_cancel_handler_unittest.mm
@@ -9,6 +9,7 @@
 #import "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/infobars/infobar_type.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/fake_translate_overlay_tab_helper.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h"
@@ -50,7 +51,8 @@
                                                 WebStateList::INSERT_ACTIVATE,
                                                 WebStateOpener());
     InfoBarManagerImpl::CreateForWebState(web_state_);
-    InfobarOverlayRequestInserter::CreateForWebState(web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        web_state_, &DefaultInfobarOverlayRequestFactory);
     FakeTranslateOverlayTabHelper::CreateForWebState(web_state_);
 
     // Set up the OverlayPresenter's presentation context so that presentation
diff --git a/ios/chrome/browser/infobars/overlays/translate_overlay_tab_helper_unittest.mm b/ios/chrome/browser/infobars/overlays/translate_overlay_tab_helper_unittest.mm
index 8cfdc4d..1ea74f16 100644
--- a/ios/chrome/browser/infobars/overlays/translate_overlay_tab_helper_unittest.mm
+++ b/ios/chrome/browser/infobars/overlays/translate_overlay_tab_helper_unittest.mm
@@ -6,6 +6,7 @@
 
 #import "ios/chrome/browser/infobars/infobar_ios.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h"
 #import "ios/chrome/browser/infobars/test/fake_infobar_ios.h"
@@ -50,7 +51,8 @@
     web_state_.SetNavigationManager(
         std::make_unique<web::FakeNavigationManager>());
     InfoBarManagerImpl::CreateForWebState(&web_state_);
-    InfobarOverlayRequestInserter::CreateForWebState(&web_state_);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        &web_state_, &DefaultInfobarOverlayRequestFactory);
     TranslateOverlayTabHelper::CreateForWebState(&web_state_);
 
     std::unique_ptr<FakeTranslateInfoBarDelegate> delegate =
diff --git a/ios/chrome/browser/main/browser_util_unittest.mm b/ios/chrome/browser/main/browser_util_unittest.mm
index 97576b4..65ebdf8 100644
--- a/ios/chrome/browser/main/browser_util_unittest.mm
+++ b/ios/chrome/browser/main/browser_util_unittest.mm
@@ -59,8 +59,7 @@
   web::FakeWebState* AppendNewWebState(Browser* browser) {
     auto fake_web_state = std::make_unique<web::FakeWebState>();
     web::FakeWebState* inserted_web_state = fake_web_state.get();
-    NSString* tab_id = inserted_web_state->GetStableIdentifier();
-    SnapshotTabHelper::CreateForWebState(inserted_web_state, tab_id);
+    SnapshotTabHelper::CreateForWebState(inserted_web_state);
     browser->GetWebStateList()->InsertWebState(
         WebStateList::kInvalidIndex, std::move(fake_web_state),
         WebStateList::INSERT_ACTIVATE, WebStateOpener());
diff --git a/ios/chrome/browser/passwords/password_tab_helper.h b/ios/chrome/browser/passwords/password_tab_helper.h
index 8f246946..ae0bb0c 100644
--- a/ios/chrome/browser/passwords/password_tab_helper.h
+++ b/ios/chrome/browser/passwords/password_tab_helper.h
@@ -34,9 +34,6 @@
 
   ~PasswordTabHelper() override;
 
-  // Creates a PasswordTabHelper and attaches it to the given `web_state`.
-  static void CreateForWebState(web::WebState* web_state);
-
   // Sets the BaseViewController from which to present UI.
   void SetBaseViewController(UIViewController* baseViewController);
 
diff --git a/ios/chrome/browser/passwords/password_tab_helper.mm b/ios/chrome/browser/passwords/password_tab_helper.mm
index 052f0a65..4efd4e1 100644
--- a/ios/chrome/browser/passwords/password_tab_helper.mm
+++ b/ios/chrome/browser/passwords/password_tab_helper.mm
@@ -20,15 +20,6 @@
 
 PasswordTabHelper::~PasswordTabHelper() = default;
 
-// static
-void PasswordTabHelper::CreateForWebState(web::WebState* web_state) {
-  DCHECK(web_state);
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(UserDataKey(),
-                           base::WrapUnique(new PasswordTabHelper(web_state)));
-  }
-}
-
 void PasswordTabHelper::SetBaseViewController(
     UIViewController* baseViewController) {
   controller_.baseViewController = baseViewController;
diff --git a/ios/chrome/browser/reading_list/offline_page_tab_helper.h b/ios/chrome/browser/reading_list/offline_page_tab_helper.h
index 1e2dd66..539c04d 100644
--- a/ios/chrome/browser/reading_list/offline_page_tab_helper.h
+++ b/ios/chrome/browser/reading_list/offline_page_tab_helper.h
@@ -35,9 +35,6 @@
                              public web::WebStateObserver,
                              ReadingListModelObserver {
  public:
-  // Creates TabHelper. `web_state` and `model` must not be null.
-  static void CreateForWebState(web::WebState* web_state,
-                                ReadingListModel* model);
   ~OfflinePageTabHelper() override;
 
   // Returns true if distilled version is currently being presented.
diff --git a/ios/chrome/browser/reading_list/offline_page_tab_helper.mm b/ios/chrome/browser/reading_list/offline_page_tab_helper.mm
index e84305a..39313fa 100644
--- a/ios/chrome/browser/reading_list/offline_page_tab_helper.mm
+++ b/ios/chrome/browser/reading_list/offline_page_tab_helper.mm
@@ -83,16 +83,6 @@
 }
 }
 
-// static
-void OfflinePageTabHelper::CreateForWebState(web::WebState* web_state,
-                                             ReadingListModel* model) {
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(
-        UserDataKey(),
-        base::WrapUnique(new OfflinePageTabHelper(web_state, model)));
-  }
-}
-
 OfflinePageTabHelper::OfflinePageTabHelper(web::WebState* web_state,
                                            ReadingListModel* model)
     : web_state_(web_state), reading_list_model_(model) {
diff --git a/ios/chrome/browser/reading_list/reading_list_web_state_observer.h b/ios/chrome/browser/reading_list/reading_list_web_state_observer.h
index 2dc982b..1011dab63 100644
--- a/ios/chrome/browser/reading_list/reading_list_web_state_observer.h
+++ b/ios/chrome/browser/reading_list/reading_list_web_state_observer.h
@@ -25,9 +25,6 @@
       public web::WebStateObserver,
       public web::WebStateUserData<ReadingListWebStateObserver> {
  public:
-  static void CreateForWebState(web::WebState* web_state,
-                                ReadingListModel* reading_list_model);
-
   ReadingListWebStateObserver(const ReadingListWebStateObserver&) = delete;
   ReadingListWebStateObserver& operator=(const ReadingListWebStateObserver&) =
       delete;
diff --git a/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm b/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm
index 9e78d60..3c33d212c 100644
--- a/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm
+++ b/ios/chrome/browser/reading_list/reading_list_web_state_observer.mm
@@ -23,18 +23,6 @@
 #error "This file requires ARC support."
 #endif
 
-// static
-void ReadingListWebStateObserver::CreateForWebState(
-    web::WebState* web_state,
-    ReadingListModel* reading_list_model) {
-  DCHECK(web_state);
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(UserDataKey(),
-                           base::WrapUnique(new ReadingListWebStateObserver(
-                               web_state, reading_list_model)));
-  }
-}
-
 ReadingListWebStateObserver::~ReadingListWebStateObserver() {
   if (reading_list_model_) {
     reading_list_model_->RemoveObserver(this);
diff --git a/ios/chrome/browser/snapshots/snapshot_tab_helper.h b/ios/chrome/browser/snapshots/snapshot_tab_helper.h
index 3242749..25a16de 100644
--- a/ios/chrome/browser/snapshots/snapshot_tab_helper.h
+++ b/ios/chrome/browser/snapshots/snapshot_tab_helper.h
@@ -29,11 +29,6 @@
 
   ~SnapshotTabHelper() override;
 
-  // Creates the tab helper for `web_state` if it does not exists. The
-  // unique identifier `tab_id` is used when interacting with the
-  // cache to save or fetch snapshots.
-  static void CreateForWebState(web::WebState* web_state, NSString* tab_id);
-
   // Sets the delegate. Capturing snapshot before setting a delegate will
   // results in failures. The delegate is not owned by the tab helper.
   void SetDelegate(id<SnapshotGeneratorDelegate> delegate);
@@ -84,7 +79,7 @@
  private:
   friend class web::WebStateUserData<SnapshotTabHelper>;
 
-  SnapshotTabHelper(web::WebState* web_state, NSString* tab_id);
+  explicit SnapshotTabHelper(web::WebState* web_state);
 
   // web::WebStateObserver implementation.
   void PageLoaded(
@@ -93,7 +88,6 @@
   void WebStateDestroyed(web::WebState* web_state) override;
 
   web::WebState* web_state_ = nullptr;
-  NSString* tab_id_ = nil;
   SnapshotGenerator* snapshot_generator_ = nil;
 
   // Manages this object as an observer of `web_state_`.
diff --git a/ios/chrome/browser/snapshots/snapshot_tab_helper.mm b/ios/chrome/browser/snapshots/snapshot_tab_helper.mm
index 5ff3413..65a8cb7 100644
--- a/ios/chrome/browser/snapshots/snapshot_tab_helper.mm
+++ b/ios/chrome/browser/snapshots/snapshot_tab_helper.mm
@@ -7,11 +7,11 @@
 #import "base/bind.h"
 #import "base/memory/ptr_util.h"
 #import "base/metrics/histogram_macros.h"
+#import "base/threading/sequenced_task_runner_handle.h"
 #import "ios/chrome/browser/snapshots/snapshot_cache.h"
 #import "ios/chrome/browser/snapshots/snapshot_generator.h"
 #import "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/web/public/thread/web_task_traits.h"
-#import "ios/web/public/thread/web_thread.h"
 #import "ios/web/public/web_client.h"
 #import "ios/web/public/web_state.h"
 
@@ -41,17 +41,6 @@
   DCHECK(!web_state_);
 }
 
-// static
-void SnapshotTabHelper::CreateForWebState(web::WebState* web_state,
-                                          NSString* tab_id) {
-  DCHECK(web_state);
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(
-        UserDataKey(),
-        base::WrapUnique(new SnapshotTabHelper(web_state, tab_id)));
-  }
-}
-
 void SnapshotTabHelper::SetDelegate(id<SnapshotGeneratorDelegate> delegate) {
   snapshot_generator_.delegate = delegate;
 }
@@ -101,21 +90,22 @@
 }
 
 void SnapshotTabHelper::WillBeSavedGreyWhenBackgrounding() {
-  [snapshot_generator_.snapshotCache willBeSavedGreyWhenBackgrounding:tab_id_];
+  [snapshot_generator_.snapshotCache
+      willBeSavedGreyWhenBackgrounding:web_state_->GetStableIdentifier()];
 }
 
 void SnapshotTabHelper::SaveGreyInBackground() {
-  [snapshot_generator_.snapshotCache saveGreyInBackgroundForSnapshotID:tab_id_];
+  [snapshot_generator_.snapshotCache
+      saveGreyInBackgroundForSnapshotID:web_state_->GetStableIdentifier()];
 }
 
-SnapshotTabHelper::SnapshotTabHelper(web::WebState* web_state, NSString* tab_id)
-    : web_state_(web_state),
-      tab_id_([tab_id copy]),
-      weak_ptr_factory_(this) {
+SnapshotTabHelper::SnapshotTabHelper(web::WebState* web_state)
+    : web_state_(web_state), weak_ptr_factory_(this) {
   DCHECK(web_state_);
-  DCHECK(tab_id_.length > 0);
-  snapshot_generator_ = [[SnapshotGenerator alloc] initWithWebState:web_state_
-                                                              tabID:tab_id_];
+  DCHECK(web_state_->GetStableIdentifier().length > 0);
+  snapshot_generator_ = [[SnapshotGenerator alloc]
+      initWithWebState:web_state_
+                 tabID:web_state_->GetStableIdentifier()];
   web_state_observation_.Observe(web_state_);
 }
 
@@ -144,7 +134,7 @@
         break;
 
       bool was_loading = was_loading_during_last_snapshot_;
-      web::GetUIThreadTaskRunner({})->PostDelayedTask(
+      base::SequencedTaskRunnerHandle::Get()->PostDelayedTask(
           FROM_HERE,
           base::BindOnce(
               &SnapshotTabHelper::UpdateSnapshotWithCallback,
@@ -175,7 +165,6 @@
   DCHECK(web_state_observation_.IsObservingSource(web_state));
   web_state_observation_.Reset();
   web_state_ = nullptr;
-  tab_id_ = nil;
 }
 
 WEB_STATE_USER_DATA_KEY_IMPL(SnapshotTabHelper)
diff --git a/ios/chrome/browser/snapshots/snapshot_tab_helper_unittest.mm b/ios/chrome/browser/snapshots/snapshot_tab_helper_unittest.mm
index 8bf23fb..d3cf0df 100644
--- a/ios/chrome/browser/snapshots/snapshot_tab_helper_unittest.mm
+++ b/ios/chrome/browser/snapshots/snapshot_tab_helper_unittest.mm
@@ -85,9 +85,8 @@
  public:
   SnapshotTabHelperTest() {
     // Create the SnapshotTabHelper with a fake delegate.
-    snapshot_id_ = [[NSUUID UUID] UUIDString];
     delegate_ = [[TabHelperSnapshotGeneratorDelegate alloc] init];
-    SnapshotTabHelper::CreateForWebState(&web_state_, snapshot_id_);
+    SnapshotTabHelper::CreateForWebState(&web_state_);
     SnapshotTabHelper::FromWebState(&web_state_)->SetDelegate(delegate_);
 
     // Set custom snapshot cache.
@@ -112,7 +111,8 @@
   ~SnapshotTabHelperTest() override { [snapshot_cache_ shutdown]; }
 
   void SetCachedSnapshot(UIImage* image) {
-    [snapshot_cache_ setImage:image withSnapshotID:snapshot_id_];
+    [snapshot_cache_ setImage:image
+               withSnapshotID:web_state_.GetStableIdentifier()];
   }
 
   UIImage* GetCachedSnapshot() {
@@ -120,7 +120,7 @@
     base::RunLoop* run_loop_ptr = &run_loop;
 
     __block UIImage* snapshot = nil;
-    [snapshot_cache_ retrieveImageForSnapshotID:snapshot_id_
+    [snapshot_cache_ retrieveImageForSnapshotID:web_state_.GetStableIdentifier()
                                        callback:^(UIImage* cached_snapshot) {
                                          snapshot = cached_snapshot;
                                          run_loop_ptr->Quit();
@@ -135,7 +135,6 @@
   base::ScopedTempDir scoped_temp_directory_;
   TabHelperSnapshotGeneratorDelegate* delegate_ = nil;
   SnapshotCache* snapshot_cache_ = nil;
-  NSString* snapshot_id_ = nil;
   web::FakeWebState web_state_;
 };
 
@@ -351,9 +350,9 @@
   id partialMock = OCMPartialMock(snapshot_cache_);
   auto web_state = std::make_unique<web::FakeWebState>();
 
-  NSString* tab_id = web_state.get()->GetStableIdentifier();
-  SnapshotTabHelper::CreateForWebState(web_state.get(), tab_id);
-  [[partialMock reject] removeImageWithSnapshotID:tab_id];
+  SnapshotTabHelper::CreateForWebState(web_state.get());
+  [[partialMock reject]
+      removeImageWithSnapshotID:web_state.get()->GetStableIdentifier()];
 
   // Use @try/@catch as -reject raises an exception.
   @try {
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm
index c19cdd76..5ce8325 100644
--- a/ios/chrome/browser/tabs/tab_helper_util.mm
+++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -47,6 +47,7 @@
 #import "ios/chrome/browser/https_upgrades/typed_navigation_upgrade_tab_helper.h"
 #import "ios/chrome/browser/infobars/infobar_badge_tab_helper.h"
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h"
 #import "ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.h"
@@ -140,7 +141,8 @@
 
   InvalidUrlTabHelper::CreateForWebState(web_state);
 
-  InfobarOverlayRequestInserter::CreateForWebState(web_state);
+  InfobarOverlayRequestInserter::CreateForWebState(
+      web_state, &DefaultInfobarOverlayRequestFactory);
   InfobarOverlayTabHelper::CreateForWebState(web_state);
   TranslateOverlayTabHelper::CreateForWebState(web_state);
 
@@ -219,8 +221,7 @@
   // condition can be removed.
   if (!for_prerender) {
     SadTabTabHelper::CreateForWebState(web_state);
-    SnapshotTabHelper::CreateForWebState(web_state,
-                                         web_state->GetStableIdentifier());
+    SnapshotTabHelper::CreateForWebState(web_state);
     PagePlaceholderTabHelper::CreateForWebState(web_state);
     PrintTabHelper::CreateForWebState(web_state);
   }
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.h b/ios/chrome/browser/translate/chrome_ios_translate_client.h
index 82f7027..e1bac549 100644
--- a/ios/chrome/browser/translate/chrome_ios_translate_client.h
+++ b/ios/chrome/browser/translate/chrome_ios_translate_client.h
@@ -43,9 +43,6 @@
 
   ~ChromeIOSTranslateClient() override;
 
-  // Creates a translation client tab helper and attaches it to `web_state`
-  static void CreateForWebState(web::WebState* web_state);
-
   // Helper method to return a new TranslatePrefs instance.
   static std::unique_ptr<translate::TranslatePrefs> CreateTranslatePrefs(
       PrefService* prefs);
@@ -71,7 +68,6 @@
   bool IsAutofillAssistantRunning() const override;
 
  private:
-  ChromeIOSTranslateClient(web::WebState* web_state);
   friend class web::WebStateUserData<ChromeIOSTranslateClient>;
   FRIEND_TEST_ALL_PREFIXES(ChromeIOSTranslateClientTest,
                            NewMetricsOnPageLoadCommits);
@@ -80,6 +76,8 @@
   FRIEND_TEST_ALL_PREFIXES(ChromeIOSTranslateClientTest,
                            PageTranslationCorrectlyUpdatesMetrics);
 
+  explicit ChromeIOSTranslateClient(web::WebState* web_state);
+
   // web::WebStateObserver implementation.
   void DidStartNavigation(web::WebState* web_state,
                           web::NavigationContext* navigation_context) override;
diff --git a/ios/chrome/browser/translate/chrome_ios_translate_client.mm b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
index e4e241dd..089998b 100644
--- a/ios/chrome/browser/translate/chrome_ios_translate_client.mm
+++ b/ios/chrome/browser/translate/chrome_ios_translate_client.mm
@@ -42,16 +42,6 @@
 #error "This file requires ARC support."
 #endif
 
-// static
-void ChromeIOSTranslateClient::CreateForWebState(web::WebState* web_state) {
-  DCHECK(web_state);
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(
-        UserDataKey(),
-        base::WrapUnique(new ChromeIOSTranslateClient(web_state)));
-  }
-}
-
 ChromeIOSTranslateClient::ChromeIOSTranslateClient(web::WebState* web_state)
     : web_state_(web_state),
       translate_manager_(std::make_unique<translate::TranslateManager>(
diff --git a/ios/chrome/browser/ui/activity_services/data/chrome_activity_item_thumbnail_generator_unittest.mm b/ios/chrome/browser/ui/activity_services/data/chrome_activity_item_thumbnail_generator_unittest.mm
index d55b1ea..f725b6a 100644
--- a/ios/chrome/browser/ui/activity_services/data/chrome_activity_item_thumbnail_generator_unittest.mm
+++ b/ios/chrome/browser/ui/activity_services/data/chrome_activity_item_thumbnail_generator_unittest.mm
@@ -25,8 +25,7 @@
     CGRect frame = {CGPointZero, CGSizeMake(400, 300)};
     delegate_.view = [[UIView alloc] initWithFrame:frame];
     delegate_.view.backgroundColor = [UIColor redColor];
-    SnapshotTabHelper::CreateForWebState(&fake_web_state_,
-                                         [[NSUUID UUID] UUIDString]);
+    SnapshotTabHelper::CreateForWebState(&fake_web_state_);
     SnapshotTabHelper::FromWebState(&fake_web_state_)->SetDelegate(delegate_);
   }
 
diff --git a/ios/chrome/browser/ui/activity_services/data/share_to_data_builder_unittest.mm b/ios/chrome/browser/ui/activity_services/data/share_to_data_builder_unittest.mm
index d5ec164..2564cd34 100644
--- a/ios/chrome/browser/ui/activity_services/data/share_to_data_builder_unittest.mm
+++ b/ios/chrome/browser/ui/activity_services/data/share_to_data_builder_unittest.mm
@@ -53,8 +53,7 @@
     web_state_->SetVisibleURL(GURL(kExpectedUrl));
 
     // Attach SnapshotTabHelper to allow snapshot generation.
-    SnapshotTabHelper::CreateForWebState(web_state_.get(),
-                                         [[NSUUID UUID] UUIDString]);
+    SnapshotTabHelper::CreateForWebState(web_state_.get());
     delegate_ = [[FakeSnapshotGeneratorDelegate alloc] init];
     SnapshotTabHelper::FromWebState(web_state_.get())->SetDelegate(delegate_);
     // Needed by the ShareToDataForWebState to get the tab title.
diff --git a/ios/chrome/browser/ui/app_store_rating/BUILD.gn b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
index 4f03a949..cd9e217 100644
--- a/ios/chrome/browser/ui/app_store_rating/BUILD.gn
+++ b/ios/chrome/browser/ui/app_store_rating/BUILD.gn
@@ -5,6 +5,8 @@
 source_set("app_store_rating") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
+    "app_store_rating_display_handler.h",
+    "app_store_rating_display_handler.mm",
     "app_store_rating_scene_agent.h",
     "app_store_rating_scene_agent.mm",
   ]
@@ -14,10 +16,12 @@
     "//components/password_manager/core/browser",
     "//components/prefs",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/promos_manager:constants",
     "//ios/chrome/browser/ui/default_promo:utils",
     "//ios/chrome/browser/ui/main:browser_interface_provider",
     "//ios/chrome/browser/ui/main:observing_scene_agent",
     "//ios/chrome/browser/ui/main:scene",
+    "//ios/chrome/browser/ui/promos_manager:promos",
   ]
 }
 
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.h b/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.h
new file mode 100644
index 0000000..c3e36021
--- /dev/null
+++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.h
@@ -0,0 +1,22 @@
+// Copyright 2022 The Chromium Authors
+// 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_APP_STORE_RATING_APP_STORE_RATING_DISPLAY_HANDLER_H_
+#define IOS_CHROME_BROWSER_UI_APP_STORE_RATING_APP_STORE_RATING_DISPLAY_HANDLER_H_
+
+#import "ios/chrome/browser/ui/promos_manager/standard_promo_display_handler.h"
+
+// Handler for displaying the App Store Rating Promo.
+//
+// This handler is called by the Promos Manager and presents the App Store
+// Rating promo to eligible users. Users are considered eligible if they
+// 1) have used Chrome for at least 15 total days,
+// 2) have used Chrome for at least 3 days in the past 7 days,
+// 3) have enabled CPE, and
+// 4) have Chrome set as their default browser.
+@interface AppStoreRatingDisplayHandler : NSObject <StandardPromoDisplayHandler>
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_APP_STORE_RATING_APP_STORE_RATING_DISPLAY_HANDLER_H_
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm b/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm
new file mode 100644
index 0000000..36c91aa
--- /dev/null
+++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.mm
@@ -0,0 +1,28 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/app_store_rating/app_store_rating_display_handler.h"
+
+#import "ios/chrome/browser/promos_manager/constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation AppStoreRatingDisplayHandler
+
+#pragma mark - StandardPromoDisplayHandler
+
+- (void)handleDisplay {
+  // TODO(crbug.com/1364669): Call to Apple's SKStoreReviewController to request
+  // the display of the App Store Rating promo.
+}
+
+#pragma mark - PromoProtocol
+
+- (promos_manager::Promo)identifier {
+  return promos_manager::Promo::AppStoreRating;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/badges/badge_mediator.mm b/ios/chrome/browser/ui/badges/badge_mediator.mm
index 6c3429b..7c3caaa0 100644
--- a/ios/chrome/browser/ui/badges/badge_mediator.mm
+++ b/ios/chrome/browser/ui/badges/badge_mediator.mm
@@ -16,6 +16,7 @@
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/infobars/infobar_metrics_recorder.h"
 #import "ios/chrome/browser/infobars/infobar_type.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_util.h"
 #import "ios/chrome/browser/main/browser.h"
@@ -473,7 +474,8 @@
   InfoBarIOS* infobar = [self infobarWithType:infobarType];
   DCHECK(infobar);
   if (infobar) {
-    InfobarOverlayRequestInserter::CreateForWebState(self.webState);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        self.webState, &DefaultInfobarOverlayRequestFactory);
     InsertParams params(infobar);
     params.overlay_type = InfobarOverlayType::kModal;
     params.insertion_index = OverlayRequestQueue::FromWebState(
diff --git a/ios/chrome/browser/ui/badges/badge_popup_menu_coordinator.mm b/ios/chrome/browser/ui/badges/badge_popup_menu_coordinator.mm
index c9db612..325b3218 100644
--- a/ios/chrome/browser/ui/badges/badge_popup_menu_coordinator.mm
+++ b/ios/chrome/browser/ui/badges/badge_popup_menu_coordinator.mm
@@ -10,6 +10,7 @@
 #import "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/infobars/infobar_metrics_recorder.h"
 #import "ios/chrome/browser/infobars/infobar_type.h"
+#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
 #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/overlays/public/overlay_request_queue.h"
@@ -154,7 +155,8 @@
     DCHECK(webState);
     InfoBarIOS* infobar = [self infobarWithType:infobarType];
     DCHECK(infobar);
-    InfobarOverlayRequestInserter::CreateForWebState(webState);
+    InfobarOverlayRequestInserter::CreateForWebState(
+        webState, &DefaultInfobarOverlayRequestFactory);
     InsertParams params(infobar);
     params.overlay_type = InfobarOverlayType::kModal;
     params.insertion_index = OverlayRequestQueue::FromWebState(
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
index 4ee67ed..295bb6c 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -59,7 +59,6 @@
 #import "ios/chrome/browser/ui/ntp/metrics/metrics.h"
 #import "ios/chrome/browser/ui/ntp/new_tab_page_feature.h"
 #import "ios/chrome/browser/ui/ntp/ntp_tile_saver.h"
-#import "ios/chrome/browser/ui/start_surface/start_surface_features.h"
 #import "ios/chrome/browser/ui/start_surface/start_surface_util.h"
 #import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/ui_util.h"
@@ -278,7 +277,6 @@
 
 - (void)configureMostRecentTabItemWithWebState:(web::WebState*)webState
                                      timeLabel:(NSString*)timeLabel {
-  DCHECK(IsStartSurfaceEnabled());
   self.returnToRecentTabSectionInfo = ReturnToRecentTabSectionInformation();
   if (!self.returnToRecentTabItem) {
     self.returnToRecentTabItem =
@@ -310,7 +308,6 @@
 }
 
 - (void)hideRecentTabTile {
-  DCHECK(IsStartSurfaceEnabled());
   if (self.showMostRecentTabStartSurfaceTile) {
     self.showMostRecentTabStartSurfaceTile = NO;
     self.returnToRecentTabItem = nil;
@@ -459,7 +456,6 @@
 #pragma mark - StartSurfaceRecentTabObserving
 
 - (void)mostRecentTabWasRemoved:(web::WebState*)web_state {
-  DCHECK(IsStartSurfaceEnabled());
   [self hideRecentTabTile];
 }
 
diff --git a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm
index 4b388b9..ee752ef 100644
--- a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm
+++ b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm
@@ -18,7 +18,9 @@
 #error "This file requires ARC support."
 #endif
 
-@implementation PostRestoreSignInProvider
+@implementation PostRestoreSignInProvider {
+  PromoStyleViewController* _viewController;
+}
 
 #pragma mark - PromoProtocol
 
@@ -88,8 +90,13 @@
   // instead pass `userGivenName` off ChromeIdentity.
   NSString* userGivenName = @"Elisa";
 
-  return [[PostRestoreSignInViewController alloc]
+  if (_viewController)
+    return _viewController;
+
+  _viewController = [[PostRestoreSignInViewController alloc]
       initWithUserGivenName:userGivenName];
+
+  return _viewController;
 }
 
 #pragma mark - StandardPromoActionHandler
diff --git a/ios/chrome/browser/ui/settings/price_notifications/price_notifications_view_controller.h b/ios/chrome/browser/ui/settings/price_notifications/price_notifications_view_controller.h
index 7741091..ac4f1ad4 100644
--- a/ios/chrome/browser/ui/settings/price_notifications/price_notifications_view_controller.h
+++ b/ios/chrome/browser/ui/settings/price_notifications/price_notifications_view_controller.h
@@ -24,6 +24,7 @@
 
 @end
 
+// View controller for Price Notifications setting.
 @interface PriceNotificationsViewController
     : SettingsRootTableViewController <PriceNotificationsConsumer,
                                        SettingsControllerProtocol>
diff --git a/ios/chrome/browser/ui/start_surface/start_surface_util.mm b/ios/chrome/browser/ui/start_surface/start_surface_util.mm
index 29a3891..ae396f6 100644
--- a/ios/chrome/browser/ui/start_surface/start_surface_util.mm
+++ b/ios/chrome/browser/ui/start_surface/start_surface_util.mm
@@ -25,9 +25,6 @@
 
 NSTimeInterval GetTimeSinceMostRecentTabWasOpenForSceneState(
     SceneState* sceneState) {
-  if (!IsStartSurfaceEnabled()) {
-    return 0;
-  }
   NSDate* timestamp = (NSDate*)[sceneState
       sessionObjectForKey:kStartSurfaceSceneEnterIntoBackgroundTime];
 
@@ -38,10 +35,6 @@
 }
 
 bool ShouldShowStartSurfaceForSceneState(SceneState* sceneState) {
-  if (!IsStartSurfaceEnabled()) {
-    return NO;
-  }
-
   if (sceneState.appState.initStage <= InitStageFirstRun) {
     // NO if the app is not yet ready to present normal UI that is required by
     // Start Surface.
@@ -91,10 +84,6 @@
 }
 
 void SetStartSurfaceSessionObjectForSceneState(SceneState* sceneState) {
-  if (!IsStartSurfaceEnabled()) {
-    return;
-  }
-
   [sceneState setSessionObject:[NSDate date]
                         forKey:kStartSurfaceSceneEnterIntoBackgroundTime];
 }
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator_unittest.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator_unittest.mm
index 917ef04..1bd107db 100644
--- a/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator_unittest.mm
+++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/tab_grid_mediator_unittest.mm
@@ -259,8 +259,7 @@
     NewTabPageTabHelper::CreateForWebState(web_state);
     NewTabPageTabHelper::FromWebState(web_state)->SetDelegate(delegate);
     PagePlaceholderTabHelper::CreateForWebState(web_state);
-    NSString* identifier = web_state->GetStableIdentifier();
-    SnapshotTabHelper::CreateForWebState(web_state, identifier);
+    SnapshotTabHelper::CreateForWebState(web_state);
     WebSessionStateTabHelper::CreateForWebState(web_state);
   }
 };
@@ -344,8 +343,7 @@
     web_state->SetBrowserState(browser_state_.get());
     web_state->SetNavigationItemCount(1);
     web_state->SetCurrentURL(url);
-    SnapshotTabHelper::CreateForWebState(web_state.get(),
-                                         [[NSUUID UUID] UUIDString]);
+    SnapshotTabHelper::CreateForWebState(web_state.get());
     return web_state;
   }
 
diff --git a/ios/chrome/browser/web/page_placeholder_tab_helper_unittest.mm b/ios/chrome/browser/web/page_placeholder_tab_helper_unittest.mm
index cea2b3a..484f702 100644
--- a/ios/chrome/browser/web/page_placeholder_tab_helper_unittest.mm
+++ b/ios/chrome/browser/web/page_placeholder_tab_helper_unittest.mm
@@ -46,8 +46,7 @@
 
     // PagePlaceholderTabHelper uses SnapshotTabHelper, so ensure it has been
     // created.
-    SnapshotTabHelper::CreateForWebState(web_state_.get(),
-                                         [[NSUUID UUID] UUIDString]);
+    SnapshotTabHelper::CreateForWebState(web_state_.get());
     PagePlaceholderTabHelper::CreateForWebState(web_state_.get());
   }
 
diff --git a/ios/chrome/browser/web/session_state/web_session_state_tab_helper.h b/ios/chrome/browser/web/session_state/web_session_state_tab_helper.h
index 5674cae..e011a85 100644
--- a/ios/chrome/browser/web/session_state/web_session_state_tab_helper.h
+++ b/ios/chrome/browser/web/session_state/web_session_state_tab_helper.h
@@ -27,8 +27,6 @@
 
   ~WebSessionStateTabHelper() override;
 
-  static void CreateForWebState(web::WebState* web_state);
-
   // Returns true if the feature is enabled and running iOS 15 or newer.
   static bool IsEnabled();
 
diff --git a/ios/chrome/browser/web/session_state/web_session_state_tab_helper.mm b/ios/chrome/browser/web/session_state/web_session_state_tab_helper.mm
index 62b75e7a..54a7407 100644
--- a/ios/chrome/browser/web/session_state/web_session_state_tab_helper.mm
+++ b/ios/chrome/browser/web/session_state/web_session_state_tab_helper.mm
@@ -43,16 +43,6 @@
 }  // anonymous namespace
 
 // static
-void WebSessionStateTabHelper::CreateForWebState(web::WebState* web_state) {
-  DCHECK(web_state);
-  if (!FromWebState(web_state)) {
-    web_state->SetUserData(
-        UserDataKey(),
-        base::WrapUnique(new WebSessionStateTabHelper(web_state)));
-  }
-}
-
-// static
 bool WebSessionStateTabHelper::IsEnabled() {
   if (!base::FeatureList::IsEnabled(web::kRestoreSessionFromCache)) {
     return false;
diff --git a/ios/chrome/browser/web/web_state_delegate_browser_agent_unittest.mm b/ios/chrome/browser/web/web_state_delegate_browser_agent_unittest.mm
index beba3b3..ad8edd5 100644
--- a/ios/chrome/browser/web/web_state_delegate_browser_agent_unittest.mm
+++ b/ios/chrome/browser/web/web_state_delegate_browser_agent_unittest.mm
@@ -61,7 +61,7 @@
     std::unique_ptr<web::WebState> web_state =
         web::WebState::Create(create_params);
     BlockedPopupTabHelper::CreateForWebState(web_state.get());
-    SnapshotTabHelper::CreateForWebState(web_state.get(), @"tab1");
+    SnapshotTabHelper::CreateForWebState(web_state.get());
     web_state->GetNavigationManager()->LoadURLWithParams(load_params);
 
     WebStateOpener opener;
diff --git a/ios/chrome/test/app/BUILD.gn b/ios/chrome/test/app/BUILD.gn
index 6e16b89f..90c2b492 100644
--- a/ios/chrome/test/app/BUILD.gn
+++ b/ios/chrome/test/app/BUILD.gn
@@ -100,7 +100,6 @@
     "//ios/web",
     "//ios/web/public/security",
     "//ios/web/public/test",
-    "//ios/web/web_state/ui:wk_web_view_configuration_provider",
     "//net",
     "//net:test_support",
     "//third_party/breakpad:client",
diff --git a/ios/chrome/test/app/browsing_data_test_util.h b/ios/chrome/test/app/browsing_data_test_util.h
index 0505eb3..572d0ef 100644
--- a/ios/chrome/test/app/browsing_data_test_util.h
+++ b/ios/chrome/test/app/browsing_data_test_util.h
@@ -25,6 +25,9 @@
 
 // Clears all the default WKWebsiteDataStore data including the WK back/forward
 // cache.
+// NOTE: This leaves objects inside //ios/web which manage JavaScriptFeatures in
+// an unknown state, relaunch the app after calling to ensure Chrome functions
+// correctly.
 [[nodiscard]] bool ClearAllWebStateBrowsingData();
 
 // Clears user decisions cache and returns whether clearing was successful or
diff --git a/ios/chrome/test/app/browsing_data_test_util.mm b/ios/chrome/test/app/browsing_data_test_util.mm
index 40ac36d..71a9c64b 100644
--- a/ios/chrome/test/app/browsing_data_test_util.mm
+++ b/ios/chrome/test/app/browsing_data_test_util.mm
@@ -21,7 +21,6 @@
 #import "ios/web/public/security/certificate_policy_cache.h"
 #import "ios/web/public/thread/web_task_traits.h"
 #import "ios/web/public/thread/web_thread.h"
-#import "ios/web/web_state/ui/wk_web_view_configuration_provider.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -73,10 +72,6 @@
       removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes]
           modifiedSince:[NSDate distantPast]
       completionHandler:^{
-        web::BrowserState* browser_state =
-            chrome_test_util::GetOriginalBrowserState();
-        web::WKWebViewConfigurationProvider::FromBrowserState(browser_state)
-            .Purge();
         callback_finished = true;
       }];
   return WaitUntilConditionOrTimeout(20, ^{
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 7513a41..63ad3586 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -566,8 +566,16 @@
 
 // Clears all web state browsing data. A GREYAssert is induced if the data
 // cannot be cleared.
+// TODO:(crbug.com/1362915): Remove after all tests are updated to use
+// `clearAllWebStateBrowsingData:` below.
 - (void)clearAllWebStateBrowsingData;
 
+// Clears all web state browsing data then relaunches the application. (A
+// GREYAssert is induced if the data cannot be cleared.)
+// NOTE: The passed in `config` will be modified to set `relaunch_policy` to
+// `ForceRelaunchByKilling.
+- (void)clearAllWebStateBrowsingData:(AppLaunchConfiguration)config;
+
 #pragma mark - Bookmarks Utilities (EG2)
 
 // Waits for the bookmark internal state to be done loading.
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index 6ba0474..a52f633 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -740,6 +740,17 @@
       [ChromeEarlGreyAppInterface clearAllWebStateBrowsingData]);
 }
 
+- (void)clearAllWebStateBrowsingData:(AppLaunchConfiguration)config {
+  EG_TEST_HELPER_ASSERT_NO_ERROR(
+      [ChromeEarlGreyAppInterface clearAllWebStateBrowsingData]);
+
+  // The app must be relaunched to rebuild internal //ios/web state after
+  // clearing browsing data with `[ChromeEarlGreyAppInterface
+  // clearAllWebStateBrowsingData]`.
+  config.relaunch_policy = ForceRelaunchByKilling;
+  [[AppLaunchManager sharedManager] ensureAppLaunchedWithConfiguration:config];
+}
+
 #pragma mark - Sync Utilities (EG2)
 
 - (void)clearSyncServerData {
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.h b/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.h
index 39ae977..7350b330d 100644
--- a/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.h
+++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.h
@@ -86,12 +86,6 @@
         SafeBrowsingQueryManager* manager) {}
   };
 
-  static void CreateForWebState(web::WebState* web_state,
-                                SafeBrowsingClient* client);
-
-  SafeBrowsingQueryManager(web::WebState* web_state,
-                           SafeBrowsingClient* client);
-
   ~SafeBrowsingQueryManager() override;
 
   SafeBrowsingQueryManager(const SafeBrowsingQueryManager&) = delete;
@@ -112,6 +106,9 @@
  private:
   friend class web::WebStateUserData<SafeBrowsingQueryManager>;
 
+  SafeBrowsingQueryManager(web::WebState* web_state,
+                           SafeBrowsingClient* client);
+
   // Queries the Safe Browsing database using SafeBrowsingUrlCheckerImpls. This
   // class may be constructed on the UI thread but otherwise must only be used
   // and destroyed on the IO thread.
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.mm b/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.mm
index 012dfed7..9635b11 100644
--- a/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.mm
+++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.mm
@@ -30,17 +30,6 @@
 
 #pragma mark - SafeBrowsingQueryManager
 
-// static
-void SafeBrowsingQueryManager::CreateForWebState(web::WebState* web_state,
-                                                 SafeBrowsingClient* client) {
-  if (FromWebState(web_state))
-    return;
-
-  web_state->SetUserData(
-      UserDataKey(),
-      std::make_unique<SafeBrowsingQueryManager>(web_state, client));
-}
-
 SafeBrowsingQueryManager::SafeBrowsingQueryManager(web::WebState* web_state,
                                                    SafeBrowsingClient* client)
     : web_state_(web_state),
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.h b/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.h
index 99afba1..42df820 100644
--- a/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.h
+++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.h
@@ -33,11 +33,6 @@
 class SafeBrowsingTabHelper
     : public web::WebStateUserData<SafeBrowsingTabHelper> {
  public:
-  static void CreateForWebState(web::WebState* web_state,
-                                SafeBrowsingClient* client);
-
-  SafeBrowsingTabHelper(web::WebState* web_state, SafeBrowsingClient* client);
-
   ~SafeBrowsingTabHelper() override;
 
   SafeBrowsingTabHelper(const SafeBrowsingTabHelper&) = delete;
@@ -53,6 +48,8 @@
  private:
   friend class web::WebStateUserData<SafeBrowsingTabHelper>;
 
+  SafeBrowsingTabHelper(web::WebState* web_state, SafeBrowsingClient* client);
+
   // A WebStatePolicyDecider that queries the SafeBrowsing database on each
   // request, always allows the request, but uses the result of the
   // SafeBrowsing check to determine whether to allow the corresponding
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.mm b/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.mm
index ee6930ee..eac23e75 100644
--- a/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.mm
+++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.mm
@@ -64,16 +64,6 @@
 
 #pragma mark - SafeBrowsingTabHelper
 
-// static
-void SafeBrowsingTabHelper::CreateForWebState(web::WebState* web_state,
-                                              SafeBrowsingClient* client) {
-  if (FromWebState(web_state))
-    return;
-
-  web_state->SetUserData(UserDataKey(), std::make_unique<SafeBrowsingTabHelper>(
-                                            web_state, client));
-}
-
 SafeBrowsingTabHelper::SafeBrowsingTabHelper(web::WebState* web_state,
                                              SafeBrowsingClient* client)
     : policy_decider_(web_state, client),
diff --git a/mojo/public/cpp/system/data_pipe_producer.cc b/mojo/public/cpp/system/data_pipe_producer.cc
index d0651ec..f00a5e2 100644
--- a/mojo/public/cpp/system/data_pipe_producer.cc
+++ b/mojo/public/cpp/system/data_pipe_producer.cc
@@ -116,6 +116,12 @@
       DCHECK_LE(bytes_transferred_, data_source_->GetLength());
       const uint64_t max_data_size =
           data_source_->GetLength() - bytes_transferred_;
+      if (max_data_size == 0) {
+        // There's no more data to transfer.
+        Finish(MOJO_RESULT_OK);
+        return;
+      }
+
       if (static_cast<uint64_t>(size) > max_data_size)
         size = static_cast<uint32_t>(max_data_size);
 
@@ -140,13 +146,6 @@
       }
 
       bytes_transferred_ += result.bytes_read;
-
-      if (result.bytes_read < read_buffer.size()) {
-        // DataSource::Read makes a best effort to read all requested bytes. We
-        // reasonably assume if it fails to read what we ask for, we've hit EOF.
-        Finish(MOJO_RESULT_OK);
-        return;
-      }
     }
   }
 
diff --git a/printing/BUILD.gn b/printing/BUILD.gn
index 64547a0c..93ed16c2 100644
--- a/printing/BUILD.gn
+++ b/printing/BUILD.gn
@@ -362,6 +362,7 @@
 
   if (is_win) {
     sources += [
+      "backend/xps_utils_win_unittest.cc",
       "emf_win_unittest.cc",
       "printed_page_win_unittest.cc",
       "printing_context_win_unittest.cc",
diff --git a/printing/backend/BUILD.gn b/printing/backend/BUILD.gn
index cf3384f..4dc3a7ec 100644
--- a/printing/backend/BUILD.gn
+++ b/printing/backend/BUILD.gn
@@ -64,6 +64,8 @@
       "printing_info_win.h",
       "win_helper.cc",
       "win_helper.h",
+      "xps_utils_win.cc",
+      "xps_utils_win.h",
     ]
     deps += [ "//services/data_decoder/public/cpp:safe_xml_parser" ]
   }
diff --git a/printing/backend/print_backend.h b/printing/backend/print_backend.h
index 6aaad76..77a60bb 100644
--- a/printing/backend/print_backend.h
+++ b/printing/backend/print_backend.h
@@ -260,14 +260,6 @@
       const std::string& printer_name,
       std::string& capabilities);
 
-  // Since parsing XML data to `PrinterSemanticCapsAndDefaults` can not be done
-  // in the print_backend level, parse base::Value into
-  // `PrinterSemanticCapsAndDefaults` data structure instead. Parsing XML data
-  // to base::Value will be processed by data_decoder service.
-  mojom::ResultCode ParseValueForXpsPrinterCapabilities(
-      const base::Value& value,
-      PrinterSemanticCapsAndDefaults* printer_info);
-
 #endif  // BUILDFLAG(IS_WIN)
 
   // Allocates a print backend.
diff --git a/printing/backend/print_backend_unittest.cc b/printing/backend/print_backend_unittest.cc
index a16f10b7..8592ba7 100644
--- a/printing/backend/print_backend_unittest.cc
+++ b/printing/backend/print_backend_unittest.cc
@@ -5,259 +5,11 @@
 #include "printing/backend/print_backend.h"
 
 #include "base/memory/scoped_refptr.h"
-#include "base/test/values_test_util.h"
-#include "base/values.h"
 #include "printing/mojom/print.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace printing {
 
-namespace {
-
-#if BUILDFLAG(IS_WIN)
-// The correct format of XPS "PageOutputQuality" and "PageOutputColor"
-// capabilities.
-constexpr char kCorrectCapabilities[] = R"({
-  "type": "element",
-  "tag": "psf:PrintCapabilities",
-  "children": [
-    {
-      "type": "element",
-      "tag": "psf:Feature",
-      "attributes": {
-        "name": "psk:PageOutputQuality"
-      },
-      "children": [
-        {
-          "type": "element",
-          "tag": "psf:Feature",
-          "attributes": {
-            "name": "psk:PageOutputQuality"
-          }
-        },
-        {
-          "type": "element",
-          "tag": "psf:Property",
-          "attributes": {
-            "name": "psf:SelectionType"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Value",
-              "attributes": {
-                "xsi:type": "xsd:QName"
-              },
-              "children": [
-                {
-                  "type": "text",
-                  "text": "psk:PickOne"
-                }
-              ]
-            }
-          ]
-        },
-        {
-          "type": "element",
-          "tag": "psf:Property",
-          "attributes": {
-            "name": "psf:DisplayName"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Value",
-              "attributes": {
-                "xsi:type": "xsd:string"
-              },
-              "children": [
-                {
-                  "type": "text",
-                  "text": "Quality"
-                }
-              ]
-            }
-          ]
-        },
-        {
-          "type": "element",
-          "tag": "psf:Option",
-          "attributes": {
-            "name": "ns0000:Draft",
-            "constrain": "psk:None"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Property",
-              "attributes": {
-                "name": "psf:DisplayName"
-              },
-              "children": [
-                {
-                  "type": "element",
-                  "tag": "psf:Value",
-                  "attributes": {
-                    "xsi:type": "xsd:string"
-                  },
-                  "children": [
-                    {
-                      "type": "text",
-                      "text": "Draft"
-                    }
-                  ]
-                }
-              ]
-            }
-          ]
-        },
-        {
-          "type": "element",
-          "tag": "psf:Option",
-          "attributes": {
-            "name": "ns0000:Advanced",
-            "constrain": "psk:None"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Property",
-              "attributes": {
-                "name": "psf:DisplayName"
-              },
-              "children": [
-                {
-                  "type": "element",
-                  "tag": "psf:Value",
-                  "attributes": {
-                    "xsi:type": "xsd:string"
-                  },
-                  "children": [
-                    {
-                      "type": "text",
-                      "text": "Advanced"
-                    }
-                  ]
-                }
-              ]
-            }
-          ]
-        },
-        {
-          "type": "element",
-          "tag": "psf:Option",
-          "attributes": {
-            "name": "psk:Normal"
-          }
-        }
-      ]
-    },
-    {
-      "type": "element",
-      "tag": "psf:Feature",
-      "attributes": {
-        "name": "psk:PageOutputColor"
-      }
-    }
-  ]
-}
-)";
-
-// The incorrect format of XPS `PageOutputQuality` capability.
-// The property inside option ns0000:Draft does not have any value.
-constexpr char kIncorrectCapabilities[] = R"({
-  "type": "element",
-  "tag": "psf:PrintCapabilities",
-  "children": [
-    {
-      "type": "element",
-      "tag": "psf:Feature",
-      "attributes": {
-        "name": "psk:PageOutputQuality"
-      },
-      "children": [
-        {
-          "type": "element",
-          "tag": "psf:Feature",
-          "attributes": {
-            "name": "psk:PageOutputQuality"
-          }
-        },
-        {
-          "type": "element",
-          "tag": "psf:Property",
-          "attributes": {
-            "name": "psf:SelectionType"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Value",
-              "attributes": {
-                "xsi:type": "xsd:QName"
-              },
-              "children": [
-                {
-                  "type": "text",
-                  "text": "psk:PickOne"
-                }
-              ]
-            }
-          ]
-        },
-        {
-          "type": "element",
-          "tag": "psf:Property",
-          "attributes": {
-            "name": "psf:DisplayName"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Value",
-              "attributes": {
-                "xsi:type": "xsd:string"
-              },
-              "children": [
-                {
-                  "type": "text",
-                  "text": "Quality"
-                }
-              ]
-            }
-          ]
-        },
-        {
-          "type": "element",
-          "tag": "psf:Option",
-          "attributes": {
-            "name": "ns0000:Draft",
-            "constrain": "psk:None"
-          },
-          "children": [
-            {
-              "type": "element",
-              "tag": "psf:Property",
-              "attributes": {
-                "name": "psf:DisplayName"
-              }
-            }
-          ]
-        }
-      ]
-    }
-  ]
-}
-)";
-
-const PageOutputQualityAttributes kPageOutputQualities = {
-    PageOutputQualityAttribute("Draft", "ns0000:Draft"),
-    PageOutputQualityAttribute("Advanced", "ns0000:Advanced"),
-    PageOutputQualityAttribute("", "psk:Normal")};
-#endif  // BUILDFLAG(IS_WIN)
-
-}  // namespace
-
 // PrintBackendTest makes use of a real print backend instance, and thus will
 // interact with printer drivers installed on a system.  This can be useful on
 // machines which a developer has control over the driver installations, but is
@@ -319,27 +71,6 @@
   }
 }
 
-TEST_F(PrintBackendTest,
-       ParseCorrectPageOutputQualityForXpsPrinterCapabilities) {
-  PrinterSemanticCapsAndDefaults printer_info;
-
-  // Expect that parsing XPS Printer Capabilities is successful.
-  // After parsing, `printer_info` will have 2 capabilities: "PageOutputQuality"
-  // and "PageOutputColor".
-  EXPECT_EQ(GetPrintBackend()->ParseValueForXpsPrinterCapabilities(
-                base::test::ParseJson(kCorrectCapabilities), &printer_info),
-            mojom::ResultCode::kSuccess);
-  ASSERT_EQ(printer_info.page_output_quality->qualities, kPageOutputQualities);
-}
-
-TEST_F(PrintBackendTest,
-       ParseIncorrectPageOutputQualityForXpsPrinterCapabilities) {
-  PrinterSemanticCapsAndDefaults printer_info;
-  EXPECT_EQ(GetPrintBackend()->ParseValueForXpsPrinterCapabilities(
-                base::test::ParseJson(kIncorrectCapabilities), &printer_info),
-            mojom::ResultCode::kFailed);
-}
-
 #endif  // BUILDFLAG(IS_WIN)
 
 }  // namespace printing
diff --git a/printing/backend/print_backend_win.cc b/printing/backend/print_backend_win.cc
index 8978bd8..98384a5a 100644
--- a/printing/backend/print_backend_win.cc
+++ b/printing/backend/print_backend_win.cc
@@ -20,6 +20,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/scoped_blocking_call.h"
+#include "base/values.h"
 #include "base/win/scoped_bstr.h"
 #include "base/win/scoped_hglobal.h"
 #include "base/win/windows_types.h"
@@ -27,23 +28,11 @@
 #include "printing/backend/printing_info_win.h"
 #include "printing/backend/win_helper.h"
 #include "printing/mojom/print.mojom.h"
-#include "services/data_decoder/public/cpp/safe_xml_parser.h"
 
 namespace printing {
 
 namespace {
 
-// Elements and namespaces in XML data. The order of these elements follows
-// the Print Schema Framework elements order. Details can be found here:
-// https://docs.microsoft.com/en-us/windows/win32/printdocs/details-of-the-printcapabilities-schema
-constexpr char kPrintCapabilities[] = "psf:PrintCapabilities";
-constexpr char kFeature[] = "psf:Feature";
-constexpr char kPageOutputQuality[] = "psk:PageOutputQuality";
-constexpr char kOption[] = "psf:Option";
-constexpr char kProperty[] = "psf:Property";
-constexpr char kValue[] = "psf:Value";
-constexpr char kName[] = "name";
-
 // Wrapper class to close provider automatically.
 class ScopedProvider {
  public:
@@ -59,58 +48,6 @@
  private:
   HPTPROVIDER provider_;
 };
-mojom::ResultCode LoadPageOutputQuality(
-    const base::Value& page_output_quality,
-    PrinterSemanticCapsAndDefaults* printer_info) {
-  PageOutputQuality printer_page_output_quality;
-  std::vector<const base::Value*> options;
-  data_decoder::GetAllXmlElementChildrenWithTag(page_output_quality, kOption,
-                                                &options);
-  if (options.empty()) {
-    LOG(WARNING) << "Incorrect XML format";
-    return mojom::ResultCode::kFailed;
-  }
-  for (const auto* option : options) {
-    PageOutputQualityAttribute quality;
-    quality.name = data_decoder::GetXmlElementAttribute(*option, kName);
-    int property_count =
-        data_decoder::GetXmlElementChildrenCount(*option, kProperty);
-
-    // TODO(crbug.com/1291257): Each formatted option is expected to have zero
-    // or one property. Each property inside an option is expected to
-    // have one value.
-    // Source:
-    // https://docs.microsoft.com/en-us/windows/win32/printdocs/pageoutputquality
-    // If an option has more than one property or a property has more than one
-    // value, more work is expected here.
-
-    // In the case an option looks like <psf:Option name="psk:Text />,
-    // property_count is 0. In this case, an option only has `name`
-    // and does not have `display_name`.
-    if (property_count > 1) {
-      LOG(WARNING) << "Incorrect XML format";
-      return mojom::ResultCode::kFailed;
-    }
-    if (property_count == 1) {
-      const base::Value* property_element = data_decoder::FindXmlElementPath(
-          *option, {kOption, kProperty}, /*unique_path=*/nullptr);
-      int value_count =
-          data_decoder::GetXmlElementChildrenCount(*property_element, kValue);
-      if (value_count != 1) {
-        LOG(WARNING) << "Incorrect XML format";
-        return mojom::ResultCode::kFailed;
-      }
-      const base::Value* value_element = data_decoder::FindXmlElementPath(
-          *option, {kOption, kProperty, kValue}, /*unique_path=*/nullptr);
-      std::string text;
-      data_decoder::GetXmlElementText(*value_element, &text);
-      quality.display_name = std::move(text);
-    }
-    printer_page_output_quality.qualities.push_back(std::move(quality));
-  }
-  printer_info->page_output_quality = std::move(printer_page_output_quality);
-  return mojom::ResultCode::kSuccess;
-}
 
 // `GetResultCodeFromSystemErrorCode()` is only ever invoked when something has
 // gone wrong while interacting with the OS printing system.  If the cause of
@@ -584,35 +521,4 @@
   return mojom::ResultCode::kSuccess;
 }
 
-mojom::ResultCode PrintBackend::ParseValueForXpsPrinterCapabilities(
-    const base::Value& capabilities,
-    PrinterSemanticCapsAndDefaults* printer_info) {
-  if (!data_decoder::IsXmlElementNamed(capabilities, kPrintCapabilities)) {
-    LOG(WARNING) << "Incorrect XML format";
-    return mojom::ResultCode::kFailed;
-  }
-  std::vector<const base::Value*> features;
-  data_decoder::GetAllXmlElementChildrenWithTag(capabilities, kFeature,
-                                                &features);
-  if (features.empty()) {
-    LOG(WARNING) << "Incorrect XML format";
-    return mojom::ResultCode::kFailed;
-  }
-  for (auto* feature : features) {
-    std::string feature_name =
-        data_decoder::GetXmlElementAttribute(*feature, kName);
-    DVLOG(2) << feature_name;
-    mojom::ResultCode result_code;
-    if (feature_name == kPageOutputQuality) {
-      result_code = LoadPageOutputQuality(*feature, printer_info);
-      if (result_code == mojom::ResultCode::kFailed)
-        return result_code;
-    }
-
-    // TODO(crbug.com/1291257): Each feature needs to be parsed. More work is
-    // expected here.
-  }
-  return mojom::ResultCode::kSuccess;
-}
-
 }  // namespace printing
diff --git a/printing/backend/xps_utils_win.cc b/printing/backend/xps_utils_win.cc
new file mode 100644
index 0000000..04d0f54
--- /dev/null
+++ b/printing/backend/xps_utils_win.cc
@@ -0,0 +1,113 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "printing/backend/xps_utils_win.h"
+
+#include "base/values.h"
+#include "printing/backend/print_backend.h"
+#include "printing/mojom/print.mojom.h"
+#include "services/data_decoder/public/cpp/safe_xml_parser.h"
+
+namespace printing {
+
+namespace {
+
+// Elements and namespaces in XML data. The order of these elements follows
+// the Print Schema Framework elements order. Details can be found here:
+// https://docs.microsoft.com/en-us/windows/win32/printdocs/details-of-the-printcapabilities-schema
+constexpr char kPrintCapabilities[] = "psf:PrintCapabilities";
+constexpr char kFeature[] = "psf:Feature";
+constexpr char kPageOutputQuality[] = "psk:PageOutputQuality";
+constexpr char kOption[] = "psf:Option";
+constexpr char kProperty[] = "psf:Property";
+constexpr char kValue[] = "psf:Value";
+constexpr char kName[] = "name";
+
+mojom::ResultCode LoadPageOutputQuality(
+    const base::Value& page_output_quality,
+    PrinterSemanticCapsAndDefaults* printer_info) {
+  PageOutputQuality printer_page_output_quality;
+  std::vector<const base::Value*> options;
+  data_decoder::GetAllXmlElementChildrenWithTag(page_output_quality, kOption,
+                                                &options);
+  if (options.empty()) {
+    LOG(WARNING) << "Incorrect XML format";
+    return mojom::ResultCode::kFailed;
+  }
+  for (const auto* option : options) {
+    PageOutputQualityAttribute quality;
+    quality.name = data_decoder::GetXmlElementAttribute(*option, kName);
+    int property_count =
+        data_decoder::GetXmlElementChildrenCount(*option, kProperty);
+
+    // TODO(crbug.com/1291257): Each formatted option is expected to have zero
+    // or one property. Each property inside an option is expected to
+    // have one value.
+    // Source:
+    // https://docs.microsoft.com/en-us/windows/win32/printdocs/pageoutputquality
+    // If an option has more than one property or a property has more than one
+    // value, more work is expected here.
+
+    // In the case an option looks like <psf:Option name="psk:Text />,
+    // property_count is 0. In this case, an option only has `name`
+    // and does not have `display_name`.
+    if (property_count > 1) {
+      LOG(WARNING) << "Incorrect XML format";
+      return mojom::ResultCode::kFailed;
+    }
+    if (property_count == 1) {
+      const base::Value* property_element = data_decoder::FindXmlElementPath(
+          *option, {kOption, kProperty}, /*unique_path=*/nullptr);
+      int value_count =
+          data_decoder::GetXmlElementChildrenCount(*property_element, kValue);
+      if (value_count != 1) {
+        LOG(WARNING) << "Incorrect XML format";
+        return mojom::ResultCode::kFailed;
+      }
+      const base::Value* value_element = data_decoder::FindXmlElementPath(
+          *option, {kOption, kProperty, kValue}, /*unique_path=*/nullptr);
+      std::string text;
+      data_decoder::GetXmlElementText(*value_element, &text);
+      quality.display_name = std::move(text);
+    }
+    printer_page_output_quality.qualities.push_back(std::move(quality));
+  }
+  printer_info->page_output_quality = std::move(printer_page_output_quality);
+  return mojom::ResultCode::kSuccess;
+}
+
+}  // namespace
+
+mojom::ResultCode ParseValueForXpsPrinterCapabilities(
+    const base::Value& capabilities,
+    PrinterSemanticCapsAndDefaults* printer_info) {
+  if (!data_decoder::IsXmlElementNamed(capabilities, kPrintCapabilities)) {
+    LOG(WARNING) << "Incorrect XML format";
+    return mojom::ResultCode::kFailed;
+  }
+  std::vector<const base::Value*> features;
+  data_decoder::GetAllXmlElementChildrenWithTag(capabilities, kFeature,
+                                                &features);
+  if (features.empty()) {
+    LOG(WARNING) << "Incorrect XML format";
+    return mojom::ResultCode::kFailed;
+  }
+  for (auto* feature : features) {
+    std::string feature_name =
+        data_decoder::GetXmlElementAttribute(*feature, kName);
+    DVLOG(2) << feature_name;
+    mojom::ResultCode result_code;
+    if (feature_name == kPageOutputQuality) {
+      result_code = LoadPageOutputQuality(*feature, printer_info);
+      if (result_code == mojom::ResultCode::kFailed)
+        return result_code;
+    }
+
+    // TODO(crbug.com/1291257): Each feature needs to be parsed. More work is
+    // expected here.
+  }
+  return mojom::ResultCode::kSuccess;
+}
+
+}  // namespace printing
diff --git a/printing/backend/xps_utils_win.h b/printing/backend/xps_utils_win.h
new file mode 100644
index 0000000..ae0e729
--- /dev/null
+++ b/printing/backend/xps_utils_win.h
@@ -0,0 +1,30 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PRINTING_BACKEND_XPS_UTILS_WIN_H_
+#define PRINTING_BACKEND_XPS_UTILS_WIN_H_
+
+#include "base/component_export.h"
+#include "printing/mojom/print.mojom-forward.h"
+
+namespace base {
+class Value;
+}  // namespace base
+
+namespace printing {
+
+struct PrinterSemanticCapsAndDefaults;
+
+// Since parsing XML data to `PrinterSemanticCapsAndDefaults` can not be done
+// in the print_backend level, parse base::Value into
+// `PrinterSemanticCapsAndDefaults` data structure instead. Parsing XML data
+// to base::Value will be processed by data_decoder service.
+COMPONENT_EXPORT(PRINT_BACKEND)
+mojom::ResultCode ParseValueForXpsPrinterCapabilities(
+    const base::Value& capabilities,
+    PrinterSemanticCapsAndDefaults* printer_info);
+
+}  // namespace printing
+
+#endif  // PRINTING_BACKEND_XPS_UTILS_WIN_H_
diff --git a/printing/backend/xps_utils_win_unittest.cc b/printing/backend/xps_utils_win_unittest.cc
new file mode 100644
index 0000000..601d311e
--- /dev/null
+++ b/printing/backend/xps_utils_win_unittest.cc
@@ -0,0 +1,277 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "printing/backend/xps_utils_win.h"
+
+#include "base/test/values_test_util.h"
+#include "printing/backend/print_backend.h"
+#include "printing/mojom/print.mojom.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace printing {
+
+namespace {
+
+// The correct format of XPS "PageOutputQuality" and "PageOutputColor"
+// capabilities.
+constexpr char kCorrectCapabilities[] = R"({
+  "type": "element",
+  "tag": "psf:PrintCapabilities",
+  "children": [
+    {
+      "type": "element",
+      "tag": "psf:Feature",
+      "attributes": {
+        "name": "psk:PageOutputQuality"
+      },
+      "children": [
+        {
+          "type": "element",
+          "tag": "psf:Feature",
+          "attributes": {
+            "name": "psk:PageOutputQuality"
+          }
+        },
+        {
+          "type": "element",
+          "tag": "psf:Property",
+          "attributes": {
+            "name": "psf:SelectionType"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Value",
+              "attributes": {
+                "xsi:type": "xsd:QName"
+              },
+              "children": [
+                {
+                  "type": "text",
+                  "text": "psk:PickOne"
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "type": "element",
+          "tag": "psf:Property",
+          "attributes": {
+            "name": "psf:DisplayName"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Value",
+              "attributes": {
+                "xsi:type": "xsd:string"
+              },
+              "children": [
+                {
+                  "type": "text",
+                  "text": "Quality"
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "type": "element",
+          "tag": "psf:Option",
+          "attributes": {
+            "name": "ns0000:Draft",
+            "constrain": "psk:None"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Property",
+              "attributes": {
+                "name": "psf:DisplayName"
+              },
+              "children": [
+                {
+                  "type": "element",
+                  "tag": "psf:Value",
+                  "attributes": {
+                    "xsi:type": "xsd:string"
+                  },
+                  "children": [
+                    {
+                      "type": "text",
+                      "text": "Draft"
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "type": "element",
+          "tag": "psf:Option",
+          "attributes": {
+            "name": "ns0000:Advanced",
+            "constrain": "psk:None"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Property",
+              "attributes": {
+                "name": "psf:DisplayName"
+              },
+              "children": [
+                {
+                  "type": "element",
+                  "tag": "psf:Value",
+                  "attributes": {
+                    "xsi:type": "xsd:string"
+                  },
+                  "children": [
+                    {
+                      "type": "text",
+                      "text": "Advanced"
+                    }
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "type": "element",
+          "tag": "psf:Option",
+          "attributes": {
+            "name": "psk:Normal"
+          }
+        }
+      ]
+    },
+    {
+      "type": "element",
+      "tag": "psf:Feature",
+      "attributes": {
+        "name": "psk:PageOutputColor"
+      }
+    }
+  ]
+}
+)";
+
+// The incorrect format of XPS `PageOutputQuality` capability.
+// The property inside option ns0000:Draft does not have any value.
+constexpr char kIncorrectCapabilities[] = R"({
+  "type": "element",
+  "tag": "psf:PrintCapabilities",
+  "children": [
+    {
+      "type": "element",
+      "tag": "psf:Feature",
+      "attributes": {
+        "name": "psk:PageOutputQuality"
+      },
+      "children": [
+        {
+          "type": "element",
+          "tag": "psf:Feature",
+          "attributes": {
+            "name": "psk:PageOutputQuality"
+          }
+        },
+        {
+          "type": "element",
+          "tag": "psf:Property",
+          "attributes": {
+            "name": "psf:SelectionType"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Value",
+              "attributes": {
+                "xsi:type": "xsd:QName"
+              },
+              "children": [
+                {
+                  "type": "text",
+                  "text": "psk:PickOne"
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "type": "element",
+          "tag": "psf:Property",
+          "attributes": {
+            "name": "psf:DisplayName"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Value",
+              "attributes": {
+                "xsi:type": "xsd:string"
+              },
+              "children": [
+                {
+                  "type": "text",
+                  "text": "Quality"
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "type": "element",
+          "tag": "psf:Option",
+          "attributes": {
+            "name": "ns0000:Draft",
+            "constrain": "psk:None"
+          },
+          "children": [
+            {
+              "type": "element",
+              "tag": "psf:Property",
+              "attributes": {
+                "name": "psf:DisplayName"
+              }
+            }
+          ]
+        }
+      ]
+    }
+  ]
+}
+)";
+
+const PageOutputQualityAttributes kPageOutputQualities = {
+    PageOutputQualityAttribute("Draft", "ns0000:Draft"),
+    PageOutputQualityAttribute("Advanced", "ns0000:Advanced"),
+    PageOutputQualityAttribute("", "psk:Normal")};
+
+}  // namespace
+
+TEST(XpsUtilTest, ParseCorrectPageOutputQualityForXpsPrinterCapabilities) {
+  PrinterSemanticCapsAndDefaults printer_info;
+
+  // Expect that parsing XPS Printer Capabilities is successful.
+  // After parsing, `printer_info` will have 2 capabilities: "PageOutputQuality"
+  // and "PageOutputColor".
+  EXPECT_EQ(ParseValueForXpsPrinterCapabilities(
+                base::test::ParseJson(kCorrectCapabilities), &printer_info),
+            mojom::ResultCode::kSuccess);
+  ASSERT_EQ(printer_info.page_output_quality->qualities, kPageOutputQualities);
+}
+
+TEST(XpsUtilTest, ParseIncorrectPageOutputQualityForXpsPrinterCapabilities) {
+  PrinterSemanticCapsAndDefaults printer_info;
+  EXPECT_EQ(ParseValueForXpsPrinterCapabilities(
+                base::test::ParseJson(kIncorrectCapabilities), &printer_info),
+            mojom::ResultCode::kFailed);
+}
+
+}  // namespace printing
diff --git a/remoting/host/daemon_process_win.cc b/remoting/host/daemon_process_win.cc
index b5aa3c6f..76ef541 100644
--- a/remoting/host/daemon_process_win.cc
+++ b/remoting/host/daemon_process_win.cc
@@ -286,7 +286,8 @@
   LOG_IF(ERROR, !remoting_host_control_.is_connected())
       << "IPC channel not connected. HostConfig message will be dropped.";
 
-  absl::optional<base::Value> config(HostConfigFromJson(serialized_config));
+  absl::optional<base::Value::Dict> config(
+      HostConfigFromJson(serialized_config));
   if (!config.has_value()) {
     LOG(ERROR) << "Invalid host config, shutting down.";
     OnPermanentError(kInvalidHostConfigurationExitCode);
diff --git a/remoting/host/host_config.cc b/remoting/host/host_config.cc
index ec30820e..07be8300 100644
--- a/remoting/host/host_config.cc
+++ b/remoting/host/host_config.cc
@@ -28,40 +28,40 @@
 const char kEnableH264ConfigPath[] = "enable_h264";
 const char kFrameRecorderBufferKbConfigPath[] = "frame-recorder-buffer-kb";
 
-absl::optional<base::Value> HostConfigFromJson(const std::string& json) {
+absl::optional<base::Value::Dict> HostConfigFromJson(const std::string& json) {
   absl::optional<base::Value> value =
       base::JSONReader::Read(json, base::JSON_ALLOW_TRAILING_COMMAS);
   if (!value.has_value()) {
-    LOG(ERROR) << "Failed to parse host config from JSON";
+    DLOG(ERROR) << "Failed to parse host config from JSON";
     return absl::nullopt;
   }
 
   if (!value->is_dict()) {
-    LOG(ERROR) << "Parsed host config returned was not a dictionary";
+    DLOG(ERROR) << "Parsed host config returned was not a dictionary";
     return absl::nullopt;
   }
 
-  return value;
+  return std::move(value->GetDict());
 }
 
-std::string HostConfigToJson(const base::Value& host_config) {
+std::string HostConfigToJson(const base::Value::Dict& host_config) {
   std::string data;
   base::JSONWriter::Write(host_config, &data);
   return data;
 }
 
-absl::optional<base::Value> HostConfigFromJsonFile(
+absl::optional<base::Value::Dict> HostConfigFromJsonFile(
     const base::FilePath& config_file) {
   std::string serialized;
   if (!base::ReadFileToString(config_file, &serialized)) {
-    LOG(ERROR) << "Failed to read " << config_file.value();
+    DLOG(ERROR) << "Failed to read " << config_file.value();
     return absl::nullopt;
   }
 
   return HostConfigFromJson(serialized);
 }
 
-bool HostConfigToJsonFile(const base::Value& host_config,
+bool HostConfigToJsonFile(const base::Value::Dict& host_config,
                           const base::FilePath& config_file) {
   std::string serialized = HostConfigToJson(host_config);
   return base::ImportantFileWriter::WriteFileAtomically(config_file,
diff --git a/remoting/host/host_config.h b/remoting/host/host_config.h
index 02a96902..300eb31d 100644
--- a/remoting/host/host_config.h
+++ b/remoting/host/host_config.h
@@ -8,10 +8,10 @@
 #include <memory>
 #include <string>
 
+#include "base/values.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace base {
-class Value;
 class FilePath;
 }  // namespace base
 
@@ -50,13 +50,14 @@
 extern const char kFrameRecorderBufferKbConfigPath[];
 
 // Helpers for serializing/deserializing Host configuration dictionaries.
-absl::optional<base::Value> HostConfigFromJson(const std::string& serialized);
-std::string HostConfigToJson(const base::Value& host_config);
+absl::optional<base::Value::Dict> HostConfigFromJson(
+    const std::string& serialized);
+std::string HostConfigToJson(const base::Value::Dict& host_config);
 
 // Helpers for loading/saving host configurations from/to files.
-absl::optional<base::Value> HostConfigFromJsonFile(
+absl::optional<base::Value::Dict> HostConfigFromJsonFile(
     const base::FilePath& config_file);
-bool HostConfigToJsonFile(const base::Value& host_config,
+bool HostConfigToJsonFile(const base::Value::Dict& host_config,
                           const base::FilePath& config_file);
 
 }  // namespace remoting
diff --git a/remoting/host/host_config_unittest.cc b/remoting/host/host_config_unittest.cc
index 27eff83..8d72c5f 100644
--- a/remoting/host/host_config_unittest.cc
+++ b/remoting/host/host_config_unittest.cc
@@ -53,21 +53,21 @@
   ASSERT_TRUE(test_dir_.CreateUniqueTempDir());
   base::FilePath test_file = test_dir_.GetPath().AppendASCII("read.json");
   WriteTestFile(test_file);
-  absl::optional<base::Value> target(HostConfigFromJsonFile(test_file));
+  absl::optional<base::Value::Dict> target(HostConfigFromJsonFile(test_file));
   ASSERT_TRUE(target.has_value());
 
-  std::string* value = target->FindStringKey(kXmppLoginConfigPath);
+  std::string* value = target->FindString(kXmppLoginConfigPath);
   EXPECT_EQ("test@gmail.com", *value);
-  value = target->FindStringKey(kOAuthRefreshTokenConfigPath);
+  value = target->FindString(kOAuthRefreshTokenConfigPath);
   EXPECT_EQ("TEST_REFRESH_TOKEN", *value);
-  value = target->FindStringKey(kHostIdConfigPath);
+  value = target->FindString(kHostIdConfigPath);
   EXPECT_EQ("TEST_HOST_ID", *value);
-  value = target->FindStringKey(kHostNameConfigPath);
+  value = target->FindString(kHostNameConfigPath);
   EXPECT_EQ("TEST_MACHINE_NAME", *value);
-  value = target->FindStringKey(kPrivateKeyConfigPath);
+  value = target->FindString(kPrivateKeyConfigPath);
   EXPECT_EQ("TEST_PRIVATE_KEY", *value);
 
-  value = target->FindStringKey("non_existent_value");
+  value = target->FindString("non_existent_value");
   EXPECT_EQ(nullptr, value);
 }
 
@@ -76,26 +76,26 @@
 
   base::FilePath test_file = test_dir_.GetPath().AppendASCII("write.json");
   WriteTestFile(test_file);
-  absl::optional<base::Value> target(HostConfigFromJsonFile(test_file));
+  absl::optional<base::Value::Dict> target(HostConfigFromJsonFile(test_file));
   ASSERT_TRUE(target.has_value());
 
   std::string new_refresh_token_value = "NEW_REFRESH_TOKEN";
-  target->SetStringKey(kOAuthRefreshTokenConfigPath, new_refresh_token_value);
+  target->Set(kOAuthRefreshTokenConfigPath, new_refresh_token_value);
   ASSERT_TRUE(HostConfigToJsonFile(*target, test_file));
 
   // Now read the file again and check that the value has been written.
   absl::optional<base::Value> reader(HostConfigFromJsonFile(test_file));
   ASSERT_TRUE(reader);
 
-  std::string* value = target->FindStringKey(kXmppLoginConfigPath);
+  std::string* value = target->FindString(kXmppLoginConfigPath);
   EXPECT_EQ("test@gmail.com", *value);
-  value = target->FindStringKey(kOAuthRefreshTokenConfigPath);
+  value = target->FindString(kOAuthRefreshTokenConfigPath);
   EXPECT_EQ(new_refresh_token_value, *value);
-  value = target->FindStringKey(kHostIdConfigPath);
+  value = target->FindString(kHostIdConfigPath);
   EXPECT_EQ("TEST_HOST_ID", *value);
-  value = target->FindStringKey(kHostNameConfigPath);
+  value = target->FindString(kHostNameConfigPath);
   EXPECT_EQ("TEST_MACHINE_NAME", *value);
-  value = target->FindStringKey(kPrivateKeyConfigPath);
+  value = target->FindString(kPrivateKeyConfigPath);
   EXPECT_EQ("TEST_PRIVATE_KEY", *value);
 }
 
diff --git a/remoting/host/mojom/remoting_host.mojom b/remoting/host/mojom/remoting_host.mojom
index c56e9910..bbc2e69e 100644
--- a/remoting/host/mojom/remoting_host.mojom
+++ b/remoting/host/mojom/remoting_host.mojom
@@ -17,7 +17,7 @@
   // This method may be called multiple times as changes are detected in the
   // host configuration file.
   [EnableIf=is_win]
-  ApplyHostConfig(mojo_base.mojom.DeprecatedDictionaryValue config);
+  ApplyHostConfig(mojo_base.mojom.DictionaryValue config);
 
   // Provides the network process with a set of platform handles which are used
   // for pairing functionality. The network process does not have access to the
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index 37a838ca..9fa34f1 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -327,10 +327,10 @@
 
   // Determines whether a new config should be applied and handles starting or
   // restarting the host process as necessary.
-  void OnConfigParsed(base::Value config);
+  void OnConfigParsed(base::Value::Dict config);
 
   // Applies the host config, returning true if successful.
-  bool ApplyConfig(const base::Value& config);
+  bool ApplyConfig(const base::Value::Dict& config);
 
   // Handles policy updates, by calling On*PolicyUpdate methods.
   void OnPolicyUpdate(base::Value::Dict policies);
@@ -381,7 +381,7 @@
 
 #if BUILDFLAG(IS_WIN)
   // mojom::RemotingHostControl implementation.
-  void ApplyHostConfig(base::Value serialized_config) override;
+  void ApplyHostConfig(base::Value::Dict serialized_config) override;
   void InitializePairingRegistry(
       ::mojo::PlatformHandle privileged_handle,
       ::mojo::PlatformHandle unprivileged_handle) override;
@@ -409,7 +409,7 @@
   scoped_refptr<RsaKeyPair> key_pair_;
   std::string oauth_refresh_token_;
   std::string robot_account_username_;
-  base::Value config_{base::Value::Type::DICTIONARY};
+  base::Value::Dict config_;
   std::string host_owner_;
   bool is_googler_ = false;
   absl::optional<size_t> max_clipboard_size_;
@@ -635,7 +635,8 @@
 void HostProcess::OnConfigUpdated(const std::string& serialized_config) {
   HOST_LOG << "Parsing new host configuration.";
 
-  absl::optional<base::Value> config(HostConfigFromJson(serialized_config));
+  absl::optional<base::Value::Dict> config(
+      HostConfigFromJson(serialized_config));
   if (!config.has_value()) {
     LOG(ERROR) << "Invalid configuration.";
     ShutdownHost(kInvalidHostConfigurationExitCode);
@@ -645,7 +646,7 @@
   OnConfigParsed(std::move(config.value()));
 }
 
-void HostProcess::OnConfigParsed(base::Value config) {
+void HostProcess::OnConfigParsed(base::Value::Dict config) {
   if (!context_->network_task_runner()->BelongsToCurrentThread()) {
     context_->network_task_runner()->PostTask(
         FROM_HERE,
@@ -1056,7 +1057,7 @@
 }
 
 #if BUILDFLAG(IS_WIN)
-void HostProcess::ApplyHostConfig(base::Value config) {
+void HostProcess::ApplyHostConfig(base::Value::Dict config) {
   DCHECK(context_->ui_task_runner()->BelongsToCurrentThread());
   OnConfigParsed(std::move(config));
 }
@@ -1097,17 +1098,17 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 // Applies the host config, returning true if successful.
-bool HostProcess::ApplyConfig(const base::Value& config) {
+bool HostProcess::ApplyConfig(const base::Value::Dict& config) {
   DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
 
-  const std::string* host_id = config.FindStringKey(kHostIdConfigPath);
+  const std::string* host_id = config.FindString(kHostIdConfigPath);
   if (!host_id) {
     LOG(ERROR) << "Config does not define " << kHostIdConfigPath << ".";
     return false;
   }
   host_id_ = *host_id;
 
-  const std::string* key_base64 = config.FindStringKey(kPrivateKeyConfigPath);
+  const std::string* key_base64 = config.FindString(kPrivateKeyConfigPath);
   if (!key_base64) {
     LOG(ERROR) << "Private key couldn't be read from the config file.";
     return false;
@@ -1120,7 +1121,7 @@
   }
 
   const std::string* host_secret_hash =
-      config.FindStringKey(kHostSecretHashConfigPath);
+      config.FindString(kHostSecretHashConfigPath);
   if (!host_secret_hash) {
     LOG(ERROR) << "Missing host_secret_hash value in configuration file.";
     return false;
@@ -1133,7 +1134,7 @@
 
   // Retrieve robot account to use for signaling and backend communication.
   const std::string* robot_account_username =
-      config.FindStringKey(kXmppLoginConfigPath);
+      config.FindString(kXmppLoginConfigPath);
   if (!robot_account_username) {
     LOG(ERROR) << "Robot account username is not defined in the config.";
     return false;
@@ -1142,7 +1143,7 @@
 
   // Retrieve robot account credentials for session signaling.
   const std::string* oauth_refresh_token =
-      config.FindStringKey(kOAuthRefreshTokenConfigPath);
+      config.FindString(kOAuthRefreshTokenConfigPath);
   if (!oauth_refresh_token) {
     LOG(ERROR) << "Robot account credentials are not defined in the config.";
     return false;
@@ -1155,9 +1156,9 @@
   // field. We are not generating separate addresses nor using JID any more but
   // we still read host_owner_email first for compatibility reason.
   const std::string* host_owner_ptr =
-      config.FindStringPath(kHostOwnerEmailConfigPath);
+      config.FindString(kHostOwnerEmailConfigPath);
   if (!host_owner_ptr) {
-    host_owner_ptr = config.FindStringPath(kHostOwnerConfigPath);
+    host_owner_ptr = config.FindString(kHostOwnerConfigPath);
   }
   if (!host_owner_ptr) {
     LOG(ERROR) << "Host config has no host_owner or host_owner_email fields.";
@@ -1218,7 +1219,7 @@
   if (policy_state_ != POLICY_ERROR_REPORTED) {
     policy_state_ = POLICY_ERROR_REPORT_PENDING;
     if ((state_ == HOST_STARTED) ||
-        (state_ == HOST_STARTING && !config_.DictEmpty())) {
+        (state_ == HOST_STARTING && !config_.empty())) {
       ReportPolicyErrorAndRestartHost();
     }
   }
@@ -1226,7 +1227,7 @@
 
 void HostProcess::ReportPolicyErrorAndRestartHost() {
   DCHECK(context_->network_task_runner()->BelongsToCurrentThread());
-  DCHECK(!config_.DictEmpty());
+  DCHECK(!config_.empty());
 
   DCHECK_EQ(policy_state_, POLICY_ERROR_REPORT_PENDING);
   policy_state_ = POLICY_ERROR_REPORTED;
@@ -1665,7 +1666,7 @@
   DCHECK_EQ(state_, HOST_STARTING);
 
   // Start the host if both the config and the policies are loaded.
-  if (!config_.DictEmpty()) {
+  if (!config_.empty()) {
     if (!report_offline_reason_.empty()) {
       SetState(HOST_GOING_OFFLINE_TO_STOP);
       GoOffline(report_offline_reason_);
@@ -1879,7 +1880,7 @@
     // to directory.
     OnHostOfflineReasonAck(true);
     return;
-  } else if (!config_.DictEmpty()) {
+  } else if (!config_.empty()) {
     if (!signal_strategy_)
       InitializeSignaling();
 
diff --git a/remoting/host/setup/daemon_controller_delegate_linux.cc b/remoting/host/setup/daemon_controller_delegate_linux.cc
index 090b521..baff327 100644
--- a/remoting/host/setup/daemon_controller_delegate_linux.cc
+++ b/remoting/host/setup/daemon_controller_delegate_linux.cc
@@ -147,18 +147,18 @@
 }
 
 absl::optional<base::Value::Dict> DaemonControllerDelegateLinux::GetConfig() {
-  absl::optional<base::Value> host_config(
+  absl::optional<base::Value::Dict> host_config(
       HostConfigFromJsonFile(GetConfigPath()));
   if (!host_config.has_value())
     return absl::nullopt;
 
   base::Value::Dict result;
-  std::string* value = host_config->FindStringKey(kHostIdConfigPath);
+  std::string* value = host_config->FindString(kHostIdConfigPath);
   if (value) {
     result.Set(kHostIdConfigPath, *value);
   }
 
-  value = host_config->FindStringKey(kXmppLoginConfigPath);
+  value = host_config->FindString(kXmppLoginConfigPath);
   if (value) {
     result.Set(kXmppLoginConfigPath, *value);
   }
@@ -189,7 +189,7 @@
   }
 
   // Write config.
-  if (!HostConfigToJsonFile(base::Value(std::move(config)), GetConfigPath())) {
+  if (!HostConfigToJsonFile(std::move(config), GetConfigPath())) {
     LOG(ERROR) << "Failed to update config file.";
     std::move(done).Run(DaemonController::RESULT_FAILED);
     return;
@@ -217,18 +217,17 @@
 void DaemonControllerDelegateLinux::UpdateConfig(
     base::Value::Dict config,
     DaemonController::CompletionCallback done) {
-  absl::optional<base::Value> new_config(
+  absl::optional<base::Value::Dict> new_config(
       HostConfigFromJsonFile(GetConfigPath()));
-  if (!new_config.has_value() || !new_config->is_dict()) {
+  if (!new_config.has_value()) {
     LOG(ERROR) << "Failed to read existing config file.";
     std::move(done).Run(DaemonController::RESULT_FAILED);
     return;
   }
 
-  new_config->GetDict().Merge(std::move(config));
+  new_config->Merge(std::move(config));
 
-  if (!HostConfigToJsonFile(base::Value(std::move(*new_config)),
-                            GetConfigPath())) {
+  if (!HostConfigToJsonFile(std::move(*new_config), GetConfigPath())) {
     LOG(ERROR) << "Failed to update config file.";
     std::move(done).Run(DaemonController::RESULT_FAILED);
     return;
diff --git a/remoting/host/setup/daemon_controller_delegate_mac.mm b/remoting/host/setup/daemon_controller_delegate_mac.mm
index 337c36e..00fb69c 100644
--- a/remoting/host/setup/daemon_controller_delegate_mac.mm
+++ b/remoting/host/setup/daemon_controller_delegate_mac.mm
@@ -171,7 +171,7 @@
   bool service_running = (job_pid > 0);
 
   const char* command = service_running ? "--save-config" : "--enable";
-  std::string input_data = HostConfigToJson(base::Value(std::move(config)));
+  std::string input_data = HostConfigToJson(std::move(config));
   if (!RunHelperAsRoot(command, input_data)) {
     LOG(ERROR) << "Failed to run the helper tool.";
     std::move(done).Run(DaemonController::RESULT_FAILED);
@@ -235,17 +235,18 @@
 
 absl::optional<base::Value::Dict> DaemonControllerDelegateMac::GetConfig() {
   base::FilePath config_path(kHostConfigFilePath);
-  absl::optional<base::Value> host_config(HostConfigFromJsonFile(config_path));
+  absl::optional<base::Value::Dict> host_config(
+      HostConfigFromJsonFile(config_path));
   if (!host_config.has_value())
     return absl::nullopt;
 
   base::Value::Dict config;
-  std::string* value = host_config->FindStringKey(kHostIdConfigPath);
+  std::string* value = host_config->FindString(kHostIdConfigPath);
   if (value) {
     config.Set(kHostIdConfigPath, *value);
   }
 
-  value = host_config->FindStringKey(kXmppLoginConfigPath);
+  value = host_config->FindString(kXmppLoginConfigPath);
   if (value) {
     config.Set(kXmppLoginConfigPath, *value);
   }
@@ -276,17 +277,16 @@
     base::Value::Dict config,
     DaemonController::CompletionCallback done) {
   base::FilePath config_file_path(kHostConfigFilePath);
-  absl::optional<base::Value> host_config(
+  absl::optional<base::Value::Dict> host_config(
       HostConfigFromJsonFile(config_file_path));
-  if (!host_config.has_value() || !host_config->is_dict()) {
+  if (!host_config.has_value()) {
     std::move(done).Run(DaemonController::RESULT_FAILED);
     return;
   }
 
-  base::Value::Dict& host_config_dict = host_config->GetDict();
-
-  host_config_dict.Merge(std::move(config));
-  ElevateAndSetConfig(std::move(host_config_dict), std::move(done));
+  host_config->Merge(std::move(config));
+  ElevateAndSetConfig(std::move(host_config.value()),
+                      std::move(done));
 }
 
 void DaemonControllerDelegateMac::Stop(
@@ -303,11 +303,11 @@
   consent.set_by_policy = false;
 
   base::FilePath config_file_path(kHostConfigFilePath);
-  absl::optional<base::Value> host_config(
+  absl::optional<base::Value::Dict> host_config(
       HostConfigFromJsonFile(config_file_path));
   if (host_config.has_value()) {
     absl::optional<bool> host_config_value =
-        host_config->FindBoolKey(kUsageStatsConsentConfigPath);
+        host_config->FindBool(kUsageStatsConsentConfigPath);
     if (host_config_value.has_value()) {
       consent.allowed = host_config_value.value();
     }
diff --git a/remoting/host/usage_stats_consent_mac.cc b/remoting/host/usage_stats_consent_mac.cc
index 574424e..ce08666 100644
--- a/remoting/host/usage_stats_consent_mac.cc
+++ b/remoting/host/usage_stats_consent_mac.cc
@@ -28,11 +28,11 @@
   if (command_line->HasSwitch(kHostConfigSwitchName)) {
     base::FilePath config_file_path =
         command_line->GetSwitchValuePath(kHostConfigSwitchName);
-    absl::optional<base::Value> host_config(
+    absl::optional<base::Value::Dict> host_config(
         HostConfigFromJsonFile(config_file_path));
     if (host_config.has_value()) {
       absl::optional<bool> host_config_value =
-          host_config->FindBoolKey(kUsageStatsConsentConfigPath);
+          host_config->FindBool(kUsageStatsConsentConfigPath);
       if (host_config_value.has_value()) {
         allowed = host_config_value.value();
         return true;
diff --git a/testing/flake_suppressor_common/queries.py b/testing/flake_suppressor_common/queries.py
index dfaa035e..bd409602 100644
--- a/testing/flake_suppressor_common/queries.py
+++ b/testing/flake_suppressor_common/queries.py
@@ -41,7 +41,8 @@
 
 
 class BigQueryQuerier():
-  def __init__(self, sample_period: int, billing_project: str):
+  def __init__(self, sample_period: int, billing_project: str,
+               result_processor: results_module.ResultProcessor):
     """Class for making calls to BigQuery.
 
     Args:
@@ -52,6 +53,7 @@
     """
     self._sample_period = sample_period
     self._billing_project = billing_project
+    self._result_processor = result_processor
 
   def GetFlakyOrFailingCiTests(self) -> ct.QueryJsonType:
     """Gets all flaky or failing GPU tests from CI.
@@ -165,7 +167,7 @@
     for r in json_results:
       typ_tags = tuple(tag_utils.TagUtils.RemoveMostIgnoredTags(r['typ_tags']))
       test_name = r['test_name']
-      _, test_name = results_module.GetTestSuiteAndNameFromResultDbName(
+      _, test_name = self._result_processor.GetTestSuiteAndNameFromResultDbName(
           test_name)
       count = int(r['result_count'])
       result_counts[typ_tags][test_name] += count
diff --git a/testing/flake_suppressor_common/queries_unittest.py b/testing/flake_suppressor_common/queries_unittest.py
index 1e74b8c..0990466 100755
--- a/testing/flake_suppressor_common/queries_unittest.py
+++ b/testing/flake_suppressor_common/queries_unittest.py
@@ -15,7 +15,10 @@
 
 class GetResultCountsUnittest(unittest.TestCase):
   def setUp(self) -> None:
-    self._querier_instance = uu.UnitTest_BigQueryQuerier(1, 'project')
+    results_processor = uu.UnitTestResultProcessor()
+    self._querier_instance = uu.UnitTest_BigQueryQuerier(
+        1, 'project', results_processor)
+
     self._querier_instance._submitted_builds = set(['build-1234', 'build-2345'])
     self._subprocess_patcher = mock.patch(
         'flake_suppressor_common.queries.subprocess.run')
diff --git a/testing/flake_suppressor_common/results.py b/testing/flake_suppressor_common/results.py
index eeb60c49..0b0113b 100644
--- a/testing/flake_suppressor_common/results.py
+++ b/testing/flake_suppressor_common/results.py
@@ -15,94 +15,93 @@
 from typ import expectations_parser
 
 
-def AggregateResults(results: ct.QueryJsonType) -> ct.AggregatedResultsType:
-  """Aggregates BigQuery results.
+class ResultProcessor():
+  def AggregateResults(self,
+                       results: ct.QueryJsonType) -> ct.AggregatedResultsType:
+    """Aggregates BigQuery results.
 
-  Also filters out any results that have already been suppressed.
+    Also filters out any results that have already been suppressed.
 
-  Args:
-    results: Parsed JSON results from a BigQuery query.
+    Args:
+      results: Parsed JSON results from a BigQuery query.
 
-  Returns:
-    A map in the following format:
-    {
-      'test_suite': {
-        'test_name': {
-          'typ_tags_as_tuple': [ 'list', 'of', 'urls' ],
+    Returns:
+      A map in the following format:
+      {
+        'test_suite': {
+          'test_name': {
+            'typ_tags_as_tuple': [ 'list', 'of', 'urls' ],
+          },
         },
-      },
-    }
-  """
-  results = _ConvertJsonResultsToResultObjects(results)
-  results = _FilterOutSuppressedResults(results)
-  aggregated_results = {}
-  for r in results:
-    build_url = 'http://ci.chromium.org/b/%s' % r.build_id
+      }
+    """
+    results = self._ConvertJsonResultsToResultObjects(results)
+    results = self._FilterOutSuppressedResults(results)
+    aggregated_results = {}
+    for r in results:
+      build_url = 'http://ci.chromium.org/b/%s' % r.build_id
 
-    build_url_list = aggregated_results.setdefault(r.suite, {}).setdefault(
-        r.test, {}).setdefault(r.tags, [])
-    build_url_list.append(build_url)
-  return aggregated_results
+      build_url_list = aggregated_results.setdefault(r.suite, {}).setdefault(
+          r.test, {}).setdefault(r.tags, [])
+      build_url_list.append(build_url)
+    return aggregated_results
 
+  def _ConvertJsonResultsToResultObjects(self, results: ct.QueryJsonType
+                                         ) -> List[data_types.Result]:
+    """Converts JSON BigQuery results to data_types.Result objects.
 
-def _ConvertJsonResultsToResultObjects(results: ct.QueryJsonType
-                                       ) -> List[data_types.Result]:
-  """Converts JSON BigQuery results to data_types.Result objects.
+    Args:
+      results: Parsed JSON results from a BigQuery query
 
-  Args:
-    results: Parsed JSON results from a BigQuery query
+    Returns:
+      The contents of |results| as a list of data_types.Result objects.
+    """
+    object_results = []
+    for r in results:
+      suite, test_name = self.GetTestSuiteAndNameFromResultDbName(r['name'])
+      build_id = r['id'].split('-')[-1]
+      typ_tags = tuple(tag_utils.TagUtils.RemoveMostIgnoredTags(r['typ_tags']))
+      object_results.append(
+          data_types.Result(suite, test_name, typ_tags, build_id))
+    return object_results
 
-  Returns:
-    The contents of |results| as a list of data_types.Result objects.
-  """
-  object_results = []
-  for r in results:
-    suite, test_name = GetTestSuiteAndNameFromResultDbName(r['name'])
-    build_id = r['id'].split('-')[-1]
-    typ_tags = tuple(tag_utils.TagUtils.RemoveMostIgnoredTags(r['typ_tags']))
-    object_results.append(
-        data_types.Result(suite, test_name, typ_tags, build_id))
-  return object_results
+  def _FilterOutSuppressedResults(self, results: List[data_types.Result]
+                                  ) -> List[data_types.Result]:
+    """Filters out results that have already been suppressed in the repo.
 
+    Args:
+      results: A list of data_types.Result objects.
 
-def _FilterOutSuppressedResults(results: List[data_types.Result]
-                                ) -> List[data_types.Result]:
-  """Filters out results that have already been suppressed in the repo.
+    Returns:
+      |results| with any already-suppressed failures removed.
+    """
+    # Get all the expectations.
+    origin_expectation_contents = (
+        expectations.GetExpectationFilesFromLocalCheckout())
+    origin_expectations = collections.defaultdict(list)
+    for filename, contents in origin_expectation_contents.items():
+      list_parser = expectations_parser.TaggedTestListParser(contents)
+      for e in list_parser.expectations:
+        expectation = data_types.Expectation(e.test, e.tags, e.raw_results,
+                                             e.reason)
+        origin_expectations[filename].append(expectation)
 
-  Args:
-    results: A list of data_types.Result objects.
+    # Discard any results that already have a matching expectation.
+    kept_results = []
+    for r in results:
+      expectation_filename = expectations.GetExpectationFileForSuite(
+          r.suite, r.tags)
+      expectation_filename = os.path.basename(expectation_filename)
+      should_keep = True
+      for e in origin_expectations[expectation_filename]:
+        if e.AppliesToResult(r):
+          should_keep = False
+          break
+      if should_keep:
+        kept_results.append(r)
 
-  Returns:
-    |results| with any already-suppressed failures removed.
-  """
-  # Get all the expectations.
-  origin_expectation_contents = (
-      expectations.GetExpectationFilesFromLocalCheckout())
-  origin_expectations = collections.defaultdict(list)
-  for filename, contents in origin_expectation_contents.items():
-    list_parser = expectations_parser.TaggedTestListParser(contents)
-    for e in list_parser.expectations:
-      expectation = data_types.Expectation(e.test, e.tags, e.raw_results,
-                                           e.reason)
-      origin_expectations[filename].append(expectation)
+    return kept_results
 
-  # Discard any results that already have a matching expectation.
-  kept_results = []
-  for r in results:
-    expectation_filename = expectations.GetExpectationFileForSuite(
-        r.suite, r.tags)
-    expectation_filename = os.path.basename(expectation_filename)
-    should_keep = True
-    for e in origin_expectations[expectation_filename]:
-      if e.AppliesToResult(r):
-        should_keep = False
-        break
-    if should_keep:
-      kept_results.append(r)
-
-  return kept_results
-
-
-def GetTestSuiteAndNameFromResultDbName(result_db_name: str) -> Tuple[str, str]:
-  _, suite, __, test_name = result_db_name.split('.', 3)
-  return suite, test_name
+  def GetTestSuiteAndNameFromResultDbName(self, result_db_name: str
+                                          ) -> Tuple[str, str]:
+    raise NotImplementedError
diff --git a/testing/flake_suppressor_common/results_unittest.py b/testing/flake_suppressor_common/results_unittest.py
index eb2ef82..393114a 100755
--- a/testing/flake_suppressor_common/results_unittest.py
+++ b/testing/flake_suppressor_common/results_unittest.py
@@ -8,10 +8,12 @@
 import unittest
 import unittest.mock as mock
 
+from typing import List, Tuple
+
 from flake_suppressor_common import data_types
 from flake_suppressor_common import results
 from flake_suppressor_common import tag_utils as common_tag_utils
-from flake_suppressor import gpu_tag_utils as tag_utils
+from flake_suppressor_common import unittest_utils as uu
 
 GENERIC_EXPECTATION_FILE_CONTENTS = """\
 # tags: [ win ]
@@ -29,9 +31,8 @@
 
 class BaseResultsUnittest(unittest.TestCase):
   def setUp(self) -> None:
-    # TODO(crbug.com/1358733): this will be removed when this module is
-    # generalized.
-    common_tag_utils.SetTagUtilsImplementation(tag_utils.GpuTagUtils)
+    common_tag_utils.SetTagUtilsImplementation(uu.UnitTestTagUtils)
+    self._results = uu.UnitTestResultProcessor()
     self._local_patcher = mock.patch(
         'flake_suppressor_common.results.expectations.'
         'GetExpectationFilesFromLocalCheckout')
@@ -105,74 +106,8 @@
             },
         },
     }
-    self.assertEqual(results.AggregateResults(query_results), expected_output)
-
-  def testWithFiltering(self) -> None:
-    """Tests that results are properly filtered out."""
-    self._local_mock.return_value = {
-        'webgl_conformance_expectations.txt': GPU_EXPECTATION_FILE_CONTENTS,
-    }
-    query_results = [
-        # Expected to be removed.
-        {
-            'name': ('gpu_tests.webgl_conformance_integration_test.'
-                     'WebGLConformanceIntegrationTest.'
-                     'conformance/textures/misc/video-rotation.html'),
-            'id':
-            'build-1111',
-            'typ_tags': ['win', 'nvidia'],
-        },
-        # Expected to be removed.
-        {
-            'name': ('gpu_tests.webgl_conformance_integration_test.'
-                     'WebGLConformanceIntegrationTest.'
-                     'conformance/textures/misc/video-rotation.html'),
-            'id':
-            'build-2222',
-            'typ_tags': ['win', 'nvidia'],
-        },
-        {
-            'name': ('gpu_tests.webgl_conformance_integration_test.'
-                     'WebGLConformanceIntegrationTest.'
-                     'conformance/textures/misc/video-rotation.html'),
-            'id':
-            'build-3333',
-            'typ_tags': ['win', 'amd'],
-        },
-        {
-            'name': ('gpu_tests.webgl_conformance_integration_test.'
-                     'WebGLConformanceIntegrationTest.'
-                     'conformance/textures/misc/texture-npot-video.html'),
-            'id':
-            'build-4444',
-            'typ_tags': ['win', 'nvidia'],
-        },
-        {
-            'name': ('gpu_tests.pixel_integration_test.PixelIntegrationTest.'
-                     'Pixel_CSS3DBlueBox'),
-            'id':
-            'build-5555',
-            'typ_tags': ['win', 'nvidia'],
-        },
-    ]
-
-    expected_output = {
-        'webgl_conformance_integration_test': {
-            'conformance/textures/misc/video-rotation.html': {
-                ('amd', 'win'): ['http://ci.chromium.org/b/3333'],
-            },
-            'conformance/textures/misc/texture-npot-video.html': {
-                ('nvidia', 'win'): ['http://ci.chromium.org/b/4444'],
-            },
-        },
-        'pixel_integration_test': {
-            'Pixel_CSS3DBlueBox': {
-                ('nvidia', 'win'): ['http://ci.chromium.org/b/5555'],
-            },
-        },
-    }
-
-    self.assertEqual(results.AggregateResults(query_results), expected_output)
+    self.assertEqual(self._results.AggregateResults(query_results),
+                     expected_output)
 
 
 class ConvertJsonResultsToResultObjectsUnittest(BaseResultsUnittest):
@@ -209,38 +144,7 @@
             '2222',
         ),
     ]
-    self.assertEqual(results._ConvertJsonResultsToResultObjects(r),
-                     expected_results)
-
-  def testDuplicateResults(self) -> None:
-    """Tests that duplicate results are not merged."""
-    r = [
-        {
-            'name': ('gpu_tests.webgl_conformance_integration_test.'
-                     'WebGLConformanceIntegrationTest.'
-                     'conformance/textures/misc/video-rotation.html'),
-            'id':
-            'build-1111',
-            'typ_tags': ['win', 'nvidia'],
-        },
-        {
-            'name': ('gpu_tests.webgl_conformance_integration_test.'
-                     'WebGLConformanceIntegrationTest.'
-                     'conformance/textures/misc/video-rotation.html'),
-            'id':
-            'build-1111',
-            'typ_tags': ['win', 'nvidia'],
-        },
-    ]
-    expected_results = [
-        data_types.Result('webgl_conformance_integration_test',
-                          'conformance/textures/misc/video-rotation.html',
-                          ('nvidia', 'win'), '1111'),
-        data_types.Result('webgl_conformance_integration_test',
-                          'conformance/textures/misc/video-rotation.html',
-                          ('nvidia', 'win'), '1111'),
-    ]
-    self.assertEqual(results._ConvertJsonResultsToResultObjects(r),
+    self.assertEqual(self._results._ConvertJsonResultsToResultObjects(r),
                      expected_results)
 
 
@@ -259,7 +163,7 @@
         data_types.Result('bar_integration_test', 'foo_test', tuple(['win']),
                           'id')
     ]
-    self.assertEqual(results._FilterOutSuppressedResults(r), r)
+    self.assertEqual(self._results._FilterOutSuppressedResults(r), r)
 
   def testSuppressedResults(self) -> None:
     """Tests functionality when expectations apply to the given results."""
@@ -281,7 +185,7 @@
                           'id'),
     ]
 
-    self.assertEqual(results._FilterOutSuppressedResults(r),
+    self.assertEqual(self._results._FilterOutSuppressedResults(r),
                      expected_filtered_results)
 
 
diff --git a/testing/flake_suppressor_common/unittest_utils.py b/testing/flake_suppressor_common/unittest_utils.py
index 5c370624..56f1f9f 100644
--- a/testing/flake_suppressor_common/unittest_utils.py
+++ b/testing/flake_suppressor_common/unittest_utils.py
@@ -3,7 +3,12 @@
 # found in the LICENSE file.
 
 from pyfakefs import fake_filesystem_unittest  # pylint: disable=import-error
+from typing import Tuple, Iterable
+
+from flake_suppressor_common import common_typing as ct
 from flake_suppressor_common import queries
+from flake_suppressor_common import results as results_module
+from flake_suppressor_common import tag_utils
 
 
 def CreateFile(test: fake_filesystem_unittest.TestCase, *args,
@@ -28,3 +33,23 @@
 
   def GetResultCountTryQuery(self) -> str:
     return """submitted_builds SELECT * FROM bar"""
+
+  def GetFlakyOrFailingCiQuery(self) -> str:
+    return """SELECT * FROM foo"""
+
+  def GetFlakyOrFailingTryQuery(self) -> str:
+    return """submitted_builds SELECT * FROM bar"""
+
+
+class UnitTestResultProcessor(results_module.ResultProcessor):
+  def GetTestSuiteAndNameFromResultDbName(self, result_db_name: str
+                                          ) -> Tuple[str, str]:
+    _, suite, __, test_name = result_db_name.split('.', 3)
+    return suite, test_name
+
+
+class UnitTestTagUtils(tag_utils.BaseTagUtils):
+  def RemoveMostIgnoredTags(self, tags: Iterable[str]) -> ct.TagTupleType:
+    tags = list(set(tags) - set(['win-laptop']))
+    tags.sort()
+    return tuple(tags)
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index ad1fe83..5938d5b 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1389,6 +1389,31 @@
             ]
         }
     ],
+    "AutofillRefinedPhoneNumberTypes": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "WithoutPhoneNumberSeparators",
+                    "enable_features": [
+                        "AutofillEnableSupportForPhoneNumberTrunkTypes",
+                        "AutofillInferCountryCallingCode"
+                    ],
+                    "disable_features": [
+                        "AutofillConsiderPhoneNumberSeparatorsValidLabels"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillRetrieveOverallPredictionsFromCache": [
         {
             "platforms": [
@@ -2935,6 +2960,29 @@
             ]
         }
     ],
+    "ConsolidateMetricsServiceInitialLogLogic": [
+        {
+            "platforms": [
+                "windows",
+                "mac",
+                "linux",
+                "chromeos",
+                "chromeos_lacros",
+                "android",
+                "ios",
+                "android_webview",
+                "android_weblayer"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "ConsolidateMetricsServiceInitialLogLogic"
+                    ]
+                }
+            ]
+        }
+    ],
     "ConsolidatedSiteStorageControls": [
         {
             "platforms": [
diff --git a/third_party/android_sdk/cipd/system_images/android-31/google_apis/arm64.yaml b/third_party/android_sdk/cipd/system_images/android-31/google_apis/arm64.yaml
index 195b1d93..5f828d1 100644
--- a/third_party/android_sdk/cipd/system_images/android-31/google_apis/arm64.yaml
+++ b/third_party/android_sdk/cipd/system_images/android-31/google_apis/arm64.yaml
@@ -6,4 +6,4 @@
 description: system_images;android-31;google_apis;arm64-v8a
 root: ../../../../public/
 data:
-  - dir: system-images/android-31/google_apis/arm64
+  - dir: system-images/android-31/google_apis/arm64-v8a
diff --git a/third_party/blink/common/storage_key/storage_key_unittest.cc b/third_party/blink/common/storage_key/storage_key_unittest.cc
index aed9ec0..7ae6c22 100644
--- a/third_party/blink/common/storage_key/storage_key_unittest.cc
+++ b/third_party/blink/common/storage_key/storage_key_unittest.cc
@@ -40,9 +40,8 @@
   url::Origin valid_origin = url::Origin::Create(GURL("https://example.com"));
   StorageKey valid = StorageKey(valid_origin);
   EXPECT_FALSE(IsOpaque(valid));
-  // TODO(https://crbug.com/1287130): Change or remove this expectation once the
-  // full ancestor tree has been properly searched to determine AncestorChainBit
-  // value.
+  // Since the same origin is used for both `origin` and `top_level_site`, it is
+  // by definition same-site.
   EXPECT_EQ(valid.ancestor_chain_bit(), mojom::AncestorChainBit::kSameSite);
 
   url::Origin invalid_origin =
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.cc b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
index a610c38..9037f6f 100644
--- a/third_party/blink/renderer/core/clipboard/system_clipboard.cc
+++ b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
@@ -126,14 +126,15 @@
 
 void SystemClipboard::WritePlainText(const String& plain_text,
                                      SmartReplaceOption) {
+  if (!clipboard_.is_bound())
+    return;
   // TODO(https://crbug.com/106449): add support for smart replace, which is
   // currently under-specified.
   String text = plain_text;
 #if BUILDFLAG(IS_WIN)
   ReplaceNewlinesWithWindowsStyleNewlines(text);
 #endif
-  if (clipboard_.is_bound())
-    clipboard_->WriteText(NonNullString(text));
+  clipboard_->WriteText(NonNullString(text));
 }
 
 String SystemClipboard::ReadHTML(KURL& url,
@@ -182,8 +183,9 @@
 }
 
 void SystemClipboard::WriteSvg(const String& markup) {
-  if (clipboard_.is_bound())
-    clipboard_->WriteSvg(NonNullString(markup));
+  if (!clipboard_.is_bound())
+    return;
+  clipboard_->WriteSvg(NonNullString(markup));
 }
 
 String SystemClipboard::ReadRTF() {
@@ -214,20 +216,20 @@
                                         const String& title) {
   DCHECK(image);
 
-  PaintImage paint_image = image->PaintImageForCurrentFrame();
+  if (!clipboard_.is_bound())
+    return;
 
+  PaintImage paint_image = image->PaintImageForCurrentFrame();
   // Orient the data.
   if (!image->HasDefaultOrientation()) {
     paint_image = Image::ResizeAndOrientImage(
         paint_image, image->CurrentFrameOrientation(), gfx::Vector2dF(1, 1), 1,
         kInterpolationNone);
   }
-
   SkBitmap bitmap;
   if (sk_sp<SkImage> sk_image = paint_image.GetSwSkImage())
     sk_image->asLegacyBitmap(&bitmap);
-  if (!clipboard_.is_bound())
-    return;
+
   // The bitmap backing a canvas can be in non-native skia pixel order (aka
   // RGBA when kN32_SkColorType is BGRA-ordered, or higher bit-depth color-types
   // like F16. The IPC to the browser requires the bitmap to be in N32 format
@@ -256,8 +258,9 @@
 }
 
 void SystemClipboard::WriteImage(const SkBitmap& bitmap) {
-  if (clipboard_.is_bound())
-    clipboard_->WriteImage(bitmap);
+  if (!clipboard_.is_bound())
+    return;
+  clipboard_->WriteImage(bitmap);
 }
 
 mojom::blink::ClipboardFilesPtr SystemClipboard::ReadFiles() {
@@ -309,14 +312,16 @@
 }
 
 void SystemClipboard::CommitWrite() {
-  if (clipboard_.is_bound())
-    clipboard_->CommitWrite();
+  if (!clipboard_.is_bound())
+    return;
+  clipboard_->CommitWrite();
 }
 
 void SystemClipboard::CopyToFindPboard(const String& text) {
 #if BUILDFLAG(IS_MAC)
-  if (clipboard_.is_bound())
-    clipboard_->WriteStringToFindPboard(text);
+  if (!clipboard_.is_bound())
+    return;
+  clipboard_->WriteStringToFindPboard(text);
 #endif
 }
 
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.cc b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
index 303178e..c8063a6 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser.cc
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser.cc
@@ -678,7 +678,9 @@
   return tree_builder_->IsParsingFragment();
 }
 
-void HTMLDocumentParser::DeferredPumpTokenizerIfPossible() {
+void HTMLDocumentParser::DeferredPumpTokenizerIfPossible(
+    bool from_finish_append,
+    base::TimeTicks schedule_time) {
   // This method is called asynchronously, continues building the HTML document.
 
   // If we're scheduled for a tokenizer pump, then document should be attached
@@ -692,6 +694,13 @@
                "parser", (void*)this, "state",
                task_runner_state_->GetStateAsString());
 
+  if (metrics_reporter_ && from_finish_append && !did_pump_tokenizer_) {
+    base::UmaHistogramCustomMicrosecondsTimes(
+        "Blink.HTMLParsing.TimeToDeferredPumpTokenizer4",
+        base::TimeTicks::Now() - schedule_time, base::Microseconds(1),
+        base::Seconds(1), 100);
+  }
+
   // This method is called when the post task is executed, marking the end of
   // a yield. Report the yielded time.
   DCHECK(yield_timer_);
@@ -731,7 +740,7 @@
 
   if (yielded) {
     DCHECK(!task_runner_state_->ShouldComplete());
-    SchedulePumpTokenizer();
+    SchedulePumpTokenizer(/*from_finish_append=*/false);
   } else if (task_runner_state_->ShouldAttemptToEndOnEOF()) {
     // Fall into this branch if ::Finish has been previously called and we've
     // just finished asynchronously parsing everything.
@@ -948,7 +957,7 @@
   return should_yield;
 }
 
-void HTMLDocumentParser::SchedulePumpTokenizer() {
+void HTMLDocumentParser::SchedulePumpTokenizer(bool from_finish_append) {
   TRACE_EVENT0("blink", "HTMLDocumentParser::SchedulePumpTokenizer");
   DCHECK(!IsStopped());
   DCHECK(!task_runner_state_->InPumpSession());
@@ -960,7 +969,8 @@
   loading_task_runner_->PostTask(
       FROM_HERE,
       WTF::BindOnce(&HTMLDocumentParser::DeferredPumpTokenizerIfPossible,
-                    WrapPersistent(this)));
+                    WrapPersistent(this), from_finish_append,
+                    base::TimeTicks::Now()));
   task_runner_state_->SetState(
       HTMLDocumentParserState::DeferredParserState::kScheduled);
 
@@ -978,7 +988,8 @@
     loading_task_runner_->PostTask(
         FROM_HERE,
         WTF::BindOnce(&HTMLDocumentParser::DeferredPumpTokenizerIfPossible,
-                      WrapPersistent(this)));
+                      WrapPersistent(this),
+                      /*from_finish_append=*/false, base::TimeTicks::Now()));
     yield_timer_ = std::make_unique<base::ElapsedTimer>();
   }
   // If a pump is already scheduled, it's OK to just upgrade it to one
@@ -1131,7 +1142,7 @@
   if (task_runner_state_->GetMode() ==
           ParserSynchronizationPolicy::kAllowDeferredParsing &&
       !task_runner_state_->ShouldComplete()) {
-    SchedulePumpTokenizer();
+    SchedulePumpTokenizer(/*from_finish_append=*/true);
   } else {
     PumpTokenizerIfPossible();
   }
@@ -1294,7 +1305,7 @@
   if (task_runner_state_->GetMode() == kAllowDeferredParsing &&
       !task_runner_state_->ShouldComplete() &&
       !task_runner_state_->InPumpSession()) {
-    SchedulePumpTokenizer();
+    SchedulePumpTokenizer(/*from_finish_append=*/false);
   } else {
     ShouldCompleteScope should_complete(task_runner_state_);
     PumpTokenizerIfPossible();
diff --git a/third_party/blink/renderer/core/html/parser/html_document_parser.h b/third_party/blink/renderer/core/html/parser/html_document_parser.h
index 8bf5cc4..0233cbb8 100644
--- a/third_party/blink/renderer/core/html/parser/html_document_parser.h
+++ b/third_party/blink/renderer/core/html/parser/html_document_parser.h
@@ -178,8 +178,9 @@
   NextTokenStatus CanTakeNextToken(base::TimeDelta& time_executing_script);
   bool PumpTokenizer();
   void PumpTokenizerIfPossible();
-  void DeferredPumpTokenizerIfPossible();
-  void SchedulePumpTokenizer();
+  void DeferredPumpTokenizerIfPossible(bool from_finish_append,
+                                       base::TimeTicks schedule_time);
+  void SchedulePumpTokenizer(bool from_finish_append);
   void ScheduleEndIfDelayed();
   void ConstructTreeFromToken(AtomicHTMLToken& atomic_token);
 
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index ceabc9e..5ae23b6e 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -299,6 +299,14 @@
         GetBackingMailboxForOverwrite(kOrderingBarrier), x, y,
         GetBackingTextureTarget(), base::checked_cast<GLuint>(row_bytes),
         orig_info, pixels);
+
+    // If the overdraw optimization kicked in, we need to indicate that the
+    // pixels do not need to be cleared, otherwise the subsequent
+    // rasterizations will clobber canvas contents.
+    if (x <= 0 && y <= 0 && orig_info.width() >= Size().width() &&
+        orig_info.height() >= Size().height())
+      is_cleared_ = true;
+
     return true;
   }
 
diff --git a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
index ed311fd..ec44895 100644
--- a/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
+++ b/third_party/blink/renderer/platform/video_capture/video_capture_impl.cc
@@ -523,51 +523,38 @@
           gpu_memory_buffer_->GetFormat());
 
 #if BUILDFLAG(IS_WIN)
+  // Explicitly set GL_TEXTURE_EXTERNAL_OES since ImageTextureTarget() will
+  // return GL_TEXTURE_2D due to GMB factory not supporting NV12 DXGI GMBs.
+  // See https://crbug.com/1253791#c17
+  // TODO(sunnyps): This shouldn't be needed after
+  // https://chromium-review.googlesource.com/c/angle/angle/+/3856660
+  texture_target = GL_TEXTURE_EXTERNAL_OES;
+#endif  // BUILDFLAG(IS_WIN)
+
+  // TODO(sunnyps): Get rid of NV12_DUAL_GMB format and instead rely on enabled
+  // by default multi plane shared images on Windows.
   if (output_format ==
-      media::GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB) {
+          media::GpuVideoAcceleratorFactories::OutputFormat::NV12_DUAL_GMB ||
+      base::FeatureList::IsEnabled(
+          media::kMultiPlaneVideoCaptureSharedImages)) {
     planes.push_back(gfx::BufferPlane::Y);
     planes.push_back(gfx::BufferPlane::UV);
-
-    // Explicitly set GL_TEXTURE_EXTERNAL_OES since ImageTextureTarget() will
-    // return GL_TEXTURE_2D due to GMB factory not supporting NV12 DXGI GMBs.
-    // See https://crbug.com/1253791#c17
-    texture_target = GL_TEXTURE_EXTERNAL_OES;
-
-    if (should_recreate_shared_image ||
-        buffer_context_->gmb_resources()->mailboxes[0].IsZero()) {
-      auto plane_mailboxes = sii->CreateSharedImageVideoPlanes(
-          gpu_memory_buffer_.get(),
-          buffer_context_->gpu_factories()->GpuMemoryBufferManager(), usage);
-      DCHECK_EQ(plane_mailboxes.size(), planes.size());
-      for (size_t plane = 0; plane < planes.size(); ++plane) {
-        buffer_context_->gmb_resources()->mailboxes[plane] =
-            plane_mailboxes[plane];
-      }
-    }
+  } else {
+    planes.push_back(gfx::BufferPlane::DEFAULT);
   }
-#endif  // BUILDFLAG(IS_WIN)
-  if (planes.empty()) {
-    if (base::FeatureList::IsEnabled(
-            media::kMultiPlaneVideoCaptureSharedImages)) {
-      planes.push_back(gfx::BufferPlane::Y);
-      planes.push_back(gfx::BufferPlane::UV);
+  for (size_t plane = 0; plane < planes.size(); ++plane) {
+    if (should_recreate_shared_image ||
+        buffer_context_->gmb_resources()->mailboxes[plane].IsZero()) {
+      buffer_context_->gmb_resources()->mailboxes[plane] =
+          sii->CreateSharedImage(
+              gpu_memory_buffer_.get(),
+              buffer_context_->gpu_factories()->GpuMemoryBufferManager(),
+              planes[plane], *(frame_info_->color_space),
+              kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, usage);
     } else {
-      planes.push_back(gfx::BufferPlane::DEFAULT);
-    }
-    for (size_t plane = 0; plane < planes.size(); ++plane) {
-      if (should_recreate_shared_image ||
-          buffer_context_->gmb_resources()->mailboxes[plane].IsZero()) {
-        buffer_context_->gmb_resources()->mailboxes[plane] =
-            sii->CreateSharedImage(
-                gpu_memory_buffer_.get(),
-                buffer_context_->gpu_factories()->GpuMemoryBufferManager(),
-                planes[plane], *(frame_info_->color_space),
-                kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, usage);
-      } else {
-        sii->UpdateSharedImage(
-            buffer_context_->gmb_resources()->release_sync_token,
-            buffer_context_->gmb_resources()->mailboxes[plane]);
-      }
+      sii->UpdateSharedImage(
+          buffer_context_->gmb_resources()->release_sync_token,
+          buffer_context_->gmb_resources()->mailboxes[plane]);
     }
   }
 
diff --git a/third_party/blink/tools/wpt_import.py.vpython b/third_party/blink/tools/wpt_import.py.vpython
deleted file mode 100644
index 1f3c0f4..0000000
--- a/third_party/blink/tools/wpt_import.py.vpython
+++ /dev/null
@@ -1,46 +0,0 @@
-wheel: <
-  name: "infra/python/wheels/google-api-python-client-py2_py3"
-  version: "version:1.6.2"
->
-
-wheel: <
-  name: "infra/python/wheels/httplib2-py2_py3"
-  version: "version:0.10.3"
->
-
-wheel: <
-  name: "infra/python/wheels/uritemplate-py2_py3"
-  version: "version:3.0.0"
->
-
-wheel: <
-  name: "infra/python/wheels/oauth2client-py2_py3"
-  version: "version:4.0.0"
->
-
-wheel: <
-  name: "infra/python/wheels/rsa-py2_py3"
-  version: "version:3.4.2"
->
-
-wheel: <
-  name: "infra/python/wheels/pyasn1-py2_py3"
-  version: "version:0.2.3"
->
-
-wheel: <
-  name: "infra/python/wheels/pyasn1_modules-py2_py3"
-  version: "version:0.0.8"
->
-
-wheel: <
-  name: "infra/python/wheels/six-py2_py3"
-  version: "version:1.10.0"
->
-
-# Not directly used by wpt_import, but required by
-# //third_party/catapult/third_party/typ, which is one of its dependencies.
-wheel: <
-  name: "infra/python/wheels/requests-py2_py3"
-  version: "version:2.13.0"
->
diff --git a/third_party/blink/web_tests/fast/canvas/bug1361165-expected.html b/third_party/blink/web_tests/fast/canvas/bug1361165-expected.html
new file mode 100644
index 0000000..ff423d9
--- /dev/null
+++ b/third_party/blink/web_tests/fast/canvas/bug1361165-expected.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+Regression test for crbug.com/1361165
+There should be a solid green rectangle below this line of text.
+<canvas id='c'></canvas>
+<script>
+const c = document.getElementById('c')
+const ctx = c.getContext("2d");
+ctx.fillStyle = '#0f0';
+ctx.fillRect(0,0,c.width,c.height);
+</script>
diff --git a/third_party/blink/web_tests/fast/canvas/bug1361165.html b/third_party/blink/web_tests/fast/canvas/bug1361165.html
new file mode 100644
index 0000000..f933c618
--- /dev/null
+++ b/third_party/blink/web_tests/fast/canvas/bug1361165.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+Regression test for crbug.com/1361165
+There should be a solid green rectangle below this line of text.
+<canvas id='c' style="background-color:red"></canvas>
+<script>
+const c = document.getElementById('c')
+const ctx = c.getContext("2d");
+var imgd = ctx.createImageData(c.width,c.height);
+for (let p = 0; p < imgd.data.length;) {
+  imgd.data[p++] = 0;
+  imgd.data[p++] = 255;
+  imgd.data[p++] = 0;
+  imgd.data[p++] = 255;
+}
+ctx.fillStyle = '#0f0';
+
+if (window.testRunner) {
+  testRunner.waitUntilDone();
+}
+
+function phase1(){
+  ctx.fillRect(0,0,50,50);
+  requestAnimationFrame(phase2);
+}
+
+function phase2(){
+  ctx.putImageData(imgd, 0, 0);	
+  ctx.fillRect(0,0,50,50);
+  if (window.testRunner) {
+    testRunner.notifyDone();
+  }
+}
+
+requestAnimationFrame(phase1);
+</script>
diff --git a/third_party/lzma_sdk/BUILD.gn b/third_party/lzma_sdk/BUILD.gn
index 67756fc..388fb93 100644
--- a/third_party/lzma_sdk/BUILD.gn
+++ b/third_party/lzma_sdk/BUILD.gn
@@ -122,6 +122,7 @@
     "C/XzCrc64.h",
     "C/XzCrc64Opt.c",
     "C/XzDec.c",
+    "C/XzIn.c",
   ]
 
   # TODO(crbug.com/1338627): Enable ARM optimizations
diff --git a/third_party/lzma_sdk/C/XzIn.c b/third_party/lzma_sdk/C/XzIn.c
new file mode 100644
index 0000000..84f868e
--- /dev/null
+++ b/third_party/lzma_sdk/C/XzIn.c
@@ -0,0 +1,325 @@
+/* XzIn.c - Xz input
+2021-09-04 : Igor Pavlov : Public domain */
+
+#include "Precomp.h"
+
+#include <string.h>
+
+#include "7zCrc.h"
+#include "CpuArch.h"
+#include "Xz.h"
+
+/*
+#define XZ_FOOTER_SIG_CHECK(p) (memcmp((p), XZ_FOOTER_SIG, XZ_FOOTER_SIG_SIZE) == 0)
+*/
+#define XZ_FOOTER_SIG_CHECK(p) ((p)[0] == XZ_FOOTER_SIG_0 && (p)[1] == XZ_FOOTER_SIG_1)
+
+
+SRes Xz_ReadHeader(CXzStreamFlags *p, ISeqInStream *inStream)
+{
+  Byte sig[XZ_STREAM_HEADER_SIZE];
+  RINOK(SeqInStream_Read2(inStream, sig, XZ_STREAM_HEADER_SIZE, SZ_ERROR_NO_ARCHIVE));
+  if (memcmp(sig, XZ_SIG, XZ_SIG_SIZE) != 0)
+    return SZ_ERROR_NO_ARCHIVE;
+  return Xz_ParseHeader(p, sig);
+}
+
+#define READ_VARINT_AND_CHECK(buf, pos, size, res) \
+  { unsigned s = Xz_ReadVarInt(buf + pos, size - pos, res); \
+  if (s == 0) return SZ_ERROR_ARCHIVE; \
+  pos += s; }
+
+SRes XzBlock_ReadHeader(CXzBlock *p, ISeqInStream *inStream, BoolInt *isIndex, UInt32 *headerSizeRes)
+{
+  Byte header[XZ_BLOCK_HEADER_SIZE_MAX];
+  unsigned headerSize;
+  *headerSizeRes = 0;
+  RINOK(SeqInStream_ReadByte(inStream, &header[0]));
+  headerSize = (unsigned)header[0];
+  if (headerSize == 0)
+  {
+    *headerSizeRes = 1;
+    *isIndex = True;
+    return SZ_OK;
+  }
+
+  *isIndex = False;
+  headerSize = (headerSize << 2) + 4;
+  *headerSizeRes = headerSize;
+  RINOK(SeqInStream_Read(inStream, header + 1, headerSize - 1));
+  return XzBlock_Parse(p, header);
+}
+
+#define ADD_SIZE_CHECK(size, val) \
+  { UInt64 newSize = size + (val); if (newSize < size) return XZ_SIZE_OVERFLOW; size = newSize; }
+
+UInt64 Xz_GetUnpackSize(const CXzStream *p)
+{
+  UInt64 size = 0;
+  size_t i;
+  for (i = 0; i < p->numBlocks; i++)
+    ADD_SIZE_CHECK(size, p->blocks[i].unpackSize);
+  return size;
+}
+
+UInt64 Xz_GetPackSize(const CXzStream *p)
+{
+  UInt64 size = 0;
+  size_t i;
+  for (i = 0; i < p->numBlocks; i++)
+    ADD_SIZE_CHECK(size, (p->blocks[i].totalSize + 3) & ~(UInt64)3);
+  return size;
+}
+
+/*
+SRes XzBlock_ReadFooter(CXzBlock *p, CXzStreamFlags f, ISeqInStream *inStream)
+{
+  return SeqInStream_Read(inStream, p->check, XzFlags_GetCheckSize(f));
+}
+*/
+
+static SRes Xz_ReadIndex2(CXzStream *p, const Byte *buf, size_t size, ISzAllocPtr alloc)
+{
+  size_t numBlocks, pos = 1;
+  UInt32 crc;
+
+  if (size < 5 || buf[0] != 0)
+    return SZ_ERROR_ARCHIVE;
+
+  size -= 4;
+  crc = CrcCalc(buf, size);
+  if (crc != GetUi32(buf + size))
+    return SZ_ERROR_ARCHIVE;
+
+  {
+    UInt64 numBlocks64;
+    READ_VARINT_AND_CHECK(buf, pos, size, &numBlocks64);
+    numBlocks = (size_t)numBlocks64;
+    if (numBlocks != numBlocks64 || numBlocks * 2 > size)
+      return SZ_ERROR_ARCHIVE;
+  }
+  
+  Xz_Free(p, alloc);
+  if (numBlocks != 0)
+  {
+    size_t i;
+    p->numBlocks = numBlocks;
+    p->blocks = (CXzBlockSizes *)ISzAlloc_Alloc(alloc, sizeof(CXzBlockSizes) * numBlocks);
+    if (!p->blocks)
+      return SZ_ERROR_MEM;
+    for (i = 0; i < numBlocks; i++)
+    {
+      CXzBlockSizes *block = &p->blocks[i];
+      READ_VARINT_AND_CHECK(buf, pos, size, &block->totalSize);
+      READ_VARINT_AND_CHECK(buf, pos, size, &block->unpackSize);
+      if (block->totalSize == 0)
+        return SZ_ERROR_ARCHIVE;
+    }
+  }
+  while ((pos & 3) != 0)
+    if (buf[pos++] != 0)
+      return SZ_ERROR_ARCHIVE;
+  return (pos == size) ? SZ_OK : SZ_ERROR_ARCHIVE;
+}
+
+static SRes Xz_ReadIndex(CXzStream *p, ILookInStream *stream, UInt64 indexSize, ISzAllocPtr alloc)
+{
+  SRes res;
+  size_t size;
+  Byte *buf;
+  if (indexSize > ((UInt32)1 << 31))
+    return SZ_ERROR_UNSUPPORTED;
+  size = (size_t)indexSize;
+  if (size != indexSize)
+    return SZ_ERROR_UNSUPPORTED;
+  buf = (Byte *)ISzAlloc_Alloc(alloc, size);
+  if (!buf)
+    return SZ_ERROR_MEM;
+  res = LookInStream_Read2(stream, buf, size, SZ_ERROR_UNSUPPORTED);
+  if (res == SZ_OK)
+    res = Xz_ReadIndex2(p, buf, size, alloc);
+  ISzAlloc_Free(alloc, buf);
+  return res;
+}
+
+static SRes LookInStream_SeekRead_ForArc(ILookInStream *stream, UInt64 offset, void *buf, size_t size)
+{
+  RINOK(LookInStream_SeekTo(stream, offset));
+  return LookInStream_Read(stream, buf, size);
+  /* return LookInStream_Read2(stream, buf, size, SZ_ERROR_NO_ARCHIVE); */
+}
+
+static SRes Xz_ReadBackward(CXzStream *p, ILookInStream *stream, Int64 *startOffset, ISzAllocPtr alloc)
+{
+  UInt64 indexSize;
+  Byte buf[XZ_STREAM_FOOTER_SIZE];
+  UInt64 pos = (UInt64)*startOffset;
+
+  if ((pos & 3) != 0 || pos < XZ_STREAM_FOOTER_SIZE)
+    return SZ_ERROR_NO_ARCHIVE;
+
+  pos -= XZ_STREAM_FOOTER_SIZE;
+  RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE));
+  
+  if (!XZ_FOOTER_SIG_CHECK(buf + 10))
+  {
+    UInt32 total = 0;
+    pos += XZ_STREAM_FOOTER_SIZE;
+    
+    for (;;)
+    {
+      size_t i;
+      #define TEMP_BUF_SIZE (1 << 10)
+      Byte temp[TEMP_BUF_SIZE];
+      
+      i = (pos > TEMP_BUF_SIZE) ? TEMP_BUF_SIZE : (size_t)pos;
+      pos -= i;
+      RINOK(LookInStream_SeekRead_ForArc(stream, pos, temp, i));
+      total += (UInt32)i;
+      for (; i != 0; i--)
+        if (temp[i - 1] != 0)
+          break;
+      if (i != 0)
+      {
+        if ((i & 3) != 0)
+          return SZ_ERROR_NO_ARCHIVE;
+        pos += i;
+        break;
+      }
+      if (pos < XZ_STREAM_FOOTER_SIZE || total > (1 << 16))
+        return SZ_ERROR_NO_ARCHIVE;
+    }
+    
+    if (pos < XZ_STREAM_FOOTER_SIZE)
+      return SZ_ERROR_NO_ARCHIVE;
+    pos -= XZ_STREAM_FOOTER_SIZE;
+    RINOK(LookInStream_SeekRead_ForArc(stream, pos, buf, XZ_STREAM_FOOTER_SIZE));
+    if (!XZ_FOOTER_SIG_CHECK(buf + 10))
+      return SZ_ERROR_NO_ARCHIVE;
+  }
+  
+  p->flags = (CXzStreamFlags)GetBe16(buf + 8);
+
+  if (!XzFlags_IsSupported(p->flags))
+    return SZ_ERROR_UNSUPPORTED;
+
+  {
+    /* to eliminate GCC 6.3 warning:
+       dereferencing type-punned pointer will break strict-aliasing rules */
+    const Byte *buf_ptr = buf;
+    if (GetUi32(buf_ptr) != CrcCalc(buf + 4, 6))
+      return SZ_ERROR_ARCHIVE;
+  }
+
+  indexSize = ((UInt64)GetUi32(buf + 4) + 1) << 2;
+
+  if (pos < indexSize)
+    return SZ_ERROR_ARCHIVE;
+
+  pos -= indexSize;
+  RINOK(LookInStream_SeekTo(stream, pos));
+  RINOK(Xz_ReadIndex(p, stream, indexSize, alloc));
+
+  {
+    UInt64 totalSize = Xz_GetPackSize(p);
+    if (totalSize == XZ_SIZE_OVERFLOW
+        || totalSize >= ((UInt64)1 << 63)
+        || pos < totalSize + XZ_STREAM_HEADER_SIZE)
+      return SZ_ERROR_ARCHIVE;
+    pos -= (totalSize + XZ_STREAM_HEADER_SIZE);
+    RINOK(LookInStream_SeekTo(stream, pos));
+    *startOffset = (Int64)pos;
+  }
+  {
+    CXzStreamFlags headerFlags;
+    CSecToRead secToRead;
+    SecToRead_CreateVTable(&secToRead);
+    secToRead.realStream = stream;
+
+    RINOK(Xz_ReadHeader(&headerFlags, &secToRead.vt));
+    return (p->flags == headerFlags) ? SZ_OK : SZ_ERROR_ARCHIVE;
+  }
+}
+
+
+/* ---------- Xz Streams ---------- */
+
+void Xzs_Construct(CXzs *p)
+{
+  p->num = p->numAllocated = 0;
+  p->streams = 0;
+}
+
+void Xzs_Free(CXzs *p, ISzAllocPtr alloc)
+{
+  size_t i;
+  for (i = 0; i < p->num; i++)
+    Xz_Free(&p->streams[i], alloc);
+  ISzAlloc_Free(alloc, p->streams);
+  p->num = p->numAllocated = 0;
+  p->streams = 0;
+}
+
+UInt64 Xzs_GetNumBlocks(const CXzs *p)
+{
+  UInt64 num = 0;
+  size_t i;
+  for (i = 0; i < p->num; i++)
+    num += p->streams[i].numBlocks;
+  return num;
+}
+
+UInt64 Xzs_GetUnpackSize(const CXzs *p)
+{
+  UInt64 size = 0;
+  size_t i;
+  for (i = 0; i < p->num; i++)
+    ADD_SIZE_CHECK(size, Xz_GetUnpackSize(&p->streams[i]));
+  return size;
+}
+
+/*
+UInt64 Xzs_GetPackSize(const CXzs *p)
+{
+  UInt64 size = 0;
+  size_t i;
+  for (i = 0; i < p->num; i++)
+    ADD_SIZE_CHECK(size, Xz_GetTotalSize(&p->streams[i]));
+  return size;
+}
+*/
+
+SRes Xzs_ReadBackward(CXzs *p, ILookInStream *stream, Int64 *startOffset, ICompressProgress *progress, ISzAllocPtr alloc)
+{
+  Int64 endOffset = 0;
+  RINOK(ILookInStream_Seek(stream, &endOffset, SZ_SEEK_END));
+  *startOffset = endOffset;
+  for (;;)
+  {
+    CXzStream st;
+    SRes res;
+    Xz_Construct(&st);
+    res = Xz_ReadBackward(&st, stream, startOffset, alloc);
+    st.startOffset = (UInt64)*startOffset;
+    RINOK(res);
+    if (p->num == p->numAllocated)
+    {
+      const size_t newNum = p->num + p->num / 4 + 1;
+      void *data = ISzAlloc_Alloc(alloc, newNum * sizeof(CXzStream));
+      if (!data)
+        return SZ_ERROR_MEM;
+      p->numAllocated = newNum;
+      if (p->num != 0)
+        memcpy(data, p->streams, p->num * sizeof(CXzStream));
+      ISzAlloc_Free(alloc, p->streams);
+      p->streams = (CXzStream *)data;
+    }
+    p->streams[p->num++] = st;
+    if (*startOffset == 0)
+      break;
+    RINOK(LookInStream_SeekTo(stream, (UInt64)*startOffset));
+    if (progress && ICompressProgress_Progress(progress, (UInt64)(endOffset - *startOffset), (UInt64)(Int64)-1) != SZ_OK)
+      return SZ_ERROR_PROGRESS;
+  }
+  return SZ_OK;
+}
diff --git a/third_party/webgpu-cts/ts_sources.txt b/third_party/webgpu-cts/ts_sources.txt
index b1b6137..31d828d 100644
--- a/third_party/webgpu-cts/ts_sources.txt
+++ b/third_party/webgpu-cts/ts_sources.txt
@@ -255,6 +255,7 @@
 src/webgpu/api/validation/render_pipeline/inter_stage.spec.ts
 src/webgpu/api/validation/render_pipeline/misc.spec.ts
 src/webgpu/api/validation/render_pipeline/multisample_state.spec.ts
+src/webgpu/api/validation/render_pipeline/overrides.spec.ts
 src/webgpu/api/validation/render_pipeline/primitive_state.spec.ts
 src/webgpu/api/validation/render_pipeline/shader_module.spec.ts
 src/webgpu/api/validation/render_pipeline/vertex_state.spec.ts
@@ -264,6 +265,7 @@
 src/webgpu/api/validation/resource_usages/texture/in_render_common.spec.ts
 src/webgpu/api/validation/resource_usages/texture/in_render_misc.spec.ts
 src/webgpu/api/validation/shader_module/entry_point.spec.ts
+src/webgpu/api/validation/shader_module/overrides.spec.ts
 src/webgpu/api/validation/state/device_lost/destroy.spec.ts
 src/webgpu/api/validation/texture/destroy.spec.ts
 src/webgpu/idl/exposed.html.ts
diff --git a/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc b/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc
index 0806218a..61840b7 100644
--- a/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc
+++ b/tools/binary_size/libsupersize/viewer/caspian/caspian_web.cc
@@ -148,6 +148,7 @@
                const char* include_sections,
                int minimum_size_bytes,
                int match_flag,
+               bool non_overhead,
                bool disassembly_mode) {
   std::vector<TreeBuilder::FilterFunc> filters;
 
@@ -187,6 +188,12 @@
         });
   }
 
+  if (non_overhead) {
+    filters.push_back([](const GroupedPath&, const BaseSymbol& sym) -> bool {
+      return !sym.IsOverhead();
+    });
+  }
+
   if (disassembly_mode) {
     filters.push_back([](const GroupedPath&, const BaseSymbol& sym) -> bool {
       return sym.Disassembly() != nullptr;
diff --git a/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js b/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
index 001c330..3140d03 100644
--- a/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
+++ b/tools/binary_size/libsupersize/viewer/static/tree-worker-wasm.js
@@ -160,6 +160,7 @@
  * @property {string} includeSections
  * @property {number} minSymbolSize
  * @property {number} flagToFilter
+ * @property {boolean} nonOverhead
  * @property {boolean} disassemblyMode
  */
 
@@ -185,7 +186,7 @@
   ret.includeSections = params.get('type');
   if (ret.methodCountMode) {
     ret.includeSections = _DEX_METHOD_SYMBOL_TYPE;
-  } else if (  ret.includeSections === null) {
+  } else if (ret.includeSections === null) {
     // Exclude native symbols by default.
     const includeSectionsSet = new Set(_SYMBOL_TYPE_SET);
     includeSectionsSet.delete('b');
@@ -193,12 +194,13 @@
   }
 
   ret.minSymbolSize = Number(params.get('min_size'));
-  if (Number.isNaN(  ret.minSymbolSize)) {
+  if (Number.isNaN(ret.minSymbolSize)) {
     ret.minSymbolSize = 0;
   }
 
   ret.flagToFilter = _NAMES_TO_FLAGS[params.get('flag_filter')] || 0;
-  ret.disassemblyMode = params.get('flag_filter') == 'disassembly'
+  ret.nonOverhead = params.get('flag_filter') === 'nonoverhead';
+  ret.disassemblyMode = params.get('flag_filter') === 'disassembly';
 
   return ret;
 }
@@ -290,6 +292,7 @@
     includeSections,
     minSymbolSize,
     flagToFilter,
+    nonOverhead,
     disassemblyMode,
   } = parseOptions(optionsStr);
 
@@ -299,7 +302,7 @@
   const start_time = Date.now();
   const diffMode = cwrapBuildTree(
       methodCountMode, groupBy, includeRegex, excludeRegex, includeSections,
-      minSymbolSize, flagToFilter, disassemblyMode);
+      minSymbolSize, flagToFilter, nonOverhead, disassemblyMode);
   console.log(
       'Constructed tree in ' + (Date.now() - start_time) / 1000.0 + ' seconds');
   return diffMode;
diff --git a/tools/binary_size/libsupersize/viewer/static/viewer.html b/tools/binary_size/libsupersize/viewer/static/viewer.html
index 68a3b3d5..e537551 100644
--- a/tools/binary_size/libsupersize/viewer/static/viewer.html
+++ b/tools/binary_size/libsupersize/viewer/static/viewer.html
@@ -283,6 +283,10 @@
         <label class="radio-label" for="uncompressedflag">Uncompressed .pak files</label>
       </div>
       <div class="radio-wrapper">
+        <input type="radio" id="nonoverheadflag" name="flag_filter" value="nonoverhead">
+        <label class="radio-label" for="nonoverheadflag">Non-overhead</label>
+      </div>
+      <div class="radio-wrapper">
         <input type="radio" id="disassemblyflag" name="flag_filter" value="disassembly">
         <label class="radio-label" for="disassemblyflag">Disassembly</label>
       </div>
diff --git a/tools/cast3p/cast_core.version b/tools/cast3p/cast_core.version
index 8403e86..b9a6d219 100644
--- a/tools/cast3p/cast_core.version
+++ b/tools/cast3p/cast_core.version
@@ -1 +1 @@
-cast_20220610_0600_RC10
+cast_20220916_0600_RC00
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index c98909d38..b430f8fc 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -10456,15 +10456,15 @@
   <int value="6" label="(06) MANUAL_FILLING"/>
   <int value="7" label="(07) FULLSCREEN"/>
   <int value="8" label="(08) BOTTOM_SHEET"/>
-  <int value="9" label="(09) TAB_MODAL_HANDLER"/>
-  <int value="10" label="(10) TAB_SWITCHER_TO_BROWSING"/>
-  <int value="11" label="(11) CLOSE_WATCHER"/>
+  <int value="9" label="(10) TAB_MODAL_HANDLER"/>
+  <int value="10" label="(11) TAB_SWITCHER_TO_BROWSING"/>
+  <int value="11" label="(12) CLOSE_WATCHER"/>
   <int value="12" label="(14) TOOLBAR_TAB_CONTROLLER"/>
   <int value="13" label="(15) TAB_RETURN_TO_CHROME_START_SURFACE"/>
   <int value="14" label="(16) SHOW_READING_LIST"/>
   <int value="15" label="(17) MINIMIZE_APP_AND_CLOSE_TAB"/>
-  <int value="16" label="(12) FIND_TOOLBAR"/>
-  <int value="17" label="(13) LOCATION_BAR"/>
+  <int value="16" label="(13) FIND_TOOLBAR"/>
+  <int value="17" label="(09) LOCATION_BAR"/>
 </enum>
 
 <enum name="BadMessageReasonAutofill">
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 790630a..5387df1 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1325,6 +1325,21 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.HTMLParsing.TimeToDeferredPumpTokenizer4"
+    units="microseconds" expires_after="2023-06-30">
+  <owner>sky@chromium.org</owner>
+  <owner>dom-dev@chromium.org</owner>
+  <summary>
+    The time between when the first content has been received by the
+    HTMLDocumentParser and when parsing begins. This is effectively measuring
+    the time between when SchedulePumpTokenizer() is called, and when the task
+    runs that does the parsing. This is only reported for http/https urls.
+
+    This histogram does not record metrics on machines with low-resolution
+    clocks.
+  </summary>
+</histogram>
+
 <histogram name="Blink.HTMLParsing.TokensParsedAverage4" units="tokens"
     expires_after="2023-06-30">
   <owner>masonf@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index 09ad2080..d198e9b 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -944,6 +944,7 @@
     clustering backend request.
   </summary>
   <token key="ClusterFilterReason">
+    <variant name="Category" summary="all non-complex categories"/>
     <variant name="NoisyCluster" summary="all noisy visits"/>
     <variant name="SingleVisit" summary="only a single visit"/>
     <variant name="VisibilityScore" summary="low visibility score"/>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index c8a9e4b..fd445aa 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -273,7 +273,7 @@
 </histogram>
 
 <histogram base="true" name="Mobile.Messages.Passwords.Modal.Dismiss"
-    enum="MobileMessagesPasswordsModalDismiss" expires_after="2022-10-16">
+    enum="MobileMessagesPasswordsModalDismiss" expires_after="2023-10-16">
 <!-- Name completed by histogram_suffixes name="Mobile.Messages.Password.Type" -->
 
   <owner>sczs@chromium.org</owner>
@@ -282,7 +282,7 @@
 </histogram>
 
 <histogram base="true" name="Mobile.Messages.Passwords.Modal.Event"
-    enum="MobileMessagesPasswordsModalEvent" expires_after="2022-10-16">
+    enum="MobileMessagesPasswordsModalEvent" expires_after="2023-10-16">
 <!-- Name completed by histogram_suffixes name="Mobile.Messages.Password.Type" -->
 
   <owner>sczs@chromium.org</owner>
@@ -317,7 +317,7 @@
 </histogram>
 
 <histogram name="Mobile.Messages.Translate.Modal.Event"
-    enum="MobileMessagesTranslateModalEvent" expires_after="2022-10-16">
+    enum="MobileMessagesTranslateModalEvent" expires_after="2023-10-16">
   <owner>sczs@chromium.org</owner>
   <owner>thegreenfrog@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index 7f56c77..12dbdbf 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -46,6 +46,8 @@
       summary="Segmentation: Low user engagement with Chrome"/>
   <variant name="SegmentationChromeStartAndroid"
       summary="Chrome Start Android"/>
+  <variant name="SegmentationChromeStartAndroidV2"
+      summary="Chrome Start Android V2"/>
   <variant name="SegmentationDummyFeature" summary="Dummy feature"/>
   <variant name="SegmentationFeedUser"
       summary="Segmentation: Feed usage in Chrome"/>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 508d588..9b33ad1 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -3808,6 +3808,11 @@
 
 <histogram name="Conversions.ReportsDeletedInDataClearOperation"
     units="conversions" expires_after="2023-02-12">
+  <obsolete>
+    Replaced with Conversions.EventReportsDeletedInDataClearOperation due to
+    introduction of Conversions.AggregatableReportsDeletedInDataClearOperation,
+    09/2022.
+  </obsolete>
   <owner>johnidel@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
@@ -3816,6 +3821,28 @@
   </summary>
 </histogram>
 
+<histogram name="Conversions.ReportsDeletedInDataClearOperation.Aggregatable"
+    units="conversions" expires_after="2023-02-12">
+  <owner>johnidel@chromium.org</owner>
+  <owner>tquintanilla@chromium.org</owner>
+  <owner>measurement-api-dev+metrics@google.com</owner>
+  <summary>
+    Records the number of aggregatable attribution reports deleted per clearing
+    operation.
+  </summary>
+</histogram>
+
+<histogram name="Conversions.ReportsDeletedInDataClearOperation.Event"
+    units="conversions" expires_after="2023-02-12">
+  <owner>johnidel@chromium.org</owner>
+  <owner>csharrison@chromium.org</owner>
+  <owner>linnan@chromium.org</owner>
+  <summary>
+    Records the number of event-level attribution reports deleted per clearing
+    operation.
+  </summary>
+</histogram>
+
 <histogram name="Conversions.ReportSendOutcome"
     enum="ConversionReportSendOutcome" expires_after="M105">
   <obsolete>
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
index fb4f8072..017bd36 100644
--- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -25,6 +25,7 @@
 <variants name="BooleanModel">
   <variant name="ChromeLowUserEngagement"/>
   <variant name="ChromeStartAndroid"/>
+  <variant name="ChromeStartAndroidV2"/>
   <variant name="CrossDeviceUser"/>
   <variant name="FeedUserSegment"/>
   <variant name="FrequentFeatureUser"/>
@@ -44,6 +45,7 @@
   <variant name="AdaptiveToolbar"/>
   <variant name="ChromeLowUserEngagement"/>
   <variant name="ChromeStartAndroid"/>
+  <variant name="ChromeStartAndroidV2"/>
   <variant name="ContextualPageActions"/>
   <variant name="CrossDeviceUser"/>
   <variant name="DummyFeature"/>
@@ -59,6 +61,7 @@
 <variants name="SegmentationModel">
   <variant name="ChromeLowUserEngagement"/>
   <variant name="ChromeStartAndroid"/>
+  <variant name="ChromeStartAndroidV2"/>
   <variant name="ContextualPageActionPriceTracking"/>
   <variant name="CrossDeviceUser"/>
   <variant name="Dummy"/>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index d97b27a7..8da003b 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "6aafceb577fd254ab3a782bbfad4e98d1ea2b1ec",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/7b9cb0dc4cbb76a10be87054698ad04bd6e0f59e/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/2c68f6d5e849083349bace01b0e3141904e98ab0/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "5617176ae53c93907d93df0e60445240c701e9ae",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/2c68f6d5e849083349bace01b0e3141904e98ab0/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/de4b5d49c14337173ee73a2b091d1bece86fe1c9/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/color/BUILD.gn b/ui/color/BUILD.gn
index f9467ca..809bb15 100644
--- a/ui/color/BUILD.gn
+++ b/ui/color/BUILD.gn
@@ -142,6 +142,8 @@
     "native_color_mixers.h",
     "ref_color_mixer.cc",
     "ref_color_mixer.h",
+    "sys_color_mixer.cc",
+    "sys_color_mixer.h",
     "ui_color_mixer.cc",
     "ui_color_mixer.h",
   ]
diff --git a/ui/color/color_id.h b/ui/color/color_id.h
index a4404a145a..59ef57d5 100644
--- a/ui/color/color_id.h
+++ b/ui/color/color_id.h
@@ -92,6 +92,26 @@
   E_CPONLY(kColorRefNeutralVariant99) \
   E_CPONLY(kColorRefNeutralVariant100) \
   \
+  /* UI system color tokens */ \
+  E_CPONLY(kColorSysPrimary) \
+  E_CPONLY(kColorSysOnPrimary) \
+  E_CPONLY(kColorSysPrimaryContainer) \
+  E_CPONLY(kColorSysOnPrimaryContainer) \
+  E_CPONLY(kColorSysSecondary) \
+  E_CPONLY(kColorSysOnSecondary) \
+  E_CPONLY(kColorSysSecondaryContainer) \
+  E_CPONLY(kColorSysOnSecondaryContainer) \
+  E_CPONLY(kColorSysTertiary) \
+  E_CPONLY(kColorSysOnTertiary) \
+  E_CPONLY(kColorSysTertiaryContainer) \
+  E_CPONLY(kColorSysOnTertiaryContainer) \
+  E_CPONLY(kColorSysError) \
+  E_CPONLY(kColorSysOnError) \
+  E_CPONLY(kColorSysErrorContainer) \
+  E_CPONLY(kColorSysOnErrorContainer) \
+  E_CPONLY(kColorSysSurfaceVariant) \
+  E_CPONLY(kColorSysOnSurfaceVariant) \
+  E_CPONLY(kColorSysOutline) \
   /* Core color concepts */ \
   /* The kColorAccent color id is used in color_provider_css_colors_test.ts. \
   If changing the variable name, the variable name in the test needs to be \
diff --git a/ui/color/color_mixers.cc b/ui/color/color_mixers.cc
index 88dfedb..46278b9 100644
--- a/ui/color/color_mixers.cc
+++ b/ui/color/color_mixers.cc
@@ -7,18 +7,21 @@
 #include "ui/color/core_default_color_mixer.h"
 #include "ui/color/native_color_mixers.h"
 #include "ui/color/ref_color_mixer.h"
+#include "ui/color/sys_color_mixer.h"
 #include "ui/color/ui_color_mixer.h"
 
 namespace ui {
 
 void AddColorMixers(ColorProvider* provider,
                     const ColorProviderManager::Key& key) {
-  ui::AddRefColorMixer(provider, key);
-  ui::AddCoreDefaultColorMixer(provider, key);
-  ui::AddNativeCoreColorMixer(provider, key);
-  ui::AddUiColorMixer(provider, key);
-  ui::AddNativeUiColorMixer(provider, key);
-  ui::AddNativePostprocessingMixer(provider, key);
+  AddRefColorMixer(provider, key);
+  // TODO(tluk): Determine the correct place to insert the sys color mixer.
+  AddSysColorMixer(provider, key);
+  AddCoreDefaultColorMixer(provider, key);
+  AddNativeCoreColorMixer(provider, key);
+  AddUiColorMixer(provider, key);
+  AddNativeUiColorMixer(provider, key);
+  AddNativePostprocessingMixer(provider, key);
 }
 
 }  // namespace ui
diff --git a/ui/color/sys_color_mixer.cc b/ui/color/sys_color_mixer.cc
new file mode 100644
index 0000000..ee7da67
--- /dev/null
+++ b/ui/color/sys_color_mixer.cc
@@ -0,0 +1,68 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/color/sys_color_mixer.h"
+
+#include "third_party/skia/include/core/SkColor.h"
+#include "ui/color/color_id.h"
+#include "ui/color/color_mixer.h"
+#include "ui/color/color_provider.h"
+#include "ui/color/color_provider_manager.h"
+#include "ui/color/color_recipe.h"
+#include "ui/color/color_transform.h"
+
+namespace ui {
+
+void AddSysColorMixer(ColorProvider* provider,
+                      const ColorProviderManager::Key& key) {
+  const bool dark_mode =
+      key.color_mode == ui::ColorProviderManager::ColorMode::kDark;
+  ColorMixer& mixer = provider->AddMixer();
+
+  mixer[kColorSysPrimary] = {dark_mode ? kColorRefPrimary80
+                                       : kColorRefPrimary40};
+  mixer[kColorSysOnPrimary] = {dark_mode ? kColorRefPrimary20
+                                         : kColorRefPrimary100};
+  mixer[kColorSysPrimaryContainer] = {
+      dark_mode ? GetResultingPaintColor(SetAlpha({kColorRefPrimary30}, 0x14),
+                                         {kColorRefSecondary30})
+                : kColorRefPrimary90};
+  mixer[kColorSysOnPrimaryContainer] = {dark_mode ? kColorRefPrimary90
+                                                  : kColorRefPrimary10};
+
+  mixer[kColorSysSecondary] = {dark_mode ? kColorRefSecondary80
+                                         : kColorRefSecondary40};
+  mixer[kColorSysOnSecondary] = {dark_mode ? kColorRefSecondary20
+                                           : kColorRefSecondary100};
+  mixer[kColorSysSecondaryContainer] = {dark_mode ? kColorRefSecondary30
+                                                  : kColorRefSecondary90};
+  mixer[kColorSysOnSecondaryContainer] = {dark_mode ? kColorRefSecondary90
+                                                    : kColorRefSecondary10};
+
+  mixer[kColorSysTertiary] = {dark_mode ? kColorRefTertiary80
+                                        : kColorRefTertiary40};
+  mixer[kColorSysOnTertiary] = {dark_mode ? kColorRefTertiary20
+                                          : kColorRefTertiary100};
+  mixer[kColorSysTertiaryContainer] = {dark_mode ? kColorRefTertiary30
+                                                 : kColorRefTertiary90};
+  mixer[kColorSysOnTertiaryContainer] = {dark_mode ? kColorRefTertiary90
+                                                   : kColorRefTertiary10};
+
+  mixer[kColorSysError] = {dark_mode ? kColorRefError80 : kColorRefError40};
+  mixer[kColorSysOnError] = {dark_mode ? kColorRefError20 : kColorRefError100};
+  mixer[kColorSysErrorContainer] = {dark_mode ? kColorRefError30
+                                              : kColorRefError90};
+  mixer[kColorSysOnErrorContainer] = {dark_mode ? kColorRefError90
+                                                : kColorRefError10};
+
+  mixer[kColorSysSurfaceVariant] = {dark_mode ? kColorRefNeutralVariant30
+                                              : kColorRefNeutralVariant90};
+  mixer[kColorSysOnSurfaceVariant] = {dark_mode ? kColorRefNeutralVariant80
+                                                : kColorRefNeutralVariant30};
+
+  mixer[kColorSysOutline] = {dark_mode ? kColorRefNeutralVariant60
+                                       : kColorRefNeutralVariant50};
+}
+
+}  // namespace ui
diff --git a/ui/color/sys_color_mixer.h b/ui/color/sys_color_mixer.h
new file mode 100644
index 0000000..b99e7618
--- /dev/null
+++ b/ui/color/sys_color_mixer.h
@@ -0,0 +1,21 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_COLOR_SYS_COLOR_MIXER_H_
+#define UI_COLOR_SYS_COLOR_MIXER_H_
+
+#include "ui/color/color_provider_manager.h"
+
+namespace ui {
+
+class ColorProvider;
+
+// Adds a color mixer to `provider` that provides the system color tokens for
+// Google Material 3.
+void AddSysColorMixer(ColorProvider* provider,
+                      const ColorProviderManager::Key& key);
+
+}  // namespace ui
+
+#endif  // UI_COLOR_SYS_COLOR_MIXER_H_
diff --git a/ui/views/cocoa/immersive_mode_controller_unittest.mm b/ui/views/cocoa/immersive_mode_controller_unittest.mm
index 2978505..08b8ec5 100644
--- a/ui/views/cocoa/immersive_mode_controller_unittest.mm
+++ b/ui/views/cocoa/immersive_mode_controller_unittest.mm
@@ -101,4 +101,53 @@
   [handle.overlay close];
 }
 
+// Test that child windows in immersive mode properly balance the revealed lock
+// count.
+TEST_F(CocoaImmersiveModeControllerTest,
+       HiddenTitleBarAccessoryViewController) {
+  ImmersiveModeControllerTestHandle handle =
+      CreateImmersiveModeControllerTestHandle(test_window());
+
+  // Controller under test.
+  auto immersive_mode_controller = std::make_unique<ImmersiveModeController>(
+      handle.browser, handle.overlay, base::DoNothing());
+  immersive_mode_controller->Enable();
+
+  EXPECT_EQ(immersive_mode_controller->revealed_lock_count(), 0);
+  immersive_mode_controller->RevealLock();
+  immersive_mode_controller->RevealLock();
+  immersive_mode_controller->RevealLock();
+  EXPECT_EQ(immersive_mode_controller->revealed_lock_count(), 3);
+
+  // One controller for Top Chrome and another hidden controller that pins the
+  // Title Bar.
+  EXPECT_EQ(handle.browser.titlebarAccessoryViewControllers.count, 2u);
+
+  // Ensure the clear controller's view covers the browser view.
+  NSTitlebarAccessoryViewController* clear_controller =
+      handle.browser.titlebarAccessoryViewControllers.lastObject;
+  EXPECT_EQ(clear_controller.view.frame.size.height,
+            handle.browser.contentView.frame.size.height);
+  EXPECT_EQ(clear_controller.view.frame.size.width,
+            handle.browser.contentView.frame.size.width);
+
+  // There is still an outstanding lock, make sure we still have the hidden
+  // controller.
+  immersive_mode_controller->RevealUnlock();
+  immersive_mode_controller->RevealUnlock();
+  EXPECT_EQ(immersive_mode_controller->revealed_lock_count(), 1);
+  EXPECT_EQ(handle.browser.titlebarAccessoryViewControllers.count, 2u);
+
+  immersive_mode_controller->RevealUnlock();
+  EXPECT_EQ(immersive_mode_controller->revealed_lock_count(), 0);
+  EXPECT_EQ(handle.browser.titlebarAccessoryViewControllers.count, 1u);
+
+  // Reset immersive_mode_controller before closing the overlay window. Make
+  // sure we have no controllers.
+  immersive_mode_controller.reset();
+  EXPECT_EQ(handle.browser.titlebarAccessoryViewControllers.count, 0u);
+
+  [handle.overlay close];
+}
+
 }  // namespace remote_cocoa
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn b/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
index c1a9072..83b9e9a 100644
--- a/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/BUILD.gn
@@ -9,8 +9,6 @@
 
 js_type_check("closure_compile_module") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
-
   deps = [
     ":activation_code_page",
     ":activation_verification_page",
@@ -189,7 +187,6 @@
     ":profile_discovery_list_item",
     ":profile_discovery_list_page",
     ":subflow_behavior",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/webui/resources/cr_components/chromeos/network:cellular_utils",
     "//ui/webui/resources/cr_components/chromeos/network:mojo_interface_provider",
diff --git a/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js b/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
index fe4cbc3..fa3cb59c 100644
--- a/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
+++ b/ui/webui/resources/cr_components/chromeos/cellular_setup/esim_flow_ui.js
@@ -15,8 +15,6 @@
 import {NetworkListenerBehavior} from '//resources/cr_components/chromeos/network/network_listener_behavior.js';
 import {assert, assertNotReached} from '//resources/js/assert.m.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {FilterType, NetworkStateProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -220,9 +218,9 @@
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
 
     const filter = {
-      filter: FilterType.kActive,
-      limit: NO_LIMIT,
-      networkType: NetworkType.kAll,
+      filter: chromeos.networkConfig.mojom.FilterType.kActive,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
+      networkType: chromeos.networkConfig.mojom.NetworkType.kAll,
     };
     networkConfig.getNetworkStateList(filter).then(response => {
       this.onActiveNetworksChanged(response.result);
@@ -288,12 +286,13 @@
   /**
    * NetworkListenerBehavior override
    * Used to determine if there is an online network connection.
-   * @param {!Array<NetworkStateProperties>}
+   * @param {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     activeNetworks
    */
   onActiveNetworksChanged(activeNetworks) {
     this.isOffline_ = !activeNetworks.some(
-        (network) => network.connectionState === ConnectionStateType.kOnline);
+        (network) => network.connectionState ===
+            chromeos.networkConfig.mojom.ConnectionStateType.kOnline);
   },
 
   initSubflow() {
diff --git a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
index ad123d9..88d4b1e1 100644
--- a/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/network/BUILD.gn
@@ -9,8 +9,6 @@
 
 js_type_check("closure_compile_module") {
   is_polymer3 = true
-  closure_flags = default_closure_args + mojom_js_args
-
   deps = [
     ":cellular_utils",
     ":cr_policy_network_behavior_mojo",
@@ -45,7 +43,7 @@
 
 js_library("mojo_interface_provider") {
   deps = [
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/js:cr.m",
   ]
 }
@@ -53,7 +51,7 @@
 js_library("cr_policy_network_behavior_mojo") {
   deps = [
     "../../../cr_elements/policy:cr_policy_indicator_behavior",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
 }
@@ -87,7 +85,7 @@
 js_library("network_choose_mobile") {
   deps = [
     ":network_shared_css",
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/webui/resources/cr_elements:i18n_behavior",
@@ -339,7 +337,7 @@
 
 js_library("onc_mojo") {
   deps = [
-    "//chromeos/services/network_config/public/mojom:mojom_webui_js",
+    "//chromeos/services/network_config/public/mojom:mojom_js_library_for_compile",
     "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:load_time_data.m",
   ]
diff --git a/ui/webui/resources/cr_components/chromeos/network/cellular_utils.js b/ui/webui/resources/cr_components/chromeos/network/cellular_utils.js
index 4384f995..692ba44 100644
--- a/ui/webui/resources/cr_components/chromeos/network/cellular_utils.js
+++ b/ui/webui/resources/cr_components/chromeos/network/cellular_utils.js
@@ -5,8 +5,6 @@
 import 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
-import {DeviceStateProperties, FilterType, NetworkStateProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 /**
  * Checks if the device has a cellular network with connectionState not
@@ -14,24 +12,26 @@
  * @return {!Promise<boolean>}
  */
 export function hasActiveCellularNetwork() {
+  const mojom = chromeos.networkConfig.mojom;
   const networkConfig =
       MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   return networkConfig
       .getNetworkStateList({
-        filter: FilterType.kActive,
-        networkType: NetworkType.kCellular,
-        limit: NO_LIMIT,
+        filter: mojom.FilterType.kActive,
+        networkType: mojom.NetworkType.kCellular,
+        limit: mojom.NO_LIMIT,
       })
       .then((response) => {
         return response.result.some(network => {
-          return network.connectionState !== ConnectionStateType.kNotConnected;
+          return network.connectionState !==
+              mojom.ConnectionStateType.kNotConnected;
         });
       });
 }
 
 /**
  * Returns number of phyical SIM and eSIM slots on the current device
- * @param {!DeviceStateProperties|undefined}
+ * @param {!chromeos.networkConfig.mojom.DeviceStateProperties|undefined}
  *     deviceState
  * @return {!{pSimSlots: number, eSimSlots: number}}
  */
@@ -60,30 +60,33 @@
  * @return {!Promise<boolean>}
  */
 export function isConnectedToNonCellularNetwork() {
+  const mojom = chromeos.networkConfig.mojom;
   const networkConfig =
       MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   return networkConfig
       .getNetworkStateList({
-        filter: FilterType.kActive,
-        networkType: NetworkType.kAll,
-        limit: NO_LIMIT,
+        filter: mojom.FilterType.kActive,
+        networkType: mojom.NetworkType.kAll,
+        limit: mojom.NO_LIMIT,
       })
       .then((response) => {
         // Filter for connected non-cellular networks.
         return response.result.some(network => {
-          return network.connectionState === ConnectionStateType.kOnline &&
-              network.type !== NetworkType.kCellular;
+          return network.connectionState ===
+              mojom.ConnectionStateType.kOnline &&
+              network.type !== mojom.NetworkType.kCellular;
         });
       });
 }
 
 /**
  * Determines if the current network is on the active sim slot.
- * @param {?NetworkStateProperties} networkState
- * @param {?DeviceStateProperties} deviceState
+ * @param {?chromeos.networkConfig.mojom.NetworkStateProperties} networkState
+ * @param {?chromeos.networkConfig.mojom.DeviceStateProperties} deviceState
  */
 export function isActiveSim(networkState, deviceState) {
-  if (!networkState || networkState.type !== NetworkType.kCellular) {
+  const mojom = chromeos.networkConfig.mojom;
+  if (!networkState || networkState.type !== mojom.NetworkType.kCellular) {
     return false;
   }
 
diff --git a/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js b/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js
index 08ba706..91c8ad62 100644
--- a/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js
+++ b/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_behavior_mojo.js
@@ -8,9 +8,10 @@
  * optional properties (which may be null|undefined).
  */
 
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+
 import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
-import {ApnProperties, ManagedApnList, ManagedBoolean, ManagedInt32, ManagedString, ManagedStringList} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {OncMojo} from './onc_mojo.js';
 
@@ -24,8 +25,9 @@
     if (!property) {
       return false;
     }
-    return property.policySource !== PolicySource.kNone &&
-        property.policySource !== PolicySource.kActiveExtension;
+    const mojom = chromeos.networkConfig.mojom;
+    return property.policySource !== mojom.PolicySource.kNone &&
+        property.policySource !== mojom.PolicySource.kActiveExtension;
   },
 
   /**
@@ -36,7 +38,8 @@
     if (!property) {
       return false;
     }
-    return property.policySource === PolicySource.kActiveExtension;
+    return property.policySource ===
+        chromeos.networkConfig.mojom.PolicySource.kActiveExtension;
   },
 
   /**
@@ -48,7 +51,8 @@
     if (!property) {
       return false;
     }
-    return property.policySource !== PolicySource.kNone;
+    return property.policySource !==
+        chromeos.networkConfig.mojom.PolicySource.kNone;
   },
 
   /**
@@ -59,9 +63,10 @@
     if (!property) {
       return false;
     }
-    return property.policySource !== PolicySource.kUserPolicyEnforced &&
-        property.policySource !== PolicySource.kDevicePolicyEnforced &&
-        property.policySource !== PolicySource.kActiveExtension;
+    const mojom = chromeos.networkConfig.mojom;
+    return property.policySource !== mojom.PolicySource.kUserPolicyEnforced &&
+        property.policySource !== mojom.PolicySource.kDevicePolicyEnforced &&
+        property.policySource !== mojom.PolicySource.kActiveExtension;
   },
 
   /**
@@ -72,8 +77,9 @@
     if (!property) {
       return false;
     }
-    return property.policySource === PolicySource.kUserPolicyEnforced ||
-        property.policySource === PolicySource.kDevicePolicyEnforced;
+    const mojom = chromeos.networkConfig.mojom;
+    return property.policySource === mojom.PolicySource.kUserPolicyEnforced ||
+        property.policySource === mojom.PolicySource.kDevicePolicyEnforced;
   },
 
   /**
@@ -84,18 +90,20 @@
     if (!property) {
       return false;
     }
-    return property.policySource === PolicySource.kUserPolicyRecommended ||
-        property.policySource === PolicySource.kDevicePolicyRecommended;
+    const mojom = chromeos.networkConfig.mojom;
+    return property.policySource ===
+        mojom.PolicySource.kUserPolicyRecommended ||
+        property.policySource === mojom.PolicySource.kDevicePolicyRecommended;
   },
 
   /**
-   * @param {!ManagedBoolean|
-   *         !ManagedInt32|
-   *         !ManagedString|
-   *         !ManagedStringList|
-   *         !ManagedApnList} property
+   * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+   *         !chromeos.networkConfig.mojom.ManagedInt32|
+   *         !chromeos.networkConfig.mojom.ManagedString|
+   *         !chromeos.networkConfig.mojom.ManagedStringList|
+   *         !chromeos.networkConfig.mojom.ManagedApnList} property
    * @return {boolean|number|string|!Array<string>|
-   *          !Array<!ApnProperties>|null}
+   *          !Array<!chromeos.networkConfig.mojom.ApnProperties>|null}
    *         |property.policyValue| if the property is policy-enforced or null
    *         otherwise.
    */
@@ -107,13 +115,13 @@
   },
 
   /**
-   * @param {!ManagedBoolean|
-   *         !ManagedInt32|
-   *         !ManagedString|
-   *         !ManagedStringList|
-   *         !ManagedApnList} property
+   * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+   *         !chromeos.networkConfig.mojom.ManagedInt32|
+   *         !chromeos.networkConfig.mojom.ManagedString|
+   *         !chromeos.networkConfig.mojom.ManagedStringList|
+   *         !chromeos.networkConfig.mojom.ManagedApnList} property
    * @return {boolean|number|string|!Array<string>|
-   *          !Array<!ApnProperties>|null}
+   *          !Array<!chromeos.networkConfig.mojom.ApnProperties>|null}
    *         |property.policyValue| if the property is policy-recommended or
    *         null otherwise.
    */
@@ -125,25 +133,25 @@
   },
 
   /**
-   * @param {!OncSource} source
+   * @param {!chromeos.networkConfig.mojom.OncSource} source
    * @return {boolean}
    * @protected
    */
   isPolicySource(source) {
-    return source === OncSource.kDevicePolicy ||
-        source === OncSource.kUserPolicy;
+    return source === chromeos.networkConfig.mojom.OncSource.kDevicePolicy ||
+        source === chromeos.networkConfig.mojom.OncSource.kUserPolicy;
   },
 
   /**
-   * @param {!OncSource} source
+   * @param {!chromeos.networkConfig.mojom.OncSource} source
    * @return {!CrPolicyIndicatorType}
    * @protected
    */
   getIndicatorTypeForSource(source) {
-    if (source === OncSource.kDevicePolicy) {
+    if (source === chromeos.networkConfig.mojom.OncSource.kDevicePolicy) {
       return CrPolicyIndicatorType.DEVICE_POLICY;
     }
-    if (source === OncSource.kUserPolicy) {
+    if (source === chromeos.networkConfig.mojom.OncSource.kUserPolicy) {
       return CrPolicyIndicatorType.USER_POLICY;
     }
     return CrPolicyIndicatorType.NONE;
@@ -158,15 +166,16 @@
     if (!property) {
       return CrPolicyIndicatorType.NONE;
     }
-    if (property.policySource === PolicySource.kUserPolicyEnforced ||
-        property.policySource === PolicySource.kUserPolicyRecommended) {
+    const mojom = chromeos.networkConfig.mojom;
+    if (property.policySource === mojom.PolicySource.kUserPolicyEnforced ||
+        property.policySource === mojom.PolicySource.kUserPolicyRecommended) {
       return CrPolicyIndicatorType.USER_POLICY;
     }
-    if (property.policySource === PolicySource.kDevicePolicyEnforced ||
-        property.policySource === PolicySource.kDevicePolicyRecommended) {
+    if (property.policySource === mojom.PolicySource.kDevicePolicyEnforced ||
+        property.policySource === mojom.PolicySource.kDevicePolicyRecommended) {
       return CrPolicyIndicatorType.DEVICE_POLICY;
     }
-    if (property.policySource === PolicySource.kActiveExtension) {
+    if (property.policySource === mojom.PolicySource.kActiveExtension) {
       return CrPolicyIndicatorType.EXTENSION;
     }
     return CrPolicyIndicatorType.NONE;
@@ -212,36 +221,36 @@
   isNetworkPolicyRecommended(property) {}
 
   /**
-   * @param {!ManagedBoolean|
-   *         !ManagedInt32|
-   *         !ManagedString|
-   *         !ManagedStringList|
-   *         !ManagedApnList} property
+   * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+   *         !chromeos.networkConfig.mojom.ManagedInt32|
+   *         !chromeos.networkConfig.mojom.ManagedString|
+   *         !chromeos.networkConfig.mojom.ManagedStringList|
+   *         !chromeos.networkConfig.mojom.ManagedApnList} property
    * @return {boolean|number|string|!Array<string>|
-   *          !Array<!ApnProperties>|null}
+   *          !Array<!chromeos.networkConfig.mojom.ApnProperties>|null}
    */
   getEnforcedPolicyValue(property) {}
 
   /**
-   * @param {!ManagedBoolean|
-   *         !ManagedInt32|
-   *         !ManagedString|
-   *         !ManagedStringList|
-   *         !ManagedApnList} property
+   * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+   *         !chromeos.networkConfig.mojom.ManagedInt32|
+   *         !chromeos.networkConfig.mojom.ManagedString|
+   *         !chromeos.networkConfig.mojom.ManagedStringList|
+   *         !chromeos.networkConfig.mojom.ManagedApnList} property
    * @return {boolean|number|string|!Array<string>|
-   *          !Array<!ApnProperties>|null}
+   *          !Array<!chromeos.networkConfig.mojom.ApnProperties>|null}
    */
   getRecommendedPolicyValue(property) {}
 
   /**
-   * @param {!OncSource} source
+   * @param {!chromeos.networkConfig.mojom.OncSource} source
    * @return {boolean}
    * @protected
    */
   isPolicySource(source) {}
 
   /**
-   * @param {!OncSource} source
+   * @param {!chromeos.networkConfig.mojom.OncSource} source
    * @return {!CrPolicyIndicatorType}
    * @protected
    */
diff --git a/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js b/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js
index a56758ee..7733f5b4 100644
--- a/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js
+++ b/ui/webui/resources/cr_components/chromeos/network/cr_policy_network_indicator_mojo.js
@@ -11,8 +11,6 @@
 import '../../../cr_elements/cr_hidden_style.css.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ManagedBoolean, ManagedInt32, ManagedString} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from '../../../cr_elements/policy/cr_policy_indicator_behavior.js';
 
@@ -29,9 +27,9 @@
      * Network property associated with the indicator. Note: |property| may
      * be null or undefined, depending on how the properties dictionary is
      * generated.
-     * @type {?ManagedBoolean|
-     *        ?ManagedInt32|
-     *        ?ManagedString|undefined}
+     * @type {?chromeos.networkConfig.mojom.ManagedBoolean|
+     *        ?chromeos.networkConfig.mojom.ManagedInt32|
+     *        ?chromeos.networkConfig.mojom.ManagedString|undefined}
      */
     property: Object,
 
@@ -55,6 +53,7 @@
       this.indicatorType = CrPolicyIndicatorType.NONE;
       return;
     }
+    const PolicySource = chromeos.networkConfig.mojom.PolicySource;
     switch (property.policySource) {
       case PolicySource.kNone:
         this.indicatorType = CrPolicyIndicatorType.NONE;
diff --git a/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.js b/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.js
index 28084b1..ca8b911 100644
--- a/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.js
+++ b/ui/webui/resources/cr_components/chromeos/network/mojo_interface_provider.js
@@ -2,27 +2,31 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CrosNetworkConfig, CrosNetworkConfigRemote} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+import 'chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 
 import {addSingletonGetter} from '../../../js/cr.m.js';
 
 /** @interface */
 export class MojoInterfaceProvider {
-  /** @return {!CrosNetworkConfigRemote} */
+  /** @return {!chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   getMojoServiceRemote() {}
 }
 
 /** @implements {MojoInterfaceProvider} */
 export class MojoInterfaceProviderImpl {
   constructor() {
-    /** @private {?CrosNetworkConfigRemote} */
+    /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
     this.remote_ = null;
   }
 
   /** @override */
   getMojoServiceRemote() {
     if (!this.remote_) {
-      this.remote_ = CrosNetworkConfig.getRemote();
+      this.remote_ = chromeos.networkConfig.mojom.CrosNetworkConfig.getRemote();
     }
 
     return this.remote_;
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js b/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js
index 2c5f3aba..e79589b 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_apnlist.js
@@ -15,10 +15,10 @@
 import './network_shared_css.js';
 
 import {OncMojo} from '//resources/cr_components/chromeos/network/onc_mojo.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {assert} from '//resources/js/assert.m.js';
+import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ApnProperties, ManagedApnProperties, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 const kDefaultAccessPointName = 'NONE';
 const kOtherAccessPointName = 'Other';
@@ -38,7 +38,7 @@
       value: false,
     },
 
-    /** @type {!ManagedProperties|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties: {
       type: Object,
       observer: 'managedPropertiesChanged_',
@@ -61,7 +61,7 @@
     /**
      * Selectable list of APN dictionaries for the UI. Includes an entry
      * corresponding to |otherApn| (see below).
-     * @private {!Array<!ApnProperties>}
+     * @private {!Array<!chromeos.networkConfig.mojom.ApnProperties>}
      */
     apnSelectList_: {
       type: Array,
@@ -74,7 +74,7 @@
      * The user settable properties for a new ('other') APN. The values for
      * accessPointName, username, and password will be set to the currently
      * active APN if it does not match an existing list entry.
-     * @private {!ApnProperties}
+     * @private {!chromeos.networkConfig.mojom.ApnProperties}
      */
     otherApn_: {
       type: Object,
@@ -130,8 +130,8 @@
   },
 
   /**
-   * @param {!ManagedApnProperties} apn
-   * @return {!ApnProperties}
+   * @param {!chromeos.networkConfig.mojom.ManagedApnProperties} apn
+   * @return {!chromeos.networkConfig.mojom.ApnProperties}
    * @private
    */
   getApnFromManaged_(apn) {
@@ -148,7 +148,8 @@
   /** @private*/
   getActiveApnFromProperties_(managedProperties) {
     const cellular = managedProperties.typeProperties.cellular;
-    /** @type {!ApnProperties|undefined} */ let activeApn;
+    /** @type {!chromeos.networkConfig.mojom.ApnProperties|undefined} */ let
+        activeApn;
     // We show selectedAPN as the active entry in the select list but it may
     // not correspond to the currently "active" APN which is represented by
     // lastGoodApn.
@@ -206,7 +207,7 @@
   /**
    * Sets the list of selectable APNs for the UI. Appends an 'Other' entry
    * (see comments for |otherApn_| above).
-   * @param {ApnProperties|undefined} activeApn
+   * @param {chromeos.networkConfig.mojom.ApnProperties|undefined} activeApn
    * @private
    */
   setApnSelectList_(activeApn) {
@@ -260,7 +261,7 @@
    * Returns a modified copy of the APN properties or undefined if the
    * property is not set. All entries in the returned copy will have nonempty
    * name and accessPointName properties.
-   * @return {!Array<!ApnProperties>|undefined}
+   * @return {!Array<!chromeos.networkConfig.mojom.ApnProperties>|undefined}
    * @private
    */
   generateApnList_() {
@@ -379,7 +380,7 @@
   },
 
   /**
-   * @param {!ApnProperties} apn
+   * @param {!chromeos.networkConfig.mojom.ApnProperties} apn
    * @return {string} The most descriptive name for the access point.
    * @private
    */
@@ -389,7 +390,7 @@
   },
 
   /**
-   * @param {ApnProperties} item
+   * @param {chromeos.networkConfig.mojom.ApnProperties} item
    * @return {boolean} Boolean indicating whether |item| is the current selected
    *     apn item.
    * @private
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js b/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js
index 3a486853..c98b29cf 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_choose_mobile.js
@@ -10,13 +10,16 @@
 import '//resources/cr_elements/cr_button/cr_button.js';
 import '//resources/cr_elements/md_select.css.js';
 import '//resources/cr_elements/cr_shared_style.css.js';
+import '//resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import '//resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js';
+import '//resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+import '//resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import '//resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import './network_shared_css.js';
 
 import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrosNetworkConfigRemote, FoundNetworkProperties, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
 import {OncMojo} from './onc_mojo.js';
@@ -39,7 +42,7 @@
       value: false,
     },
 
-    /** @type {!ManagedProperties|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties: {
       type: Object,
       observer: 'managedPropertiesChanged_',
@@ -57,7 +60,7 @@
 
     /**
      * Selectable list of mojom.FoundNetworkProperties dictionaries for the UI.
-     * @private {!Array<!FoundNetworkProperties>}
+     * @private {!Array<!chromeos.networkConfig.mojom.FoundNetworkProperties>}
      */
     mobileNetworkList_: {
       type: Array,
@@ -70,7 +73,7 @@
   /** @private {boolean} */
   scanRequested_: false,
 
-  /** @private {?CrosNetworkConfigRemote} */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -79,7 +82,7 @@
   },
 
   /**
-   * @return {?CrosNetworkConfigRemote}
+   * @return {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote}
    * @private
    */
   getNetworkConfig_() {
@@ -115,7 +118,7 @@
   },
 
   /**
-   * @param {!FoundNetworkProperties} foundNetwork
+   * @param {!chromeos.networkConfig.mojom.FoundNetworkProperties} foundNetwork
    * @return {boolean}
    * @private
    */
@@ -125,31 +128,33 @@
   },
 
   /**
-   * @param {!ManagedProperties} properties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
    * @return {boolean}
    * @private
    */
   getEnableScanButton_(properties) {
     return !this.disabled &&
-        properties.connectionState === ConnectionStateType.kNotConnected &&
+        properties.connectionState ===
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected &&
         !!this.deviceState && !this.deviceState.scanning;
   },
 
   /**
-   * @param {!ManagedProperties} properties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
    * @return {boolean}
    * @private
    */
   getEnableSelectNetwork_(properties) {
     return (
         !this.disabled && !!this.deviceState && !this.deviceState.scanning &&
-        properties.connectionState === ConnectionStateType.kNotConnected &&
+        properties.connectionState ===
+            chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected &&
         !!properties.typeProperties.cellular.foundNetworks &&
         properties.typeProperties.cellular.foundNetworks.length > 0);
   },
 
   /**
-   * @param {!ManagedProperties} properties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
    * @return {string}
    * @private
    */
@@ -163,14 +168,15 @@
     if (this.scanRequested_) {
       return this.i18n('networkCellularScanCompleted');
     }
-    if (properties.connectionState !== ConnectionStateType.kNotConnected) {
+    if (properties.connectionState !==
+        chromeos.networkConfig.mojom.ConnectionStateType.kNotConnected) {
       return this.i18n('networkCellularScanConnectedHelp');
     }
     return '';
   },
 
   /**
-   * @param {!FoundNetworkProperties} foundNetwork
+   * @param {!chromeos.networkConfig.mojom.FoundNetworkProperties} foundNetwork
    * @return {string}
    * @private
    */
@@ -188,7 +194,8 @@
   onScanTap_() {
     this.scanRequested_ = true;
 
-    this.getNetworkConfig_().requestNetworkScan(NetworkType.kCellular);
+    this.getNetworkConfig_().requestNetworkScan(
+        chromeos.networkConfig.mojom.NetworkType.kCellular);
   },
 
   /**
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config.js b/ui/webui/resources/cr_components/chromeos/network/network_config.js
index 82f0f64..7cf898b5 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config.js
@@ -25,8 +25,6 @@
 import {assert, assertNotReached} from '//resources/js/assert.m.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {flush, html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CertificateType, ConfigProperties, CrosNetworkConfigRemote, EAPConfigProperties, GlobalPolicy, HiddenSsidMode, IPSecConfigProperties, L2TPConfigProperties, ManagedBoolean, ManagedEAPProperties, ManagedInt32, ManagedIPSecProperties, ManagedL2TPProperties, ManagedOpenVPNProperties, ManagedProperties, ManagedString, ManagedStringList, ManagedWireGuardProperties, NetworkCertificate, OpenVPNConfigProperties, SecurityType, StartConnectResult, SubjectAltName, VpnType, WireGuardConfigProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, IPConfigType, NetworkType, OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -65,6 +63,12 @@
   USER_INPUT: 'UserInput',
 };
 
+// Note: This pattern does not work for elements that are stamped on initial
+// load because chromeos.networkConfig is not defined yet. <network-config>
+// however is always embedded in a <cr-dialog> so it is not stamped immediately.
+// TODO(stevenjb): Figure out a better way to do this.
+const mojom = chromeos.networkConfig.mojom;
+
 /** @type {string}  */ const DEFAULT_HASH = 'default';
 /** @type {string}  */ const DO_NOT_CHECK_HASH = 'do-not-check';
 /** @type {string}  */ const NO_CERTS_HASH = 'no-certs';
@@ -82,7 +86,7 @@
   ],
 
   properties: {
-    /** @type {!GlobalPolicy|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy_: Object,
 
     /**
@@ -96,7 +100,7 @@
 
     /**
      * The type of network being configured as an enum.
-     * @private {NetworkType|undefined}
+     * @private{chromeos.networkConfig.mojom.NetworkType|undefined}
      */
     mojoType_: Number,
 
@@ -134,7 +138,7 @@
       notify: true,
     },
 
-    /** @private {?ManagedProperties} */
+    /** @private {?chromeos.networkConfig.mojom.ManagedProperties} */
     managedProperties_: {
       type: Object,
       value: null,
@@ -142,7 +146,7 @@
 
     /**
      * Managed EAP properties used for determination of managed EAP fields.
-     * @private {?ManagedEAPProperties}
+     * @private {?chromeos.networkConfig.mojom.ManagedEAPProperties}
      */
     managedEapProperties_: {
       type: Object,
@@ -154,7 +158,7 @@
 
     /**
      * The configuration properties for the network.
-     * @private {!ConfigProperties|undefined}
+     * @private {!chromeos.networkConfig.mojom.ConfigProperties|undefined}
      */
     configProperties_: Object,
 
@@ -164,7 +168,7 @@
      * Note: even though this references an entry in configProperties_, we
      * need to send a separate notification when it changes for data binding
      * (e.g. by using 'set').
-     * @private {?EAPConfigProperties}
+     * @private {?chromeos.networkConfig.mojom.EAPConfigProperties}
      */
     eapProperties_: {
       type: Object,
@@ -174,20 +178,20 @@
     /**
      * The cached result of installed server CA certificates.
      * @private {
-     *     undefined|Array<!NetworkCertificate>}
+     *     undefined|Array<!chromeos.networkConfig.mojom.NetworkCertificate>}
      */
     cachedServerCaCerts_: Array,
 
     /**
      * The cached result of installed user certificates.
      * @private {
-     *     undefined|Array<!NetworkCertificate>}
+     *     undefined|Array<!chromeos.networkConfig.mojom.NetworkCertificate>}
      */
     cachedUserCerts_: Array,
 
     /**
      * Used to populate the 'Server CA certificate' dropdown.
-     * @private {!Array<!NetworkCertificate>}
+     * @private {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>}
      */
     serverCaCerts_: {
       type: Array,
@@ -201,7 +205,7 @@
 
     /**
      * Used to populate the 'User certificate' dropdown.
-     * @private {!Array<!NetworkCertificate>}
+     * @private {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>}
      */
     userCerts_: {
       type: Array,
@@ -247,7 +251,7 @@
      * Security value, used for Ethernet and Wifi and to detect when Security
      * changes. NOTE: the <select> element might set this to a string, see
      * crbug.com/1046149.
-     * @private {!SecurityType|string|undefined}
+     * @private {!chromeos.networkConfig.mojom.SecurityType|string|undefined}
      */
     securityType_: Number,
 
@@ -468,7 +472,7 @@
   /** @const */
   MIN_PASSPHRASE_LENGTH: 5,
 
-  /** @private {?CrosNetworkConfigRemote} */
+  /** @private {?mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -509,9 +513,10 @@
       const managedProperties =
           OncMojo.getDefaultManagedProperties(mojoType, this.guid, this.name);
       // Allow securityType_ to be set externally (e.g. in tests).
-      if (mojoType === NetworkType.kWiFi && this.securityType_ !== undefined) {
+      if (mojoType === mojom.NetworkType.kWiFi &&
+          this.securityType_ !== undefined) {
         managedProperties.typeProperties.wifi.security =
-            /**@type {!SecurityType}*/ (this.securityType_);
+            /**@type{!mojom.SecurityType}*/ (this.securityType_);
       }
       this.managedProperties_ = managedProperties;
       this.mojoType_ = mojoType;
@@ -520,7 +525,7 @@
       });
     }
 
-    if (this.mojoType_ === NetworkType.kVPN ||
+    if (this.mojoType_ === mojom.NetworkType.kVPN ||
         (this.globalPolicy_ &&
          this.globalPolicy_.allowOnlyPolicyWifiNetworksToConnect)) {
       this.autoConnect_ = false;
@@ -584,13 +589,14 @@
       this.eapProperties_.subjectAltNameMatch = sanm;
     }
     const propertiesToSet = this.getPropertiesToSet_();
-    if (this.managedProperties_.source === OncSource.kNone) {
+    if (this.managedProperties_.source === mojom.OncSource.kNone) {
       if (this.getHiddenNetworkMigrationEnabled()) {
         // Note: Set hidden SSID mode of new WiFi networks to disabled to avoid
         // unintentionally marking networks as hidden if not in range or
         // misspelled, etc.
-        if (this.mojoType_ === NetworkType.kWiFi) {
-          propertiesToSet.typeConfig.wifi.hiddenSsid = HiddenSsidMode.kDisabled;
+        if (this.mojoType_ === mojom.NetworkType.kWiFi) {
+          propertiesToSet.typeConfig.wifi.hiddenSsid =
+              chromeos.networkConfig.mojom.HiddenSsidMode.kDisabled;
         }
       }
       if (!this.autoConnect_) {
@@ -723,10 +729,10 @@
   },
 
   /**
-   * @param {CertificateType} type
+   * @param {chromeos.networkConfig.mojom.CertificateType} type
    * @param {string} desc
    * @param {string} hash
-   * @return {!NetworkCertificate}
+   * @return {!chromeos.networkConfig.mojom.NetworkCertificate}
    * @private
    */
   getDefaultCert_(type, desc, hash) {
@@ -745,7 +751,7 @@
   },
 
   /**
-   * @param {?ManagedBoolean|undefined} property
+   * @param {?mojom.ManagedBoolean|undefined} property
    * @return {boolean}
    * @private
    */
@@ -757,7 +763,7 @@
   },
 
   /**
-   * @param {?ManagedInt32|undefined} property
+   * @param {?mojom.ManagedInt32|undefined} property
    * @return {number}
    * @private
    */
@@ -769,7 +775,7 @@
   },
 
   /**
-   * @param {?ManagedStringList|undefined} property
+   * @param {?mojom.ManagedStringList|undefined} property
    * @return {!Array<string>|undefined}
    * @private
    */
@@ -781,7 +787,7 @@
   },
 
   /**
-   * @param {?ManagedProperties} managedProperties
+   * @param {?mojom.ManagedProperties} managedProperties
    * @private
    */
   getManagedPropertiesCallback_(managedProperties) {
@@ -796,17 +802,17 @@
     this.managedEapProperties_ = this.getManagedEap_(managedProperties);
     this.mojoType_ = managedProperties.type;
 
-    if (this.mojoType_ === NetworkType.kVPN) {
+    if (this.mojoType_ === mojom.NetworkType.kVPN) {
       let saveCredentials = false;
       const vpn = managedProperties.typeProperties.vpn;
-      if (vpn.type === VpnType.kOpenVPN) {
+      if (vpn.type === mojom.VpnType.kOpenVPN) {
         saveCredentials = this.getActiveBoolean_(vpn.openVpn.saveCredentials);
-      } else if (vpn.type === VpnType.kIKEv2) {
+      } else if (vpn.type === mojom.VpnType.kIKEv2) {
         saveCredentials = this.getActiveBoolean_(vpn.ipSec.saveCredentials);
-      } else if (vpn.type === VpnType.kL2TPIPsec) {
+      } else if (vpn.type === mojom.VpnType.kL2TPIPsec) {
         saveCredentials = this.getActiveBoolean_(vpn.ipSec.saveCredentials) ||
             this.getActiveBoolean_(vpn.l2tp.saveCredentials);
-      } else if (vpn.type === VpnType.kWireGuard) {
+      } else if (vpn.type === mojom.VpnType.kWireGuard) {
         saveCredentials = true;
       }
       this.vpnSaveCredentials_ = saveCredentials;
@@ -818,21 +824,21 @@
   },
 
   /**
-   * @return {!Array<SecurityType>}
+   * @return {!Array<mojom.SecurityType>}
    * @private
    */
   getSecurityItems_() {
-    if (this.mojoType_ === NetworkType.kWiFi) {
+    if (this.mojoType_ === mojom.NetworkType.kWiFi) {
       return [
-        SecurityType.kNone,
-        SecurityType.kWepPsk,
-        SecurityType.kWpaPsk,
-        SecurityType.kWpaEap,
+        mojom.SecurityType.kNone,
+        mojom.SecurityType.kWepPsk,
+        mojom.SecurityType.kWpaPsk,
+        mojom.SecurityType.kWpaEap,
       ];
     }
     return [
-      SecurityType.kNone,
-      SecurityType.kWpaEap,
+      mojom.SecurityType.kNone,
+      mojom.SecurityType.kWpaEap,
     ];
   },
 
@@ -843,10 +849,10 @@
       return;
     }
     const source = this.managedProperties_.source;
-    if (source !== OncSource.kNone) {
+    if (source !== mojom.OncSource.kNone) {
       // Configured networks can not change whether they are shared.
-      this.shareNetwork_ =
-          source === OncSource.kDevice || source === OncSource.kDevicePolicy;
+      this.shareNetwork_ = source === mojom.OncSource.kDevice ||
+          source === mojom.OncSource.kDevicePolicy;
       return;
     }
     if (!this.shareIsVisible_()) {
@@ -859,8 +865,8 @@
       // the user can change the sharing setting by updating the toggle in the
       // UI.
 
-      if (this.mojoType_ === NetworkType.kWiFi) {
-        this.shareNetwork_ = this.securityType_ === SecurityType.kNone;
+      if (this.mojoType_ === mojom.NetworkType.kWiFi) {
+        this.shareNetwork_ = this.securityType_ === mojom.SecurityType.kNone;
         return;
       }
     }
@@ -873,8 +879,8 @@
   },
 
   /**
-   * @param {!ManagedEAPProperties} eap
-   * @return {!EAPConfigProperties}
+   * @param {!mojom.ManagedEAPProperties} eap
+   * @return {!mojom.EAPConfigProperties}
    * @private
    */
   getEAPConfigProperties_(eap) {
@@ -890,7 +896,7 @@
       saveCredentials: this.getActiveBoolean_(eap.saveCredentials),
       serverCaPems: this.getActiveStringList_(eap.serverCaPems),
       subjectAltNameMatch:
-          /** @type {!Array<!SubjectAltName>} */
+          /** @type {!Array<!chromeos.networkConfig.mojom.SubjectAltName>} */
           (OncMojo.getActiveValue(eap.subjectAltNameMatch) || []),
       subjectMatch: OncMojo.getActiveString(eap.subjectMatch),
       useSystemCas: this.getActiveBoolean_(eap.useSystemCas),
@@ -898,8 +904,8 @@
   },
 
   /**
-   * @param {!ManagedIPSecProperties} ipSec
-   * @return {!IPSecConfigProperties}
+   * @param {!mojom.ManagedIPSecProperties} ipSec
+   * @return {!mojom.IPSecConfigProperties}
    * @private
    */
   getIPSecConfigProperties_(ipSec) {
@@ -921,8 +927,8 @@
   },
 
   /**
-   * @param {!ManagedL2TPProperties} l2tp
-   * @return {!L2TPConfigProperties}
+   * @param {!mojom.ManagedL2TPProperties} l2tp
+   * @return {!mojom.L2TPConfigProperties}
    * @private
    */
   getL2TPConfigProperties_(l2tp) {
@@ -935,8 +941,8 @@
   },
 
   /**
-   * @param {!ManagedOpenVPNProperties} openVpn
-   * @return {!OpenVPNConfigProperties}
+   * @param {!mojom.ManagedOpenVPNProperties} openVpn
+   * @return {!mojom.OpenVPNConfigProperties}
    * @private
    */
   getOpenVPNConfigProperties_(openVpn) {
@@ -956,8 +962,8 @@
   },
 
   /**
-   * @param {!ManagedWireGuardProperties} wireguard
-   * @return {!WireGuardConfigProperties}
+   * @param {!mojom.ManagedWireGuardProperties} wireguard
+   * @return {!mojom.WireGuardConfigProperties}
    * @private
    */
   getWireGuardConfigProperties_(wireguard) {
@@ -999,9 +1005,9 @@
     configProperties.name = OncMojo.getActiveString(managedProperties.name);
 
     let autoConnect;
-    let security = SecurityType.kNone;
+    let security = mojom.SecurityType.kNone;
     switch (managedProperties.type) {
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         const wifi = managedProperties.typeProperties.wifi;
         const configWifi = configProperties.typeConfig.wifi;
         autoConnect = this.getActiveBoolean_(wifi.autoConnect);
@@ -1014,37 +1020,37 @@
         security = wifi.security;
         configWifi.security = security;
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         const eap = managedProperties.typeProperties.ethernet.eap ?
             this.getEAPConfigProperties_(
                 managedProperties.typeProperties.ethernet.eap) :
             undefined;
-        security = eap ? SecurityType.kWpaEap : SecurityType.kNone;
-        const auth = security === SecurityType.kWpaEap ? '8021X' : 'None';
+        security = eap ? mojom.SecurityType.kWpaEap : mojom.SecurityType.kNone;
+        const auth = security === mojom.SecurityType.kWpaEap ? '8021X' : 'None';
         configProperties.typeConfig.ethernet.authentication = auth;
         configProperties.typeConfig.ethernet.eap = eap;
         break;
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kVPN:
         const vpn = managedProperties.typeProperties.vpn;
         const vpnType = vpn.type;
         const configVpn = configProperties.typeConfig.vpn;
         configVpn.host = OncMojo.getActiveString(vpn.host);
         configVpn.type = {value: vpnType};
-        if (vpnType === VpnType.kIKEv2) {
+        if (vpnType === mojom.VpnType.kIKEv2) {
           if (!this.isIkev2Supported_()) {
             break;
           }
           assert(vpn.ipSec);
           configVpn.ipSec = this.getIPSecConfigProperties_(vpn.ipSec);
-        } else if (vpnType === VpnType.kL2TPIPsec) {
+        } else if (vpnType === mojom.VpnType.kL2TPIPsec) {
           assert(vpn.ipSec);
           configVpn.ipSec = this.getIPSecConfigProperties_(vpn.ipSec);
           assert(vpn.l2tp);
           configVpn.l2tp = this.getL2TPConfigProperties_(vpn.l2tp);
-        } else if (vpnType === VpnType.kOpenVPN) {
+        } else if (vpnType === mojom.VpnType.kOpenVPN) {
           assert(vpn.openVpn);
           configVpn.openVpn = this.getOpenVPNConfigProperties_(vpn.openVpn);
-        } else if (vpnType === VpnType.kWireGuard) {
+        } else if (vpnType === mojom.VpnType.kWireGuard) {
           if (!this.isWireGuardSupported_()) {
             break;
           }
@@ -1061,7 +1067,7 @@
         } else {
           assertNotReached();
         }
-        security = SecurityType.kNone;
+        security = mojom.SecurityType.kNone;
         break;
     }
     if (autoConnect !== undefined) {
@@ -1081,7 +1087,7 @@
           OncMojo.serializeSubjectAltNameMatch(
               this.eapProperties_.subjectAltNameMatch);
     }
-    if (managedProperties.type === NetworkType.kVPN) {
+    if (managedProperties.type === mojom.NetworkType.kVPN) {
       this.vpnType_ = this.getVpnTypeFromProperties_(this.configProperties_);
       this.ipsecAuthType_ =
           this.getIpsecAuthTypeFromProperties_(this.configProperties_);
@@ -1105,18 +1111,18 @@
     // to a string. See crbug.com/1046149 for details.
     if (typeof (this.securityType_) === 'string') {
       this.securityType_ =
-          /** @type {!SecurityType}*/ (
-              Number.parseInt(/** @type {string}*/ (this.securityType_), 10));
+          /** @type{!chromeos.networkConfig.mojom.SecurityType}*/ (
+              Number.parseInt(/** @type{string}*/ (this.securityType_), 10));
     }
     const security = this.securityType_;
-    if (type === NetworkType.kWiFi) {
+    if (type === mojom.NetworkType.kWiFi) {
       this.configProperties_.typeConfig.wifi.security = security;
-    } else if (type === NetworkType.kEthernet) {
-      const auth = security === SecurityType.kWpaEap ? '8021X' : 'None';
+    } else if (type === mojom.NetworkType.kEthernet) {
+      const auth = security === mojom.SecurityType.kWpaEap ? '8021X' : 'None';
       this.configProperties_.typeConfig.ethernet.authentication = auth;
     }
     let eap;
-    if (security === SecurityType.kWpaEap) {
+    if (security === mojom.SecurityType.kWpaEap) {
       eap = this.getEap_(this.configProperties_, true);
       eap.outer = eap.outer || 'LEAP';
     }
@@ -1152,7 +1158,7 @@
   /** @private */
   updateEapCerts_() {
     // EAP is used for all configurable types except VPN.
-    if (this.mojoType_ === NetworkType.kVPN) {
+    if (this.mojoType_ === mojom.NetworkType.kVPN) {
       return;
     }
     const eap = this.eapProperties_;
@@ -1164,15 +1170,16 @@
 
   /** @private */
   updateShowEap_() {
-    if (!this.eapProperties_ || this.securityType_ === SecurityType.kNone) {
+    if (!this.eapProperties_ ||
+        this.securityType_ === mojom.SecurityType.kNone) {
       this.showEap_ = null;
       this.updateCertError_();
       return;
     }
     const outer = this.eapProperties_.outer;
     switch (this.mojoType_) {
-      case NetworkType.kWiFi:
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kWiFi:
+      case mojom.NetworkType.kEthernet:
         this.showEap_ = {
           Outer: true,
           Inner: outer === 'PEAP' || outer === 'EAP-TTLS',
@@ -1190,9 +1197,9 @@
   },
 
   /**
-   * @param {!ConfigProperties} properties
+   * @param {!mojom.ConfigProperties} properties
    * @param {boolean=} opt_create
-   * @return {?EAPConfigProperties}
+   * @return {?mojom.EAPConfigProperties}
    * @private
    */
   getEap_(properties, opt_create) {
@@ -1216,15 +1223,15 @@
   },
 
   /**
-   * @param {!EAPConfigProperties|undefined} eapProperties
+   * @param {!mojom.EAPConfigProperties|undefined} eapProperties
    * @private
    */
   setEap_(eapProperties) {
     switch (this.mojoType_) {
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         this.configProperties_.typeConfig.wifi.eap = eapProperties;
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         this.configProperties_.typeConfig.ethernet.eap = eapProperties;
         break;
     }
@@ -1232,20 +1239,20 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @return {?ManagedEAPProperties}
+   * @param {!mojom.ManagedProperties} managedProperties
+   * @return {?mojom.ManagedEAPProperties}
    * @private
    */
   getManagedEap_(managedProperties) {
     let managedEap;
     switch (managedProperties.type) {
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         managedEap = managedProperties.typeProperties.wifi.eap;
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         managedEap = managedProperties.typeProperties.ethernet.eap;
         break;
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kVPN:
         if (managedProperties.typeProperties.vpn.ipSec) {
           managedEap = managedProperties.typeProperties.vpn.ipSec.eap;
         }
@@ -1255,25 +1262,25 @@
   },
 
   /**
-   * @param {!ConfigProperties} properties
+   * @param {!mojom.ConfigProperties} properties
    * @return {!VPNConfigType}
    * @private
    */
   getVpnTypeFromProperties_(properties) {
     const vpn = properties.typeConfig.vpn;
     assert(vpn);
-    if (!!vpn.type && vpn.type.value === VpnType.kIKEv2) {
+    if (!!vpn.type && vpn.type.value === mojom.VpnType.kIKEv2) {
       return VPNConfigType.IKEV2;
-    } else if (!!vpn.type && vpn.type.value === VpnType.kL2TPIPsec) {
+    } else if (!!vpn.type && vpn.type.value === mojom.VpnType.kL2TPIPsec) {
       return VPNConfigType.L2TP_IPSEC;
-    } else if (!!vpn.type && vpn.type.value === VpnType.kWireGuard) {
+    } else if (!!vpn.type && vpn.type.value === mojom.VpnType.kWireGuard) {
       return VPNConfigType.WIREGUARD;
     }
     return VPNConfigType.OPEN_VPN;
   },
 
   /**
-   * @param {!ConfigProperties} properties
+   * @param {!mojom.ConfigProperties} properties
    * @return {!IpsecAuthType}
    * @private
    */
@@ -1281,8 +1288,8 @@
     const vpn = properties.typeConfig.vpn;
     assert(vpn);
     if (!vpn.type ||
-        !(vpn.type.value === VpnType.kL2TPIPsec ||
-          vpn.type.value === VpnType.kIKEv2)) {
+        !(vpn.type.value === mojom.VpnType.kL2TPIPsec ||
+          vpn.type.value === mojom.VpnType.kIKEv2)) {
       // This field will not be used by services other than IPsec-based VPN.
       // Initiate it to "PSK" for simplicity.
       return IpsecAuthType.PSK;
@@ -1319,18 +1326,18 @@
       // eap.useSystemCas (which does not apply to OpenVPN and IPsec-based
       // VPNs).
       caCerts.unshift(this.getDefaultCert_(
-          CertificateType.kServerCA, this.i18n('networkCAUseDefault'),
-          DEFAULT_HASH));
+          chromeos.networkConfig.mojom.CertificateType.kServerCA,
+          this.i18n('networkCAUseDefault'), DEFAULT_HASH));
     }
     if (!isIpsec) {
       // For IPsec-based VPNs, it is mandatory to verify the server.
       caCerts.push(this.getDefaultCert_(
-          CertificateType.kServerCA, this.i18n('networkCADoNotCheck'),
-          DO_NOT_CHECK_HASH));
+          chromeos.networkConfig.mojom.CertificateType.kServerCA,
+          this.i18n('networkCADoNotCheck'), DO_NOT_CHECK_HASH));
     }
     if (!caCerts.length) {
       caCerts = [this.getDefaultCert_(
-          CertificateType.kServerCA,
+          chromeos.networkConfig.mojom.CertificateType.kServerCA,
           this.i18n('networkCertificateNoneInstalled'), NO_CERTS_HASH)];
     }
     this.set('serverCaCerts_', caCerts);
@@ -1343,7 +1350,7 @@
       }  // Clear the hash to invalidate the certificate.
     });
 
-    const isEap = this.securityType_ === SecurityType.kWpaEap;
+    const isEap = this.securityType_ === mojom.SecurityType.kWpaEap;
     const isEapTls = isEap && this.eapProperties_.outer === 'EAP-TLS';
 
     // User certificate is allowed but not required for OpenVPN and
@@ -1352,12 +1359,12 @@
 
     if (isUserCertOptional) {
       userCerts.unshift(this.getDefaultCert_(
-          CertificateType.kUserCert, this.i18n('networkNoUserCert'),
-          NO_USER_CERT_HASH));
+          chromeos.networkConfig.mojom.CertificateType.kUserCert,
+          this.i18n('networkNoUserCert'), NO_USER_CERT_HASH));
     }
     if (!userCerts.length) {
       userCerts = [this.getDefaultCert_(
-          CertificateType.kUserCert,
+          chromeos.networkConfig.mojom.CertificateType.kUserCert,
           this.i18n('networkCertificateNoneInstalled'), NO_CERTS_HASH)];
     }
     this.set('userCerts_', userCerts);
@@ -1380,7 +1387,7 @@
     }
     switch (this.vpnType_) {
       case VPNConfigType.IKEV2:
-        vpn.type = {value: VpnType.kIKEv2};
+        vpn.type = {value: mojom.VpnType.kIKEv2};
         if (!vpn.ipSec) {
           this.ipsecAuthType_ = IpsecAuthType.EAP;
           vpn.ipSec = {
@@ -1401,7 +1408,7 @@
         }
         break;
       case VPNConfigType.L2TP_IPSEC:
-        vpn.type = {value: VpnType.kL2TPIPsec};
+        vpn.type = {value: mojom.VpnType.kL2TPIPsec};
         if (this.ipsecAuthType_ !== IpsecAuthType.PSK &&
             this.ipsecAuthType_ !== IpsecAuthType.CERT) {
           // This will happen if user changes the VPN type to IKEv2 where the
@@ -1419,11 +1426,11 @@
         }
         break;
       case VPNConfigType.OPEN_VPN:
-        vpn.type = {value: VpnType.kOpenVPN};
+        vpn.type = {value: mojom.VpnType.kOpenVPN};
         vpn.openVpn = vpn.openVpn || {saveCredentials: false};
         break;
       case VPNConfigType.WIREGUARD:
-        vpn.type = {value: VpnType.kWireGuard};
+        vpn.type = {value: mojom.VpnType.kWireGuard};
         vpn.wireguard = vpn.wireguard || {peers: [{}]};
         break;
       default:
@@ -1447,7 +1454,7 @@
       UserCert: (isIpsec && ipsecAuthIsCert) || isOpenvpn,
     };
 
-    if (vpn.type.value === VpnType.kL2TPIPsec && !vpn.l2tp) {
+    if (vpn.type.value === mojom.VpnType.kL2TPIPsec && !vpn.l2tp) {
       vpn.l2tp = {
         lcpEchoDisabled: false,
         password: '',
@@ -1455,17 +1462,17 @@
         username: '',
       };
     }
-    if (vpn.type.value !== VpnType.kL2TPIPsec &&
-        vpn.type.value !== VpnType.kIKEv2) {
+    if (vpn.type.value !== mojom.VpnType.kL2TPIPsec &&
+        vpn.type.value !== mojom.VpnType.kIKEv2) {
       delete vpn.ipSec;
     }
-    if (vpn.type.value !== VpnType.kL2TPIPsec) {
+    if (vpn.type.value !== mojom.VpnType.kL2TPIPsec) {
       delete vpn.l2tp;
     }
-    if (vpn.type.value !== VpnType.kOpenVPN) {
+    if (vpn.type.value !== mojom.VpnType.kOpenVPN) {
       delete vpn.openVpn;
     }
-    if (vpn.type.value !== VpnType.kWireGuard) {
+    if (vpn.type.value !== mojom.VpnType.kWireGuard) {
       delete vpn.wireguard;
     }
     this.updateCertError_();
@@ -1583,10 +1590,10 @@
   },
 
   /**
-   * @param {!Array<!NetworkCertificate>} certs
+   * @param {!Array<!chromeos.networkConfig.mojom.NetworkCertificate>} certs
    * @param {string|undefined} hash
    * @private
-   * @return {!NetworkCertificate|undefined}
+   * @return {!chromeos.networkConfig.mojom.NetworkCertificate|undefined}
    */
   findCert_(certs, hash) {
     if (!hash) {
@@ -1657,7 +1664,7 @@
   /**
    * Checks that the hash of the certificate is set and not one of the default
    * special strings.
-   * @param {NetworkCertificate|undefined} cert
+   * @param {chromeos.networkConfig.mojom.NetworkCertificate|undefined} cert
    * @return {boolean}
    * @private
    */
@@ -1693,7 +1700,7 @@
         }
       }
     }
-    if (this.securityType_ === SecurityType.kWpaEap) {
+    if (this.securityType_ === mojom.SecurityType.kWpaEap) {
       return this.eapIsConfigured_();
     }
     return true;
@@ -1705,12 +1712,12 @@
   },
 
   /**
-   * @param {NetworkType} networkType
+   * @param {mojom.NetworkType} networkType
    * @return {boolean}
    * @private
    */
   isWiFi_(networkType) {
-    return networkType === NetworkType.kWiFi;
+    return networkType === mojom.NetworkType.kWiFi;
   },
 
   /** @private */
@@ -1724,13 +1731,13 @@
   },
 
   /**
-   * @param {NetworkType} networkType
+   * @param {mojom.NetworkType} networkType
    * @return {boolean}
    * @private
    */
   securityIsVisible_(networkType) {
-    return networkType === NetworkType.kWiFi ||
-        networkType === NetworkType.kEthernet;
+    return networkType === mojom.NetworkType.kWiFi ||
+        networkType === mojom.NetworkType.kEthernet;
   },
 
   /**
@@ -1739,7 +1746,7 @@
    */
   securityIsEnabled_() {
     // WiFi Security type cannot be changed once configured.
-    return !this.guid || this.mojoType_ === NetworkType.kEthernet;
+    return !this.guid || this.mojoType_ === mojom.NetworkType.kEthernet;
   },
 
   /**
@@ -1750,8 +1757,8 @@
     if (!this.managedProperties_) {
       return false;
     }
-    return this.managedProperties_.source === OncSource.kNone &&
-        this.managedProperties_.type === NetworkType.kWiFi;
+    return this.managedProperties_.source === mojom.OncSource.kNone &&
+        this.managedProperties_.type === mojom.NetworkType.kWiFi;
   },
 
   /**
@@ -1763,13 +1770,13 @@
       return false;
     }
     if (!this.shareAllowEnable ||
-        this.managedProperties_.source !== OncSource.kNone) {
+        this.managedProperties_.source !== mojom.OncSource.kNone) {
       return false;
     }
 
     // Insecure WiFi networks are always shared.
-    if (this.mojoType_ === NetworkType.kWiFi &&
-        this.securityType_ === SecurityType.kNone) {
+    if (this.mojoType_ === mojom.NetworkType.kWiFi &&
+        this.securityType_ === mojom.SecurityType.kNone) {
       return false;
     }
     return true;
@@ -1782,7 +1789,7 @@
   configCanAutoConnect_() {
     // Only WiFi can choose whether or not to autoConnect.
     return loadTimeData.getBoolean('showHiddenNetworkWarning') &&
-        this.mojoType_ === NetworkType.kWiFi;
+        this.mojoType_ === mojom.NetworkType.kWiFi;
   },
 
   /**
@@ -1921,7 +1928,7 @@
   },
 
   /**
-   * @param {WireGuardConfigProperties|null|undefined} wireguard
+   * @param {mojom.WireGuardConfigProperties|null|undefined} wireguard
    * @param {string|undefined} ipAddress
    * @return {boolean}
    * @private
@@ -1991,7 +1998,7 @@
   /** @private */
   getPropertiesToSet_() {
     const propertiesToSet =
-        /** @type {!ConfigProperties}*/ (
+        /** @type{!mojom.ConfigProperties}*/ (
             Object.assign({}, this.configProperties_));
     // Do not set AutoConnect by default, the connection manager will set
     // it to true on a successful connection.
@@ -2003,7 +2010,7 @@
     if (eap) {
       this.setEapProperties_(eap);
     }
-    if (this.mojoType_ === NetworkType.kVPN) {
+    if (this.mojoType_ === mojom.NetworkType.kVPN) {
       const vpnConfig = propertiesToSet.typeConfig.vpn;
       // VPN.Host can be an IP address but will not be recognized as such if
       // there is initial whitespace, so trim it.
@@ -2011,20 +2018,20 @@
         vpnConfig.host = vpnConfig.host.trim();
       }
       const vpnType = vpnConfig.type.value;
-      if (vpnType === VpnType.kOpenVPN) {
+      if (vpnType === mojom.VpnType.kOpenVPN) {
         this.setOpenVPNProperties_(propertiesToSet);
       } else {
         delete propertiesToSet.typeConfig.vpn.openVpn;
       }
-      if (vpnType === VpnType.kIKEv2) {
+      if (vpnType === mojom.VpnType.kIKEv2) {
         this.setVpnIkev2Properties_(propertiesToSet);
-      } else if (vpnType === VpnType.kL2TPIPsec) {
+      } else if (vpnType === mojom.VpnType.kL2TPIPsec) {
         this.setVpnL2tpIpsecProperties_(propertiesToSet);
       } else {
         delete propertiesToSet.typeConfig.vpn.ipSec;
         delete propertiesToSet.typeConfig.vpn.l2tp;
       }
-      if (vpnType === VpnType.kWireGuard) {
+      if (vpnType === mojom.VpnType.kWireGuard) {
         this.setWireGuardProperties_(propertiesToSet);
       } else {
         delete propertiesToSet.typeConfig.vpn.wireguard;
@@ -2061,7 +2068,7 @@
   },
 
   /**
-   * @param {!EAPConfigProperties} eap
+   * @param {!mojom.EAPConfigProperties} eap
    * @private
    */
   setEapProperties_(eap) {
@@ -2075,7 +2082,7 @@
   },
 
   /**
-   * @param {!ConfigProperties} propertiesToSet
+   * @param {!mojom.ConfigProperties} propertiesToSet
    * @private
    */
   setVpnIkev2Properties_(propertiesToSet) {
@@ -2119,7 +2126,7 @@
   },
 
   /**
-   * @param {!ConfigProperties} propertiesToSet
+   * @param {!mojom.ConfigProperties} propertiesToSet
    * @private
    */
   setOpenVPNProperties_(propertiesToSet) {
@@ -2146,7 +2153,7 @@
   },
 
   /**
-   * @param {!ConfigProperties} propertiesToSet
+   * @param {!mojom.ConfigProperties} propertiesToSet
    * @private
    */
   setWireGuardProperties_(propertiesToSet) {
@@ -2158,7 +2165,7 @@
       gateway: this.ipAddressInput_,
       ipAddress: this.ipAddressInput_,
       routingPrefix: 32,
-      type: IPConfigType.kIPv4,
+      type: chromeos.networkConfig.mojom.IPConfigType.kIPv4,
     };
     if (this.nameServersInput_) {
       propertiesToSet.nameServersConfigType = 'Static';
@@ -2181,7 +2188,7 @@
   },
 
   /**
-   * @param {!ConfigProperties} propertiesToSet
+   * @param {!mojom.ConfigProperties} propertiesToSet
    * @private
    */
   setVpnL2tpIpsecProperties_(propertiesToSet) {
@@ -2225,7 +2232,7 @@
     // Only attempt a connection if the network is not yet connected.
     if (connect &&
         this.managedProperties_.connectionState ===
-            ConnectionStateType.kNotConnected) {
+            mojom.ConnectionStateType.kNotConnected) {
       this.startConnect_(this.guid);
     } else {
       this.close_();
@@ -2262,10 +2269,10 @@
   startConnect_(guid) {
     this.networkConfig_.startConnect(guid).then(response => {
       const result = response.result;
-      if (result === StartConnectResult.kSuccess ||
-          result === StartConnectResult.kInvalidGuid ||
-          result === StartConnectResult.kInvalidState ||
-          result === StartConnectResult.kCanceled) {
+      if (result === mojom.StartConnectResult.kSuccess ||
+          result === mojom.StartConnectResult.kInvalidGuid ||
+          result === mojom.StartConnectResult.kInvalidState ||
+          result === mojom.StartConnectResult.kCanceled) {
         // Connect succeeded, or is in progress completed or canceled.
         // Close the dialog.
         this.close_();
@@ -2280,16 +2287,16 @@
   },
 
   /**
-   * @param {NetworkType|undefined} mojoType
-   * @param {SecurityType|undefined} securityType
+   * @param {chromeos.networkConfig.mojom.NetworkType|undefined} mojoType
+   * @param {chromeos.networkConfig.mojom.SecurityType|undefined} securityType
    * @return {boolean}
    * @private
    */
   computeConfigRequiresPassphrase_(mojoType, securityType) {
     // Note: 'Passphrase' is only used by WiFi; Ethernet uses EAP.Password.
-    return mojoType === NetworkType.kWiFi &&
-        (securityType === SecurityType.kWepPsk ||
-         securityType === SecurityType.kWpaPsk);
+    return mojoType === mojom.NetworkType.kWiFi &&
+        (securityType === mojom.SecurityType.kWepPsk ||
+         securityType === mojom.SecurityType.kWpaPsk);
   },
 
   /**
@@ -2317,25 +2324,25 @@
 
   /**
    * Returns a managed property for policy controlled networks.
-   * @param {!ManagedProperties} managedProperties
-   * @return {ManagedString|undefined}
+   * @param {!mojom.ManagedProperties} managedProperties
+   * @return {mojom.ManagedString|undefined}
    * @private
    */
   getManagedSecurity_(managedProperties) {
     const policySource =
         OncMojo.getEnforcedPolicySourceFromOncSource(managedProperties.source);
-    if (policySource === PolicySource.kNone) {
+    if (policySource === mojom.PolicySource.kNone) {
       return undefined;
     }
     switch (managedProperties.type) {
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         return {
           activeValue: OncMojo.getSecurityTypeString(
               managedProperties.typeProperties.wifi.security),
           policySource: policySource,
         };
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         return {
           activeValue: OncMojo.getActiveString(
               managedProperties.typeProperties.ethernet.authentication),
@@ -2347,21 +2354,21 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @return {!ManagedBoolean|undefined}
+   * @param {!mojom.ManagedProperties} managedProperties
+   * @return {!mojom.ManagedBoolean|undefined}
    * @private
    */
   getManagedVpnSaveCredentials_(managedProperties) {
     const vpn = managedProperties.typeProperties.vpn;
     switch (vpn.type) {
-      case VpnType.kIKEv2:
+      case mojom.VpnType.kIKEv2:
         return vpn.ipSec.saveCredentials || OncMojo.createManagedBool(false);
-      case VpnType.kOpenVPN:
+      case mojom.VpnType.kOpenVPN:
         return vpn.openVpn.saveCredentials || OncMojo.createManagedBool(false);
-      case VpnType.kL2TPIPsec:
+      case mojom.VpnType.kL2TPIPsec:
         return vpn.ipSec.saveCredentials || vpn.l2tp.saveCredentials ||
             OncMojo.createManagedBool(false);
-      case VpnType.kWireGuard:
+      case mojom.VpnType.kWireGuard:
         return OncMojo.createManagedBool(true);
     }
     assertNotReached();
@@ -2369,17 +2376,17 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @return {?ManagedStringList|undefined}
+   * @param {!mojom.ManagedProperties} managedProperties
+   * @return {?mojom.ManagedStringList|undefined}
    * @private
    */
   getManagedVpnServerCaRefs_(managedProperties) {
     const vpn = managedProperties.typeProperties.vpn;
     switch (vpn.type) {
-      case VpnType.kOpenVPN:
+      case mojom.VpnType.kOpenVPN:
         return vpn.openVpn.serverCaRefs;
-      case VpnType.kIKEv2:
-      case VpnType.kL2TPIPsec:
+      case mojom.VpnType.kIKEv2:
+      case mojom.VpnType.kL2TPIPsec:
         return vpn.ipSec.serverCaRefs;
     }
     assertNotReached();
@@ -2387,17 +2394,17 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
-   * @return {!ManagedString|undefined}
+   * @param {!mojom.ManagedProperties} managedProperties
+   * @return {!mojom.ManagedString|undefined}
    * @private
    */
   getManagedVpnClientCertType_(managedProperties) {
     const vpn = managedProperties.typeProperties.vpn;
     switch (vpn.type) {
-      case VpnType.kOpenVPN:
+      case mojom.VpnType.kOpenVPN:
         return vpn.openVpn.clientCertType || OncMojo.createManagedString('');
-      case VpnType.kIKEv2:
-      case VpnType.kL2TPIPsec:
+      case mojom.VpnType.kIKEv2:
+      case mojom.VpnType.kL2TPIPsec:
         return vpn.ipSec.clientCertType || OncMojo.createManagedString('');
     }
     assertNotReached();
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_config_select.js b/ui/webui/resources/cr_components/chromeos/network/network_config_select.js
index 72c9954..4cbea34 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_config_select.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_config_select.js
@@ -12,10 +12,9 @@
 import './cr_policy_network_indicator_mojo.js';
 import './network_shared_css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {assertNotReached} from '//resources/js/assert.m.js';
+import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {NetworkCertificate} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 import {CrPolicyNetworkBehaviorMojo} from './cr_policy_network_behavior_mojo.js';
 import {NetworkConfigElementBehavior} from './network_config_element_behavior.js';
@@ -92,7 +91,7 @@
   /**
    * Returns a localized label for |item|. If |this.key| is set, |item| is
    * expected to be an enum and the key is used to convert it to a string.
-   * @param {string|number|!NetworkCertificate}
+   * @param {string|number|!chromeos.networkConfig.mojom.NetworkCertificate}
    *     item
    * @return {string}
    * @private
@@ -100,7 +99,8 @@
   getItemLabel_(item) {
     if (this.certList) {
       return this.getCertificateName_(
-          /** @type {!NetworkCertificate}*/ (item));
+          /** @type {!chromeos.networkConfig.mojom.NetworkCertificate}*/ (
+              item));
     }
     let value;
     if (this.key) {
@@ -123,27 +123,29 @@
   },
 
   /**
-   * @param {string|number|!NetworkCertificate}
+   * @param {string|number|!chromeos.networkConfig.mojom.NetworkCertificate}
    *     item
    * @return {string|number}
    * @private
    */
   getItemValue_(item) {
     if (this.certList) {
-      return /** @type {NetworkCertificate}*/ (item).hash;
+      return /** @type {chromeos.networkConfig.mojom.NetworkCertificate}*/ (
+                 item)
+          .hash;
     }
     return /** @type {string|number}*/ (item);
   },
 
   /**
-   * @param {string|!NetworkCertificate} item
+   * @param {string|!chromeos.networkConfig.mojom.NetworkCertificate} item
    * @return {boolean}
    * @private
    */
   getItemEnabled_(item) {
     if (this.certList) {
       const cert =
-          /** @type {NetworkCertificate}*/ (item);
+          /** @type {chromeos.networkConfig.mojom.NetworkCertificate}*/ (item);
       if (this.deviceCertsOnly && !cert.deviceWide) {
         return false;
       }
@@ -153,7 +155,7 @@
   },
 
   /**
-   * @param {!NetworkCertificate} certificate
+   * @param {!chromeos.networkConfig.mojom.NetworkCertificate} certificate
    * @return {string}
    * @private
    */
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_icon.js b/ui/webui/resources/cr_components/chromeos/network/network_icon.js
index d6a8cd1..774dce52 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_icon.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_icon.js
@@ -12,8 +12,6 @@
 import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {SecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -94,37 +92,38 @@
     if (!this.networkState) {
       return '';
     }
+    const mojom = chromeos.networkConfig.mojom;
     const type = this.networkState.type;
-    if (type === NetworkType.kEthernet) {
+    if (type === mojom.NetworkType.kEthernet) {
       return 'ethernet';
     }
-    if (type === NetworkType.kVPN) {
+    if (type === mojom.NetworkType.kVPN) {
       return 'vpn';
     }
 
     const prefix = OncMojo.networkTypeIsMobile(type) ? 'cellular-' : 'wifi-';
 
-    if (this.networkState.type === NetworkType.kCellular &&
+    if (this.networkState.type === mojom.NetworkType.kCellular &&
         this.networkState.typeState.cellular.simLocked) {
       return prefix + 'locked';
     }
 
     if (!this.isListItem && !this.networkState.guid) {
       const device = this.deviceState;
-      if (!device || device.deviceState === DeviceStateType.kEnabled ||
-          device.deviceState === DeviceStateType.kEnabling) {
+      if (!device || device.deviceState === mojom.DeviceStateType.kEnabled ||
+          device.deviceState === mojom.DeviceStateType.kEnabling) {
         return prefix + 'no-network';
       }
       return prefix + 'off';
     }
 
     const connectionState = this.networkState.connectionState;
-    if (connectionState === ConnectionStateType.kConnecting) {
+    if (connectionState === mojom.ConnectionStateType.kConnecting) {
       return prefix + 'connecting';
     }
 
     if (!this.isListItem &&
-        connectionState === ConnectionStateType.kNotConnected) {
+        connectionState === mojom.ConnectionStateType.kNotConnected) {
       return prefix + 'not-connected';
     }
 
@@ -148,14 +147,15 @@
       return '';
     }
 
+    const mojom = chromeos.networkConfig.mojom;
     const type = this.networkState.type;
 
     // Ethernet and VPN connection labels don't attempt to describe the network
     // state like the icons, so there is only one string for each.
-    if (type === NetworkType.kEthernet) {
+    if (type === mojom.NetworkType.kEthernet) {
       return this.i18nDynamic(locale, 'networkIconLabelEthernet');
     }
-    if (type === NetworkType.kVPN) {
+    if (type === mojom.NetworkType.kVPN) {
       return this.i18nDynamic(locale, 'networkIconLabelVpn');
     }
 
@@ -163,7 +163,7 @@
     // 'Instant Tether', 'Cellular', 'Wi-Fi' which will be using to form the
     // full localized connection state string.
     let networkTypeString = '';
-    if (type === NetworkType.kTether) {
+    if (type === mojom.NetworkType.kTether) {
       networkTypeString = this.i18nDynamic(locale, 'OncTypeTether');
     } else if (OncMojo.networkTypeIsMobile(type)) {
       networkTypeString = this.i18nDynamic(locale, 'OncTypeCellular');
@@ -179,8 +179,8 @@
     if (!this.isListItem && !this.networkState.guid) {
       const device = this.deviceState;
       // Networks with no guid are generally UI placeholders.
-      if (!device || device.deviceState === DeviceStateType.kEnabled ||
-          device.deviceState === DeviceStateType.kEnabling) {
+      if (!device || device.deviceState === mojom.DeviceStateType.kEnabled ||
+          device.deviceState === mojom.DeviceStateType.kEnabling) {
         return this.i18nDynamic(
             locale, 'networkIconLabelNoNetwork', networkTypeString);
       }
@@ -188,13 +188,13 @@
     }
 
     const connectionState = this.networkState.connectionState;
-    if (connectionState === ConnectionStateType.kConnecting) {
+    if (connectionState === mojom.ConnectionStateType.kConnecting) {
       return this.i18nDynamic(
           locale, 'networkIconLabelConnecting', networkTypeString);
     }
 
     if (!this.isListItem &&
-        connectionState === ConnectionStateType.kNotConnected) {
+        connectionState === mojom.ConnectionStateType.kNotConnected) {
       // We only show 'Not Connected' when we are not in a list.
       return this.i18nDynamic(
           locale, 'networkIconLabelNotConnected', networkTypeString);
@@ -249,7 +249,8 @@
     if (!this.networkState) {
       return '';
     }
-    if (this.networkState.type === NetworkType.kCellular) {
+    if (this.networkState.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular) {
       const technology = this.getTechnologyId_(
           this.networkState.typeState.cellular.networkTechnology);
       if (technology !== '') {
@@ -299,13 +300,14 @@
     if (!this.networkState) {
       return false;
     }
+    const mojom = chromeos.networkConfig.mojom;
     if (!this.isListItem &&
         this.networkState.connectionState ===
-            ConnectionStateType.kNotConnected) {
+            mojom.ConnectionStateType.kNotConnected) {
       return false;
     }
-    return this.networkState.type === NetworkType.kWiFi &&
-        this.networkState.typeState.wifi.security !== SecurityType.kNone;
+    return this.networkState.type === mojom.NetworkType.kWiFi &&
+        this.networkState.typeState.wifi.security !== mojom.SecurityType.kNone;
   },
 
   /**
@@ -316,7 +318,8 @@
     if (!this.networkState) {
       return false;
     }
-    return this.networkState.type === NetworkType.kCellular &&
+    const mojom = chromeos.networkConfig.mojom;
+    return this.networkState.type === mojom.NetworkType.kCellular &&
         this.networkState.typeState.cellular.roaming;
   },
 
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js b/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
index c6a0364..c726b43 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_ip_config.js
@@ -13,8 +13,6 @@
 import './network_shared_css.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {IPConfigProperties, ManagedProperties, NO_ROUTING_PREFIX} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {IPConfigType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -62,11 +60,11 @@
 const getRoutingPrefixAsLength = function(netmask) {
   'use strict';
   if (!netmask) {
-    return NO_ROUTING_PREFIX;
+    return chromeos.networkConfig.mojom.NO_ROUTING_PREFIX;
   }
   const tokens = netmask.split('.');
   if (tokens.length !== 4) {
-    return NO_ROUTING_PREFIX;
+    return chromeos.networkConfig.mojom.NO_ROUTING_PREFIX;
   }
   let prefixLength = 0;
   for (let i = 0; i < tokens.length; ++i) {
@@ -75,7 +73,7 @@
     // '0' then the netmask is invalid. For example, 255.224.255.0
     if (prefixLength / 8 !== i) {
       if (token !== '0') {
-        return NO_ROUTING_PREFIX;
+        return chromeos.networkConfig.mojom.NO_ROUTING_PREFIX;
       }
     } else if (token === '255') {
       prefixLength += 8;
@@ -97,7 +95,7 @@
       prefixLength += 0;
     } else {
       // mask is not a valid number.
-      return NO_ROUTING_PREFIX;
+      return chromeos.networkConfig.mojom.NO_ROUTING_PREFIX;
     }
   }
   return prefixLength;
@@ -115,7 +113,7 @@
       value: false,
     },
 
-    /** @type {!ManagedProperties|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties: {
       type: Object,
       observer: 'managedPropertiesChanged_',
@@ -198,16 +196,16 @@
 
     if (properties.ipConfigs || properties.staticIpConfig) {
       // Update the 'ipConfig' property.
-      const ipv4 = this.getIPConfigUIProperties_(
-          OncMojo.getIPConfigForType(properties, IPConfigType.kIPv4));
-      let ipv6 = this.getIPConfigUIProperties_(
-          OncMojo.getIPConfigForType(properties, IPConfigType.kIPv6));
+      const ipv4 = this.getIPConfigUIProperties_(OncMojo.getIPConfigForType(
+          properties, chromeos.networkConfig.mojom.IPConfigType.kIPv4));
+      let ipv6 = this.getIPConfigUIProperties_(OncMojo.getIPConfigForType(
+          properties, chromeos.networkConfig.mojom.IPConfigType.kIPv6));
 
       // If connected and the IP address is automatic and set, show message if
       // the ipv6 address is not set.
       if (OncMojo.connectionStateIsConnected(properties.connectionState) &&
           this.automatic_ && ipv4 && ipv4.ipAddress) {
-        ipv6 = ipv6 || {type: IPConfigType.kIPv6};
+        ipv6 = ipv6 || {type: chromeos.networkConfig.mojom.IPConfigType.kIPv6};
         ipv6.ipAddress = ipv6.ipAddress || this.i18n('ipAddressNotAvailable');
       }
 
@@ -219,7 +217,7 @@
 
   /**
    * Checks whether IP address config type can be changed.
-   * @param {?ManagedProperties} managedProperties
+   * @param {?chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean}
    * @private
    */
@@ -227,7 +225,8 @@
     if (this.disabled || !managedProperties) {
       return false;
     }
-    if (managedProperties.type === NetworkType.kCellular) {
+    if (managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular) {
       // Cellular IP config properties can not be changed.
       return false;
     }
@@ -266,7 +265,7 @@
       }
       if (!this.ipConfig_.ipv4) {
         this.ipConfig_.ipv4 = {
-          type: IPConfigType.kIPv4,
+          type: chromeos.networkConfig.mojom.IPConfigType.kIPv4,
         };
       }
       this.setIpv4Defaults_(this.ipConfig_.ipv4);
@@ -285,7 +284,7 @@
   },
 
   /**
-   * @param {!IPConfigProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.IPConfigProperties|undefined}
    *     ipconfig
    * @return {!OncMojo.IPConfigUIProperties|undefined} A new
    *     IPConfigUIProperties object with routingPrefix expressed as a netmask
@@ -306,7 +305,8 @@
     ipconfigUI.type = ipconfig.type;
     ipconfigUI.webProxyAutoDiscoveryUrl = ipconfig.webProxyAutoDiscoveryUrl;
 
-    if (ipconfig.routingPrefix !== NO_ROUTING_PREFIX) {
+    if (ipconfig.routingPrefix !==
+        chromeos.networkConfig.mojom.NO_ROUTING_PREFIX) {
       ipconfigUI.netmask = getRoutingPrefixAsNetmask(ipconfig.routingPrefix);
     }
 
@@ -315,7 +315,7 @@
 
   /**
    * @param {!OncMojo.IPConfigUIProperties} ipconfigUI
-   * @return {!IPConfigProperties} A new
+   * @return {!chromeos.networkConfig.mojom.IPConfigProperties} A new
    *     IPConfigProperties object with netmask expressed as a a prefix
    *     length.
    * @private
@@ -412,7 +412,8 @@
    * @private
    */
   computeShouldShowAutoIpConfigToggle_() {
-    if (this.managedProperties.type === NetworkType.kCellular) {
+    if (this.managedProperties.type ===
+        chromeos.networkConfig.mojom.NetworkType.kCellular) {
       return false;
     }
     return true;
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_list.js b/ui/webui/resources/cr_components/chromeos/network/network_list.js
index 57917b1..6122c08 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_list.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_list.js
@@ -12,7 +12,6 @@
 import '//resources/polymer/v3_0/iron-list/iron-list.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 import {CrScrollableBehavior} from '../../../cr_elements/cr_scrollable_behavior.js';
 import {ListPropertyUpdateBehavior} from '../../../js/list_property_update_behavior.js';
@@ -79,7 +78,7 @@
      */
     deviceState: Object,
 
-    /** @type {!GlobalPolicy|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy: Object,
 
     /**
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_list_item.js b/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
index b4a56dac..40c08ffd 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_list_item.js
@@ -20,11 +20,9 @@
 import {getESimProfileProperties} from '//resources/cr_components/chromeos/cellular_setup/esim_manager_utils.js';
 import {assert} from '//resources/js/assert.m.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ActivationStateType, CrosNetworkConfigRemote, GlobalPolicy, ManagedCellularProperties, ManagedProperties, SecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType, OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
-import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 import {FocusRowBehavior} from '../../../js/cr/ui/focus_row_behavior.js';
+import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
 import {CrPolicyNetworkBehaviorMojo} from './cr_policy_network_behavior_mojo.js';
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
@@ -110,7 +108,7 @@
 
     /**
      * The cached ConnectionState for the network.
-     * @type {!ConnectionStateType|undefined}
+     * @type {!chromeos.networkConfig.mojom.ConnectionStateType|undefined}
      */
     connectionState_: Number,
 
@@ -133,10 +131,10 @@
      */
     deviceState: Object,
 
-    /** @private {?ManagedProperties|undefined} */
+    /** @private {?chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties_: Object,
 
-    /** @type {!GlobalPolicy|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy: Object,
 
     /**
@@ -241,7 +239,7 @@
     },
   },
 
-  /** @private {?CrosNetworkConfigRemote} */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -265,8 +263,9 @@
    * @private
    */
   isESimNetwork_() {
+    const mojom = chromeos.networkConfig.mojom;
     return !!this.networkState &&
-        this.networkState.type === NetworkType.kCellular &&
+        this.networkState.type === mojom.NetworkType.kCellular &&
         !!this.networkState.typeState.cellular.eid &&
         !!this.networkState.typeState.cellular.iccid;
   },
@@ -287,6 +286,8 @@
 
   /** @private */
   async setSubtitle_() {
+    const mojom = chromeos.networkConfig.mojom;
+
     if (this.item.hasOwnProperty('customItemSubtitle') &&
         this.item.customItemSubtitle) {
       // Item is a custom OOBE network or pending eSIM profile.
@@ -414,6 +415,9 @@
       return '';
     }
 
+    const NetworkType = chromeos.networkConfig.mojom.NetworkType;
+    const OncSource = chromeos.networkConfig.mojom.OncSource;
+    const SecurityType = chromeos.networkConfig.mojom.SecurityType;
     const status = this.getNetworkStateText_();
     const isManaged = this.item.source === OncSource.kDevicePolicy ||
         this.item.source === OncSource.kUserPolicy;
@@ -628,11 +632,12 @@
    * @private
    */
   getNetworkStateText_() {
+    const mojom = chromeos.networkConfig.mojom;
     if (!this.networkState) {
       return '';
     }
 
-    if (this.networkState.type === NetworkType.kCellular) {
+    if (this.networkState.type === mojom.NetworkType.kCellular) {
       if (this.networkState.typeState.cellular.simLocked) {
         return this.i18n('networkListItemUpdatedCellularSimCardLocked');
       }
@@ -647,7 +652,7 @@
       // and Online.
       return this.i18n('networkListItemConnected');
     }
-    if (connectionState === ConnectionStateType.kConnecting) {
+    if (connectionState === mojom.ConnectionStateType.kConnecting) {
       return this.i18n('networkListItemConnecting');
     }
     return '';
@@ -658,7 +663,9 @@
    * @private
    */
   getNetworkStateTextClass_() {
-    if (this.networkState && this.networkState.type === NetworkType.kCellular &&
+    const mojom = chromeos.networkConfig.mojom;
+    if (this.networkState &&
+        this.networkState.type === mojom.NetworkType.kCellular &&
         this.networkState.typeState.cellular.simLocked) {
       return 'warning';
     }
@@ -792,9 +799,10 @@
 
     // If cellular activation is not currently available and |this.networkState|
     // describes an unactivated cellular network, the text should be shown.
-    return this.networkState.type === NetworkType.kCellular &&
+    const mojom = chromeos.networkConfig.mojom;
+    return this.networkState.type === mojom.NetworkType.kCellular &&
         this.networkState.typeState.cellular.activationState !==
-        ActivationStateType.kActivated;
+        mojom.ActivationStateType.kActivated;
   },
 
   /**
@@ -844,7 +852,8 @@
   },
 
   /**
-   * @param {?ManagedProperties|undefined} managedProperties
+   * @param {?chromeos.networkConfig.mojom.ManagedProperties|undefined}
+   *     managedProperties
    * @return {boolean}
    * @private
    */
@@ -858,11 +867,11 @@
       return false;
     }
     return cellularProperties.activationState ===
-        ActivationStateType.kNotActivated;
+        chromeos.networkConfig.mojom.ActivationStateType.kNotActivated;
   },
 
   /**
-   * @param {?ManagedCellularProperties|undefined}
+   * @param {?chromeos.networkConfig.mojom.ManagedCellularProperties|undefined}
    *     cellularProperties
    * @return {boolean}
    * @private
@@ -872,11 +881,11 @@
       return false;
     }
     return cellularProperties.activationState ===
-        ActivationStateType.kNotActivated;
+        chromeos.networkConfig.mojom.ActivationStateType.kNotActivated;
   },
 
   /**
-   * @param {?ManagedCellularProperties|undefined}
+   * @param {?chromeos.networkConfig.mojom.ManagedCellularProperties|undefined}
    *     cellularProperties
    * @return {boolean}
    * @private
@@ -891,7 +900,7 @@
   },
 
   /**
-   * @param {?ManagedProperties|undefined}
+   * @param {?chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
@@ -935,7 +944,7 @@
   },
 
   /**
-   * @param {?ManagedProperties|undefined}
+   * @param {?chromeos.networkConfig.mojom.ManagedProperties|undefined}
    *     managedProperties
    * @return {boolean}
    * @private
@@ -959,7 +968,7 @@
       return false;
     }
     return this.networkState.typeState.cellular.activationState ===
-        ActivationStateType.kActivating;
+        chromeos.networkConfig.mojom.ActivationStateType.kActivating;
   },
 
   /**
@@ -971,7 +980,8 @@
       return false;
     }
 
-    if (this.item.type !== NetworkType.kWiFi) {
+    const mojom = chromeos.networkConfig.mojom;
+    if (this.item.type !== mojom.NetworkType.kWiFi) {
       return false;
     }
 
@@ -1003,8 +1013,9 @@
     }
 
     // Only Cellular and WiFi networks can be blocked by administrators.
-    if (this.item.type !== NetworkType.kCellular &&
-        this.item.type !== NetworkType.kWiFi) {
+    const mojom = chromeos.networkConfig.mojom;
+    if (this.item.type !== mojom.NetworkType.kCellular &&
+        this.item.type !== mojom.NetworkType.kWiFi) {
       return false;
     }
 
@@ -1012,7 +1023,7 @@
       return false;
     }
 
-    if (this.item.type === NetworkType.kCellular) {
+    if (this.item.type === mojom.NetworkType.kCellular) {
       return !!this.globalPolicy.allowOnlyPolicyCellularNetworks;
     }
 
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js b/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js
index 078042f4..e116f85 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_listener_behavior.js
@@ -2,23 +2,23 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
+
 /**
  * @fileoverview Polymer behavior for observing CrosNetworkConfigObserver
  * events.
  */
 
-import {CrosNetworkConfigObserver, CrosNetworkConfigObserverReceiver, NetworkStateProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-
-import {MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
-
 /** @polymerBehavior */
 export const NetworkListenerBehavior = {
-  /** @private {?CrosNetworkConfigObserver} */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigObserver} */
   observer_: null,
 
   /** @override */
   attached() {
-    this.observer_ = new CrosNetworkConfigObserverReceiver(this);
+    this.observer_ =
+        new chromeos.networkConfig.mojom.CrosNetworkConfigObserverReceiver(
+            this);
     MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote().addObserver(
         this.observer_.$.bindNewPipeAndPassRemote());
   },
@@ -26,12 +26,12 @@
   // CrosNetworkConfigObserver methods. Override these in the implementation.
 
   /**
-   * @param {!Array<NetworkStateProperties>}
+   * @param {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     activeNetworks
    */
   onActiveNetworksChanged(activeNetworks) {},
 
-  /** @param {!NetworkStateProperties} network */
+  /** @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network */
   onNetworkStateChanged(network) {},
 
   onNetworkStateListChanged() {},
@@ -49,19 +49,19 @@
 /** @interface */
 export class NetworkListenerBehaviorInterface {
   constructor() {
-    /** @private {?CrosNetworkConfigObserver} */
+    /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigObserver} */
     this.observer_;
   }
 
   attached() {}
 
   /**
-   * @param {!Array<NetworkStateProperties>}
+   * @param {!Array<chromeos.networkConfig.mojom.NetworkStateProperties>}
    *     activeNetworks
    */
   onActiveNetworksChanged(activeNetworks) {}
 
-  /** @param {!NetworkStateProperties} network */
+  /** @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network */
   onNetworkStateChanged(network) {}
 
   onNetworkStateListChanged() {}
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js b/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
index adb75a1..1145e458 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_nameservers.js
@@ -15,8 +15,6 @@
 import './network_shared_css.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {IPConfigType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -45,7 +43,7 @@
       value: false,
     },
 
-    /** @type {!ManagedProperties|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties: {
       type: Object,
       observer: 'managedPropertiesChanged_',
@@ -208,8 +206,9 @@
 
     // Update the 'nameservers' property.
     let nameservers = [];
-    const ipv4 =
-        OncMojo.getIPConfigForType(this.managedProperties, IPConfigType.kIPv4);
+    const ipv4 = OncMojo.getIPConfigForType(
+        this.managedProperties,
+        chromeos.networkConfig.mojom.IPConfigType.kIPv4);
     if (ipv4 && ipv4.nameServers) {
       nameservers = ipv4.nameServers.slice();
     }
@@ -257,7 +256,7 @@
   },
 
   /**
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean} True if the nameservers config type type can be changed.
    * @private
    */
@@ -273,7 +272,7 @@
 
   /**
    * @param {string} nameserversType
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @return {boolean} True if the nameservers are editable.
    * @private
    */
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js b/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
index 57c6a7b..4c8c53b 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_property_list_mojo.js
@@ -15,8 +15,6 @@
 
 import {assert} from '//resources/js/assert.m.js';
 import {flush, html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ActivationStateType, SecurityType, SubjectAltName, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {OncSource, PolicySource, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -308,8 +306,8 @@
       // Unspecified properties in policy configurations are not user
       // modifiable. https://crbug.com/819837.
       const source = this.propertyDict.source;
-      return source !== OncSource.kUserPolicy &&
-          source !== OncSource.kDevicePolicy;
+      return source !== chromeos.networkConfig.mojom.OncSource.kUserPolicy &&
+          source !== chromeos.networkConfig.mojom.OncSource.kDevicePolicy;
     }
     return !this.isNetworkPolicyEnforced(property);
   },
@@ -383,7 +381,7 @@
         this.propertyDict.source) {
       const policySource = OncMojo.getEnforcedPolicySourceFromOncSource(
           this.propertyDict.source);
-      if (policySource !== PolicySource.kNone) {
+      if (policySource !== chromeos.networkConfig.mojom.PolicySource.kNone) {
         // If the dictionary is policy controlled, provide an empty property
         // object with the network policy source. See https://crbug.com/819837
         // for more info.
@@ -415,7 +413,8 @@
 
     if (key === 'wifi.eap.subjectAltNameMatch') {
       return OncMojo.serializeSubjectAltNameMatch(
-          /** @type {!Array<!SubjectAltName>} */ (value));
+          /** @type {!Array<!chromeos.networkConfig.mojom.SubjectAltName>} */ (
+              value));
     }
 
     if (key === 'wifi.eap.domainSuffixMatch') {
@@ -440,16 +439,17 @@
       // Special case typed managed properties.
       if (key === 'cellular.activationState') {
         valueStr = OncMojo.getActivationStateTypeString(
-            /** @type {!ActivationStateType}*/ (value));
+            /** @type{!chromeos.networkConfig.mojom.ActivationStateType}*/ (
+                value));
       } else if (key === 'portalState') {
         valueStr = OncMojo.getPortalStateString(
-            /** @type {!PortalState}*/ (value));
+            /** @type{!chromeos.networkConfig.mojom.PortalState}*/ (value));
       } else if (key === 'vpn.type') {
         valueStr = OncMojo.getVpnTypeString(
-            /** @type {!VpnType}*/ (value));
+            /** @type{!chromeos.networkConfig.mojom.VpnType}*/ (value));
       } else if (key === 'wifi.security') {
         valueStr = OncMojo.getSecurityTypeString(
-            /** @type {!SecurityType}*/ (value));
+            /** @type{!chromeos.networkConfig.mojom.SecurityType}*/ (value));
       } else {
         return value.toString();
       }
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_proxy.js b/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
index 26216d3..473febc 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_proxy.js
@@ -17,11 +17,9 @@
 import './network_proxy_input.js';
 import './network_shared_css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {assert} from '//resources/js/assert.m.js';
+import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ManagedManualProxySettings, ManagedProperties, ManagedProxyLocation, ManagedProxySettings, ManagedStringList, ProxyLocation, ProxySettings} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {IPConfigType, OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {CrPolicyNetworkBehaviorMojo} from './cr_policy_network_behavior_mojo.js';
 import {OncMojo} from './onc_mojo.js';
@@ -42,7 +40,7 @@
       value: false,
     },
 
-    /** @type {!ManagedProperties|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.ManagedProperties|undefined} */
     managedProperties: {
       type: Object,
       observer: 'managedPropertiesChanged_',
@@ -57,7 +55,7 @@
 
     /**
      * UI visible / edited proxy configuration.
-     * @private {!ManagedProxySettings}
+     * @private {!chromeos.networkConfig.mojom.ManagedProxySettings}
      */
     proxy_: {
       type: Object,
@@ -109,7 +107,7 @@
   /**
    * Saved Manual properties so that switching to another type does not loose
    * any set properties while the UI is open.
-   * @private {!ManagedManualProxySettings|
+   * @private {!chromeos.networkConfig.mojom.ManagedManualProxySettings|
    *           undefined}
    */
   savedManual_: undefined,
@@ -117,7 +115,7 @@
   /**
    * Saved ExcludeDomains properties so that switching to a non-Manual type does
    * not loose any set exclusions while the UI is open.
-   * @private {!ManagedStringList|undefined}
+   * @private {!chromeos.networkConfig.mojom.ManagedStringList|undefined}
    */
   savedExcludeDomains_: undefined,
 
@@ -143,8 +141,8 @@
   },
 
   /**
-   * @param {!ManagedProperties|undefined} newValue
-   * @param {!ManagedProperties|undefined} oldValue
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined} newValue
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties|undefined} oldValue
    * @private
    */
   managedPropertiesChanged_(newValue, oldValue) {
@@ -202,8 +200,8 @@
   },
 
   /**
-   * @param {?ManagedProxyLocation|undefined} a
-   * @param {?ManagedProxyLocation|undefined} b
+   * @param {?chromeos.networkConfig.mojom.ManagedProxyLocation|undefined} a
+   * @param {?chromeos.networkConfig.mojom.ManagedProxyLocation|undefined} b
    * @return {boolean}
    * @private
    */
@@ -214,7 +212,7 @@
 
   /**
    * @param {number} port
-   * @return {!ManagedProxyLocation}
+   * @return {!chromeos.networkConfig.mojom.ManagedProxyLocation}
    * @private
    */
   createDefaultProxyLocation_(port) {
@@ -226,13 +224,14 @@
 
   /**
    * Returns a copy of |inputProxy| with all required properties set correctly.
-   * @param {!ManagedProxySettings} inputProxy
-   * @return {!ManagedProxySettings}
+   * @param {!chromeos.networkConfig.mojom.ManagedProxySettings} inputProxy
+   * @return {!chromeos.networkConfig.mojom.ManagedProxySettings}
    * @private
    */
   validateProxy_(inputProxy) {
     const proxy =
-        /** @type {!ManagedProxySettings} */ (Object.assign({}, inputProxy));
+        /** @type {!chromeos.networkConfig.mojom.ManagedProxySettings} */ (
+            Object.assign({}, inputProxy));
     const type = proxy.type.activeValue;
     if (type === 'PAC') {
       if (!proxy.pac) {
@@ -252,7 +251,7 @@
       proxy.excludeDomains =
           proxy.excludeDomains || this.savedExcludeDomains_ || {
             activeValue: [],
-            policySource: PolicySource.kNone,
+            policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
           };
     }
     return proxy;
@@ -280,7 +279,8 @@
       // Set the Web Proxy Auto Discovery URL for display purposes.
       const ipv4 = this.managedProperties ?
           OncMojo.getIPConfigForType(
-              this.managedProperties, IPConfigType.kIPv4) :
+              this.managedProperties,
+              chromeos.networkConfig.mojom.IPConfigType.kIPv4) :
           null;
       this.wpad_ = (ipv4 && ipv4.webProxyAutoDiscoveryUrl) ||
           this.i18n('networkProxyWpadNone');
@@ -291,7 +291,7 @@
   },
 
   /**
-   * @param {!ManagedProxySettings} proxy
+   * @param {!chromeos.networkConfig.mojom.ManagedProxySettings} proxy
    * @private
    */
   setProxy_(proxy) {
@@ -320,7 +320,7 @@
   },
 
   /**
-   * @return {!ManagedProxySettings}
+   * @return {!chromeos.networkConfig.mojom.ManagedProxySettings}
    * @private
    */
   createDefaultProxySettings_() {
@@ -330,9 +330,9 @@
   },
 
   /**
-   * @param {?ManagedProxyLocation|undefined}
+   * @param {?chromeos.networkConfig.mojom.ManagedProxyLocation|undefined}
    *     location
-   * @return {!ProxyLocation|undefined}
+   * @return {!chromeos.networkConfig.mojom.ProxyLocation|undefined}
    * @private
    */
   getProxyLocation_(location) {
@@ -350,12 +350,13 @@
    * @private
    */
   sendProxyChange_() {
+    const mojom = chromeos.networkConfig.mojom;
     const proxyType = OncMojo.getActiveString(this.proxy_.type);
     if (!proxyType || (proxyType === 'PAC' && !this.proxy_.pac)) {
       return;
     }
 
-    const proxy = /** @type {!ProxySettings} */ ({
+    const proxy = /** @type {!mojom.ProxySettings} */ ({
       type: proxyType,
       excludeDomains: OncMojo.getActiveValue(this.proxy_.excludeDomains),
     });
@@ -364,7 +365,7 @@
       let manual = {};
       if (this.proxy_.manual) {
         this.savedManual_ =
-            /** @type{!ManagedManualProxySettings}*/ (
+            /** @type{!mojom.ManagedManualProxySettings}*/ (
                 Object.assign({}, this.proxy_.manual));
         manual = {
           httpProxy: this.getProxyLocation_(this.proxy_.manual.httpProxy),
@@ -375,15 +376,15 @@
       }
       if (this.proxy_.excludeDomains) {
         this.savedExcludeDomains_ =
-            /** @type{!ManagedStringList}*/ (
+            /** @type{!mojom.ManagedStringList}*/ (
                 Object.assign({}, this.proxy_.excludeDomains));
       }
       const defaultProxy = manual.httpProxy || {host: '', port: 80};
       if (this.useSameProxy_) {
-        manual.secureHttpProxy =
-            /** @type {!ProxyLocation} */ (Object.assign({}, defaultProxy));
-        manual.socks =
-            /** @type {!ProxyLocation} */ (Object.assign({}, defaultProxy));
+        manual.secureHttpProxy = /** @type {!mojom.ProxyLocation} */ (
+            Object.assign({}, defaultProxy));
+        manual.socks = /** @type {!mojom.ProxyLocation} */ (
+            Object.assign({}, defaultProxy));
       } else {
         // Remove properties with empty hosts to unset them.
         if (manual.httpProxy && !manual.httpProxy.host) {
@@ -564,7 +565,8 @@
       return false;
     }
     const source = this.managedProperties.source;
-    return source === OncSource.kDevice || source === OncSource.kDevicePolicy;
+    return source === chromeos.networkConfig.mojom.OncSource.kDevice ||
+        source === chromeos.networkConfig.mojom.OncSource.kDevicePolicy;
   },
 
   /**
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js b/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js
index 04f012e..16129d9 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_proxy_input.js
@@ -13,7 +13,6 @@
 import './network_shared_css.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ManagedProxyLocation} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 
@@ -44,7 +43,7 @@
 
     /**
      * The proxy object.
-     * @type {!ManagedProxyLocation}
+     * @type {!chromeos.networkConfig.mojom.ManagedProxyLocation}
      */
     value: {
       type: Object,
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_select.js b/ui/webui/resources/cr_components/chromeos/network/network_select.js
index 072d655..45174f4 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_select.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_select.js
@@ -13,14 +13,15 @@
 
 import {assert} from '//resources/js/assert.m.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CrosNetworkConfigRemote, FilterType, GlobalPolicy, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
 import {NetworkList} from './network_list_types.js';
 import {NetworkListenerBehavior} from './network_listener_behavior.js';
 import {OncMojo} from './onc_mojo.js';
 
+
+const mojom = chromeos.networkConfig.mojom;
+
 Polymer({
   _template: html`{__html_template__}`,
   is: 'network-select',
@@ -98,7 +99,7 @@
       value: false,
     },
 
-    /** @private {!GlobalPolicy|undefined} */
+    /** @private {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy_: Object,
   },
 
@@ -109,7 +110,7 @@
   /** @private {number|null} */
   scanIntervalId_: null,
 
-  /** @private {?CrosNetworkConfigRemote} */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -190,12 +191,12 @@
         defaultNetwork = state;
         break;
       }
-      if (state.connectionState === ConnectionStateType.kConnecting &&
+      if (state.connectionState === mojom.ConnectionStateType.kConnecting &&
           !defaultNetwork) {
         defaultNetwork = state;
         // Do not break here in case a non WiFi network is connecting but a
         // WiFi network is connected.
-      } else if (state.type === NetworkType.kWiFi) {
+      } else if (state.type === mojom.NetworkType.kWiFi) {
         break;  // Non connecting or connected WiFI networks are always last.
       }
     }
@@ -231,7 +232,7 @@
     // Request only WiFi network scans. Tether and Cellular scans are not useful
     // here. Cellular scans are disruptive and should only be triggered by
     // explicit user action.
-    const kWiFi = NetworkType.kWiFi;
+    const kWiFi = chromeos.networkConfig.mojom.NetworkType.kWiFi;
     this.networkConfig_.requestNetworkScan(kWiFi);
     this.scanIntervalId_ = window.setInterval(function() {
       this.networkConfig_.requestNetworkScan(kWiFi);
@@ -258,9 +259,9 @@
         deviceStates.some((deviceState) => !!deviceState.scanning);
 
     const filter = {
-      filter: FilterType.kVisible,
-      networkType: NetworkType.kAll,
-      limit: NO_LIMIT,
+      filter: chromeos.networkConfig.mojom.FilterType.kVisible,
+      networkType: mojom.NetworkType.kAll,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
     };
     this.networkConfig_.getNetworkStateList(filter).then(response => {
       this.onGetNetworkStateList_(deviceStates, response.result);
diff --git a/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js b/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
index b6d77402..2c740c1 100644
--- a/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
+++ b/ui/webui/resources/cr_components/chromeos/network/network_siminfo.js
@@ -18,7 +18,6 @@
 
 import {isActiveSim} from '//resources/cr_components/chromeos/network/cellular_utils.js';
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
 import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 import {loadTimeData} from '../../../js/load_time_data.m.js';
@@ -60,7 +59,7 @@
       value: null,
     },
 
-    /** @type {!GlobalPolicy|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy: Object,
 
     disabled: {
diff --git a/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js b/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
index 9439cc4..27351bf 100644
--- a/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
+++ b/ui/webui/resources/cr_components/chromeos/network/onc_mojo.js
@@ -8,12 +8,14 @@
  * strings and for debugging. They are not intended to be drectly user facing.
  */
 
+import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
+import 'chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-lite.js';
+import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
+import 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-lite.js';
+
 import {assert, assertNotReached} from 'chrome://resources/js/assert.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {ActivationStateType, ApnProperties, AuthenticationType, ConfigProperties, DeviceStateProperties, HiddenSsidMode, InhibitReason, IPConfigProperties, ManagedApnList, ManagedBoolean, ManagedInt32, ManagedProperties, ManagedString, ManagedStringList, ManagedSubjectAltNameMatchList, NetworkStateProperties, ProxyMode, SecurityType, SIMInfo, SIMLockStatus, SubjectAltName, SubjectAltName_Type, TetherStateProperties, TrafficCounterProperties, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {ConnectionStateType, DeviceStateType, IPConfigType, NetworkType, OncSource, PolicySource, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {IPAddress} from 'chrome://resources/mojo/services/network/public/mojom/ip_address.mojom-webui.js';
-
 
 // Used to indicate a saved but unknown credential value. Will appear as
 // placeholder character in the credential (passphrase, password, etc.) field by
@@ -40,10 +42,12 @@
   }
 
   /**
-   * @param {!ActivationStateType} value
+   * @param {!chromeos.networkConfig.mojom.ActivationStateType} value
    * @return {string}
    */
   static getActivationStateTypeString(value) {
+    const ActivationStateType =
+        chromeos.networkConfig.mojom.ActivationStateType;
     switch (value) {
       case ActivationStateType.kUnknown:
         return 'Unknown';
@@ -64,9 +68,11 @@
 
   /**
    * @param {string} value
-   * @return {!ActivationStateType}
+   * @return {!chromeos.networkConfig.mojom.ActivationStateType}
    */
   static getActivationStateTypeFromString(value) {
+    const ActivationStateType =
+        chromeos.networkConfig.mojom.ActivationStateType;
     switch (value) {
       case 'Unknown':
         return ActivationStateType.kUnknown;
@@ -86,10 +92,11 @@
   }
 
   /**
-   * @param {!PortalState} value
+   * @param {!chromeos.networkConfig.mojom.PortalState} value
    * @return {string}
    */
   static getPortalStateString(value) {
+    const PortalState = chromeos.networkConfig.mojom.PortalState;
     switch (value) {
       case PortalState.kUnknown:
         return 'Unknown';
@@ -109,10 +116,12 @@
   }
 
   /**
-   * @param {!ConnectionStateType} value
+   * @param {!chromeos.networkConfig.mojom.ConnectionStateType} value
    * @return {string}
    */
   static getConnectionStateTypeString(value) {
+    const ConnectionStateType =
+        chromeos.networkConfig.mojom.ConnectionStateType;
     switch (value) {
       case ConnectionStateType.kOnline:
         return 'Online';
@@ -131,9 +140,11 @@
 
   /**
    * @param {string} value
-   * @return {!ConnectionStateType}
+   * @return {!chromeos.networkConfig.mojom.ConnectionStateType}
    */
   static getConnectionStateTypeFromString(value) {
+    const ConnectionStateType =
+        chromeos.networkConfig.mojom.ConnectionStateType;
     switch (value) {
       case 'Online':
         return ConnectionStateType.kOnline;
@@ -151,10 +162,12 @@
   }
 
   /**
-   * @param {!ConnectionStateType} value
+   * @param {!chromeos.networkConfig.mojom.ConnectionStateType} value
    * @return {boolean}
    */
   static connectionStateIsConnected(value) {
+    const ConnectionStateType =
+        chromeos.networkConfig.mojom.ConnectionStateType;
     switch (value) {
       case ConnectionStateType.kOnline:
       case ConnectionStateType.kConnected:
@@ -169,10 +182,11 @@
   }
 
   /**
-   * @param {!DeviceStateType} value
+   * @param {!chromeos.networkConfig.mojom.DeviceStateType} value
    * @return {string}
    */
   static getDeviceStateTypeString(value) {
+    const DeviceStateType = chromeos.networkConfig.mojom.DeviceStateType;
     switch (value) {
       case DeviceStateType.kUninitialized:
         return 'Uninitialized';
@@ -194,10 +208,11 @@
   }
 
   /**
-   * @param {!DeviceStateType} value
+   * @param {!chromeos.networkConfig.mojom.DeviceStateType} value
    * @return {boolean}
    */
   static deviceStateIsIntermediate(value) {
+    const DeviceStateType = chromeos.networkConfig.mojom.DeviceStateType;
     switch (value) {
       case DeviceStateType.kUninitialized:
       case DeviceStateType.kDisabling:
@@ -213,7 +228,7 @@
   }
 
   /**
-   * @param {?DeviceStateProperties|undefined}
+   * @param {?chromeos.networkConfig.mojom.DeviceStateProperties|undefined}
    *     device
    * @return {boolean}
    */
@@ -222,14 +237,16 @@
       return false;
     }
 
-    return device.inhibitReason !== InhibitReason.kNotInhibited;
+    return device.inhibitReason !==
+        chromeos.networkConfig.mojom.InhibitReason.kNotInhibited;
   }
 
   /**
-   * @param {!NetworkType} value
+   * @param {!chromeos.networkConfig.mojom.NetworkType} value
    * @return {string}
    */
   static getNetworkTypeString(value) {
+    const NetworkType = chromeos.networkConfig.mojom.NetworkType;
     switch (value) {
       case NetworkType.kAll:
         return 'All';
@@ -253,10 +270,11 @@
   }
 
   /**
-   * @param {!NetworkType} value
+   * @param {!chromeos.networkConfig.mojom.NetworkType} value
    * @return {boolean}
    */
   static networkTypeIsMobile(value) {
+    const NetworkType = chromeos.networkConfig.mojom.NetworkType;
     switch (value) {
       case NetworkType.kCellular:
       case NetworkType.kMobile:
@@ -274,7 +292,7 @@
   }
 
   /**
-   * @param {!NetworkType} value
+   * @param {!chromeos.networkConfig.mojom.NetworkType} value
    * @return {boolean}
    */
   static networkTypeHasConfigurationFlow(value) {
@@ -285,9 +303,10 @@
 
   /**
    * @param {string} value
-   * @return {!NetworkType}
+   * @return {!chromeos.networkConfig.mojom.NetworkType}
    */
   static getNetworkTypeFromString(value) {
+    const NetworkType = chromeos.networkConfig.mojom.NetworkType;
     switch (value) {
       case 'All':
         return NetworkType.kAll;
@@ -311,10 +330,11 @@
   }
 
   /**
-   * @param {!OncSource} value
+   * @param {!chromeos.networkConfig.mojom.OncSource} value
    * @return {string}
    */
   static getOncSourceString(value) {
+    const OncSource = chromeos.networkConfig.mojom.OncSource;
     switch (value) {
       case OncSource.kNone:
         return 'None';
@@ -332,10 +352,11 @@
   }
 
   /**
-   * @param {!SecurityType} value
+   * @param {!chromeos.networkConfig.mojom.SecurityType} value
    * @return {string}
    */
   static getSecurityTypeString(value) {
+    const SecurityType = chromeos.networkConfig.mojom.SecurityType;
     switch (value) {
       case SecurityType.kNone:
         return 'None';
@@ -354,9 +375,10 @@
 
   /**
    * @param {string} value
-   * @return {!SecurityType}
+   * @return {!chromeos.networkConfig.mojom.SecurityType}
    */
   static getSecurityTypeFromString(value) {
+    const SecurityType = chromeos.networkConfig.mojom.SecurityType;
     switch (value) {
       case 'None':
         return SecurityType.kNone;
@@ -374,10 +396,11 @@
   }
 
   /**
-   * @param {!VpnType} value
+   * @param {!chromeos.networkConfig.mojom.VpnType} value
    * @return {string}
    */
   static getVpnTypeString(value) {
+    const VpnType = chromeos.networkConfig.mojom.VpnType;
     switch (value) {
       case VpnType.kL2TPIPsec:
         return 'L2TP-IPsec';
@@ -394,9 +417,10 @@
 
   /**
    * @param {string} value
-   * @return {!VpnType}
+   * @return {!chromeos.networkConfig.mojom.VpnType}
    */
   static getVpnTypeFromString(value) {
+    const VpnType = chromeos.networkConfig.mojom.VpnType;
     switch (value) {
       case 'L2TP-IPsec':
         return VpnType.kL2TPIPsec;
@@ -423,27 +447,29 @@
   static getTypeString(key, value) {
     if (key === 'activationState') {
       return OncMojo.getActivationStateTypeString(
-          /** @type {!ActivationStateType} */ (value));
+          /** @type {!chromeos.networkConfig.mojom.ActivationStateType} */ (
+              value));
     }
     if (key === 'connectionState') {
       return OncMojo.getConnectionStateTypeString(
-          /** @type {!ConnectionStateType} */ (value));
+          /** @type {!chromeos.networkConfig.mojom.ConnectionStateType} */ (
+              value));
     }
     if (key === 'deviceState') {
       return OncMojo.getDeviceStateTypeString(
-          /** @type {!DeviceStateType} */ (value));
+          /** @type {!chromeos.networkConfig.mojom.DeviceStateType} */ (value));
     }
     if (key === 'type') {
       return OncMojo.getNetworkTypeString(
-          /** @type {!NetworkType} */ (value));
+          /** @type {!chromeos.networkConfig.mojom.NetworkType} */ (value));
     }
     if (key === 'source') {
       return OncMojo.getOncSourceString(
-          /** @type {!OncSource} */ (value));
+          /** @type {!chromeos.networkConfig.mojom.OncSource} */ (value));
     }
     if (key === 'security') {
       return OncMojo.getSecurityTypeString(
-          /** @type {!SecurityType} */ (value));
+          /** @type {!chromeos.networkConfig.mojom.SecurityType} */ (value));
     }
     return value;
   }
@@ -452,10 +478,12 @@
    * Policy indicators expect a per-property PolicySource, but sometimes we need
    * to use the per-configuration OncSource (e.g. for unmanaged intrinsic
    * properties like Security). This returns the corresponding PolicySource.
-   * @param {!OncSource} source
-   * @return {!PolicySource}
+   * @param {!chromeos.networkConfig.mojom.OncSource} source
+   * @return {!chromeos.networkConfig.mojom.PolicySource}
    */
   static getEnforcedPolicySourceFromOncSource(source) {
+    const OncSource = chromeos.networkConfig.mojom.OncSource;
+    const PolicySource = chromeos.networkConfig.mojom.PolicySource;
     switch (source) {
       case OncSource.kNone:
       case OncSource.kDevice:
@@ -472,7 +500,7 @@
   }
 
   /**
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @return {string}
    */
   static getNetworkTypeDisplayName(type) {
@@ -494,14 +522,15 @@
   }
 
   /**
-   * @param {!NetworkStateProperties} network
+   * @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network
    * @return {string}
    */
   static getNetworkStateDisplayName(network) {
     if (!network.name) {
       return OncMojo.getNetworkTypeDisplayName(network.type);
     }
-    if (network.type === NetworkType.kVPN &&
+    const mojom = chromeos.networkConfig.mojom;
+    if (network.type === mojom.NetworkType.kVPN &&
         network.typeState.vpn.providerName) {
       return OncMojo.getVpnDisplayName(
           network.name, network.typeState.vpn.providerName);
@@ -510,14 +539,15 @@
   }
 
   /**
-   * @param {!ManagedProperties} network
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} network
    * @return {string}
    */
   static getNetworkName(network) {
     if (!network.name || !network.name.activeValue) {
       return OncMojo.getNetworkTypeDisplayName(network.type);
     }
-    if (network.type === NetworkType.kVPN &&
+    const mojom = chromeos.networkConfig.mojom;
+    if (network.type === mojom.NetworkType.kVPN &&
         network.typeProperties.vpn.providerName) {
       return OncMojo.getVpnDisplayName(
           network.name.activeValue, network.typeProperties.vpn.providerName);
@@ -527,10 +557,11 @@
 
   /**
    * Gets the SignalStrength value from |network| based on network.type.
-   * @param {!NetworkStateProperties} network
+   * @param {!chromeos.networkConfig.mojom.NetworkStateProperties} network
    * @return {number} The signal strength value if it exists or 0.
    */
   static getSignalStrength(network) {
+    const NetworkType = chromeos.networkConfig.mojom.NetworkType;
     switch (network.type) {
       case NetworkType.kCellular:
         return network.typeState.cellular.signalStrength;
@@ -547,8 +578,8 @@
    * Determines whether a connection to |network| can be attempted. Note that
    * this function does not consider policies which may block a connection from
    * succeeding.
-   * @param {!NetworkStateProperties|
-   *     !ManagedProperties} network
+   * @param {!chromeos.networkConfig.mojom.NetworkStateProperties|
+   *     !chromeos.networkConfig.mojom.ManagedProperties} network
    * @return {boolean} Whether the network can currently be connected; if the
    *     network is not connectable, it must first be configured.
    */
@@ -588,31 +619,32 @@
 
   /**
    * Returns a NetworkStateProperties object with type set and default values.
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @param {?string=} opt_name Optional name, intended for testing.
-   * @return {!NetworkStateProperties}
+   * @return {!chromeos.networkConfig.mojom.NetworkStateProperties}
    */
   static getDefaultNetworkState(type, opt_name) {
+    const mojom = chromeos.networkConfig.mojom;
     const result = {
       connectable: false,
       connectRequested: false,
-      connectionState: ConnectionStateType.kNotConnected,
+      connectionState: mojom.ConnectionStateType.kNotConnected,
       guid: opt_name ? (opt_name + '_guid') : '',
       name: opt_name || '',
-      portalState: PortalState.kUnknown,
+      portalState: mojom.PortalState.kUnknown,
       priority: 0,
-      proxyMode: ProxyMode.kDirect,
+      proxyMode: mojom.ProxyMode.kDirect,
       prohibitedByPolicy: false,
-      source: OncSource.kNone,
+      source: mojom.OncSource.kNone,
       type: type,
       typeState: {},
     };
     switch (type) {
-      case NetworkType.kCellular:
+      case mojom.NetworkType.kCellular:
         result.typeState.cellular = {
           iccid: '',
           eid: '',
-          activationState: ActivationStateType.kUnknown,
+          activationState: mojom.ActivationStateType.kUnknown,
           networkTechnology: '',
           roaming: false,
           signalStrength: 0,
@@ -621,12 +653,12 @@
           simLockType: '',
         };
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         result.typeState.ethernet = {
-          authentication: AuthenticationType.kNone,
+          authentication: mojom.AuthenticationType.kNone,
         };
         break;
-      case NetworkType.kTether:
+      case mojom.NetworkType.kTether:
         result.typeState.tether = {
           batteryPercentage: 0,
           carrier: '',
@@ -634,20 +666,20 @@
           signalStrength: 0,
         };
         break;
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kVPN:
         result.typeState.vpn = {
-          type: VpnType.kOpenVPN,
+          type: mojom.VpnType.kOpenVPN,
           providerId: '',
           providerName: '',
         };
         break;
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         result.typeState.wifi = {
           bssid: '',
           frequency: 0,
           hexSsid: opt_name || '',
           hiddenSsid: false,
-          security: SecurityType.kNone,
+          security: mojom.SecurityType.kNone,
           signalStrength: 0,
           ssid: '',
         };
@@ -661,10 +693,11 @@
   /**
    * Converts an ManagedProperties dictionary to NetworkStateProperties.
    * Used to provide state properties to NetworkIcon.
-   * @param {!ManagedProperties} properties
-   * @return {!NetworkStateProperties}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
+   * @return {!chromeos.networkConfig.mojom.NetworkStateProperties}
    */
   static managedPropertiesToNetworkState(properties) {
+    const mojom = chromeos.networkConfig.mojom;
     const networkState = OncMojo.getDefaultNetworkState(properties.type);
     networkState.connectable = properties.connectable;
     networkState.connectionState = properties.connectionState;
@@ -678,7 +711,7 @@
     networkState.source = properties.source;
 
     switch (properties.type) {
-      case NetworkType.kCellular:
+      case mojom.NetworkType.kCellular:
         const cellularProperties = properties.typeProperties.cellular;
         networkState.typeState.cellular.iccid =
             cellularProperties.iccid || '';
@@ -695,26 +728,26 @@
         networkState.typeState.cellular.simLocked =
             cellularProperties.simLocked;
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         networkState.typeState.ethernet.authentication =
             OncMojo.getActiveValue(
                 properties.typeProperties.ethernet.authentication) === '8021X' ?
-            AuthenticationType.k8021x :
-            AuthenticationType.kNone;
+            mojom.AuthenticationType.k8021x :
+            mojom.AuthenticationType.kNone;
         break;
-      case NetworkType.kTether:
+      case mojom.NetworkType.kTether:
         if (properties.typeProperties.tether) {
           networkState.typeState.tether =
-              /** @type {!TetherStateProperties}*/ (
+              /** @type {!mojom.TetherStateProperties}*/ (
                   Object.assign({}, properties.typeProperties.tether));
         }
         break;
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kVPN:
         networkState.typeState.vpn.providerName =
             properties.typeProperties.vpn.providerName;
         networkState.typeState.vpn.type = properties.typeProperties.vpn.type;
         break;
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         const wifiProperties = properties.typeProperties.wifi;
         networkState.typeState.wifi.bssid = wifiProperties.bssid || '';
         networkState.typeState.wifi.frequency = wifiProperties.frequency;
@@ -733,41 +766,42 @@
   /**
    * Returns a ManagedProperties object with type, guid and name set, and all
    * other required properties set to their default values.
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @param {string} guid
    * @param {string} name
-   * @return {!ManagedProperties}
+   * @return {!chromeos.networkConfig.mojom.ManagedProperties}
    */
   static getDefaultManagedProperties(type, guid, name) {
+    const mojom = chromeos.networkConfig.mojom;
     const result = {
-      connectionState: ConnectionStateType.kNotConnected,
-      source: OncSource.kNone,
+      connectionState: mojom.ConnectionStateType.kNotConnected,
+      source: mojom.OncSource.kNone,
       type: type,
       connectable: false,
       guid: guid,
       name: OncMojo.createManagedString(name),
       ipAddressConfigType: OncMojo.createManagedString('DHCP'),
       nameServersConfigType: OncMojo.createManagedString('DHCP'),
-      portalState: PortalState.kUnknown,
+      portalState: mojom.PortalState.kUnknown,
       trafficCounterProperties: OncMojo.createTrafficCounterProperties(),
     };
     switch (type) {
-      case NetworkType.kCellular:
+      case mojom.NetworkType.kCellular:
         result.typeProperties = {
           cellular: {
-            activationState: ActivationStateType.kUnknown,
+            activationState: mojom.ActivationStateType.kUnknown,
             signalStrength: 0,
             simLocked: false,
             supportNetworkScan: false,
           },
         };
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         result.typeProperties = {
           ethernet: {},
         };
         break;
-      case NetworkType.kTether:
+      case mojom.NetworkType.kTether:
         result.typeProperties = {
           tether: {
             batteryPercentage: 0,
@@ -777,22 +811,22 @@
           },
         };
         break;
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kVPN:
         result.typeProperties = {
           vpn: {
             providerName: '',
-            type: VpnType.kOpenVPN,
+            type: mojom.VpnType.kOpenVPN,
             openVpn: {},
           },
         };
         break;
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         result.typeProperties = {
           wifi: {
             bssid: '',
             frequency: 0,
             ssid: OncMojo.createManagedString(''),
-            security: SecurityType.kNone,
+            security: mojom.SecurityType.kNone,
             signalStrength: 0,
             isSyncable: false,
             isConfiguredByActiveUser: false,
@@ -806,28 +840,29 @@
   /**
    * Returns a ConfigProperties object with a default networkType struct
    * based on |type|.
-   * @param {!NetworkType} type
-   * @return {!ConfigProperties}
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
+   * @return {!chromeos.networkConfig.mojom.ConfigProperties}
    */
   static getDefaultConfigProperties(type) {
+    const mojom = chromeos.networkConfig.mojom;
     switch (type) {
-      case NetworkType.kCellular:
+      case mojom.NetworkType.kCellular:
         return {typeConfig: {cellular: {}}};
         break;
-      case NetworkType.kEthernet:
+      case mojom.NetworkType.kEthernet:
         return {typeConfig: {ethernet: {}}};
         break;
-      case NetworkType.kVPN:
+      case mojom.NetworkType.kVPN:
         return {typeConfig: {vpn: {}}};
         break;
-      case NetworkType.kWiFi:
+      case mojom.NetworkType.kWiFi:
         // Note: wifi.security can not be changed, so |security| will be ignored
         // for existing configurations.
         return {
           typeConfig: {
             wifi: {
-              security: SecurityType.kNone,
-              hiddenSsid: HiddenSsidMode.kAutomatic,
+              security: mojom.SecurityType.kNone,
+              hiddenSsid: mojom.HiddenSsidMode.kAutomatic,
             },
           },
         };
@@ -839,7 +874,7 @@
 
   /**
    * Sets the value of a property in an mojo config dictionary.
-   * @param {!ConfigProperties} config
+   * @param {!chromeos.networkConfig.mojom.ConfigProperties} config
    * @param {string} key The property key which may be nested, e.g. 'foo.bar'
    * @param {boolean|number|string|!Object} value The property value
    */
@@ -863,15 +898,15 @@
   }
 
   /**
-   * @param {!ManagedBoolean|
-   *         !ManagedInt32|
-   *         !ManagedString|
-   *         !ManagedStringList|
-   *         !ManagedApnList|
-   *         !ManagedSubjectAltNameMatchList|
+   * @param {!chromeos.networkConfig.mojom.ManagedBoolean|
+   *         !chromeos.networkConfig.mojom.ManagedInt32|
+   *         !chromeos.networkConfig.mojom.ManagedString|
+   *         !chromeos.networkConfig.mojom.ManagedStringList|
+   *         !chromeos.networkConfig.mojom.ManagedApnList|
+   *         !chromeos.networkConfig.mojom.ManagedSubjectAltNameMatchList|
    *         null|undefined} property
    * @return {boolean|number|string|!Array<string>|
-   *          !Array<!ApnProperties>|undefined}
+   *          !Array<!chromeos.networkConfig.mojom.ApnProperties>|undefined}
    */
   static getActiveValue(property) {
     if (!property) {
@@ -881,7 +916,7 @@
   }
 
   /**
-   * @param {?ManagedString|undefined} property
+   * @param {?chromeos.networkConfig.mojom.ManagedString|undefined} property
    * @return {string}
    */
   static getActiveString(property) {
@@ -894,27 +929,28 @@
   /**
    * Returns IPConfigProperties for |type|. For IPv4, these will be the static
    * properties if IPAddressConfigType is Static and StaticIPConfig is set.
-   * @param {!ManagedProperties} properties
-   * @param {!IPConfigType} desiredType
-   * @return {!IPConfigProperties|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
+   * @param {!chromeos.networkConfig.mojom.IPConfigType} desiredType
+   * @return {!chromeos.networkConfig.mojom.IPConfigProperties|undefined}
    */
   static getIPConfigForType(properties, desiredType) {
+    const mojom = chromeos.networkConfig.mojom;
     const ipConfigs = properties.ipConfigs;
     let ipConfig;
     if (ipConfigs) {
       ipConfig = ipConfigs.find(ipconfig => ipconfig.type === desiredType);
-      if (ipConfig && desiredType !== IPConfigType.kIPv4) {
+      if (ipConfig && desiredType !== mojom.IPConfigType.kIPv4) {
         return ipConfig;
       }
     }
 
     // Only populate static ip config properties for IPv4.
-    if (desiredType !== IPConfigType.kIPv4) {
+    if (desiredType !== mojom.IPConfigType.kIPv4) {
       return undefined;
     }
 
     if (!ipConfig) {
-      ipConfig = /** @type {!IPConfigProperties} */ ({routingPrefix: 0});
+      ipConfig = /** @type {!mojom.IPConfigProperties} */ ({routingPrefix: 0});
     }
 
     const staticIpConfig = properties.staticIpConfig;
@@ -949,8 +985,8 @@
    * Compares two IP config property dictionaries. Returns true if all
    * properties specified in the new dictionary match the values in the existing
    * dictionary.
-   * @param {!IPConfigProperties} staticValue
-   * @param {!IPConfigProperties} newValue
+   * @param {!chromeos.networkConfig.mojom.IPConfigProperties} staticValue
+   * @param {!chromeos.networkConfig.mojom.IPConfigProperties} newValue
    * @return {boolean} True if all properties set in |newValue| are equal to
    *     the corresponding properties in |staticValue|.
    */
@@ -974,15 +1010,16 @@
 
   /**
    * Extracts existing ip config properties from |managedProperties| and applies
-   * |newValue| to |field|. Returns a ConfigProperties object with the
+   * |newValue| to |field|. Returns a mojom.ConfigProperties object with the
    * IP Config related properties set, or null if no changes were applied.
-   * @param {!ManagedProperties} managedProperties
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} managedProperties
    * @param {string} field
    * @param {string|!Array<string>|
-   *     !IPConfigProperties} newValue
-   * @return {?ConfigProperties}
+   *     !chromeos.networkConfig.mojom.IPConfigProperties} newValue
+   * @return {?chromeos.networkConfig.mojom.ConfigProperties}
    */
   static getUpdatedIPConfigProperties(managedProperties, field, newValue) {
+    const mojom = chromeos.networkConfig.mojom;
     // Get an empty ONC dictionary and set just the IP Config properties that
     // need to change.
     let ipConfigType =
@@ -992,7 +1029,7 @@
         OncMojo.getActiveString(managedProperties.nameServersConfigType) ||
         'DHCP';
     let staticIpConfig =
-        OncMojo.getIPConfigForType(managedProperties, IPConfigType.kIPv4);
+        OncMojo.getIPConfigForType(managedProperties, mojom.IPConfigType.kIPv4);
     let nameServers = staticIpConfig ? staticIpConfig.nameServers : undefined;
     if (field === 'ipAddressConfigType') {
       const newIpConfigType = /** @type {string} */ (newValue);
@@ -1008,7 +1045,7 @@
       nsConfigType = newNsConfigType;
     } else if (field === 'staticIpConfig') {
       const ipConfigValue =
-          /** @type {!IPConfigProperties} */ (newValue);
+          /** @type {!mojom.IPConfigProperties} */ (newValue);
       if (!ipConfigValue.ipAddress) {
         console.error('Invalid StaticIPConfig: ' + JSON.stringify(newValue));
         return null;
@@ -1046,17 +1083,18 @@
     if (nsConfigType === 'Static') {
       assert(nameServers && nameServers.length);
       config.staticIpConfig = config.staticIpConfig ||
-          /** @type {!IPConfigProperties}*/ ({routingPrefix: 0});
+          /** @type{!mojom.IPConfigProperties}*/ ({routingPrefix: 0});
       config.staticIpConfig.nameServers = nameServers;
     }
     return config;
   }
 
   /**
-   * @param {!ManagedProperties} properties
-   * @return {ManagedBoolean|undefined}
+   * @param {!chromeos.networkConfig.mojom.ManagedProperties} properties
+   * @return {chromeos.networkConfig.mojom.ManagedBoolean|undefined}
    */
   static getManagedAutoConnect(properties) {
+    const NetworkType = chromeos.networkConfig.mojom.NetworkType;
     const type = properties.type;
     switch (type) {
       case NetworkType.kCellular:
@@ -1071,42 +1109,42 @@
 
   /**
    * @param {string} s
-   * @return {!ManagedString}
+   * @return {!chromeos.networkConfig.mojom.ManagedString}
    */
   static createManagedString(s) {
     return {
       activeValue: s,
-      policySource: PolicySource.kNone,
+      policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
       policyValue: undefined,
     };
   }
 
   /**
    * @param {number} n
-   * @return {!ManagedInt32}
+   * @return {!chromeos.networkConfig.mojom.ManagedInt32}
    */
   static createManagedInt(n) {
     return {
       activeValue: n,
-      policySource: PolicySource.kNone,
+      policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
       policyValue: 0,
     };
   }
 
   /**
    * @param {boolean} b
-   * @return {!ManagedBoolean}
+   * @return {!chromeos.networkConfig.mojom.ManagedBoolean}
    */
   static createManagedBool(b) {
     return {
       activeValue: b,
-      policySource: PolicySource.kNone,
+      policySource: chromeos.networkConfig.mojom.PolicySource.kNone,
       policyValue: false,
     };
   }
 
   /**
-   * @return {!TrafficCounterProperties}
+   * @return {!chromeos.networkConfig.mojom.TrafficCounterProperties}
    */
   static createTrafficCounterProperties() {
     return {
@@ -1118,19 +1156,20 @@
 
   /**
    * Returns a string to translate for the user visible connection state.
-   * @param {!ConnectionStateType}
+   * @param {!chromeos.networkConfig.mojom.ConnectionStateType}
    *     connectionState
    * @return {string}
    */
   static getConnectionStateString(connectionState) {
+    const mojom = chromeos.networkConfig.mojom;
     switch (connectionState) {
-      case ConnectionStateType.kOnline:
-      case ConnectionStateType.kConnected:
-      case ConnectionStateType.kPortal:
+      case mojom.ConnectionStateType.kOnline:
+      case mojom.ConnectionStateType.kConnected:
+      case mojom.ConnectionStateType.kPortal:
         return 'OncConnected';
-      case ConnectionStateType.kConnecting:
+      case mojom.ConnectionStateType.kConnecting:
         return 'OncConnecting';
-      case ConnectionStateType.kNotConnected:
+      case mojom.ConnectionStateType.kNotConnected:
         return 'OncNotConnected';
     }
     assertNotReached();
@@ -1139,8 +1178,8 @@
 
   /**
    * Returns true the IPAddress bytes match.
-   * @param {?IPAddress|undefined} a
-   * @param {?IPAddress|undefined} b
+   * @param {?network.mojom.IPAddress|undefined} a
+   * @param {?network.mojom.IPAddress|undefined} b
    * @return {boolean}
    */
   static ipAddressMatch(a, b) {
@@ -1162,8 +1201,8 @@
 
   /**
    * Returns true the SIMLockStatus properties match.
-   * @param {?SIMLockStatus|undefined} a
-   * @param {?SIMLockStatus|undefined} b
+   * @param {?chromeos.networkConfig.mojom.SIMLockStatus|undefined} a
+   * @param {?chromeos.networkConfig.mojom.SIMLockStatus|undefined} b
    * @return {boolean}
    */
   static simLockStatusMatch(a, b) {
@@ -1176,8 +1215,8 @@
 
   /**
    * Returns true if the SIMInfos match.
-   * @param {?Array<SIMInfo>|undefined} a
-   * @param {?Array<SIMInfo>|undefined} b
+   * @param {?Array<chromeos.networkConfig.mojom.SIMInfo>|undefined} a
+   * @param {?Array<chromeos.networkConfig.mojom.SIMInfo>|undefined} b
    */
   static simInfosMatch(a, b) {
     if (!a || !b) {
@@ -1201,8 +1240,8 @@
 
   /**
    * Returns true if the APN properties match.
-   * @param {ApnProperties} a
-   * @param {ApnProperties} b
+   * @param {chromeos.networkConfig.mojom.ApnProperties} a
+   * @param {chromeos.networkConfig.mojom.ApnProperties} b
    * @return {boolean}
    */
   static apnMatch(a, b) {
@@ -1216,8 +1255,8 @@
 
   /**
    * Returns true if the APN List matches.
-   * @param {Array<!ApnProperties>|undefined} a
-   * @param {Array<!ApnProperties>|undefined} b
+   * @param {Array<!chromeos.networkConfig.mojom.ApnProperties>|undefined} a
+   * @param {Array<!chromeos.networkConfig.mojom.ApnProperties>|undefined} b
    * @return {boolean}
    */
   static apnListMatch(a, b) {
@@ -1232,13 +1271,14 @@
 
   /**
    * Returns true if the portal state has restricted connectivity.
-   * @param {!PortalState|undefined} portal
+   * @param {!chromeos.networkConfig.mojom.PortalState|undefined} portal
    * @return {boolean}
    */
   static isRestrictedConnectivity(portal) {
     if (portal === undefined) {
       return false;
     }
+    const PortalState = chromeos.networkConfig.mojom.PortalState;
     switch (portal) {
       case PortalState.kUnknown:
       case PortalState.kOnline:
@@ -1296,7 +1336,7 @@
    * formatted as a semicolon separated string of entries in the following
    * format: <type>:<value>.
    * See https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf.
-   * @param {!Array<!SubjectAltName>}
+   * @param {!Array<!chromeos.networkConfig.mojom.SubjectAltName>}
    *        subjectAltNameMatch
    * @return {string}
    */
@@ -1308,13 +1348,13 @@
     for (const e of subjectAltNameMatch) {
       let type;
       switch (e.type) {
-        case SubjectAltName_Type.kEmail:
+        case chromeos.networkConfig.mojom.SubjectAltName_Type.kEmail:
           type = 'EMAIL';
           break;
-        case SubjectAltName_Type.kDns:
+        case chromeos.networkConfig.mojom.SubjectAltName_Type.kDns:
           type = 'DNS';
           break;
-        case SubjectAltName_Type.kUri:
+        case chromeos.networkConfig.mojom.SubjectAltName_Type.kUri:
           type = 'URI';
           break;
         default:
@@ -1332,7 +1372,7 @@
    *  - a type other than 'EMAIL', 'DNS', 'URI';
    *  - a value with non-RFC compliant characters.
    * @param {string} subjectAltNameMatch
-   * @return {?Array<!SubjectAltName>}
+   * @return {?Array<!chromeos.networkConfig.mojom.SubjectAltName>}
    */
   static deserializeSubjectAltNameMatch(subjectAltNameMatch) {
     const regValidEmailChars = RegExp('^[a-zA-Z0-9-\\.\\+_~@]*$');
@@ -1341,7 +1381,7 @@
 
     const entries = subjectAltNameMatch.trim().split(';');
     const result =
-        /*@type {Array<!SubjectAltName>}*/[];
+      /*@type {Array<!chromeos.networkConfig.mojom.SubjectAltName>}*/[];
 
     for (const entry of entries) {
       if (entry === '') {
@@ -1350,13 +1390,13 @@
       let type;
       let value;
       if (entry.toUpperCase().startsWith('EMAIL:')) {
-        type = SubjectAltName_Type.kEmail;
+        type = chromeos.networkConfig.mojom.SubjectAltName_Type.kEmail;
         value = regValidEmailChars.exec(entry.substring(6));
       } else if (entry.toUpperCase().startsWith('DNS:')) {
-        type = SubjectAltName_Type.kDns;
+        type = chromeos.networkConfig.mojom.SubjectAltName_Type.kDns;
         value = VALID_DNS_CHARS_REGEX.exec(entry.substring(4));
       } else if (entry.toUpperCase().startsWith('URI:')) {
-        type = SubjectAltName_Type.kUri;
+        type = chromeos.networkConfig.mojom.SubjectAltName_Type.kUri;
         value = regValidUriChars.exec(entry.substring(4));
       } else {
         console.warn('Invalid Subject Alternative Name Match type ' + entry);
@@ -1366,7 +1406,7 @@
         console.warn('Invalid Subject Alternative Name Match value ' + entry);
         return null;
       }
-      result.push(/* @type {!SubjectAltName} */ {
+      result.push(/* @type {!chromeos.networkConfig.mojom.SubjectAltName} */ {
         type: type,
         value: value[0],
       });
@@ -1381,23 +1421,23 @@
  */
 OncMojo.USE_ATTACH_APN_NAME = 'attach';
 
-/** @typedef {DeviceStateProperties} */
+/** @typedef {chromeos.networkConfig.mojom.DeviceStateProperties} */
 OncMojo.DeviceStateProperties;
 
-/** @typedef {NetworkStateProperties} */
+/** @typedef {chromeos.networkConfig.mojom.NetworkStateProperties} */
 OncMojo.NetworkStateProperties;
 
 /**
- * @typedef {ManagedBoolean|
- *           ManagedInt32|
- *           ManagedString|
- *           ManagedStringList|
- *           ManagedApnList}
+ * @typedef {chromeos.networkConfig.mojom.ManagedBoolean|
+ *           chromeos.networkConfig.mojom.ManagedInt32|
+ *           chromeos.networkConfig.mojom.ManagedString|
+ *           chromeos.networkConfig.mojom.ManagedStringList|
+ *           chromeos.networkConfig.mojom.ManagedApnList}
  */
 OncMojo.ManagedProperty;
 
 /**
- * Modified version of IPConfigProperties to store routingPrefix as
+ * Modified version of mojom.IPConfigProperties to store routingPrefix as
  * a human-readable netmask string instead of as a number. Used in
  * network_ip_config.js.
  * @typedef {{
@@ -1405,7 +1445,7 @@
  *   ipAddress: (string|undefined),
  *   nameServers: (Array<string>|undefined),
  *   netmask: (string|undefined),
- *   type: !IPConfigType,
+ *   type: !chromeos.networkConfig.mojom.IPConfigType,
  *   webProxyAutoDiscoveryUrl: (string|undefined),
  * }}
  */
diff --git a/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js b/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js
index d86ca25..30cf46c 100644
--- a/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js
+++ b/ui/webui/resources/cr_components/chromeos/network/sim_lock_dialogs.js
@@ -16,10 +16,9 @@
 import './network_shared_css.js';
 
 import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {CellularSimState, CrosNetworkConfigRemote, GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
-import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 import {assertNotReached} from '../../../js/assert.m.js';
+import {I18nBehavior} from '../../../cr_elements/i18n_behavior.js';
 import {loadTimeData} from '../../../js/load_time_data.m.js';
 
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from './mojo_interface_provider.js';
@@ -53,7 +52,7 @@
       observer: 'deviceStateChanged_',
     },
 
-    /** @type {!GlobalPolicy|undefined} */
+    /** @type {!chromeos.networkConfig.mojom.GlobalPolicy|undefined} */
     globalPolicy: Object,
 
     /**
@@ -190,7 +189,7 @@
     },
   },
 
-  /** @private {?CrosNetworkConfigRemote} */
+  /** @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote} */
   networkConfig_: null,
 
   /** @override */
@@ -425,7 +424,7 @@
   },
 
   /**
-   * @param {!CellularSimState} cellularSimState
+   * @param {!chromeos.networkConfig.mojom.CellularSimState} cellularSimState
    * @private
    */
   setCellularSimState_(cellularSimState) {
diff --git a/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn b/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
index 5b7580b..2ccfaf58 100644
--- a/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
+++ b/ui/webui/resources/cr_components/chromeos/network_health/BUILD.gn
@@ -21,7 +21,10 @@
 }
 
 js_library("mojo_interface_provider") {
-  deps = [ "//chromeos/services/network_health/public/mojom:mojom_webui_js" ]
+  deps = [
+    "//chromeos/services/network_health/public/mojom:mojom_js_library_for_compile",
+    "//chromeos/services/network_health/public/mojom:mojom_webui_js",
+  ]
 }
 
 js_library("network_health_summary") {
diff --git a/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js b/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
index 057d306..a625d12 100644
--- a/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
+++ b/ui/webui/resources/cr_components/chromeos/network_health/network_health_summary.js
@@ -141,7 +141,10 @@
    * @return {string}
    */
   getPortalStateString_(state) {
-    return this.i18n('OncPortalState' + OncMojo.getPortalStateString(state));
+    return this.i18n(
+        'OncPortalState' +
+        OncMojo.getPortalStateString(
+            /** @type {chromeos.networkConfig.mojom.PortalState} */ (state)));
   },
 
   /**
@@ -151,7 +154,10 @@
    * @return {string}
    */
   getNetworkTypeString_(type) {
-    return this.i18n('OncType' + OncMojo.getNetworkTypeString(type));
+    return this.i18n(
+        'OncType' +
+        OncMojo.getNetworkTypeString(
+            /** @type {chromeos.networkConfig.mojom.NetworkType} */ (type)));
   },
 
   /**
diff --git a/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.js b/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.js
index d3363f51..bd562e3 100644
--- a/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.js
+++ b/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters.js
@@ -6,9 +6,8 @@
 
 import {OncMojo} from 'chrome://resources/cr_components/chromeos/network/onc_mojo.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {TrafficCounterSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {CrosNetworkConfig} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {TrafficCountersAdapter} from './traffic_counters_adapter.js';
@@ -34,9 +33,9 @@
  * @typedef {{
  *   guid: string,
  *   name: string,
- *   type: !NetworkType,
+ *   type: !chromeos.networkConfig.mojom.NetworkType,
  *   counters: !Array<!Object>,
- *   lastResetTime: ?Time,
+ *   lastResetTime: ?mojoBase.mojom.Time,
  * }}
  */
 let Network;
@@ -45,9 +44,9 @@
  * Helper function to create a Network object.
  * @param {string} guid
  * @param {string} name
- * @param {!NetworkType} type
+ * @param {!chromeos.networkConfig.mojom.NetworkType} type
  * @param {!Array<!Object>} counters
- * @param {?Time} lastResetTime
+ * @param {?mojoBase.mojom.Time} lastResetTime
  * @return {Network} Network object
  */
 function createNetwork(guid, name, type, counters, lastResetTime) {
@@ -72,7 +71,7 @@
 
 /**
  * Converts a mojo time to JS. TODO(b/200327630)
- * @param {!Time} mojoTime
+ * @param {!mojoBase.mojom.Time} mojoTime
  * @return {!Date}
  */
 function convertMojoTimeToJS(mojoTime) {
@@ -186,7 +185,7 @@
   }
 
   /**
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @return {string} A string for the given NetworkType.
    * @private
    */
@@ -195,21 +194,21 @@
   }
 
   /**
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @return {string} An icon for the given NetworkType.
    * @private
    */
   getNetworkTypeIcon_(type) {
     switch (type) {
-      case NetworkType.kEthernet:
+      case chromeos.networkConfig.mojom.NetworkType.kEthernet:
         return TechnologyIcons.ETHERNET;
-      case NetworkType.kWiFi:
+      case chromeos.networkConfig.mojom.NetworkType.kWiFi:
         return TechnologyIcons.WIFI;
-      case NetworkType.kVPN:
+      case chromeos.networkConfig.mojom.NetworkType.kVPN:
         return TechnologyIcons.VPN;
-      case NetworkType.kTether:
-      case NetworkType.kMobile:
-      case NetworkType.kCellular:
+      case chromeos.networkConfig.mojom.NetworkType.kTether:
+      case chromeos.networkConfig.mojom.NetworkType.kMobile:
+      case chromeos.networkConfig.mojom.NetworkType.kCellular:
         return TechnologyIcons.CELLULAR;
       default:
         return '';
@@ -217,7 +216,7 @@
   }
 
   /**
-   * @param {!NetworkType} type
+   * @param {!chromeos.networkConfig.mojom.NetworkType} type
    * @return {boolean} Whether type should be expanded.
    * @private
    * */
@@ -249,31 +248,31 @@
   convertSourceEnumToString_(counters) {
     for (const counter of counters) {
       switch (counter.source) {
-        case TrafficCounterSource.kUnknown:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kUnknown:
           counter.source = this.i18n('TrafficCountersUnknown');
           break;
-        case TrafficCounterSource.kChrome:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kChrome:
           counter.source = this.i18n('TrafficCountersChrome');
           break;
-        case TrafficCounterSource.kUser:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kUser:
           counter.source = this.i18n('TrafficCountersUser');
           break;
-        case TrafficCounterSource.kArc:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kArc:
           counter.source = this.i18n('TrafficCountersArc');
           break;
-        case TrafficCounterSource.kCrosvm:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kCrosvm:
           counter.source = this.i18n('TrafficCountersCrosvm');
           break;
-        case TrafficCounterSource.kPluginvm:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kPluginvm:
           counter.source = this.i18n('TrafficCountersPluginvm');
           break;
-        case TrafficCounterSource.kUpdateEngine:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kUpdateEngine:
           counter.source = this.i18n('TrafficCountersUpdateEngine');
           break;
-        case TrafficCounterSource.kVpn:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kVpn:
           counter.source = this.i18n('TrafficCountersVpn');
           break;
-        case TrafficCounterSource.kSystem:
+        case chromeos.networkConfig.mojom.TrafficCounterSource.kSystem:
           counter.source = this.i18n('TrafficCountersSystem');
       }
     }
diff --git a/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.js b/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.js
index eb0b0af..ba08883bf 100644
--- a/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.js
+++ b/ui/webui/resources/cr_components/chromeos/traffic_counters/traffic_counters_adapter.js
@@ -7,9 +7,8 @@
  */
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/cr_components/chromeos/network/mojo_interface_provider.js';
-import {CrosNetworkConfig, CrosNetworkConfigRemote, FilterType, NO_LIMIT, UInt32Value} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {CrosNetworkConfig} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
 
 /** @type {number} Default traffic counter reset day. */
 const kDefaultResetDay = 1;
@@ -19,9 +18,9 @@
  * @typedef {{
  *   guid: string,
  *   name: string,
- *   type: !NetworkType,
+ *   type: !chromeos.networkConfig.mojom.NetworkType,
  *   counters: !Array<!Object>,
- *   lastResetTime: ?Time,
+ *   lastResetTime: ?mojoBase.mojom.Time,
  *   friendlyDate: ?string,
  *   autoReset: boolean,
  *   userSpecifiedResetDay: number,
@@ -34,9 +33,9 @@
  * Helper function to create a Network object.
  * @param {string} guid
  * @param {string} name
- * @param {!NetworkType} type
+ * @param {!chromeos.networkConfig.mojom.NetworkType} type
  * @param {!Array<!Object>} counters
- * @param {?Time} lastResetTime
+ * @param {?mojoBase.mojom.Time} lastResetTime
  * @param {?string} friendlyDate
  * @param {boolean} autoReset
  * @param {number} userSpecifiedResetDay
@@ -61,7 +60,7 @@
   constructor() {
     /**
      * Network Config mojo remote.
-     * @private {?CrosNetworkConfigRemote}
+     * @private {?chromeos.networkConfig.mojom.CrosNetworkConfigRemote}
      */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
@@ -73,9 +72,9 @@
    */
   async requestTrafficCountersForActiveNetworks() {
     const filter = {
-      filter: FilterType.kActive,
-      networkType: NetworkType.kAll,
-      limit: NO_LIMIT,
+      filter: chromeos.networkConfig.mojom.FilterType.kActive,
+      networkType: chromeos.networkConfig.mojom.NetworkType.kAll,
+      limit: chromeos.networkConfig.mojom.NO_LIMIT,
     };
     const networks = [];
     const networkStateList =
@@ -121,7 +120,7 @@
   /**
    * Requests last reset time for the given network.
    * @param {string} guid
-   * @return {?Promise<?Time>} last reset
+   * @return {?Promise<?mojoBase.mojom.Time>} last reset
    * time for network with guid
    */
   async requestLastResetTimeForNetwork(guid) {
@@ -186,7 +185,7 @@
    * Sets values for auto reset.
    * @param {string} guid
    * @param {boolean} autoReset
-   * @param {?UInt32Value} resetDay
+   * @param {?chromeos.networkConfig.mojom.UInt32Value} resetDay
    */
   async setTrafficCountersAutoResetForNetwork(guid, autoReset, resetDay) {
     await this.networkConfig_.setTrafficCountersAutoReset(