diff --git a/DEPS b/DEPS
index 853eb53..aa71c000 100644
--- a/DEPS
+++ b/DEPS
@@ -305,11 +305,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': 'd9853f3ce8dce7ce84f0c2701cf93bfbed617347',
+  'src_internal_revision': '3ddd5788bd026e3ed8a3f674c273a6030f54e656',
   # 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': '4cc541b8014920519c812cca60d48c584a9a7425',
+  'skia_revision': '359f3d7cc7edfcb93e99ab5ed7e9f2f5fdd8ef85',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
@@ -317,7 +317,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'd82a5821d42ff564e2e45f69ad99bcb997f5ef4e',
+  'angle_revision': '2d28e33f7a654e8e0553c13bac09fa688b6c1acb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -357,7 +357,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
-  'freetype_revision': '61a423426089e65c27699d824303f209026b2f05',
+  'freetype_revision': 'c6cf32de3b3582d0eea9f6372121f0f07d22ae68',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
@@ -397,7 +397,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'c6af98d7a7a5cdb38791e6861f6e75cc98251ca7',
+  'devtools_frontend_revision': '5c0782b1ec316a185616cd76223d66c8b2b4dbbb',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -421,7 +421,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '6bab1bd9fd23c03ab2b0f26e9b489e0b6b1844f2',
+  'dawn_revision': 'b0a54bfe2da42392af08f2cfa3d9cf023650a61e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -537,7 +537,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       '65a5746fb4cc5fd7fdd1773b0c50bc556ff8900a',
+  'libcxx_revision':       '23b5bc93867b93b73f7be97cf2e8a71e95770e07',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:5d0a4153b0bcc86c5a23310d5b648a587be3c56d',
@@ -1212,7 +1212,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'Ul34k1el1z0LA--qJ9VP_0h5ZIZ9blHmq8DRSB0FtHAC',
+              'version': 'Y0AWgaivgW6UpW6RIrsVLJG2p5zUsR7Hrx1g6tkWnN0C',
           },
       ],
       'condition': 'checkout_android',
@@ -1278,7 +1278,7 @@
       'packages': [
         {
           'package': 'chromium/third_party/updater/chrome_mac_universal_prod',
-          'version': 'version:2@141.0.7340.0',
+          'version': 'version:2@141.0.7376.0',
         },
       ],
   },
@@ -1613,7 +1613,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'ced3635c6f861e027c3f1c20a71be39b4fd724d1',
+    'adb0ed24d1920f5972d5e07ce95ed892fdb9e1f5',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1763,7 +1763,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'PZIMSQQlA-lyFob400zXKrWJc17eh0huam1uufEo8WcC',
+          'version': '9VwlGkB8Od7UMCZj0NCB0GkJNQ-pnEfIX1Sm0WH-udgC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2641,7 +2641,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '9e99848ef108842c9c6f1fefe5bf8d4fd44c8496',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'd17b40b3b5e36f3744f1d010fe3ba2d3c55559c0',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -3012,7 +3012,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '3f6f3decfcf874544fd2afff11e0c26bdf9b6fdb',
+    Var('webrtc_git') + '/src.git' + '@' + 'db0e64c5e80168839d74ae0cc6173ccd537ae211',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -3156,7 +3156,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'KgO-CzQigL3-F-4NZv58uZTilUmQAs8OT8rHVAG_zzAC',
+        'version': 'ec0BRXe3YCu9PlxJCawlfnbd2ckGAWv6Co5au7j93ywC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3167,7 +3167,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'gpSHAS6hX4m5EaoM0ftR_cQhzztQUhXygvk1ck6EqxEC',
+        'version': '_bhVqXqUyoRAYI-5YOBCYLquNjw2jfPYdSnrpvSBQ-MC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3793,7 +3793,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '3feaf40d64066b385cb8b00b672e1aafe6d83978',
+        '684211821a75efa2da3fad3310385a55308a3da6',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 6a5d0525..c9468fa 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -7022,7 +7022,7 @@
             results.append(
                 output_api.PresubmitError(
                     'Do not include actual screenshots in the changelist. Run '
-                    'tools/translate/upload_screenshots.py to upload them instead:',
+                    'tools/translation/upload_screenshots.py to upload them instead:',
                     sorted(unnecessary_screenshots)))
 
         if missing_sha1:
@@ -7038,7 +7038,7 @@
                 output_api.PresubmitError(
                     'The following files do not seem to contain valid sha1 hashes. '
                     'Make sure they contain hashes created by '
-                    'tools/translate/upload_screenshots.py:',
+                    'tools/translation/upload_screenshots.py:',
                     sorted(invalid_sha1)))
 
         if missing_sha1_modified:
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index b9e3c8f1..cc95f2e 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -3698,7 +3698,7 @@
     VALID_SHA1 = ('0000000000000000000000000000000000000000', )
     DO_NOT_UPLOAD_PNG_MESSAGE = ('Do not include actual screenshots in the '
                                  'changelist. Run '
-                                 'tools/translate/upload_screenshots.py to '
+                                 'tools/translation/upload_screenshots.py to '
                                  'upload them instead:')
     ADD_SIGNATURES_MESSAGE = ('You are adding UI strings.\n'
                               'To ensure the best translations, take '
@@ -3714,7 +3714,7 @@
     SHA1_FORMAT_MESSAGE = (
         'The following files do not seem to contain valid sha1 '
         'hashes. Make sure they contain hashes created by '
-        'tools/translate/upload_screenshots.py:')
+        'tools/translation/upload_screenshots.py:')
 
     def makeInputApi(self, files):
         input_api = MockInputApi()
diff --git a/android_webview/browser/aw_web_contents_delegate.cc b/android_webview/browser/aw_web_contents_delegate.cc
index 7d122dfa..20f9883 100644
--- a/android_webview/browser/aw_web_contents_delegate.cc
+++ b/android_webview/browser/aw_web_contents_delegate.cc
@@ -39,6 +39,7 @@
 #include "third_party/blink/public/common/mediastream/media_stream_request.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
 #include "third_party/blink/public/mojom/mediastream/media_stream.mojom.h"
+#include "url/gurl.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "android_webview/browser_jni_headers/AwWebContentsDelegate_jni.h"
@@ -377,7 +378,7 @@
 }
 
 content::NavigationController::UserAgentOverrideOption
-AwWebContentsDelegate::ShouldOverrideUserAgentForPrerender2() {
+AwWebContentsDelegate::ShouldOverrideUserAgentForPrerender2(const GURL& url) {
   // For WebView, always use the user agent override, which is set every time
   // the user agent in AwSettings is modified.
   return content::NavigationController::UA_OVERRIDE_TRUE;
diff --git a/android_webview/browser/aw_web_contents_delegate.h b/android_webview/browser/aw_web_contents_delegate.h
index 5291ac2c..31bf3a5 100644
--- a/android_webview/browser/aw_web_contents_delegate.h
+++ b/android_webview/browser/aw_web_contents_delegate.h
@@ -5,6 +5,7 @@
 #ifndef ANDROID_WEBVIEW_BROWSER_AW_WEB_CONTENTS_DELEGATE_H_
 #define ANDROID_WEBVIEW_BROWSER_AW_WEB_CONTENTS_DELEGATE_H_
 
+#include "base/memory/scoped_refptr.h"
 #include "components/embedder_support/android/delegate/web_contents_delegate_android.h"
 
 namespace android_webview {
@@ -87,7 +88,7 @@
       content::PreloadingTriggerType trigger_type) override;
   int AllowedPrerenderingCount(content::WebContents& web_contents) override;
   content::NavigationController::UserAgentOverrideOption
-  ShouldOverrideUserAgentForPrerender2() override;
+  ShouldOverrideUserAgentForPrerender2(const GURL& url) override;
   bool ShouldAllowPartialParamMismatchOfPrerender2(
       content::NavigationHandle& navigation_handle) override;
 
diff --git a/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 382f67c..50bdda6b 100644
--- a/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -1643,6 +1643,7 @@
     attribute @@unscopables
     getter URL
     getter activeElement
+    getter activeViewTransition
     getter adoptedStyleSheets
     getter alinkColor
     getter all
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
index f47a293..012bc2e 100644
--- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -987,6 +987,9 @@
     setter x
     setter y
     setter z
+interface CSSRouteRule : CSSConditionRule
+    attribute @@toStringTag
+    method constructor
 interface CSSRule
     attribute @@toStringTag
     attribute CHARSET_RULE
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 4e9b789..28fa7a5 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -324,28 +324,6 @@
     "ash_export.h",
     "ash_interfaces.cc",
     "ash_prefs.cc",
-    "assistant/assistant_alarm_timer_controller_impl.cc",
-    "assistant/assistant_alarm_timer_controller_impl.h",
-    "assistant/assistant_controller_impl.cc",
-    "assistant/assistant_controller_impl.h",
-    "assistant/assistant_interaction_controller_impl.cc",
-    "assistant/assistant_interaction_controller_impl.h",
-    "assistant/assistant_notification_controller_impl.cc",
-    "assistant/assistant_notification_controller_impl.h",
-    "assistant/assistant_notification_expiry_monitor.cc",
-    "assistant/assistant_notification_expiry_monitor.h",
-    "assistant/assistant_setup_controller.cc",
-    "assistant/assistant_setup_controller.h",
-    "assistant/assistant_state_controller.cc",
-    "assistant/assistant_state_controller.h",
-    "assistant/assistant_suggestions_controller_impl.cc",
-    "assistant/assistant_suggestions_controller_impl.h",
-    "assistant/assistant_ui_controller_impl.cc",
-    "assistant/assistant_ui_controller_impl.h",
-    "assistant/assistant_view_delegate_impl.cc",
-    "assistant/assistant_view_delegate_impl.h",
-    "assistant/assistant_web_view_delegate_impl.cc",
-    "assistant/assistant_web_view_delegate_impl.h",
     "auth/active_session_auth_controller_impl.cc",
     "auth/active_session_auth_controller_impl.h",
     "auth/active_session_auth_metrics_recorder.cc",
@@ -572,6 +550,8 @@
     "curtain/security_curtain_widget_controller.h",
     "curtain/session.cc",
     "curtain/session.h",
+    "curtain/stack_layout.cc",
+    "curtain/stack_layout.h",
     "dbus/ash_dbus_services.cc",
     "dbus/ash_dbus_services.h",
     "dbus/display_service_provider.cc",
@@ -3351,8 +3331,6 @@
     "//ash/app_list",
     "//ash/app_menu",
     "//ash/assistant/model",
-    "//ash/assistant/ui",
-    "//ash/assistant/ui:constants",
     "//ash/assistant/util",
     "//ash/birch:removed_items_proto",
     "//ash/constants",
@@ -3623,7 +3601,6 @@
 
   allow_circular_includes_from = [
     "//ash/app_list",
-    "//ash/assistant/ui",
     "//ash/in_session_auth",
     "//ash/quick_pair/companion_app",
     "//ash/quick_pair/feature_status_tracker",
@@ -4603,9 +4580,6 @@
     "//ash/app_list:unit_tests",
     "//ash/app_menu",
     "//ash/assistant/model",
-    "//ash/assistant/ui",
-    "//ash/assistant/ui:constants",
-    "//ash/assistant/ui/colors:assistant_colors_views",
     "//ash/assistant/util",
     "//ash/constants",
     "//ash/dbus:privacy_screen_proto",
@@ -4954,8 +4928,6 @@
     ":test_support",
     "//ash/app_list",
     "//ash/app_list:test_support",
-    "//ash/assistant/ui",
-    "//ash/assistant/ui:constants",
     "//ash/in_session_auth",
     "//ash/public/cpp",
     "//ash/public/cpp:test_support",
@@ -5427,8 +5399,6 @@
     "//ash/app_list:test_support",
     "//ash/app_menu",
     "//ash/assistant/model",
-    "//ash/assistant/ui",
-    "//ash/assistant/ui:constants",
     "//ash/constants",
     "//ash/in_session_auth",
     "//ash/keyboard/ui",
diff --git a/ash/accelerators/accelerator_commands.cc b/ash/accelerators/accelerator_commands.cc
index a6ce171..9eb0d68 100644
--- a/ash/accelerators/accelerator_commands.cc
+++ b/ash/accelerators/accelerator_commands.cc
@@ -13,7 +13,6 @@
 #include "ash/accessibility/magnifier/docked_magnifier_controller.h"
 #include "ash/accessibility/magnifier/fullscreen_magnifier_controller.h"
 #include "ash/app_list/app_list_controller_impl.h"
-#include "ash/assistant/assistant_controller_impl.h"
 #include "ash/capture_mode/capture_mode_camera_controller.h"
 #include "ash/capture_mode/capture_mode_controller.h"
 #include "ash/clipboard/clipboard_history_controller_impl.h"
@@ -33,7 +32,6 @@
 #include "ash/public/cpp/accelerator_actions.h"
 #include "ash/public/cpp/annotator/annotator_controller_base.h"
 #include "ash/public/cpp/app_types_util.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
 #include "ash/public/cpp/capture_mode/capture_mode_api.h"
 #include "ash/public/cpp/new_window_delegate.h"
 #include "ash/public/cpp/system/toast_data.h"
@@ -97,7 +95,7 @@
 #include "base/time/time.h"
 #include "chromeos/ash/components/audio/cras_audio_handler.h"
 #include "chromeos/ash/components/dbus/biod/fake_biod_client.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_enums.h"
+#include "chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/ui/base/display_util.h"
 #include "chromeos/ui/base/window_properties.h"
@@ -145,8 +143,6 @@
 // Percent by which the volume should be changed when a volume key is pressed.
 constexpr double kStepPercentage = 4.0;
 constexpr char kVirtualDesksToastId[] = "virtual_desks_toast";
-// Toast id for Assistant shortcuts.
-constexpr char kAssistantErrorToastId[] = "assistant_error";
 // Toast ID for the notification center tray "No notifications" toast.
 constexpr char kNotificationCenterTrayNoNotificationsToastId[] =
     "notification_center_tray_toast_ids.no_notifications";
@@ -1346,73 +1342,7 @@
 }
 
 void ToggleAssistant() {
-  using assistant::AssistantAllowedState;
-  switch (AssistantState::Get()->allowed_state().value_or(
-      AssistantAllowedState::ALLOWED)) {
-    case AssistantAllowedState::DISALLOWED_BY_NONPRIMARY_USER:
-      // Show a toast if the active user is not primary.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_SECONDARY_USER_TOAST_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_LOCALE:
-      // Show a toast if the Assistant is disabled due to unsupported
-      // locales.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_LOCALE_UNSUPPORTED_TOAST_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_POLICY:
-      // Show a toast if the Assistant is disabled due to enterprise policy.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_DISABLED_BY_POLICY_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_DEMO_MODE:
-      // Show a toast if the Assistant is disabled due to being in Demo
-      // Mode.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_DISABLED_IN_DEMO_MODE_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_PUBLIC_SESSION:
-      // Show a toast if the Assistant is disabled due to being in public
-      // session.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_DISABLED_IN_PUBLIC_SESSION_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_INCOGNITO:
-      // Show a toast if the Assistant is disabled due to being in Incognito
-      // mode.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_DISABLED_IN_GUEST_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_ACCOUNT_TYPE:
-      // Show a toast if the Assistant is disabled due to the account type.
-      ShowToast(kAssistantErrorToastId, ToastCatalogName::kAssistantError,
-                l10n_util::GetStringUTF16(
-                    IDS_ASH_ASSISTANT_DISABLED_BY_ACCOUNT_MESSAGE));
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_KIOSK_MODE:
-      // No need to show toast in KIOSK mode.
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_NO_BINARY:
-      // No need to show toast.
-      return;
-    case AssistantAllowedState::DISALLOWED_BY_NEW_ENTRY_POINT:
-      // Showing new entry point instead.
-      AssistantUiController::Get()->ShowUi(
-          assistant::AssistantEntryPoint::kHotkey);
-      return;
-    case AssistantAllowedState::ALLOWED:
-      // Nothing need to do if allowed.
-      break;
-  }
-  AssistantUiController::Get()->ToggleUi(
-      /*entry_point=*/assistant::AssistantEntryPoint::kHotkey,
-      /*exit_point=*/assistant::AssistantExitPoint::kHotkey);
+  assistant::AssistantBrowserDelegate::Get()->OpenNewEntryPoint();
 }
 
 void ToggleCalendar() {
diff --git a/ash/accelerators/accelerator_unittest.cc b/ash/accelerators/accelerator_unittest.cc
index 1e186f48..d98e4a5 100644
--- a/ash/accelerators/accelerator_unittest.cc
+++ b/ash/accelerators/accelerator_unittest.cc
@@ -9,8 +9,6 @@
 
 #include "ash/accelerators/accelerator_controller_impl.h"
 #include "ash/app_list/test/app_list_test_helper.h"
-#include "ash/assistant/model/assistant_ui_model.h"
-#include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
 #include "ash/shell.h"
 #include "ash/shell_observer.h"
 #include "ash/system/network/network_observer.h"
@@ -208,8 +206,6 @@
       /*control=*/false, /*shift=*/false, /*alt=*/false, /*command=*/false);
 
   EXPECT_TRUE(open_new_entry_point_future.Wait());
-  EXPECT_EQ(0, user_action_tester.GetActionCount(
-                   "VoiceInteraction.Started.Assistant"));
   EXPECT_EQ(1, user_action_tester.GetActionCount(
                    "Assistant.NewEntryPoint.AssistantKey"));
 }
diff --git a/ash/accelerators/keyboard_code_util.cc b/ash/accelerators/keyboard_code_util.cc
index 5401b52..111fa92 100644
--- a/ash/accelerators/keyboard_code_util.cc
+++ b/ash/accelerators/keyboard_code_util.cc
@@ -5,8 +5,6 @@
 #include "ash/accelerators/keyboard_code_util.h"
 
 #include "ash/public/cpp/accelerators_util.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/assistant/assistant_state_base.h"
 #include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
@@ -71,12 +69,6 @@
   return l10n_util::GetStringUTF16(msg_id);
 }
 
-bool IsAssistantAvailable() {
-  AssistantStateBase* state = AssistantState::Get();
-  return state->allowed_state() == assistant::AssistantAllowedState::ALLOWED &&
-         state->settings_enabled().value_or(false);
-}
-
 }  // namespace
 
 std::u16string GetStringForKeyboardCode(ui::KeyboardCode key_code,
@@ -157,9 +149,7 @@
     case ui::mojom::MetaKey::kSearch:
       return &kCaptureModeDemoToolsSearchIcon;
     case ui::mojom::MetaKey::kLauncher:
-      return IsAssistantAvailable()
-                 ? &kCaptureModeDemoToolsLauncherAssistantOnIcon
-                 : &kCaptureModeDemoToolsLauncherAssistantOffIcon;
+      return &kCaptureModeDemoToolsLauncherAssistantOffIcon;
     case ui::mojom::MetaKey::kLauncherRefresh:
       return &kCampbellHeroIcon;
     case ui::mojom::MetaKey::kExternalMeta:
diff --git a/ash/ambient/ambient_controller.cc b/ash/ambient/ambient_controller.cc
index 848db1f2..68be7600 100644
--- a/ash/ambient/ambient_controller.cc
+++ b/ash/ambient/ambient_controller.cc
@@ -34,7 +34,6 @@
 #include "ash/ambient/ui/ambient_container_view.h"
 #include "ash/ambient/ui/ambient_view_delegate.h"
 #include "ash/ambient/util/ambient_util.h"
-#include "ash/assistant/model/assistant_interaction_model.h"
 #include "ash/login/ui/lock_screen.h"
 #include "ash/public/cpp/ambient/ambient_backend_controller.h"
 #include "ash/public/cpp/ambient/ambient_client.h"
@@ -43,7 +42,6 @@
 #include "ash/public/cpp/ambient/ambient_ui_model.h"
 #include "ash/public/cpp/ambient/common/ambient_settings.h"
 #include "ash/public/cpp/ambient/fake_ambient_backend_controller_impl.h"
-#include "ash/public/cpp/assistant/controller/assistant_interaction_controller.h"
 #include "ash/public/cpp/shell_window_ids.h"
 #include "ash/root_window_controller.h"
 #include "ash/session/session_controller_impl.h"
@@ -68,7 +66,6 @@
 #include "build/buildflag.h"
 #include "cc/paint/skottie_wrapper.h"
 #include "chromeos/ash/components/assistant/buildflags.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
 #include "chromeos/components/kiosk/kiosk_utils.h"
 #include "chromeos/dbus/power/power_manager_client.h"
 #include "chromeos/dbus/power_manager/backlight.pb.h"
@@ -319,10 +316,6 @@
 
       ClearPreTargetHandler();
 
-      // Should stop observing AssistantInteractionModel when ambient screen is
-      // not shown.
-      AssistantInteractionController::Get()->GetModel()->RemoveObserver(this);
-
       if (visibility == AmbientUiVisibility::kHidden) {
         if (LockScreen::HasInstance()) {
           // Add observer for user activity.
@@ -586,7 +579,7 @@
     return;
   }
   // While |kPreview| is loading, don't |DismissUI| on user activity.
-  // Users can still |DismissUI| with mouse, touch, key or assistant events.
+  // Users can still |DismissUI| with mouse, touch, key.
   if (ambient_ui_model_.ui_visibility() == AmbientUiVisibility::kPreview &&
       !IsShowing()) {
     return;
@@ -629,14 +622,6 @@
   DismissUI();
 }
 
-void AmbientController::OnInteractionStateChanged(
-    InteractionState interaction_state) {
-  if (interaction_state == InteractionState::kActive) {
-    // Assistant is active.
-    DismissUI();
-  }
-}
-
 void AmbientController::SetUiVisibilityShouldShow() {
   DVLOG(1) << __func__;
 
@@ -1214,9 +1199,6 @@
   if (!user_activity_observer_.IsObserving())
     user_activity_observer_.Observe(ui::UserActivityDetector::Get());
 
-  // Add observer for assistant interaction model
-  AssistantInteractionController::Get()->GetModel()->AddObserver(this);
-
   session_metrics_recorder_ = std::make_unique<AmbientSessionMetricsRecorder>(
       ambient_ui_launcher_->CreateMetricsDelegate(GetCurrentUiSettings()));
 
diff --git a/ash/ambient/ambient_controller.h b/ash/ambient/ambient_controller.h
index 57974e75..16412bc 100644
--- a/ash/ambient/ambient_controller.h
+++ b/ash/ambient/ambient_controller.h
@@ -19,7 +19,6 @@
 #include "ash/ambient/resources/ambient_dlc_background_installer.h"
 #include "ash/ambient/ui/ambient_view_delegate.h"
 #include "ash/ash_export.h"
-#include "ash/assistant/model/assistant_interaction_model_observer.h"
 #include "ash/public/cpp/ambient/ambient_ui_model.h"
 #include "ash/public/cpp/screen_backlight_observer.h"
 #include "ash/public/cpp/session/session_observer.h"
@@ -68,7 +67,6 @@
       public device::mojom::FingerprintObserver,
       public ui::UserActivityObserver,
       public ui::EventHandler,
-      public AssistantInteractionModelObserver,
       public AmbientUiLauncher::Observer {
  public:
   static void RegisterProfilePrefs(PrefRegistrySimple* registry);
@@ -121,9 +119,6 @@
   void OnMouseEvent(ui::MouseEvent* event) override;
   void OnTouchEvent(ui::TouchEvent* event) override;
 
-  // AssistantInteractionModelObserver:
-  void OnInteractionStateChanged(InteractionState interaction_state) override;
-
   // AmbientUiLauncher::Observer:
   void OnReadyStateChanged(bool is_ready) override;
 
diff --git a/ash/ambient/ambient_controller_unittest.cc b/ash/ambient/ambient_controller_unittest.cc
index 73d78354..1895b1d 100644
--- a/ash/ambient/ambient_controller_unittest.cc
+++ b/ash/ambient/ambient_controller_unittest.cc
@@ -23,7 +23,6 @@
 #include "ash/ambient/ui/photo_view.h"
 #include "ash/ambient/util/ambient_util.h"
 #include "ash/ambient/util/time_of_day_utils.h"
-#include "ash/assistant/assistant_interaction_controller_impl.h"
 #include "ash/constants/ambient_time_of_day_constants.h"
 #include "ash/constants/ambient_video.h"
 #include "ash/constants/ash_paths.h"
@@ -79,7 +78,6 @@
 namespace {
 
 using ash::personalization_app::mojom::AmbientTheme;
-using assistant::AssistantInteractionMetadata;
 
 constexpr char kUser1[] = "user1@gmail.com";
 constexpr char kUser2[] = "user2@gmail.com";
@@ -1488,28 +1486,6 @@
   EXPECT_FALSE(ctrl->power_status_observer_.IsObserving());
 }
 
-TEST_P(AmbientControllerTestForAnyUiSettings,
-       ShowDismissAmbientScreenUponAssistantQuery) {
-  if (ash::assistant::features::IsNewEntryPointEnabled()) {
-    GTEST_SKIP() << "Assistant is not available if new entry point is enabled. "
-                    "crbug.com/388361414";
-  }
-
-  // Without user interaction, should show ambient mode.
-  SetAmbientShownAndWaitForWidgets();
-  EXPECT_TRUE(ambient_controller()->ShouldShowAmbientUi());
-
-  // Trigger Assistant interaction.
-  static_cast<AssistantInteractionControllerImpl*>(
-      AssistantInteractionController::Get())
-      ->OnInteractionStarted(AssistantInteractionMetadata());
-  base::RunLoop().RunUntilIdle();
-
-  // Ambient screen should dismiss.
-  EXPECT_TRUE(GetContainerViews().empty());
-  EXPECT_FALSE(ambient_controller()->ShouldShowAmbientUi());
-}
-
 // For all test cases that depend on ash ambient resources (lottie files, image
 // assets, etc) being present to run.
 #if BUILDFLAG(HAS_ASH_AMBIENT_ANIMATION_RESOURCES)
diff --git a/ash/ambient/ui/photo_view_unittest.cc b/ash/ambient/ui/photo_view_unittest.cc
index 20ac0006..b6fb1ef 100644
--- a/ash/ambient/ui/photo_view_unittest.cc
+++ b/ash/ambient/ui/photo_view_unittest.cc
@@ -9,7 +9,6 @@
 #include "ash/ambient/ambient_ui_settings.h"
 #include "ash/ambient/test/ambient_ash_test_base.h"
 #include "ash/ambient/ui/ambient_container_view.h"
-#include "ash/assistant/ui/assistant_view_ids.h"
 #include "ash/public/cpp/ambient/proto/photo_cache_entry.pb.h"
 #include "ash/webui/personalization_app/mojom/personalization_app.mojom-shared.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/ash/ash_prefs.cc b/ash/ash_prefs.cc
index 5250336d..9343b39d 100644
--- a/ash/ash_prefs.cc
+++ b/ash/ash_prefs.cc
@@ -13,7 +13,6 @@
 #include "ash/ambient/managed/screensaver_images_policy_handler.h"
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/app_list/views/app_list_nudge_controller.h"
-#include "ash/assistant/assistant_controller_impl.h"
 #include "ash/birch/birch_coral_provider.h"
 #include "ash/birch/birch_item.h"
 #include "ash/birch/birch_model.h"
diff --git a/ash/assistant/assistant_alarm_timer_controller_impl.cc b/ash/assistant/assistant_alarm_timer_controller_impl.cc
deleted file mode 100644
index 1e931c8..0000000
--- a/ash/assistant/assistant_alarm_timer_controller_impl.cc
+++ /dev/null
@@ -1,494 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_alarm_timer_controller_impl.h"
-
-#include <cmath>
-#include <utility>
-
-#include "ash/assistant/assistant_controller_impl.h"
-#include "ash/assistant/assistant_notification_controller_impl.h"
-#include "ash/assistant/util/deep_link_util.h"
-#include "ash/strings/grit/ash_strings.h"
-#include "base/containers/contains.h"
-#include "base/functional/bind.h"
-#include "base/i18n/message_formatter.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-#include "chromeos/ash/services/assistant/public/cpp/features.h"
-#include "chromeos/ash/services/libassistant/public/cpp/assistant_notification.h"
-#include "chromeos/ash/services/libassistant/public/cpp/assistant_timer.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "third_party/icu/source/common/unicode/utypes.h"
-#include "third_party/icu/source/i18n/unicode/measfmt.h"
-#include "third_party/icu/source/i18n/unicode/measunit.h"
-#include "third_party/icu/source/i18n/unicode/measure.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace ash {
-
-namespace {
-
-using assistant::AssistantNotification;
-using assistant::AssistantNotificationButton;
-using assistant::AssistantNotificationPriority;
-using assistant::AssistantTimer;
-using assistant::AssistantTimerState;
-using assistant::util::AlarmTimerAction;
-
-// Grouping key and ID prefix for timer notifications.
-constexpr char kTimerNotificationGroupingKey[] = "assistant/timer";
-constexpr char kTimerNotificationIdPrefix[] = "assistant/timer";
-
-// Helpers ---------------------------------------------------------------------
-
-std::string ToFormattedTimeString(base::TimeDelta time,
-                                  UMeasureFormatWidth width) {
-  DCHECK(width == UMEASFMT_WIDTH_NARROW || width == UMEASFMT_WIDTH_NUMERIC);
-
-  // Method aliases to prevent line-wrapping below.
-  const auto createHour = icu::MeasureUnit::createHour;
-  const auto createMinute = icu::MeasureUnit::createMinute;
-  const auto createSecond = icu::MeasureUnit::createSecond;
-
-  // We round |total_seconds| to the nearest full second since we don't display
-  // our time string w/ millisecond granularity and because this method is
-  // called very near to full second boundaries. Otherwise, values like 4.99 sec
-  // would be displayed to the user as "0:04" instead of the expected "0:05".
-  const int64_t total_seconds = std::abs(std::round(time.InSecondsF()));
-
-  // Calculate time in hours/minutes/seconds.
-  const int32_t hours = total_seconds / 3600;
-  const int32_t minutes = (total_seconds - hours * 3600) / 60;
-  const int32_t seconds = total_seconds % 60;
-
-  // Success of the ICU APIs is tracked by |status|.
-  UErrorCode status = U_ZERO_ERROR;
-
-  // Create our distinct |measures| to be formatted.
-  std::vector<icu::Measure> measures;
-
-  // We only show |hours| if necessary.
-  if (hours)
-    measures.emplace_back(hours, createHour(status), status);
-
-  // We only show |minutes| if necessary or if using numeric format |width|.
-  if (minutes || width == UMEASFMT_WIDTH_NUMERIC)
-    measures.emplace_back(minutes, createMinute(status), status);
-
-  // We only show |seconds| if necessary or if using numeric format |width|.
-  if (seconds || width == UMEASFMT_WIDTH_NUMERIC)
-    measures.emplace_back(seconds, createSecond(status), status);
-
-  // Format our |measures| into a |unicode_message|.
-  icu::UnicodeString unicode_message;
-  icu::FieldPosition field_position = icu::FieldPosition::DONT_CARE;
-  icu::MeasureFormat measure_format(icu::Locale::getDefault(), width, status);
-  measure_format.formatMeasures(measures.data(), measures.size(),
-                                unicode_message, field_position, status);
-
-  std::string formatted_time;
-  if (U_SUCCESS(status)) {
-    // If formatting was successful, convert our |unicode_message| into UTF-8.
-    unicode_message.toUTF8String(formatted_time);
-  } else {
-    // If something went wrong formatting w/ ICU, fall back to I18N messages.
-    LOG(ERROR) << "Error formatting time string: " << status;
-    formatted_time =
-        base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNumberedArgs(
-            l10n_util::GetStringUTF16(
-                width == UMEASFMT_WIDTH_NARROW
-                    ? IDS_ASSISTANT_TIMER_NOTIFICATION_FORMATTED_TIME_NARROW_FALLBACK
-                    : IDS_ASSISTANT_TIMER_NOTIFICATION_FORMATTED_TIME_NUMERIC_FALLBACK),
-            hours, minutes, seconds));
-  }
-
-  // If necessary, negate the amount of time remaining.
-  if (time.InSeconds() < 0) {
-    formatted_time =
-        base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNumberedArgs(
-            l10n_util::GetStringUTF16(
-                IDS_ASSISTANT_TIMER_NOTIFICATION_FORMATTED_TIME_NEGATE),
-            formatted_time));
-  }
-
-  return formatted_time;
-}
-
-// Returns a string representation of the original duration for a given |timer|.
-std::string ToOriginalDurationString(const AssistantTimer& timer) {
-  return ToFormattedTimeString(timer.original_duration, UMEASFMT_WIDTH_NARROW);
-}
-
-// Returns a string representation of the remaining time for the given |timer|.
-std::string ToRemainingTimeString(const AssistantTimer& timer) {
-  return ToFormattedTimeString(timer.remaining_time, UMEASFMT_WIDTH_NUMERIC);
-}
-
-// Creates a notification ID for the given |timer|. It is guaranteed that this
-// method will always return the same notification ID given the same timer.
-std::string CreateTimerNotificationId(const AssistantTimer& timer) {
-  return std::string(kTimerNotificationIdPrefix) + timer.id;
-}
-
-// Creates a notification title for the given |timer|.
-std::string CreateTimerNotificationTitle(const AssistantTimer& timer) {
-  return ToRemainingTimeString(timer);
-}
-
-// Creates a notification message for the given |timer|.
-std::string CreateTimerNotificationMessage(const AssistantTimer& timer) {
-  if (timer.label.empty()) {
-    return base::UTF16ToUTF8(
-        base::i18n::MessageFormatter::FormatWithNumberedArgs(
-            l10n_util::GetStringUTF16(
-                timer.state == AssistantTimerState::kFired
-                    ? IDS_ASSISTANT_TIMER_NOTIFICATION_MESSAGE_WHEN_FIRED
-                    : IDS_ASSISTANT_TIMER_NOTIFICATION_MESSAGE),
-            ToOriginalDurationString(timer)));
-  }
-  return base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNumberedArgs(
-      l10n_util::GetStringUTF16(
-          timer.state == AssistantTimerState::kFired
-              ? IDS_ASSISTANT_TIMER_NOTIFICATION_MESSAGE_WHEN_FIRED_WITH_LABEL
-              : IDS_ASSISTANT_TIMER_NOTIFICATION_MESSAGE_WITH_LABEL),
-      ToOriginalDurationString(timer), timer.label));
-}
-
-// Creates notification buttons for the given |timer|.
-std::vector<AssistantNotificationButton> CreateTimerNotificationButtons(
-    const AssistantTimer& timer) {
-  std::vector<AssistantNotificationButton> buttons;
-
-  if (timer.state != AssistantTimerState::kFired) {
-    if (timer.state == AssistantTimerState::kPaused) {
-      // "RESUME" button.
-      buttons.push_back({l10n_util::GetStringUTF8(
-                             IDS_ASSISTANT_TIMER_NOTIFICATION_RESUME_BUTTON),
-                         assistant::util::CreateAlarmTimerDeepLink(
-                             AlarmTimerAction::kResumeTimer, timer.id)
-                             .value(),
-                         /*remove_notification_on_click=*/false});
-    } else {
-      // "PAUSE" button.
-      buttons.push_back({l10n_util::GetStringUTF8(
-                             IDS_ASSISTANT_TIMER_NOTIFICATION_PAUSE_BUTTON),
-                         assistant::util::CreateAlarmTimerDeepLink(
-                             AlarmTimerAction::kPauseTimer, timer.id)
-                             .value(),
-                         /*remove_notification_on_click=*/false});
-    }
-  }
-
-  if (timer.state == AssistantTimerState::kFired) {
-    // "STOP" button.
-    buttons.push_back(
-        {l10n_util::GetStringUTF8(IDS_ASSISTANT_TIMER_NOTIFICATION_STOP_BUTTON),
-         assistant::util::CreateAlarmTimerDeepLink(
-             AlarmTimerAction::kRemoveAlarmOrTimer, timer.id)
-             .value(),
-         /*remove_notification_on_click=*/true});
-
-    // "ADD 1 MIN" button.
-    buttons.push_back(
-        {l10n_util::GetStringUTF8(
-             IDS_ASSISTANT_TIMER_NOTIFICATION_ADD_1_MIN_BUTTON),
-         assistant::util::CreateAlarmTimerDeepLink(
-             AlarmTimerAction::kAddTimeToTimer, timer.id, base::Minutes(1))
-             .value(),
-         /*remove_notification_on_click=*/false});
-  } else {
-    // "CANCEL" button.
-    buttons.push_back({l10n_util::GetStringUTF8(
-                           IDS_ASSISTANT_TIMER_NOTIFICATION_CANCEL_BUTTON),
-                       assistant::util::CreateAlarmTimerDeepLink(
-                           AlarmTimerAction::kRemoveAlarmOrTimer, timer.id)
-                           .value(),
-                       /*remove_notification_on_click=*/true});
-  }
-
-  return buttons;
-}
-
-// Creates a timer notification priority for the given |timer|.
-AssistantNotificationPriority CreateTimerNotificationPriority(
-    const AssistantTimer& timer) {
-  // In timers v2, a notification for a |kFired| timer is |kHigh| priority.
-  // This will cause the notification to pop up to the user.
-  if (timer.state == AssistantTimerState::kFired)
-    return AssistantNotificationPriority::kHigh;
-
-  // If the notification has lived for at least |kPopupThreshold|, drop the
-  // priority to |kLow| so that the notification will not pop up to the user.
-  constexpr base::TimeDelta kPopupThreshold = base::Seconds(6);
-  const base::TimeDelta lifetime =
-      base::Time::Now() - timer.creation_time.value_or(base::Time::Now());
-  if (lifetime >= kPopupThreshold)
-    return AssistantNotificationPriority::kLow;
-
-  // Otherwise, the notification is |kDefault| priority. This means that it
-  // may or may not pop up to the user, depending on the presence of other
-  // notifications.
-  return AssistantNotificationPriority::kDefault;
-}
-
-// Creates a notification for the given |timer|.
-AssistantNotification CreateTimerNotification(
-    const AssistantTimer& timer,
-    const AssistantNotification* existing_notification = nullptr) {
-  AssistantNotification notification;
-  notification.title = CreateTimerNotificationTitle(timer);
-  notification.message = CreateTimerNotificationMessage(timer);
-  notification.buttons = CreateTimerNotificationButtons(timer);
-  notification.client_id = CreateTimerNotificationId(timer);
-  notification.grouping_key = kTimerNotificationGroupingKey;
-  notification.priority = CreateTimerNotificationPriority(timer);
-  notification.remove_on_click = false;
-  notification.is_pinned = false;
-
-  // If we are creating a notification to replace an |existing_notification| and
-  // our new notification has higher priority, we want the system to "renotify"
-  // the user of the notification change. This will cause the new notification
-  // to popup to the user even if it was previously marked as read.
-  if (existing_notification &&
-      notification.priority > existing_notification->priority) {
-    notification.renotify = true;
-  }
-
-  return notification;
-}
-
-// Returns whether an |update| from LibAssistant to the specified |original|
-// timer is allowed. Updates are always allowed in v1, only conditionally in v2.
-bool ShouldAllowUpdateFromLibAssistant(const AssistantTimer& original,
-                                       const AssistantTimer& update) {
-  // If |id| is not equal, then |update| does refer to the |original| timer.
-  DCHECK_EQ(original.id, update.id);
-
-  // In v2, updates are only allowed from LibAssistant if they are significant.
-  // We may receive an update due to a state change in another timer, and we'd
-  // want to discard the update to this timer to avoid introducing UI jank by
-  // updating its notification outside of its regular tick interval. In v2, we
-  // also update timer state from |kScheduled| to |kFired| ourselves to work
-  // around latency in receiving the event from LibAssistant. When we do so, we
-  // expect to later receive the state change from LibAssistant but discard it.
-  return !original.IsEqualInLibAssistantTo(update);
-}
-
-}  // namespace
-
-// AssistantAlarmTimerControllerImpl ------------------------------------------
-
-AssistantAlarmTimerControllerImpl::AssistantAlarmTimerControllerImpl(
-    AssistantControllerImpl* assistant_controller)
-    : assistant_controller_(assistant_controller) {
-  model_.AddObserver(this);
-  assistant_controller_observation_.Observe(AssistantController::Get());
-}
-
-AssistantAlarmTimerControllerImpl::~AssistantAlarmTimerControllerImpl() {
-  model_.RemoveObserver(this);
-}
-
-void AssistantAlarmTimerControllerImpl::SetAssistant(
-    assistant::Assistant* assistant) {
-  assistant_ = assistant;
-}
-
-const AssistantAlarmTimerModel* AssistantAlarmTimerControllerImpl::GetModel()
-    const {
-  return &model_;
-}
-
-void AssistantAlarmTimerControllerImpl::OnTimerStateChanged(
-    const std::vector<AssistantTimer>& new_or_updated_timers) {
-  // First we remove all old timers that no longer exist.
-  for (const auto* old_timer : model_.GetAllTimers()) {
-    if (!base::Contains(new_or_updated_timers, old_timer->id,
-                        &AssistantTimer::id)) {
-      model_.RemoveTimer(old_timer->id);
-    }
-  }
-
-  // Then we add any new timers and update existing ones (if allowed).
-  for (const auto& new_or_updated_timer : new_or_updated_timers) {
-    const auto* original_timer = model_.GetTimerById(new_or_updated_timer.id);
-    const bool is_new_timer = original_timer == nullptr;
-    if (is_new_timer || ShouldAllowUpdateFromLibAssistant(
-                            *original_timer, new_or_updated_timer)) {
-      model_.AddOrUpdateTimer(std::move(new_or_updated_timer));
-    }
-  }
-}
-
-void AssistantAlarmTimerControllerImpl::OnAssistantControllerConstructed() {
-  AssistantState::Get()->AddObserver(this);
-}
-
-void AssistantAlarmTimerControllerImpl::OnAssistantControllerDestroying() {
-  AssistantState::Get()->RemoveObserver(this);
-}
-
-void AssistantAlarmTimerControllerImpl::OnDeepLinkReceived(
-    assistant::util::DeepLinkType type,
-    const std::map<std::string, std::string>& params) {
-  using assistant::util::DeepLinkParam;
-  using assistant::util::DeepLinkType;
-
-  if (type != DeepLinkType::kAlarmTimer)
-    return;
-
-  const std::optional<AlarmTimerAction>& action =
-      assistant::util::GetDeepLinkParamAsAlarmTimerAction(params);
-  if (!action.has_value())
-    return;
-
-  const std::optional<std::string>& alarm_timer_id =
-      assistant::util::GetDeepLinkParam(params, DeepLinkParam::kId);
-  if (!alarm_timer_id.has_value())
-    return;
-
-  // Duration is optional. Only used for adding time to timer.
-  const std::optional<base::TimeDelta>& duration =
-      assistant::util::GetDeepLinkParamAsTimeDelta(params,
-                                                   DeepLinkParam::kDurationMs);
-
-  PerformAlarmTimerAction(action.value(), alarm_timer_id.value(), duration);
-}
-
-void AssistantAlarmTimerControllerImpl::OnAssistantStatusChanged(
-    assistant::AssistantStatus status) {
-  // If LibAssistant is no longer running we need to clear our cache to
-  // accurately reflect LibAssistant alarm/timer state.
-  if (status == assistant::AssistantStatus::NOT_READY)
-    model_.RemoveAllTimers();
-}
-
-void AssistantAlarmTimerControllerImpl::OnTimerAdded(
-    const AssistantTimer& timer) {
-  // Schedule the next tick of |timer|.
-  ScheduleNextTick(timer);
-
-  // Create a notification for the added alarm/timer.
-  assistant_controller_->notification_controller()->AddOrUpdateNotification(
-      CreateTimerNotification(timer));
-}
-
-void AssistantAlarmTimerControllerImpl::OnTimerUpdated(
-    const AssistantTimer& timer) {
-  // Schedule the next tick of |timer|.
-  ScheduleNextTick(timer);
-
-  auto* notification_controller =
-      assistant_controller_->notification_controller();
-  const auto* existing_notification =
-      notification_controller->model()->GetNotificationById(
-          CreateTimerNotificationId(timer));
-
-  // When a |timer| is updated we need to update the corresponding notification
-  // unless it has already been dismissed by the user.
-  if (existing_notification) {
-    notification_controller->AddOrUpdateNotification(
-        CreateTimerNotification(timer, existing_notification));
-  }
-}
-
-void AssistantAlarmTimerControllerImpl::OnTimerRemoved(
-    const AssistantTimer& timer) {
-  // Clean up the ticker for |timer|, if one exists.
-  tickers_.erase(timer.id);
-
-  // Remove any notification associated w/ |timer|.
-  assistant_controller_->notification_controller()->RemoveNotificationById(
-      CreateTimerNotificationId(timer), /*from_server=*/false);
-}
-
-void AssistantAlarmTimerControllerImpl::PerformAlarmTimerAction(
-    const AlarmTimerAction& action,
-    const std::string& alarm_timer_id,
-    const std::optional<base::TimeDelta>& duration) {
-  DCHECK(assistant_);
-
-  switch (action) {
-    case AlarmTimerAction::kAddTimeToTimer:
-      if (!duration.has_value()) {
-        LOG(ERROR) << "Ignoring add time to timer action duration.";
-        return;
-      }
-      assistant_->AddTimeToTimer(alarm_timer_id, duration.value());
-      break;
-    case AlarmTimerAction::kPauseTimer:
-      DCHECK(!duration.has_value());
-      assistant_->PauseTimer(alarm_timer_id);
-      break;
-    case AlarmTimerAction::kRemoveAlarmOrTimer:
-      DCHECK(!duration.has_value());
-      assistant_->RemoveAlarmOrTimer(alarm_timer_id);
-      break;
-    case AlarmTimerAction::kResumeTimer:
-      DCHECK(!duration.has_value());
-      assistant_->ResumeTimer(alarm_timer_id);
-      break;
-  }
-}
-
-void AssistantAlarmTimerControllerImpl::ScheduleNextTick(
-    const AssistantTimer& timer) {
-  auto& ticker = tickers_[timer.id];
-  if (ticker.IsRunning())
-    return;
-
-  // The next tick of |timer| should occur at its next full second of remaining
-  // time. Here we are calculating the number of milliseconds to that next full
-  // second.
-  int millis_to_next_full_sec = timer.remaining_time.InMilliseconds() % 1000;
-
-  // If |timer| has already fired, |millis_to_next_full_sec| will be negative.
-  // In this case, we take the inverse of the value to get the correct number of
-  // milliseconds to the next full second of remaining time.
-  if (millis_to_next_full_sec < 0)
-    millis_to_next_full_sec = 1000 + millis_to_next_full_sec;
-
-  // If we are exactly at the boundary of a full second, we want to make sure
-  // we wait until the next second to perform the next tick. Otherwise we'll end
-  // up w/ a superfluous tick that is unnecessary.
-  if (millis_to_next_full_sec == 0)
-    millis_to_next_full_sec = 1000;
-
-  // NOTE: We pass a copy of |timer.id| here as |timer| may no longer exist
-  // when Tick() is called due to the possibility of the |model_| being updated
-  // via a call to OnTimerStateChanged(), such as might happen if a timer is
-  // created, paused, resumed, or removed by LibAssistant.
-  ticker.Start(FROM_HERE, base::Milliseconds(millis_to_next_full_sec),
-               base::BindOnce(&AssistantAlarmTimerControllerImpl::Tick,
-                              base::Unretained(this), timer.id));
-}
-
-void AssistantAlarmTimerControllerImpl::Tick(const std::string& timer_id) {
-  const auto* timer = model_.GetTimerById(timer_id);
-  DCHECK(timer);
-
-  // We don't tick paused timers. Once the |timer| resumes, ticking will resume.
-  if (timer->state == AssistantTimerState::kPaused)
-    return;
-
-  // Update |timer| to reflect the new amount of |remaining_time|.
-  AssistantTimer updated_timer(*timer);
-  updated_timer.remaining_time = updated_timer.fire_time - base::Time::Now();
-
-  // If there is no remaining time left on the timer, we ensure that our timer
-  // is marked as |kFired|. Since LibAssistant may be a bit slow to notify us of
-  // the change in state, we set the value ourselves to eliminate UI jank.
-  // NOTE: We use the rounded value of |remaining_time| since that's what we are
-  // displaying to the user and otherwise would be out of sync for ticks
-  // occurring at full second boundary values.
-  if (std::round(updated_timer.remaining_time.InSecondsF()) <= 0.f)
-    updated_timer.state = AssistantTimerState::kFired;
-
-  model_.AddOrUpdateTimer(std::move(updated_timer));
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_alarm_timer_controller_impl.h b/ash/assistant/assistant_alarm_timer_controller_impl.h
deleted file mode 100644
index 69dd0a69..0000000
--- a/ash/assistant/assistant_alarm_timer_controller_impl.h
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_ALARM_TIMER_CONTROLLER_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_ALARM_TIMER_CONTROLLER_IMPL_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "ash/assistant/model/assistant_alarm_timer_model.h"
-#include "ash/assistant/model/assistant_alarm_timer_model_observer.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/assistant/controller/assistant_alarm_timer_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
-#include "base/timer/timer.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-
-namespace ash {
-
-namespace assistant {
-namespace util {
-enum class AlarmTimerAction;
-}  // namespace util
-}  // namespace assistant
-
-class AssistantControllerImpl;
-
-// The AssistantAlarmTimerControllerImpl is a sub-controller of
-// AssistantController tasked with tracking alarm/timer state and providing
-// alarm/timer APIs.
-class AssistantAlarmTimerControllerImpl
-    : public AssistantAlarmTimerController,
-      public AssistantControllerObserver,
-      public AssistantStateObserver,
-      public AssistantAlarmTimerModelObserver {
- public:
-  explicit AssistantAlarmTimerControllerImpl(
-      AssistantControllerImpl* assistant_controller);
-
-  AssistantAlarmTimerControllerImpl(const AssistantAlarmTimerControllerImpl&) =
-      delete;
-  AssistantAlarmTimerControllerImpl& operator=(
-      const AssistantAlarmTimerControllerImpl&) = delete;
-
-  ~AssistantAlarmTimerControllerImpl() override;
-
-  // Provides a pointer to the |assistant| owned by AssistantService.
-  void SetAssistant(assistant::Assistant* assistant);
-
-  // AssistantAlarmTimerController:
-  const AssistantAlarmTimerModel* GetModel() const override;
-  void OnTimerStateChanged(
-      const std::vector<assistant::AssistantTimer>& timers) override;
-
-  // AssistantControllerObserver:
-  void OnAssistantControllerConstructed() override;
-  void OnAssistantControllerDestroying() override;
-  void OnDeepLinkReceived(
-      assistant::util::DeepLinkType type,
-      const std::map<std::string, std::string>& params) override;
-
-  // AssistantStateObserver:
-  void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
-
-  // AssistantAlarmTimerModelObserver:
-  void OnTimerAdded(const assistant::AssistantTimer& timer) override;
-  void OnTimerUpdated(const assistant::AssistantTimer& timer) override;
-  void OnTimerRemoved(const assistant::AssistantTimer& timer) override;
-
- private:
-  void PerformAlarmTimerAction(const assistant::util::AlarmTimerAction& action,
-                               const std::string& alarm_timer_id,
-                               const std::optional<base::TimeDelta>& duration);
-
-  void ScheduleNextTick(const assistant::AssistantTimer& timer);
-  void Tick(const std::string& timer_id);
-
-  const raw_ptr<AssistantControllerImpl>
-      assistant_controller_;  // Owned by Shell.
-
-  AssistantAlarmTimerModel model_;
-
-  // We independently tick timers in our |model_| to update their respective
-  // remaining times. This map contains these tickers, keyed by timer id.
-  std::map<std::string, base::OneShotTimer> tickers_;
-
-  // Owned by AssistantService.
-  raw_ptr<assistant::Assistant> assistant_;
-
-  base::ScopedObservation<AssistantController, AssistantControllerObserver>
-      assistant_controller_observation_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_ALARM_TIMER_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_controller_impl.cc b/ash/assistant/assistant_controller_impl.cc
deleted file mode 100644
index 63fbc7f..0000000
--- a/ash/assistant/assistant_controller_impl.cc
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_controller_impl.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "ash/accessibility/accessibility_controller.h"
-#include "ash/assistant/util/deep_link_util.h"
-#include "ash/capture_mode/capture_mode_controller.h"
-#include "ash/constants/ash_features.h"
-#include "ash/public/cpp/android_intent_helper.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/new_window_delegate.h"
-#include "ash/public/cpp/session/session_types.h"
-#include "ash/public/mojom/assistant_volume_control.mojom.h"
-#include "ash/session/session_controller_impl.h"
-#include "ash/shell.h"
-#include "base/functional/bind.h"
-#include "base/memory/scoped_refptr.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_enums.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-#include "chromeos/ash/services/assistant/public/cpp/features.h"
-#include "chromeos/ash/services/libassistant/public/cpp/assistant_feedback.h"
-#include "components/account_id/account_id.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "url/gurl.h"
-
-namespace ash {
-
-namespace {
-
-const AccountId& GetActiveUserAccountId() {
-  const UserSession* active_user_session =
-      Shell::Get()->session_controller()->GetUserSession(0);
-  DCHECK(active_user_session);
-  return active_user_session->user_info.account_id;
-}
-
-}  // namespace
-
-AssistantControllerImpl::AssistantControllerImpl() {
-  Shell::Get()->AddShellObserver(this);
-  assistant_state_controller_.AddObserver(this);
-  CrasAudioHandler::Get()->AddAudioObserver(this);
-  AddObserver(this);
-
-  // The Assistant service needs to have accessibility state synced with ash
-  // and be notified of any accessibility status changes in the future to
-  // provide an opportunity to turn on/off A11Y features.
-  Shell::Get()->accessibility_controller()->AddObserver(this);
-
-  color_mode_observer_.Observe(DarkLightModeControllerImpl::Get());
-
-  NotifyConstructed();
-}
-
-AssistantControllerImpl::~AssistantControllerImpl() = default;
-
-void AssistantControllerImpl::BindReceiver(
-    mojo::PendingReceiver<mojom::AssistantVolumeControl> receiver) {
-  if (assistant_volume_control_receiver_.is_bound()) {
-    assistant_volume_control_receiver_.reset();
-  }
-  assistant_volume_control_receiver_.Bind(std::move(receiver));
-}
-
-void AssistantControllerImpl::SetAssistant(assistant::Assistant* assistant) {
-  assistant_ = assistant;
-
-  // Provide reference to sub-controllers.
-  assistant_alarm_timer_controller_.SetAssistant(assistant);
-  assistant_interaction_controller_.SetAssistant(assistant);
-  assistant_notification_controller_.SetAssistant(assistant);
-  assistant_ui_controller_.SetAssistant(assistant);
-
-  if (assistant) {
-    for (AssistantControllerObserver& observer : observers_)
-      observer.OnAssistantReady();
-  }
-}
-
-void AssistantControllerImpl::SendAssistantFeedback(
-    bool assistant_debug_info_allowed,
-    const std::string& feedback_description,
-    const std::string& screenshot_png) {
-  if (!IsAssistantReady()) {
-    return;
-  }
-
-  assistant::AssistantFeedback assistant_feedback;
-  assistant_feedback.assistant_debug_info_allowed =
-      assistant_debug_info_allowed;
-  assistant_feedback.description = feedback_description;
-  assistant_feedback.screenshot_png =
-      std::vector<uint8_t>(screenshot_png.begin(), screenshot_png.end());
-  assistant_->SendAssistantFeedback(std::move(assistant_feedback));
-}
-
-void AssistantControllerImpl::StartSpeakerIdEnrollmentFlow() {
-  setup_controller()->StartOnboarding(false /* relaunch */,
-                                      FlowType::kSpeakerIdEnrollment);
-}
-
-void AssistantControllerImpl::DownloadImage(
-    const GURL& url,
-    ImageDownloader::DownloadCallback callback) {
-  constexpr net::NetworkTrafficAnnotationTag kNetworkTrafficAnnotationTag =
-      net::DefineNetworkTrafficAnnotation("image_downloader", R"(
-            semantics {
-              sender: "Google Assistant"
-              description:
-                "The Google Assistant requires dynamic loading of images to "
-                "provide a media rich user experience. Images are downloaded "
-                "on an as needed basis."
-              trigger:
-                "Generally triggered in direct response to a user issued "
-                "query. A single query may necessitate the downloading of "
-                "multiple images."
-              data: "None."
-              destination: GOOGLE_OWNED_SERVICE
-            }
-            policy {
-              cookies_allowed: NO
-              setting:
-                "The Google Assistant can be enabled/disabled in Chrome "
-                "Settings and is subject to eligibility requirements."
-              policy_exception_justification:
-                "The users can disable this feature. This does not send/store "
-                "user data."
-            })");
-
-  ImageDownloader::Get()->Download(url, kNetworkTrafficAnnotationTag,
-                                   GetActiveUserAccountId(),
-                                   std::move(callback));
-}
-
-void AssistantControllerImpl::AddObserver(
-    AssistantControllerObserver* observer) {
-  observers_.AddObserver(observer);
-}
-
-void AssistantControllerImpl::RemoveObserver(
-    AssistantControllerObserver* observer) {
-  observers_.RemoveObserver(observer);
-}
-
-void AssistantControllerImpl::OpenUrl(const GURL& url,
-                                      bool in_background,
-                                      bool from_server) {
-  // app_list search result will be opened by `OpenUrl()`. However, the
-  // `assistant_` may not be ready. Show a toast to indicate it.
-  if (!IsAssistantReady()) {
-    assistant_ui_controller_.ShowUnboundErrorToast();
-    return;
-  }
-
-  if (assistant::util::IsDeepLinkUrl(url)) {
-    NotifyDeepLinkReceived(url);
-    return;
-  }
-
-  auto* android_helper = AndroidIntentHelper::GetInstance();
-  if (IsAndroidIntent(url) && !android_helper) {
-    NOTREACHED();
-  }
-
-  // Give observers an opportunity to perform any necessary handling before we
-  // open the specified |url| in a new browser tab.
-  NotifyOpeningUrl(url, in_background, from_server);
-
-  if (IsAndroidIntent(url)) {
-    android_helper->LaunchAndroidIntent(url.spec());
-  } else {
-    assistant::AssistantBrowserDelegate::Get()->OpenUrl(url);
-  }
-  NotifyUrlOpened(url, from_server);
-}
-
-void AssistantControllerImpl::OpenAssistantSettings() {
-  // Launch Assistant settings via deeplink.
-  OpenUrl(assistant::util::CreateAssistantSettingsDeepLink(),
-          /*in_background=*/false, /*from_server=*/false);
-}
-
-base::WeakPtr<ash::AssistantController> AssistantControllerImpl::GetWeakPtr() {
-  return weak_factory_.GetWeakPtr();
-}
-
-void AssistantControllerImpl::OnDeepLinkReceived(
-    assistant::util::DeepLinkType type,
-    const std::map<std::string, std::string>& params) {
-  using assistant::util::DeepLinkParam;
-  using assistant::util::DeepLinkType;
-
-  switch (type) {
-    case DeepLinkType::kChromeSettings: {
-      // Chrome Settings deep links are opened in a new browser tab.
-      OpenUrl(
-          assistant::util::GetChromeSettingsUrl(
-              assistant::util::GetDeepLinkParam(params, DeepLinkParam::kPage)),
-          /*in_background=*/false, /*from_server=*/false);
-      break;
-    }
-    case DeepLinkType::kFeedback:
-      NewWindowDelegate::GetInstance()->OpenFeedbackPage(
-          NewWindowDelegate::FeedbackSource::kFeedbackSourceAssistant);
-
-      // Close the assistant UI so that the feedback page is visible.
-      assistant_ui_controller_.CloseUi(
-          assistant::AssistantExitPoint::kUnspecified);
-      break;
-    case DeepLinkType::kScreenshot:
-      // We close the UI before taking the screenshot as it's probably not the
-      // user's intention to include the Assistant in the picture.
-      assistant_ui_controller_.CloseUi(
-          assistant::AssistantExitPoint::kScreenshot);
-      CaptureModeController::Get()->CaptureScreenshotsOfAllDisplays();
-      break;
-    case DeepLinkType::kTaskManager:
-      // Open task manager window.
-      NewWindowDelegate::GetInstance()->ShowTaskManager();
-      break;
-    case DeepLinkType::kUnsupported:
-    case DeepLinkType::kAlarmTimer:
-    case DeepLinkType::kLists:
-    case DeepLinkType::kNotes:
-    case DeepLinkType::kOnboarding:
-    case DeepLinkType::kQuery:
-    case DeepLinkType::kReminders:
-    case DeepLinkType::kSettings:
-      // No action needed.
-      break;
-  }
-}
-
-void AssistantControllerImpl::SetVolume(int volume, bool user_initiated) {
-  volume = std::min(100, volume);
-  volume = std::max(volume, 0);
-  CrasAudioHandler::Get()->SetOutputVolumePercent(volume);
-}
-
-void AssistantControllerImpl::SetMuted(bool muted) {
-  CrasAudioHandler::Get()->SetOutputMute(muted);
-}
-
-void AssistantControllerImpl::AddVolumeObserver(
-    mojo::PendingRemote<mojom::VolumeObserver> observer) {
-  volume_observers_.Add(std::move(observer));
-
-  int output_volume = CrasAudioHandler::Get()->GetOutputVolumePercent();
-  bool mute = CrasAudioHandler::Get()->IsOutputMuted();
-  OnOutputMuteChanged(mute);
-  OnOutputNodeVolumeChanged(0 /* node */, output_volume);
-}
-
-void AssistantControllerImpl::OnOutputMuteChanged(bool mute_on) {
-  for (auto& observer : volume_observers_)
-    observer->OnMuteStateChanged(mute_on);
-}
-
-void AssistantControllerImpl::OnOutputNodeVolumeChanged(uint64_t node,
-                                                        int volume) {
-  // |node| refers to the active volume device, which we don't care here.
-  for (auto& observer : volume_observers_)
-    observer->OnVolumeChanged(volume);
-}
-
-void AssistantControllerImpl::OnAccessibilityStatusChanged() {
-  if (!IsAssistantReady()) {
-    return;
-  }
-
-  // The Assistant service needs to be informed of changes to accessibility
-  // state so that it can turn on/off A11Y features appropriately.
-  assistant_->OnAccessibilityStatusChanged(
-      Shell::Get()->accessibility_controller()->spoken_feedback().enabled());
-}
-
-void AssistantControllerImpl::OnColorModeChanged(bool dark_mode_enabled) {
-  if (!IsAssistantReady()) {
-    return;
-  }
-
-  assistant_->OnColorModeChanged(dark_mode_enabled);
-}
-
-void AssistantControllerImpl::OnShellDestroying() {
-  NotifyDestroying();
-  CrasAudioHandler::Get()->RemoveAudioObserver(this);
-  Shell::Get()->accessibility_controller()->RemoveObserver(this);
-  assistant_state_controller_.RemoveObserver(this);
-  Shell::Get()->RemoveShellObserver(this);
-  RemoveObserver(this);
-}
-
-bool AssistantControllerImpl::IsAssistantReady() const {
-  if (!assistant_) {
-    return false;
-  }
-
-  if (AssistantState::Get()->assistant_status() ==
-      assistant::AssistantStatus::NOT_READY) {
-    return false;
-  }
-
-  return true;
-}
-
-void AssistantControllerImpl::NotifyConstructed() {
-  for (AssistantControllerObserver& observer : observers_)
-    observer.OnAssistantControllerConstructed();
-}
-
-void AssistantControllerImpl::NotifyDestroying() {
-  for (AssistantControllerObserver& observer : observers_)
-    observer.OnAssistantControllerDestroying();
-}
-
-void AssistantControllerImpl::NotifyDeepLinkReceived(const GURL& deep_link) {
-  using assistant::util::DeepLinkType;
-
-  // Retrieve deep link type and parsed parameters.
-  DeepLinkType type = assistant::util::GetDeepLinkType(deep_link);
-  const std::map<std::string, std::string> params =
-      assistant::util::GetDeepLinkParams(deep_link);
-
-  for (AssistantControllerObserver& observer : observers_)
-    observer.OnDeepLinkReceived(type, params);
-}
-
-void AssistantControllerImpl::NotifyOpeningUrl(const GURL& url,
-                                               bool in_background,
-                                               bool from_server) {
-  for (AssistantControllerObserver& observer : observers_)
-    observer.OnOpeningUrl(url, in_background, from_server);
-}
-
-void AssistantControllerImpl::NotifyUrlOpened(const GURL& url,
-                                              bool from_server) {
-  for (AssistantControllerObserver& observer : observers_)
-    observer.OnUrlOpened(url, from_server);
-}
-
-void AssistantControllerImpl::OnAssistantStatusChanged(
-    assistant::AssistantStatus status) {
-  switch (status) {
-    case assistant::AssistantStatus::NOT_READY:
-      assistant_volume_control_receiver_.reset();
-      assistant_ui_controller_.CloseUi(
-          assistant::AssistantExitPoint::kUnspecified);
-      break;
-    case assistant::AssistantStatus::READY:
-      OnAccessibilityStatusChanged();
-      OnColorModeChanged(
-          DarkLightModeControllerImpl::Get()->IsDarkModeEnabled());
-      break;
-  }
-}
-
-void AssistantControllerImpl::OnLockedFullScreenStateChanged(bool enabled) {
-  if (enabled)
-    assistant_ui_controller_.CloseUi(
-        assistant::AssistantExitPoint::kUnspecified);
-}
-
-void AssistantControllerImpl::BindVolumeControl(
-    mojo::PendingReceiver<mojom::AssistantVolumeControl> receiver) {
-  Shell::Get()->assistant_controller()->BindReceiver(std::move(receiver));
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_controller_impl.h b/ash/assistant/assistant_controller_impl.h
deleted file mode 100644
index 887aa969..0000000
--- a/ash/assistant/assistant_controller_impl.h
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_CONTROLLER_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_CONTROLLER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "ash/accessibility/accessibility_observer.h"
-#include "ash/ash_export.h"
-#include "ash/assistant/assistant_alarm_timer_controller_impl.h"
-#include "ash/assistant/assistant_interaction_controller_impl.h"
-#include "ash/assistant/assistant_notification_controller_impl.h"
-#include "ash/assistant/assistant_setup_controller.h"
-#include "ash/assistant/assistant_state_controller.h"
-#include "ash/assistant/assistant_suggestions_controller_impl.h"
-#include "ash/assistant/assistant_ui_controller_impl.h"
-#include "ash/assistant/assistant_view_delegate_impl.h"
-#include "ash/assistant/ui/assistant_view_delegate.h"
-#include "ash/public/cpp/assistant/assistant_interface_binder.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "ash/public/cpp/image_downloader.h"
-#include "ash/public/cpp/style/color_mode_observer.h"
-#include "ash/public/mojom/assistant_volume_control.mojom.h"
-#include "ash/shell_observer.h"
-#include "ash/style/dark_light_mode_controller_impl.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/observer_list.h"
-#include "base/scoped_observation.h"
-#include "chromeos/ash/components/audio/cras_audio_handler.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-#include "components/prefs/pref_service.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "mojo/public/cpp/bindings/receiver_set.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "mojo/public/cpp/bindings/remote_set.h"
-
-namespace ash {
-
-class ASH_EXPORT AssistantControllerImpl
-    : public AssistantController,
-      public AssistantControllerObserver,
-      public AssistantStateObserver,
-      public mojom::AssistantVolumeControl,
-      public CrasAudioHandler::AudioObserver,
-      public AccessibilityObserver,
-      public AssistantInterfaceBinder,
-      public ColorModeObserver,
-      public ShellObserver {
- public:
-  AssistantControllerImpl();
-
-  AssistantControllerImpl(const AssistantControllerImpl&) = delete;
-  AssistantControllerImpl& operator=(const AssistantControllerImpl&) = delete;
-
-  ~AssistantControllerImpl() override;
-
-  void BindReceiver(
-      mojo::PendingReceiver<mojom::AssistantVolumeControl> receiver);
-
-  // Downloads the image found at the specified |url|. On completion, the
-  // supplied |callback| will be run with the downloaded image. If the download
-  // attempt is unsuccessful, a NULL image is returned.
-  void DownloadImage(const GURL& url,
-                     ImageDownloader::DownloadCallback callback);
-
-  // AssistantController:
-  void AddObserver(AssistantControllerObserver* observer) override;
-  void RemoveObserver(AssistantControllerObserver* observer) override;
-  void OpenAssistantSettings() override;
-  void OpenUrl(const GURL& url, bool in_background, bool from_server) override;
-  base::WeakPtr<ash::AssistantController> GetWeakPtr() override;
-  void SetAssistant(assistant::Assistant* assistant) override;
-  void StartSpeakerIdEnrollmentFlow() override;
-  void SendAssistantFeedback(bool assistant_debug_info_allowed,
-                             const std::string& feedback_description,
-                             const std::string& screenshot_png) override;
-
-  // AssistantControllerObserver:
-  void OnDeepLinkReceived(
-      assistant::util::DeepLinkType type,
-      const std::map<std::string, std::string>& params) override;
-
-  // mojom::VolumeControl:
-  void SetVolume(int volume, bool user_initiated) override;
-  void SetMuted(bool muted) override;
-  void AddVolumeObserver(
-      mojo::PendingRemote<mojom::VolumeObserver> observer) override;
-
-  // CrasAudioHandler::AudioObserver:
-  void OnOutputMuteChanged(bool mute_on) override;
-  void OnOutputNodeVolumeChanged(uint64_t node, int volume) override;
-
-  // AccessibilityObserver:
-  void OnAccessibilityStatusChanged() override;
-
-  // ColorModeObserver:
-  void OnColorModeChanged(bool dark_mode_enabled) override;
-
-  // ShellObserver:
-  void OnShellDestroying() override;
-
-  AssistantAlarmTimerControllerImpl* alarm_timer_controller() {
-    return &assistant_alarm_timer_controller_;
-  }
-
-  AssistantNotificationControllerImpl* notification_controller() {
-    return &assistant_notification_controller_;
-  }
-
-  AssistantSetupController* setup_controller() {
-    return &assistant_setup_controller_;
-  }
-
-  AssistantViewDelegate* view_delegate() { return &view_delegate_; }
-
-  bool IsAssistantReady() const;
-
- private:
-  void NotifyConstructed();
-  void NotifyDestroying();
-  void NotifyDeepLinkReceived(const GURL& deep_link);
-  void NotifyOpeningUrl(const GURL& url, bool in_background, bool from_server);
-  void NotifyUrlOpened(const GURL& url, bool from_server);
-
-  // AssistantStateObserver:
-  void OnAssistantStatusChanged(assistant::AssistantStatus status) override;
-  void OnLockedFullScreenStateChanged(bool enabled) override;
-
-  // AssistantInterfaceBinder implementation:
-  void BindVolumeControl(
-      mojo::PendingReceiver<mojom::AssistantVolumeControl> receiver) override;
-
-  // The observer list should be initialized early so that sub-controllers may
-  // register as observers during their construction.
-  base::ObserverList<AssistantControllerObserver> observers_;
-
-  mojo::Receiver<mojom::AssistantVolumeControl>
-      assistant_volume_control_receiver_{this};
-  mojo::RemoteSet<mojom::VolumeObserver> volume_observers_;
-
-  // |assistant_| can be nullptr if libassistant creation is not yet completed,
-  // i.e. it cannot take a request.
-  raw_ptr<assistant::Assistant> assistant_ = nullptr;
-
-  // Assistant sub-controllers.
-  AssistantAlarmTimerControllerImpl assistant_alarm_timer_controller_{this};
-  AssistantInteractionControllerImpl assistant_interaction_controller_{this};
-  AssistantNotificationControllerImpl assistant_notification_controller_;
-  AssistantStateController assistant_state_controller_;
-  AssistantSetupController assistant_setup_controller_{this};
-  AssistantSuggestionsControllerImpl assistant_suggestions_controller_;
-  AssistantUiControllerImpl assistant_ui_controller_{this};
-
-  AssistantViewDelegateImpl view_delegate_{this};
-
-  base::ScopedObservation<DarkLightModeControllerImpl, ColorModeObserver>
-      color_mode_observer_{this};
-
-  base::WeakPtrFactory<AssistantControllerImpl> weak_factory_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_interaction_controller_impl.h b/ash/assistant/assistant_interaction_controller_impl.h
deleted file mode 100644
index 1c535a7d..0000000
--- a/ash/assistant/assistant_interaction_controller_impl.h
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_INTERACTION_CONTROLLER_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_INTERACTION_CONTROLLER_IMPL_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "ash/assistant/model/assistant_interaction_model.h"
-#include "ash/assistant/model/assistant_interaction_model_observer.h"
-#include "ash/assistant/model/assistant_ui_model_observer.h"
-#include "ash/assistant/ui/assistant_view_delegate.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "ash/public/cpp/assistant/controller/assistant_interaction_controller.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/scoped_observation.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "ui/display/display_observer.h"
-#include "ui/display/screen.h"
-
-namespace display {
-enum class TabletState;
-}  // namespace display
-
-namespace ash {
-
-class AssistantControllerImpl;
-enum class AssistantButtonId;
-
-class AssistantInteractionControllerImpl
-    : public AssistantInteractionController,
-      public assistant::AssistantInteractionSubscriber,
-      public AssistantControllerObserver,
-      public AssistantInteractionModelObserver,
-      public AssistantUiModelObserver,
-      public AssistantViewDelegateObserver,
-      public display::DisplayObserver {
- public:
-  using AssistantInteractionMetadata = assistant::AssistantInteractionMetadata;
-  using AssistantInteractionResolution =
-      assistant::AssistantInteractionResolution;
-  using AssistantInteractionType = assistant::AssistantInteractionType;
-  using AssistantQuerySource = assistant::AssistantQuerySource;
-  using AssistantSuggestion = assistant::AssistantSuggestion;
-  using AssistantSuggestionType = assistant::AssistantSuggestionType;
-
-  explicit AssistantInteractionControllerImpl(
-      AssistantControllerImpl* assistant_controller);
-
-  AssistantInteractionControllerImpl(
-      const AssistantInteractionControllerImpl&) = delete;
-  AssistantInteractionControllerImpl& operator=(
-      const AssistantInteractionControllerImpl&) = delete;
-
-  ~AssistantInteractionControllerImpl() override;
-
-  // Provides a pointer to the |assistant| owned by AssistantService.
-  void SetAssistant(assistant::Assistant* assistant);
-
-  // AssistantInteractionController:
-  const AssistantInteractionModel* GetModel() const override;
-  base::TimeDelta GetTimeDeltaSinceLastInteraction() const override;
-  bool HasHadInteraction() const override;
-  void StartTextInteraction(const std::string& text,
-                            bool allow_tts,
-                            AssistantQuerySource query_source) override;
-
-  // AssistantControllerObserver:
-  void OnAssistantControllerConstructed() override;
-  void OnAssistantControllerDestroying() override;
-  void OnDeepLinkReceived(
-      assistant::util::DeepLinkType type,
-      const std::map<std::string, std::string>& params) override;
-
-  // AssistantInteractionModelObserver:
-  void OnInputModalityChanged(InputModality input_modality) override;
-  void OnMicStateChanged(MicState mic_state) override;
-  void OnCommittedQueryChanged(const AssistantQuery& assistant_query) override;
-
-  // AssistantUiModelObserver:
-  void OnUiVisibilityChanged(
-      AssistantVisibility new_visibility,
-      AssistantVisibility old_visibility,
-      std::optional<AssistantEntryPoint> entry_point,
-      std::optional<AssistantExitPoint> exit_point) override;
-
-  // assistant::AssistantInteractionSubscriber:
-  void OnInteractionStarted(
-      const AssistantInteractionMetadata& metadata) override;
-  void OnInteractionFinished(
-      AssistantInteractionResolution resolution) override;
-  void OnHtmlResponse(const std::string& response,
-                      const std::string& fallback) override;
-  void OnSuggestionsResponse(
-      const std::vector<AssistantSuggestion>& response) override;
-  void OnTextResponse(const std::string& response) override;
-  void OnOpenUrlResponse(const GURL& url, bool in_background) override;
-  void OnOpenAppResponse(const assistant::AndroidAppInfo& app_info) override;
-  void OnSpeechRecognitionStarted() override;
-  void OnSpeechRecognitionIntermediateResult(
-      const std::string& high_confidence_text,
-      const std::string& low_confidence_text) override;
-  void OnSpeechRecognitionEndOfUtterance() override;
-  void OnSpeechRecognitionFinalResult(const std::string& final_result) override;
-  void OnSpeechLevelUpdated(float speech_level) override;
-  void OnTtsStarted(bool due_to_error) override;
-  void OnWaitStarted() override;
-
-  // AssistantViewDelegateObserver:
-  void OnDialogPlateButtonPressed(AssistantButtonId id) override;
-  void OnDialogPlateContentsCommitted(const std::string& text) override;
-  void OnSuggestionPressed(
-      const base::UnguessableToken& suggestion_id) override;
-
-  // display::DisplayObserver:
-  void OnDisplayTabletStateChanged(display::TabletState state) override;
-
- private:
-  bool HasActiveInteraction() const;
-  void OnUiVisible(AssistantEntryPoint entry_point);
-  void StartVoiceInteraction();
-  void StopActiveInteraction(bool cancel_conversation);
-
-  InputModality GetDefaultInputModality() const;
-  AssistantResponse* GetResponseForActiveInteraction();
-  AssistantVisibility GetVisibility() const;
-  bool IsVisible() const;
-
-  const raw_ptr<AssistantControllerImpl>
-      assistant_controller_;  // Owned by Shell.
-  AssistantInteractionModel model_;
-  bool has_had_interaction_ = false;
-
-  // Owned by AssistantService.
-  raw_ptr<assistant::Assistant> assistant_ = nullptr;
-
-  base::ScopedObservation<AssistantController, AssistantControllerObserver>
-      assistant_controller_observation_{this};
-
-  base::ScopedObservation<display::Screen, display::DisplayObserver>
-      display_observation_{this};
-
-  base::WeakPtrFactory<AssistantInteractionControllerImpl> weak_factory_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_INTERACTION_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_notification_controller_impl.cc b/ash/assistant/assistant_notification_controller_impl.cc
deleted file mode 100644
index aa40d7ee..0000000
--- a/ash/assistant/assistant_notification_controller_impl.cc
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_notification_controller_impl.h"
-
-#include <memory>
-#include <utility>
-
-#include "ash/assistant/assistant_controller_impl.h"
-#include "ash/assistant/assistant_notification_expiry_monitor.h"
-#include "ash/assistant/util/deep_link_util.h"
-#include "ash/constants/notifier_catalogs.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/notification_utils.h"
-#include "ash/shell.h"
-#include "ash/strings/grit/ash_strings.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chromeos/ash/services/libassistant/public/cpp/assistant_notification.h"
-#include "chromeos/ui/vector_icons/vector_icons.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/message_center/message_center.h"
-#include "ui/message_center/public/cpp/notification.h"
-#include "url/gurl.h"
-
-namespace ash {
-
-namespace {
-
-constexpr char kNotifierId[] = "assistant";
-
-// Helpers ---------------------------------------------------------------------
-
-std::unique_ptr<message_center::Notification> CreateSystemNotification(
-    const message_center::NotifierId& notifier_id,
-    const assistant::AssistantNotification& notification) {
-  const std::u16string title = base::UTF8ToUTF16(notification.title);
-  const std::u16string message = base::UTF8ToUTF16(notification.message);
-  const std::u16string display_source =
-      l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_NOTIFICATION_DISPLAY_SOURCE);
-
-  message_center::RichNotificationData data;
-  for (const auto& button : notification.buttons)
-    data.buttons.emplace_back(base::UTF8ToUTF16(button.label));
-
-  std::unique_ptr<message_center::Notification> system_notification =
-      ash::CreateSystemNotificationPtr(
-          message_center::NOTIFICATION_TYPE_SIMPLE, notification.client_id,
-          title, message, display_source, GURL(), notifier_id, data,
-          /*delegate=*/nullptr, chromeos::kNotificationAssistantIcon,
-          message_center::SystemNotificationWarningLevel::NORMAL);
-
-  system_notification->set_renotify(notification.renotify);
-  system_notification->set_pinned(notification.is_pinned);
-
-  switch (notification.priority) {
-    case assistant::AssistantNotificationPriority::kLow:
-      system_notification->set_priority(message_center::LOW_PRIORITY);
-      break;
-    case assistant::AssistantNotificationPriority::kDefault:
-      system_notification->set_priority(message_center::DEFAULT_PRIORITY);
-      break;
-    case assistant::AssistantNotificationPriority::kHigh:
-      system_notification->set_priority(message_center::HIGH_PRIORITY);
-      break;
-  }
-
-  return system_notification;
-}
-
-message_center::NotifierId GetNotifierId() {
-  return message_center::NotifierId(
-      message_center::NotifierType::SYSTEM_COMPONENT, kNotifierId,
-      NotificationCatalogName::kAssistantNotification);
-}
-
-bool IsValidActionUrl(const GURL& action_url) {
-  return action_url.is_valid() && (action_url.SchemeIsHTTPOrHTTPS() ||
-                                   assistant::util::IsDeepLinkUrl(action_url));
-}
-
-}  // namespace
-
-// AssistantNotificationControllerImpl
-// ---------------------------------------------
-
-AssistantNotificationControllerImpl::AssistantNotificationControllerImpl()
-    : expiry_monitor_(this), notifier_id_(GetNotifierId()) {
-  model_.AddObserver(this);
-  message_center::MessageCenter::Get()->AddObserver(this);
-}
-
-AssistantNotificationControllerImpl::~AssistantNotificationControllerImpl() {
-  message_center::MessageCenter::Get()->RemoveObserver(this);
-  model_.RemoveObserver(this);
-}
-
-void AssistantNotificationControllerImpl::SetAssistant(
-    assistant::Assistant* assistant) {
-  receiver_.reset();
-
-  assistant_ = assistant;
-
-  if (assistant)
-    receiver_.Bind(assistant_->GetPendingNotificationDelegate());
-}
-
-// AssistantNotificationController --------------------------------------
-
-void AssistantNotificationControllerImpl::RemoveNotificationById(
-    const std::string& id,
-    bool from_server) {
-  model_.RemoveNotificationById(id, from_server);
-}
-
-void AssistantNotificationControllerImpl::SetQuietMode(bool enabled) {
-  message_center::MessageCenter::Get()->SetQuietMode(enabled);
-}
-
-// NotificationDelegate ------------------------------------------------------
-
-void AssistantNotificationControllerImpl::AddOrUpdateNotification(
-    AssistantNotification notification) {
-  model_.AddOrUpdateNotification(std::move(notification));
-}
-
-void AssistantNotificationControllerImpl::RemoveNotificationByGroupingKey(
-    const std::string& grouping_key,
-    bool from_server) {
-  model_.RemoveNotificationsByGroupingKey(grouping_key, from_server);
-}
-
-void AssistantNotificationControllerImpl::RemoveAllNotifications(
-    bool from_server) {
-  model_.RemoveAllNotifications(from_server);
-}
-
-// AssistantNotificationModelObserver ------------------------------------------
-
-void AssistantNotificationControllerImpl::OnNotificationAdded(
-    const AssistantNotification& notification) {
-  // Do not show system notifications if the setting is disabled.
-  if (!AssistantState::Get()->notification_enabled().value_or(true))
-    return;
-
-  message_center::MessageCenter::Get()->AddNotification(
-      CreateSystemNotification(notifier_id_, notification));
-}
-
-void AssistantNotificationControllerImpl::OnNotificationUpdated(
-    const AssistantNotification& notification) {
-  // Do not show system notifications if the setting is disabled.
-  if (!AssistantState::Get()->notification_enabled().value_or(true))
-    return;
-
-  message_center::MessageCenter::Get()->UpdateNotification(
-      notification.client_id,
-      CreateSystemNotification(notifier_id_, notification));
-}
-
-void AssistantNotificationControllerImpl::OnNotificationRemoved(
-    const AssistantNotification& notification,
-    bool from_server) {
-  // Remove the notification from the message center.
-  message_center::MessageCenter::Get()->RemoveNotification(
-      notification.client_id, /*by_user=*/false);
-
-  // Dismiss the notification on the server to sync across devices.
-  if (!from_server && AssistantState::Get()->assistant_status() ==
-                          assistant::AssistantStatus::READY) {
-    assistant_->DismissNotification(notification);
-  }
-}
-
-void AssistantNotificationControllerImpl::OnAllNotificationsRemoved(
-    bool from_server) {
-  message_center::MessageCenter::Get()->RemoveNotificationsForNotifierId(
-      notifier_id_);
-}
-
-// message_center::MessageCenterObserver ---------------------------------------
-
-void AssistantNotificationControllerImpl::OnNotificationClicked(
-    const std::string& id,
-    const std::optional<int>& button_index,
-    const std::optional<std::u16string>& reply) {
-  const AssistantNotification* notification = model_.GetNotificationById(id);
-  if (!notification)
-    return;
-
-  const auto& action_url =
-      button_index.has_value()
-          ? notification->buttons[button_index.value()].action_url
-          : notification->action_url;
-
-  // Open the action url if it is valid.
-  if (IsValidActionUrl(action_url)) {
-    // NOTE: We copy construct a new GURL as our |notification| may be destroyed
-    // during the OpenUrl() sequence leaving |action_url| in a bad state.
-    AssistantController::Get()->OpenUrl(GURL(action_url));
-
-    const bool remove_notification =
-        button_index.has_value() ? notification->buttons[button_index.value()]
-                                       .remove_notification_on_click
-                                 : notification->remove_on_click;
-
-    if (remove_notification)
-      model_.RemoveNotificationById(id, /*from_server=*/false);
-    return;
-  }
-
-  if (!notification->from_server)
-    return;
-
-  // If the notification is from the server, we retrieve the notification
-  // payload using the following indexing scheme:
-  //
-  // Index:  |    [0]    |   [1]    |   [2]    | ...
-  // -------------------------------------------------
-  // Action: | Top Level | Button 1 | Button 2 | ...
-  const int action_index = button_index.value_or(-1) + 1;
-  if (AssistantState::Get()->assistant_status() ==
-      assistant::AssistantStatus::READY) {
-    assistant_->RetrieveNotification(*notification, action_index);
-  }
-}
-
-void AssistantNotificationControllerImpl::OnNotificationRemoved(
-    const std::string& notification_id,
-    bool by_user) {
-  // Update our notification model to remain in sync w/ Message Center.
-  if (model_.GetNotificationById(notification_id))
-    model_.RemoveNotificationById(notification_id, /*from_server=*/false);
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_notification_controller_impl.h b/ash/assistant/assistant_notification_controller_impl.h
deleted file mode 100644
index c92ed15..0000000
--- a/ash/assistant/assistant_notification_controller_impl.h
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_NOTIFICATION_CONTROLLER_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_NOTIFICATION_CONTROLLER_IMPL_H_
-
-#include <string>
-
-#include "ash/ash_export.h"
-#include "ash/assistant/assistant_notification_expiry_monitor.h"
-#include "ash/assistant/model/assistant_notification_model.h"
-#include "ash/assistant/model/assistant_notification_model_observer.h"
-#include "ash/public/cpp/assistant/controller/assistant_notification_controller.h"
-#include "base/memory/raw_ptr.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-#include "chromeos/ash/services/libassistant/public/cpp/assistant_notification.h"
-#include "chromeos/ash/services/libassistant/public/mojom/notification_delegate.mojom.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-#include "ui/message_center/message_center_observer.h"
-#include "ui/message_center/public/cpp/notifier_id.h"
-
-namespace ash {
-
-// The class to manage Assistant notifications.
-class ASH_EXPORT AssistantNotificationControllerImpl
-    : public AssistantNotificationController,
-      public AssistantNotificationModelObserver,
-      public message_center::MessageCenterObserver,
-      public libassistant::mojom::NotificationDelegate {
- public:
-  using AssistantNotification = assistant::AssistantNotification;
-
-  AssistantNotificationControllerImpl();
-
-  AssistantNotificationControllerImpl(
-      const AssistantNotificationControllerImpl&) = delete;
-  AssistantNotificationControllerImpl& operator=(
-      const AssistantNotificationControllerImpl&) = delete;
-
-  ~AssistantNotificationControllerImpl() override;
-
-  // Returns the underlying model.
-  const AssistantNotificationModel* model() const { return &model_; }
-
-  // Provides a pointer to the |assistant| owned by AssistantController.
-  void SetAssistant(assistant::Assistant* assistant);
-
-  // AssistantNotificationController:
-  void RemoveNotificationById(const std::string& id, bool from_server) override;
-  void SetQuietMode(bool enabled) override;
-
-  // libassistant::mojom::NotificationDelegate:
-  void AddOrUpdateNotification(AssistantNotification notification) override;
-  void RemoveNotificationByGroupingKey(const std::string& grouping_id,
-                                       bool from_server) override;
-  void RemoveAllNotifications(bool from_server) override;
-
-  // AssistantNotificationModelObserver:
-  void OnNotificationAdded(const AssistantNotification& notification) override;
-  void OnNotificationUpdated(
-      const AssistantNotification& notification) override;
-  void OnNotificationRemoved(const AssistantNotification& notification,
-                             bool from_server) override;
-  void OnAllNotificationsRemoved(bool from_server) override;
-
-  // message_center::MessageCenterObserver:
-  void OnNotificationAdded(const std::string& id) override {}
-  void OnNotificationClicked(
-      const std::string& id,
-      const std::optional<int>& button_index,
-      const std::optional<std::u16string>& reply) override;
-  void OnNotificationUpdated(const std::string& notification) override {}
-  void OnNotificationRemoved(const std::string& notification_id,
-                             bool by_user) override;
-
- private:
-  AssistantNotificationModel model_;
-  AssistantNotificationExpiryMonitor expiry_monitor_;
-
-  // Owned by AssistantService
-  raw_ptr<assistant::Assistant> assistant_ = nullptr;
-
-  const message_center::NotifierId notifier_id_;
-
-  mojo::Receiver<libassistant::mojom::NotificationDelegate> receiver_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_NOTIFICATION_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_notification_expiry_monitor.cc b/ash/assistant/assistant_notification_expiry_monitor.cc
deleted file mode 100644
index cb2c823..0000000
--- a/ash/assistant/assistant_notification_expiry_monitor.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_notification_expiry_monitor.h"
-
-#include <algorithm>
-
-#include "ash/assistant/assistant_notification_controller_impl.h"
-#include "ash/assistant/model/assistant_notification_model.h"
-#include "ash/assistant/model/assistant_notification_model_observer.h"
-#include "base/functional/bind.h"
-#include "base/memory/raw_ptr.h"
-#include "base/time/time.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-
-namespace ash {
-
-namespace {
-
-bool HasExpired(const AssistantNotificationExpiryMonitor::AssistantNotification*
-                    notification) {
-  return notification->expiry_time.has_value() &&
-         (notification->expiry_time.value() <= base::Time::Now());
-}
-
-// Returns the minimum of the base::Time instances that actually have a value.
-std::optional<base::Time> Min(std::optional<base::Time> left,
-                              std::optional<base::Time> right) {
-  if (!left.has_value())
-    return right;
-
-  if (!right.has_value())
-    return left;
-
-  return std::min(left.value(), right.value());
-}
-
-}  // namespace
-
-class AssistantNotificationExpiryMonitor::Observer
-    : public AssistantNotificationModelObserver {
- public:
-  explicit Observer(AssistantNotificationExpiryMonitor* monitor)
-      : monitor_(monitor) {}
-
-  Observer(const Observer&) = delete;
-  Observer& operator=(const Observer&) = delete;
-
-  ~Observer() override = default;
-
-  void OnNotificationAdded(const AssistantNotification& notification) override {
-    monitor_->UpdateTimer();
-  }
-
-  void OnNotificationUpdated(
-      const AssistantNotification& notification) override {
-    monitor_->UpdateTimer();
-  }
-
-  void OnNotificationRemoved(const AssistantNotification& notification,
-                             bool from_server) override {
-    monitor_->UpdateTimer();
-  }
-
-  void OnAllNotificationsRemoved(bool from_server) override {
-    monitor_->UpdateTimer();
-  }
-
- private:
-  const raw_ptr<AssistantNotificationExpiryMonitor> monitor_;
-};
-
-AssistantNotificationExpiryMonitor::AssistantNotificationExpiryMonitor(
-    AssistantNotificationControllerImpl* controller)
-    : controller_(controller), observer_(std::make_unique<Observer>(this)) {
-  DCHECK(controller_);
-  controller_->model()->AddObserver(observer_.get());
-}
-
-AssistantNotificationExpiryMonitor::~AssistantNotificationExpiryMonitor() =
-    default;
-
-void AssistantNotificationExpiryMonitor::UpdateTimer() {
-  std::optional<base::TimeDelta> timeout = GetTimerTimeout();
-  if (timeout) {
-    timer_.Start(
-        FROM_HERE, timeout.value(),
-        base::BindOnce(
-            &AssistantNotificationExpiryMonitor::RemoveExpiredNotifications,
-            base::Unretained(this)));
-  } else {
-    timer_.Stop();
-  }
-}
-
-std::optional<base::TimeDelta>
-AssistantNotificationExpiryMonitor::GetTimerTimeout() const {
-  std::optional<base::Time> endtime = GetTimerEndTime();
-  if (endtime)
-    return endtime.value() - base::Time::Now();
-  return std::nullopt;
-}
-
-std::optional<base::Time> AssistantNotificationExpiryMonitor::GetTimerEndTime()
-    const {
-  std::optional<base::Time> result = std::nullopt;
-  for (const AssistantNotification* notification : GetNotifications())
-    result = Min(result, notification->expiry_time);
-  return result;
-}
-
-void AssistantNotificationExpiryMonitor::RemoveExpiredNotifications() {
-  for (const NotificationId& id : GetExpiredNotifications()) {
-    VLOG(1) << "Removing expired notification '" << id << "'";
-    controller_->RemoveNotificationById(id, /*from_server=*/false);
-  }
-
-  UpdateTimer();
-}
-
-std::vector<AssistantNotificationExpiryMonitor::NotificationId>
-AssistantNotificationExpiryMonitor::GetExpiredNotifications() const {
-  std::vector<NotificationId> result;
-  for (const AssistantNotification* notification : GetNotifications()) {
-    if (HasExpired(notification))
-      result.push_back(notification->client_id);
-  }
-  return result;
-}
-
-std::vector<const AssistantNotificationExpiryMonitor::AssistantNotification*>
-AssistantNotificationExpiryMonitor::GetNotifications() const {
-  return controller_->model()->GetNotifications();
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_notification_expiry_monitor.h b/ash/assistant/assistant_notification_expiry_monitor.h
deleted file mode 100644
index 34d6355..0000000
--- a/ash/assistant/assistant_notification_expiry_monitor.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
-#define ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
-
-#include <memory>
-#include <optional>
-#include <string>
-#include <vector>
-
-#include "ash/assistant/model/assistant_notification_model_observer.h"
-#include "base/memory/raw_ptr.h"
-#include "base/timer/timer.h"
-
-namespace ash {
-
-class AssistantNotificationControllerImpl;
-
-// Will track all Assistant notifications by subscribing to the given
-// |controller| and will call
-// |AssistantNotificationController::RemoveNotificationById| when the
-// notification expires (i.e. when the current time passes the value in the
-// expiry_time| field).
-class AssistantNotificationExpiryMonitor {
- public:
-  using AssistantNotification = assistant::AssistantNotification;
-
-  explicit AssistantNotificationExpiryMonitor(
-      AssistantNotificationControllerImpl* controller);
-
-  AssistantNotificationExpiryMonitor(
-      const AssistantNotificationExpiryMonitor&) = delete;
-  AssistantNotificationExpiryMonitor& operator=(
-      const AssistantNotificationExpiryMonitor&) = delete;
-
-  ~AssistantNotificationExpiryMonitor();
-
- private:
-  using NotificationId = std::string;
-  class Observer;
-
-  // Start/stop the timer waiting for the next expiry time.
-  // If the timer is already running this will start a new timer with the
-  // (new) expiry time that will expire first.
-  void UpdateTimer();
-
-  std::optional<base::TimeDelta> GetTimerTimeout() const;
-  std::optional<base::Time> GetTimerEndTime() const;
-  void RemoveExpiredNotifications();
-  std::vector<NotificationId> GetExpiredNotifications() const;
-  std::vector<const AssistantNotification*> GetNotifications() const;
-
-  base::OneShotTimer timer_;
-  const raw_ptr<AssistantNotificationControllerImpl> controller_;
-  std::unique_ptr<Observer> observer_;
-};
-
-}  // namespace ash
-#endif  // ASH_ASSISTANT_ASSISTANT_NOTIFICATION_EXPIRY_MONITOR_H_
diff --git a/ash/assistant/assistant_setup_controller.cc b/ash/assistant/assistant_setup_controller.cc
deleted file mode 100644
index a15003b..0000000
--- a/ash/assistant/assistant_setup_controller.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_setup_controller.h"
-
-#include "ash/assistant/assistant_controller_impl.h"
-#include "ash/assistant/util/deep_link_util.h"
-#include "ash/assistant/util/i18n_util.h"
-#include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
-#include "base/functional/bind.h"
-#include "base/functional/callback_helpers.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/ash/services/assistant/public/cpp/features.h"
-
-namespace {
-
-constexpr char kGSuiteAdministratorInstructionsUrl[] =
-    "https://support.google.com/a/answer/6304876";
-
-}  // namespace
-
-namespace ash {
-
-AssistantSetupController::AssistantSetupController(
-    AssistantControllerImpl* assistant_controller)
-    : assistant_controller_(assistant_controller) {
-  assistant_controller_observation_.Observe(AssistantController::Get());
-}
-
-AssistantSetupController::~AssistantSetupController() = default;
-
-void AssistantSetupController::OnAssistantControllerConstructed() {
-  assistant_controller_->view_delegate()->AddObserver(this);
-}
-
-void AssistantSetupController::OnAssistantControllerDestroying() {
-  assistant_controller_->view_delegate()->RemoveObserver(this);
-}
-
-void AssistantSetupController::OnDeepLinkReceived(
-    assistant::util::DeepLinkType type,
-    const std::map<std::string, std::string>& params) {
-  if (type != assistant::util::DeepLinkType::kOnboarding)
-    return;
-
-  std::optional<bool> relaunch = assistant::util::GetDeepLinkParamAsBool(
-      params, assistant::util::DeepLinkParam::kRelaunch);
-
-  StartOnboarding(relaunch.value_or(false));
-}
-
-void AssistantSetupController::OnOptInButtonPressed() {
-  using assistant::prefs::ConsentStatus;
-  if (AssistantState::Get()->consent_status().value_or(
-          ConsentStatus::kUnknown) == ConsentStatus::kUnauthorized) {
-    AssistantController::Get()->OpenUrl(assistant::util::CreateLocalizedGURL(
-        kGSuiteAdministratorInstructionsUrl));
-  } else {
-    StartOnboarding(/*relaunch=*/true);
-  }
-}
-
-void AssistantSetupController::StartOnboarding(bool relaunch, FlowType type) {
-  auto* assistant_setup = AssistantSetup::GetInstance();
-  if (!assistant_setup)
-    return;
-
-  AssistantUiController::Get()->CloseUi(assistant::AssistantExitPoint::kSetup);
-
-  assistant_setup->StartAssistantOptInFlow(
-      type, base::BindOnce(&AssistantSetupController::OnOptInFlowFinished,
-                           weak_ptr_factory_.GetWeakPtr(), relaunch));
-}
-
-void AssistantSetupController::OnOptInFlowFinished(bool relaunch,
-                                                   bool completed) {
-  if (relaunch && completed) {
-    AssistantUiController::Get()->ShowUi(
-        assistant::AssistantEntryPoint::kSetup);
-  }
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_setup_controller.h b/ash/assistant/assistant_setup_controller.h
deleted file mode 100644
index f597638..0000000
--- a/ash/assistant/assistant_setup_controller.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_SETUP_CONTROLLER_H_
-#define ASH_ASSISTANT_ASSISTANT_SETUP_CONTROLLER_H_
-
-#include <map>
-#include <string>
-
-#include "ash/assistant/ui/assistant_view_delegate.h"
-#include "ash/public/cpp/assistant/assistant_setup.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "base/scoped_observation.h"
-
-namespace ash {
-
-class AssistantControllerImpl;
-
-class AssistantSetupController : public AssistantControllerObserver,
-                                 public AssistantViewDelegateObserver {
- public:
-  explicit AssistantSetupController(
-      AssistantControllerImpl* assistant_controller);
-
-  AssistantSetupController(const AssistantSetupController&) = delete;
-  AssistantSetupController& operator=(const AssistantSetupController&) = delete;
-
-  ~AssistantSetupController() override;
-
-  // AssistantControllerObserver:
-  void OnAssistantControllerConstructed() override;
-  void OnAssistantControllerDestroying() override;
-  void OnDeepLinkReceived(
-      assistant::util::DeepLinkType type,
-      const std::map<std::string, std::string>& params) override;
-
-  // AssistantViewDelegateObserver:
-  void OnOptInButtonPressed() override;
-
-  void StartOnboarding(bool relaunch, FlowType type = FlowType::kConsentFlow);
-
- private:
-  void OnOptInFlowFinished(bool relaunch, bool completed);
-
-  const raw_ptr<AssistantControllerImpl>
-      assistant_controller_;  // Owned by Shell.
-
-  base::ScopedObservation<AssistantController, AssistantControllerObserver>
-      assistant_controller_observation_{this};
-
-  base::WeakPtrFactory<AssistantSetupController> weak_ptr_factory_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_SETUP_CONTROLLER_H_
diff --git a/ash/assistant/assistant_state_controller.cc b/ash/assistant/assistant_state_controller.cc
deleted file mode 100644
index 2de95d6..0000000
--- a/ash/assistant/assistant_state_controller.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_state_controller.h"
-
-#include "ash/session/session_controller_impl.h"
-#include "ash/shell.h"
-
-namespace ash {
-
-AssistantStateController::AssistantStateController()
-    : session_observer_(this) {}
-
-AssistantStateController::~AssistantStateController() = default;
-
-void AssistantStateController::OnActiveUserPrefServiceChanged(
-    PrefService* pref_service) {
-  // For non-primary prefs, calling the method with nullptr will reset the
-  // current registry.
-  PrefService* primary_user_prefs =
-      Shell::Get()->session_controller()->GetPrimaryUserPrefService();
-  RegisterPrefChanges(primary_user_prefs == pref_service ? primary_user_prefs
-                                                         : nullptr);
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_state_controller.h b/ash/assistant/assistant_state_controller.h
deleted file mode 100644
index 83998e3..0000000
--- a/ash/assistant/assistant_state_controller.h
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_STATE_CONTROLLER_H_
-#define ASH_ASSISTANT_ASSISTANT_STATE_CONTROLLER_H_
-
-#include "ash/ash_export.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/session/session_observer.h"
-
-namespace ash {
-
-// Provide access of Assistant related prefs and states to the clients.
-class ASH_EXPORT AssistantStateController : public AssistantState,
-                                            public SessionObserver {
- public:
-  AssistantStateController();
-
-  AssistantStateController(const AssistantStateController&) = delete;
-  AssistantStateController& operator=(const AssistantStateController&) = delete;
-
-  ~AssistantStateController() override;
-
- private:
-  // SessionObserver:
-  void OnActiveUserPrefServiceChanged(PrefService* pref_service) override;
-
-  ScopedSessionObserver session_observer_;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_STATE_CONTROLLER_H_
diff --git a/ash/assistant/assistant_suggestions_controller_impl.cc b/ash/assistant/assistant_suggestions_controller_impl.cc
deleted file mode 100644
index 281b5261..0000000
--- a/ash/assistant/assistant_suggestions_controller_impl.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_suggestions_controller_impl.h"
-
-#include <algorithm>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "ash/assistant/model/assistant_ui_model.h"
-#include "ash/assistant/util/assistant_util.h"
-#include "ash/assistant/util/deep_link_util.h"
-#include "ash/assistant/util/resource_util.h"
-#include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
-#include "ash/shell.h"
-#include "ash/strings/grit/ash_strings.h"
-#include "base/functional/bind.h"
-#include "base/rand_util.h"
-#include "base/unguessable_token.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/ash/services/assistant/public/cpp/features.h"
-#include "chromeos/ash/services/libassistant/public/cpp/assistant_suggestion.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace ash {
-
-namespace {
-
-using assistant::AssistantSuggestion;
-using assistant::AssistantSuggestionType;
-using assistant::prefs::AssistantOnboardingMode;
-
-// Conversation starters -------------------------------------------------------
-
-constexpr int kMaxNumOfConversationStarters = 3;
-
-}  // namespace
-
-// AssistantSuggestionsControllerImpl ------------------------------------------
-
-AssistantSuggestionsControllerImpl::AssistantSuggestionsControllerImpl() {
-  UpdateConversationStarters();
-  assistant_controller_observation_.Observe(AssistantController::Get());
-}
-
-AssistantSuggestionsControllerImpl::~AssistantSuggestionsControllerImpl() =
-    default;
-
-const AssistantSuggestionsModel* AssistantSuggestionsControllerImpl::GetModel()
-    const {
-  return &model_;
-}
-
-void AssistantSuggestionsControllerImpl::OnAssistantControllerConstructed() {
-  AssistantUiController::Get()->GetModel()->AddObserver(this);
-  AssistantState::Get()->AddObserver(this);
-}
-
-void AssistantSuggestionsControllerImpl::OnAssistantControllerDestroying() {
-  AssistantState::Get()->RemoveObserver(this);
-  AssistantUiController::Get()->GetModel()->RemoveObserver(this);
-}
-
-void AssistantSuggestionsControllerImpl::OnUiVisibilityChanged(
-    AssistantVisibility new_visibility,
-    AssistantVisibility old_visibility,
-    std::optional<AssistantEntryPoint> entry_point,
-    std::optional<AssistantExitPoint> exit_point) {
-  // When Assistant is finishing a session, we update our cache of conversation
-  // starters so that they're fresh for the next launch.
-  if (assistant::util::IsFinishingSession(new_visibility))
-    UpdateConversationStarters();
-}
-
-void AssistantSuggestionsControllerImpl::OnAssistantContextEnabled(
-    bool enabled) {
-  // We currently assume that the context setting is not being modified while
-  // Assistant UI is visible.
-  DCHECK_NE(AssistantVisibility::kVisible,
-            AssistantUiController::Get()->GetModel()->visibility());
-  UpdateConversationStarters();
-}
-
-void AssistantSuggestionsControllerImpl::OnAssistantOnboardingModeChanged(
-    AssistantOnboardingMode onboarding_mode) {
-  UpdateOnboardingSuggestions();
-}
-
-void AssistantSuggestionsControllerImpl::UpdateConversationStarters() {
-  std::vector<AssistantSuggestion> conversation_starters;
-
-  // Adds a conversation starter for the given |message_id| and |action_url|.
-  auto AddConversationStarter = [&conversation_starters](
-                                    int message_id, GURL action_url = GURL()) {
-    AssistantSuggestion starter;
-    starter.id = base::UnguessableToken::Create();
-    starter.type = AssistantSuggestionType::kConversationStarter;
-    starter.text = l10n_util::GetStringUTF8(message_id);
-    starter.action_url = action_url;
-    conversation_starters.push_back(std::move(starter));
-  };
-
-  // Always show the "What can you do?" conversation starter.
-  AddConversationStarter(IDS_ASH_ASSISTANT_CHIP_WHAT_CAN_YOU_DO);
-
-  // The rest of the conversation starters will be shuffled...
-  std::vector<int> shuffled_message_ids;
-
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_IM_BORED);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_OPEN_FILES);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_PLAY_MUSIC);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_SEND_AN_EMAIL);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_SET_A_REMINDER);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_TELL_ME_A_JOKE);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_WHATS_ON_MY_CALENDAR);
-  shuffled_message_ids.push_back(IDS_ASH_ASSISTANT_CHIP_WHATS_THE_WEATHER);
-
-  base::RandomShuffle(shuffled_message_ids.begin(), shuffled_message_ids.end());
-
-  // ...and added until we have no more than |kMaxNumOfConversationStarters|.
-  for (int i = 0;
-       conversation_starters.size() < kMaxNumOfConversationStarters &&
-       i < static_cast<int>(shuffled_message_ids.size());
-       ++i) {
-    AddConversationStarter(shuffled_message_ids[i]);
-  }
-
-  model_.SetConversationStarters(std::move(conversation_starters));
-}
-
-void AssistantSuggestionsControllerImpl::UpdateOnboardingSuggestions() {
-  auto CreateIconResourceLink = [](int message_id) {
-    switch (message_id) {
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_CONVERSION:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kConversionPath);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_KNOWLEDGE:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kPersonPinCircle);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_KNOWLEDGE_EDU:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kStraighten);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_LANGUAGE:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kTranslate);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_MATH:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kCalculate);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_PERSONALITY:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kSentimentVerySatisfied);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_PRODUCTIVITY:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kTimer);
-      case IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_TECHNICAL:
-        return assistant::util::CreateIconResourceLink(
-            assistant::util::IconName::kScreenshot);
-      default:
-        NOTREACHED();
-    }
-  };
-
-  std::vector<AssistantSuggestion> onboarding_suggestions;
-
-  using assistant::AssistantBetterOnboardingType;
-  auto AddSuggestion = [&CreateIconResourceLink, &onboarding_suggestions](
-                           int message_id, AssistantBetterOnboardingType type) {
-    onboarding_suggestions.emplace_back();
-    auto& suggestion = onboarding_suggestions.back();
-    suggestion.id = base::UnguessableToken::Create();
-    suggestion.type = AssistantSuggestionType::kBetterOnboarding;
-    suggestion.better_onboarding_type = type;
-    suggestion.text = l10n_util::GetStringUTF8(message_id);
-    suggestion.icon_url = CreateIconResourceLink(message_id);
-    suggestion.action_url = GURL();
-  };
-
-  switch (AssistantState::Get()->onboarding_mode().value_or(
-      AssistantOnboardingMode::kDefault)) {
-    case AssistantOnboardingMode::kEducation:
-      AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_MATH,
-                    AssistantBetterOnboardingType::kMath);
-      AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_KNOWLEDGE_EDU,
-                    AssistantBetterOnboardingType::kKnowledgeEdu);
-      break;
-    case AssistantOnboardingMode::kDefault:
-      AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_CONVERSION,
-                    AssistantBetterOnboardingType::kConversion);
-      AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_KNOWLEDGE,
-                    AssistantBetterOnboardingType::kKnowledge);
-      break;
-  }
-
-  AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_PRODUCTIVITY,
-                AssistantBetterOnboardingType::kProductivity);
-  AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_PERSONALITY,
-                AssistantBetterOnboardingType::kPersonality);
-  AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_LANGUAGE,
-                AssistantBetterOnboardingType::kLanguage);
-  AddSuggestion(IDS_ASH_ASSISTANT_ONBOARDING_SUGGESTION_TECHNICAL,
-                AssistantBetterOnboardingType::kTechnical);
-
-  model_.SetOnboardingSuggestions(std::move(onboarding_suggestions));
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_suggestions_controller_impl.h b/ash/assistant/assistant_suggestions_controller_impl.h
deleted file mode 100644
index d7de226..0000000
--- a/ash/assistant/assistant_suggestions_controller_impl.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_IMPL_H_
-
-#include "ash/assistant/model/assistant_suggestions_model.h"
-#include "ash/assistant/model/assistant_ui_model_observer.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "ash/public/cpp/assistant/controller/assistant_suggestions_controller.h"
-#include "base/scoped_observation.h"
-
-namespace ash {
-
-// The implementation of the Assistant controller in charge of suggestions.
-class AssistantSuggestionsControllerImpl
-    : public AssistantSuggestionsController,
-      public AssistantControllerObserver,
-      public AssistantUiModelObserver,
-      public AssistantStateObserver {
- public:
-  AssistantSuggestionsControllerImpl();
-
-  AssistantSuggestionsControllerImpl(
-      const AssistantSuggestionsControllerImpl&) = delete;
-  AssistantSuggestionsControllerImpl& operator=(
-      const AssistantSuggestionsControllerImpl&) = delete;
-
-  ~AssistantSuggestionsControllerImpl() override;
-
-  // AssistantSuggestionsController:
-  const AssistantSuggestionsModel* GetModel() const override;
-
-  // AssistantControllerObserver:
-  void OnAssistantControllerConstructed() override;
-  void OnAssistantControllerDestroying() override;
-
-  // AssistantUiModelObserver:
-  void OnUiVisibilityChanged(
-      AssistantVisibility new_visibility,
-      AssistantVisibility old_visibility,
-      std::optional<AssistantEntryPoint> entry_point,
-      std::optional<AssistantExitPoint> exit_point) override;
-
- private:
-  // AssistantStateObserver:
-  void OnAssistantContextEnabled(bool enabled) override;
-  void OnAssistantOnboardingModeChanged(
-      assistant::prefs::AssistantOnboardingMode onboarding_mode) override;
-
-  void UpdateConversationStarters();
-  void UpdateOnboardingSuggestions();
-
-  AssistantSuggestionsModel model_;
-
-  base::ScopedObservation<AssistantController, AssistantControllerObserver>
-      assistant_controller_observation_{this};
-
-  // A WeakPtrFactory used to manage lifecycle of conversation starter requests
-  // to the server (via the dedicated ConversationStartersClient).
-  base::WeakPtrFactory<AssistantSuggestionsControllerImpl>
-      conversation_starters_weak_factory_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_SUGGESTIONS_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_ui_controller_impl.cc b/ash/assistant/assistant_ui_controller_impl.cc
deleted file mode 100644
index 61fd2225..0000000
--- a/ash/assistant/assistant_ui_controller_impl.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_ui_controller_impl.h"
-
-#include <optional>
-
-#include "ash/assistant/assistant_controller_impl.h"
-#include "ash/assistant/model/assistant_interaction_model.h"
-#include "ash/assistant/ui/assistant_ui_constants.h"
-#include "ash/assistant/util/assistant_util.h"
-#include "ash/assistant/util/deep_link_util.h"
-#include "ash/assistant/util/histogram_util.h"
-#include "ash/constants/ash_pref_names.h"
-#include "ash/constants/notifier_catalogs.h"
-#include "ash/public/cpp/assistant/assistant_setup.h"
-#include "ash/public/cpp/assistant/assistant_state.h"
-#include "ash/public/cpp/assistant/controller/assistant_interaction_controller.h"
-#include "ash/public/cpp/system/toast_data.h"
-#include "ash/session/session_controller_impl.h"
-#include "ash/shell.h"
-#include "ash/strings/grit/ash_strings.h"
-#include "ash/system/toast/toast_manager_impl.h"
-#include "base/functional/bind.h"
-#include "base/metrics/histogram_functions.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_browser_delegate.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
-#include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
-#include "chromeos/ash/services/assistant/public/cpp/features.h"
-#include "components/prefs/pref_registry_simple.h"
-#include "components/prefs/pref_service.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace ash {
-
-namespace {
-
-// Helpers ---------------------------------------------------------------------
-
-PrefService* pref_service() {
-  auto* result =
-      Shell::Get()->session_controller()->GetPrimaryUserPrefService();
-  DCHECK(result);
-  return result;
-}
-
-// Toast -----------------------------------------------------------------------
-
-constexpr char kUnboundServiceToastId[] =
-    "assistant_controller_unbound_service";
-
-void ShowToast(const std::string& id,
-               ToastCatalogName catalog_name,
-               int message_id) {
-  ToastData toast(id, catalog_name, l10n_util::GetStringUTF16(message_id));
-  Shell::Get()->toast_manager()->Show(std::move(toast));
-}
-
-}  // namespace
-
-// AssistantUiControllerImpl ---------------------------------------------------
-
-AssistantUiControllerImpl::AssistantUiControllerImpl(
-    AssistantControllerImpl* assistant_controller)
-    : assistant_controller_(assistant_controller) {
-  model_.AddObserver(this);
-  assistant_controller_observation_.Observe(AssistantController::Get());
-  overview_controller_observation_.Observe(Shell::Get()->overview_controller());
-}
-
-AssistantUiControllerImpl::~AssistantUiControllerImpl() {
-  model_.RemoveObserver(this);
-}
-
-void AssistantUiControllerImpl::SetAssistant(assistant::Assistant* assistant) {
-  assistant_ = assistant;
-}
-
-const AssistantUiModel* AssistantUiControllerImpl::GetModel() const {
-  return &model_;
-}
-
-int AssistantUiControllerImpl::GetNumberOfSessionsWhereOnboardingShown() const {
-  return pref_service()->GetInteger(
-      prefs::kAssistantNumSessionsWhereOnboardingShown);
-}
-
-bool AssistantUiControllerImpl::HasShownOnboarding() const {
-  return has_shown_onboarding_;
-}
-
-void AssistantUiControllerImpl::SetKeyboardTraversalMode(
-    bool keyboard_traversal_mode) {
-  model_.SetKeyboardTraversalMode(keyboard_traversal_mode);
-}
-
-void AssistantUiControllerImpl::ShowUi(AssistantEntryPoint entry_point) {
-  // TODO: crbug.com/417538592 - open Gemini PWA via AppList and delete
-  // dependency to AssistantBrowserDelegate.
-  if (ash::assistant::features::IsNewEntryPointEnabled()) {
-    assistant::AssistantBrowserDelegate::Get()->OpenNewEntryPoint();
-    return;
-  }
-
-  // Skip if the opt-in window is active.
-  auto* assistant_setup = AssistantSetup::GetInstance();
-  if (assistant_setup && assistant_setup->BounceOptInWindowIfActive())
-    return;
-
-  auto* assistant_state = AssistantState::Get();
-
-  if (!assistant_state->settings_enabled().value_or(false) ||
-      assistant_state->locked_full_screen_enabled().value_or(false)) {
-    return;
-  }
-
-  // TODO(dmblack): Show a more helpful message to the user.
-  if (assistant_state->assistant_status() ==
-      assistant::AssistantStatus::NOT_READY) {
-    ShowUnboundErrorToast();
-    return;
-  }
-
-  if (!assistant_) {
-    ShowUnboundErrorToast();
-    return;
-  }
-
-  model_.SetVisible(entry_point);
-}
-
-std::optional<base::ScopedClosureRunner> AssistantUiControllerImpl::CloseUi(
-    AssistantExitPoint exit_point) {
-  if (model_.visibility() != AssistantVisibility::kVisible)
-    return std::nullopt;
-
-  // Set visibility to `kClosing`.
-  model_.SetClosing(exit_point);
-
-  // When the return value is destroyed, visibility will be set to `kClosed`
-  // provided the visibility change hasn't been invalidated.
-  return base::ScopedClosureRunner(base::BindOnce(
-      [](const base::WeakPtr<AssistantUiControllerImpl>& weak_ptr,
-         assistant::AssistantExitPoint exit_point) {
-        if (weak_ptr)
-          weak_ptr->model_.SetClosed(exit_point);
-      },
-      weak_factory_for_delayed_visibility_changes_.GetWeakPtr(), exit_point));
-}
-
-void AssistantUiControllerImpl::SetAppListBubbleWidth(int width) {
-  model_.SetAppListBubbleWidth(width);
-}
-
-void AssistantUiControllerImpl::ToggleUi(
-    std::optional<AssistantEntryPoint> entry_point,
-    std::optional<AssistantExitPoint> exit_point) {
-  // When not visible, toggling will show the UI.
-  if (model_.visibility() != AssistantVisibility::kVisible) {
-    DCHECK(entry_point.has_value());
-    ShowUi(entry_point.value());
-    return;
-  }
-
-  // Otherwise toggling closes the UI.
-  DCHECK(exit_point.has_value());
-  CloseUi(exit_point.value());
-}
-
-void AssistantUiControllerImpl::OnInteractionStateChanged(
-    InteractionState interaction_state) {
-  if (interaction_state != InteractionState::kActive)
-    return;
-
-  // If there is an active interaction, we need to show Assistant UI if it is
-  // not already showing. We don't have enough information here to know what
-  // the interaction source is.
-  ShowUi(AssistantEntryPoint::kUnspecified);
-}
-
-void AssistantUiControllerImpl::OnAssistantControllerConstructed() {
-  AssistantInteractionController::Get()->GetModel()->AddObserver(this);
-  assistant_controller_->view_delegate()->AddObserver(this);
-}
-
-void AssistantUiControllerImpl::OnAssistantControllerDestroying() {
-  assistant_controller_->view_delegate()->RemoveObserver(this);
-  AssistantInteractionController::Get()->GetModel()->RemoveObserver(this);
-}
-
-void AssistantUiControllerImpl::OnOpeningUrl(const GURL& url,
-                                             bool in_background,
-                                             bool from_server) {
-  if (model_.visibility() != AssistantVisibility::kVisible)
-    return;
-
-  CloseUi(from_server ? AssistantExitPoint::kNewBrowserTabFromServer
-                      : AssistantExitPoint::kNewBrowserTabFromUser);
-}
-
-void AssistantUiControllerImpl::OnUiVisibilityChanged(
-    AssistantVisibility new_visibility,
-    AssistantVisibility old_visibility,
-    std::optional<AssistantEntryPoint> entry_point,
-    std::optional<AssistantExitPoint> exit_point) {
-  weak_factory_for_delayed_visibility_changes_.InvalidateWeakPtrs();
-
-  if (new_visibility == AssistantVisibility::kVisible) {
-    // Only record the entry point when Assistant UI becomes visible.
-    assistant::util::RecordAssistantEntryPoint(entry_point.value());
-  }
-
-  if (old_visibility == AssistantVisibility::kVisible) {
-    // Only record the exit point when Assistant UI becomes invisible to
-    // avoid recording duplicate events (e.g. pressing ESC key).
-    assistant::util::RecordAssistantExitPoint(exit_point.value());
-  }
-}
-
-void AssistantUiControllerImpl::OnOnboardingShown() {
-  if (has_shown_onboarding_)
-    return;
-
-  has_shown_onboarding_ = true;
-
-  // Update the number of user sessions in which Assistant onboarding was shown.
-  pref_service()->SetInteger(prefs::kAssistantNumSessionsWhereOnboardingShown,
-                             GetNumberOfSessionsWhereOnboardingShown() + 1);
-}
-
-void AssistantUiControllerImpl::OnOverviewModeWillStart() {
-  // Close Assistant UI before entering overview mode.
-  CloseUi(AssistantExitPoint::kOverviewMode);
-}
-
-void AssistantUiControllerImpl::ShowUnboundErrorToast() {
-  ShowToast(kUnboundServiceToastId, ToastCatalogName::kAssistantUnboundService,
-            IDS_ASH_ASSISTANT_ERROR_GENERIC);
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_ui_controller_impl.h b/ash/assistant/assistant_ui_controller_impl.h
deleted file mode 100644
index c229a66..0000000
--- a/ash/assistant/assistant_ui_controller_impl.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_UI_CONTROLLER_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_UI_CONTROLLER_IMPL_H_
-
-#include <optional>
-
-#include "ash/ash_export.h"
-#include "ash/assistant/model/assistant_interaction_model_observer.h"
-#include "ash/assistant/model/assistant_ui_model.h"
-#include "ash/assistant/model/assistant_ui_model_observer.h"
-#include "ash/assistant/ui/assistant_view_delegate.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
-#include "ash/wm/overview/overview_controller.h"
-#include "ash/wm/overview/overview_observer.h"
-#include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
-
-namespace chromeos {
-namespace assistant {
-namespace mojom {
-class Assistant;
-}  // namespace mojom
-}  // namespace assistant
-}  // namespace chromeos
-
-namespace ash {
-
-class AssistantControllerImpl;
-
-class ASH_EXPORT AssistantUiControllerImpl
-    : public AssistantUiController,
-      public AssistantControllerObserver,
-      public AssistantInteractionModelObserver,
-      public AssistantUiModelObserver,
-      public AssistantViewDelegateObserver,
-      public OverviewObserver {
- public:
-  explicit AssistantUiControllerImpl(
-      AssistantControllerImpl* assistant_controller);
-
-  AssistantUiControllerImpl(const AssistantUiControllerImpl&) = delete;
-  AssistantUiControllerImpl& operator=(const AssistantUiControllerImpl&) =
-      delete;
-
-  ~AssistantUiControllerImpl() override;
-
-  // Provides a pointer to the |assistant| owned by AssistantService.
-  void SetAssistant(assistant::Assistant* assistant);
-
-  // AssistantUiController:
-  const AssistantUiModel* GetModel() const override;
-  int GetNumberOfSessionsWhereOnboardingShown() const override;
-  bool HasShownOnboarding() const override;
-  void SetKeyboardTraversalMode(bool keyboard_traversal_mode) override;
-  void ShowUi(AssistantEntryPoint entry_point) override;
-  void ToggleUi(std::optional<AssistantEntryPoint> entry_point,
-                std::optional<AssistantExitPoint> exit_point) override;
-  std::optional<base::ScopedClosureRunner> CloseUi(
-      AssistantExitPoint exit_point) override;
-  void SetAppListBubbleWidth(int width) override;
-
-  // AssistantInteractionModelObserver:
-  void OnInteractionStateChanged(InteractionState interaction_state) override;
-
-  // AssistantControllerObserver:
-  void OnAssistantControllerConstructed() override;
-  void OnAssistantControllerDestroying() override;
-  void OnOpeningUrl(const GURL& url,
-                    bool in_background,
-                    bool from_server) override;
-
-  // AssistantUiModelObserver:
-  void OnUiVisibilityChanged(
-      AssistantVisibility new_visibility,
-      AssistantVisibility old_visibility,
-      std::optional<AssistantEntryPoint> entry_point,
-      std::optional<AssistantExitPoint> exit_point) override;
-
-  // AssistantViewDelegateObserver:
-  void OnOnboardingShown() override;
-
-  // OverviewObserver:
-  void OnOverviewModeWillStart() override;
-
-  void ShowUnboundErrorToast();
-
- private:
-  const raw_ptr<AssistantControllerImpl>
-      assistant_controller_;  // Owned by Shell.
-  AssistantUiModel model_;
-  bool has_shown_onboarding_ = false;
-
-  // Owned by AssistantService.
-  raw_ptr<assistant::Assistant> assistant_ = nullptr;
-
-  base::ScopedObservation<AssistantController, AssistantControllerObserver>
-      assistant_controller_observation_{this};
-
-  base::ScopedObservation<OverviewController, OverviewObserver>
-      overview_controller_observation_{this};
-
-  base::WeakPtrFactory<AssistantUiControllerImpl>
-      weak_factory_for_delayed_visibility_changes_{this};
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_UI_CONTROLLER_IMPL_H_
diff --git a/ash/assistant/assistant_view_delegate_impl.h b/ash/assistant/assistant_view_delegate_impl.h
deleted file mode 100644
index b1e895e..0000000
--- a/ash/assistant/assistant_view_delegate_impl.h
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_VIEW_DELEGATE_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_VIEW_DELEGATE_IMPL_H_
-
-#include <string>
-
-#include "ash/assistant/ui/assistant_view_delegate.h"
-#include "base/memory/raw_ptr.h"
-
-namespace ash {
-
-class AssistantControllerImpl;
-
-class AssistantViewDelegateImpl : public AssistantViewDelegate {
- public:
-  explicit AssistantViewDelegateImpl(
-      AssistantControllerImpl* assistant_controller);
-
-  AssistantViewDelegateImpl(const AssistantViewDelegateImpl&) = delete;
-  AssistantViewDelegateImpl& operator=(const AssistantViewDelegateImpl&) =
-      delete;
-
-  ~AssistantViewDelegateImpl() override;
-
-  // AssistantViewDelegate:
-  const AssistantNotificationModel* GetNotificationModel() const override;
-  void AddObserver(AssistantViewDelegateObserver* observer) override;
-  void RemoveObserver(AssistantViewDelegateObserver* observer) override;
-  void DownloadImage(const GURL& url,
-                     ImageDownloader::DownloadCallback callback) override;
-  ::wm::CursorManager* GetCursorManager() override;
-  std::string GetPrimaryUserGivenName() const override;
-  aura::Window* GetRootWindowForDisplayId(int64_t display_id) override;
-  aura::Window* GetRootWindowForNewWindows() override;
-  bool IsTabletMode() const override;
-  void OnDialogPlateButtonPressed(AssistantButtonId id) override;
-  void OnDialogPlateContentsCommitted(const std::string& text) override;
-  void OnNotificationButtonPressed(const std::string& notification_id,
-                                   int notification_button_index) override;
-  void OnOnboardingShown() override;
-  void OnOptInButtonPressed() override;
-  void OnSuggestionPressed(
-      const base::UnguessableToken& suggestion_id) override;
-  void OnLauncherSearchChipPressed(std::u16string_view query) override;
-
- private:
-  const raw_ptr<AssistantControllerImpl> assistant_controller_;
-  base::ObserverList<AssistantViewDelegateObserver> view_delegate_observers_;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_VIEW_DELEGATE_IMPL_H_
diff --git a/ash/assistant/assistant_web_view_delegate_impl.cc b/ash/assistant/assistant_web_view_delegate_impl.cc
deleted file mode 100644
index 3554922b..0000000
--- a/ash/assistant/assistant_web_view_delegate_impl.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/assistant_web_view_delegate_impl.h"
-
-#include "ash/frame/non_client_frame_view_ash.h"
-#include "chromeos/ui/frame/caption_buttons/caption_button_model.h"
-#include "chromeos/ui/frame/default_frame_header.h"
-#include "ui/views/view_utils.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/window/caption_button_types.h"
-#include "ui/views/window/frame_caption_button.h"
-#include "ui/views/window/non_client_view.h"
-
-namespace ash {
-
-namespace {
-
-class AssistantWebContainerCaptionButtonModel
-    : public chromeos::CaptionButtonModel {
- public:
-  AssistantWebContainerCaptionButtonModel() = default;
-
-  AssistantWebContainerCaptionButtonModel(
-      const AssistantWebContainerCaptionButtonModel&) = delete;
-  AssistantWebContainerCaptionButtonModel& operator=(
-      const AssistantWebContainerCaptionButtonModel&) = delete;
-
-  ~AssistantWebContainerCaptionButtonModel() override = default;
-
-  // CaptionButtonModel:
-  bool IsVisible(views::CaptionButtonIcon type) const override {
-    switch (type) {
-      case views::CAPTION_BUTTON_ICON_CLOSE:
-        return true;
-
-      case views::CAPTION_BUTTON_ICON_BACK:
-        return back_button_visibility_;
-
-      case views::CAPTION_BUTTON_ICON_MINIMIZE:
-      case views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE:
-      case views::CAPTION_BUTTON_ICON_LEFT_TOP_SNAPPED:
-      case views::CAPTION_BUTTON_ICON_RIGHT_BOTTOM_SNAPPED:
-      case views::CAPTION_BUTTON_ICON_MENU:
-      case views::CAPTION_BUTTON_ICON_ZOOM:
-      case views::CAPTION_BUTTON_ICON_LOCATION:
-      case views::CAPTION_BUTTON_ICON_CENTER:
-      case views::CAPTION_BUTTON_ICON_FLOAT:
-      case views::CAPTION_BUTTON_ICON_CUSTOM:
-      case views::CAPTION_BUTTON_ICON_COUNT:
-        return false;
-    }
-  }
-
-  bool IsEnabled(views::CaptionButtonIcon type) const override { return true; }
-
-  bool InZoomMode() const override { return false; }
-
-  void set_back_button_visibility(bool visibility) {
-    back_button_visibility_ = visibility;
-  }
-
- private:
-  bool back_button_visibility_ = false;
-};
-
-}  // namespace
-
-AssistantWebViewDelegateImpl::AssistantWebViewDelegateImpl() = default;
-
-AssistantWebViewDelegateImpl::~AssistantWebViewDelegateImpl() = default;
-
-void AssistantWebViewDelegateImpl::UpdateBackButtonVisibility(
-    views::Widget* widget,
-    bool visibility) {
-  auto caption_button_model =
-      std::make_unique<AssistantWebContainerCaptionButtonModel>();
-  caption_button_model->set_back_button_visibility(visibility);
-
-  auto* non_client_view = widget->non_client_view();
-
-  DCHECK(
-      views::IsViewClass<NonClientFrameViewAsh>(non_client_view->frame_view()));
-
-  auto* frame_view_ash =
-      static_cast<NonClientFrameViewAsh*>(non_client_view->frame_view());
-  frame_view_ash->SetCaptionButtonModel(std::move(caption_button_model));
-
-  if (visibility) {
-    views::FrameCaptionButton* back_button =
-        frame_view_ash->GetHeaderView()->GetFrameHeader()->GetBackButton();
-    back_button->SetPaintAsActive(widget->IsActive());
-  }
-}
-
-}  // namespace ash
diff --git a/ash/assistant/assistant_web_view_delegate_impl.h b/ash/assistant/assistant_web_view_delegate_impl.h
deleted file mode 100644
index 6ceb5372..0000000
--- a/ash/assistant/assistant_web_view_delegate_impl.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_ASSISTANT_WEB_VIEW_DELEGATE_IMPL_H_
-#define ASH_ASSISTANT_ASSISTANT_WEB_VIEW_DELEGATE_IMPL_H_
-
-#include "ash/assistant/ui/assistant_web_view_delegate.h"
-
-namespace ash {
-
-class AssistantWebViewDelegateImpl : public AssistantWebViewDelegate {
- public:
-  AssistantWebViewDelegateImpl();
-
-  AssistantWebViewDelegateImpl(const AssistantWebViewDelegateImpl&) = delete;
-  AssistantWebViewDelegateImpl& operator=(const AssistantWebViewDelegateImpl&) =
-      delete;
-
-  ~AssistantWebViewDelegateImpl() override;
-
-  // AssistantWebViewDelegate:
-  void UpdateBackButtonVisibility(views::Widget* widget,
-                                  bool visibility) override;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_ASSISTANT_WEB_VIEW_DELEGATE_IMPL_H_
diff --git a/ash/assistant/model/BUILD.gn b/ash/assistant/model/BUILD.gn
index cff9ae0..4dd1b60 100644
--- a/ash/assistant/model/BUILD.gn
+++ b/ash/assistant/model/BUILD.gn
@@ -32,18 +32,9 @@
     "assistant_ui_model.cc",
     "assistant_ui_model.h",
     "assistant_ui_model_observer.h",
-    "ui/assistant_card_element.cc",
-    "ui/assistant_card_element.h",
-    "ui/assistant_error_element.cc",
-    "ui/assistant_error_element.h",
-    "ui/assistant_text_element.cc",
-    "ui/assistant_text_element.h",
-    "ui/assistant_ui_element.cc",
-    "ui/assistant_ui_element.h",
   ]
 
   deps = [
-    "//ash/assistant/ui:constants",
     "//ash/public/cpp",
     "//chromeos/ash/services/assistant/public/cpp",
     "//chromeos/ash/services/assistant/public/mojom",
diff --git a/ash/assistant/model/DEPS b/ash/assistant/model/DEPS
index 3bab983..611d56d7 100644
--- a/ash/assistant/model/DEPS
+++ b/ash/assistant/model/DEPS
@@ -1,7 +1,5 @@
 include_rules = [
   "-ash",
-  "+ash/assistant/ui/assistant_ui_constants.h",
-  "+ash/assistant/ui/assistant_view_ids.h",
   "+ash/assistant/model",
   "+ash/public/cpp",
   "+ash/public/cpp/app_list",
diff --git a/ash/assistant/model/assistant_response.cc b/ash/assistant/model/assistant_response.cc
index 546a52f..cf47ab18 100644
--- a/ash/assistant/model/assistant_response.cc
+++ b/ash/assistant/model/assistant_response.cc
@@ -8,8 +8,6 @@
 #include <utility>
 
 #include "ash/assistant/model/assistant_response_observer.h"
-#include "ash/assistant/model/ui/assistant_error_element.h"
-#include "ash/assistant/model/ui/assistant_ui_element.h"
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
@@ -49,31 +47,7 @@
       std::move(callback_).Run(/*is_completed=*/false);
   }
 
-  void Process() {
-    // Responses should only be processed once.
-    DCHECK_EQ(ProcessingState::kUnprocessed, response_->processing_state());
-    response_->set_processing_state(ProcessingState::kProcessing);
-
-    // Completion of |response_| processing is indicated by |processing_count_|
-    // reaching zero. This value is decremented as each UI element is processed.
-    processing_count_ = response_->GetUiElements().size();
-
-    // Try finishing directly if there are no UI elements to be processed.
-    if (processing_count_ == 0) {
-      TryFinishing();
-      return;
-    }
-
-    for (const auto& ui_element : response_->GetUiElements()) {
-      // Start asynchronous processing of the UI element. Note that if the UI
-      // element does not require any pre-rendering processing the callback may
-      // be run synchronously. Also we must use WeakPtr here because |this| will
-      // destroy before |ui_element| by design.
-      ui_element->Process(
-          base::BindOnce(&AssistantResponse::Processor::OnFinishedProcessing,
-                         weak_ptr_factory_.GetWeakPtr()));
-    }
-  }
+  void Process() {}
 
  private:
   void OnFinishedProcessing() {
@@ -124,46 +98,6 @@
   observers_.RemoveObserver(observer);
 }
 
-void AssistantResponse::AddUiElement(
-    std::unique_ptr<AssistantUiElement> ui_element) {
-  // In processing v2, UI elements are first cached in a pending state...
-  auto pending_ui_element = std::make_unique<PendingUiElement>();
-  pending_ui_element->ui_element = std::move(ui_element);
-  pending_ui_element->is_processing = true;
-  pending_ui_elements_.push_back(std::move(pending_ui_element));
-
-  // ...while we perform any pre-processing necessary prior to rendering.
-  pending_ui_elements_.back()->ui_element->Process(base::BindOnce(
-      [](const base::WeakPtr<AssistantResponse>& self,
-         PendingUiElement* pending_ui_element) {
-        if (!self)
-          return;
-
-        // Indicate that |pending_ui_element| has finished processing.
-        pending_ui_element->is_processing = false;
-
-        // Add any UI elements that are ready for rendering to the response.
-        // Note that this may or may not include the |pending_ui_element| which
-        // just finished processing as we are required to add renderable UI
-        // elements to the response in the same order that they were initially
-        // pended to avoid inadvertently shuffling the response.
-        while (!self->pending_ui_elements_.empty() &&
-               !self->pending_ui_elements_.front()->is_processing) {
-          self->ui_elements_.push_back(
-              std::move(self->pending_ui_elements_.front()->ui_element));
-          self->pending_ui_elements_.pop_front();
-          self->NotifyUiElementAdded(self->ui_elements_.back().get());
-        }
-      },
-      weak_factory_.GetWeakPtr(),
-      base::Unretained(pending_ui_elements_.back().get())));
-}
-
-const std::vector<std::unique_ptr<AssistantUiElement>>&
-AssistantResponse::GetUiElements() const {
-  return ui_elements_;
-}
-
 void AssistantResponse::AddSuggestions(
     const std::vector<AssistantSuggestion>& suggestions) {
   for (const auto& suggestion : suggestions)
@@ -204,22 +138,11 @@
 
 bool AssistantResponse::ContainsUiElement(
     const AssistantUiElement* element) const {
-  DCHECK(element);
-
-  bool contains_element = base::Contains(
-      ui_elements_, *element, &std::unique_ptr<AssistantUiElement>::operator*);
-
-  return contains_element || ContainsPendingUiElement(element);
+  return false;
 }
 
 bool AssistantResponse::ContainsPendingUiElement(
     const AssistantUiElement* element) const {
-  DCHECK(element);
-
-  return std::ranges::any_of(
-      pending_ui_elements_,
-      [element](const std::unique_ptr<PendingUiElement>& other) {
-        return *other->ui_element == *element;
-      });
+  return false;
 }
 }  // namespace ash
diff --git a/ash/assistant/model/assistant_response.h b/ash/assistant/model/assistant_response.h
index da851b3e..1449c06 100644
--- a/ash/assistant/model/assistant_response.h
+++ b/ash/assistant/model/assistant_response.h
@@ -5,7 +5,6 @@
 #ifndef ASH_ASSISTANT_MODEL_ASSISTANT_RESPONSE_H_
 #define ASH_ASSISTANT_MODEL_ASSISTANT_RESPONSE_H_
 
-#include <deque>
 #include <memory>
 #include <vector>
 
@@ -56,13 +55,6 @@
   void AddObserver(AssistantResponseObserver* observer) const;
   void RemoveObserver(AssistantResponseObserver* observer) const;
 
-  // Adds the specified |ui_element| that should be rendered for the
-  // interaction.
-  void AddUiElement(std::unique_ptr<AssistantUiElement> ui_element);
-
-  // Returns all UI elements belonging to the response.
-  const std::vector<std::unique_ptr<AssistantUiElement>>& GetUiElements() const;
-
   // Adds the specified |suggestions| that should be rendered for the
   // interaction.
   void AddSuggestions(const std::vector<AssistantSuggestion>& suggestions);
@@ -106,17 +98,10 @@
   friend class base::RefCounted<AssistantResponse>;
   ~AssistantResponse();
 
-  std::deque<std::unique_ptr<PendingUiElement>> pending_ui_elements_;
   std::vector<AssistantSuggestion> suggestions_;
   ProcessingState processing_state_ = ProcessingState::kUnprocessed;
   bool has_tts_ = false;
 
-  // We specify the declaration order below as intended because we want
-  // |processor_| to be destroyed before |ui_elements_| (we also forced this
-  // order in the destructor), so that when the response processing got
-  // interrupted, the |ProcessingCallback| can have a chance to return false
-  // during the destruction to indicate the failure of completion.
-  std::vector<std::unique_ptr<AssistantUiElement>> ui_elements_;
   std::unique_ptr<Processor> processor_;
 
   mutable base::ObserverList<AssistantResponseObserver> observers_;
diff --git a/ash/assistant/model/assistant_ui_model.h b/ash/assistant/model/assistant_ui_model.h
index 3f44c6f7..21073344 100644
--- a/ash/assistant/model/assistant_ui_model.h
+++ b/ash/assistant/model/assistant_ui_model.h
@@ -8,7 +8,6 @@
 #include <optional>
 #include <ostream>
 
-#include "ash/assistant/ui/assistant_ui_constants.h"
 #include "base/component_export.h"
 #include "base/observer_list.h"
 #include "chromeos/ash/services/assistant/public/cpp/assistant_service.h"
@@ -98,7 +97,7 @@
 
   AssistantVisibility visibility_ = AssistantVisibility::kClosed;
   AssistantEntryPoint entry_point_ = AssistantEntryPoint::kUnspecified;
-  int app_list_bubble_width_ = kPreferredWidthDip;
+  int app_list_bubble_width_ = 0;
 
   mutable base::ObserverList<AssistantUiModelObserver> observers_;
 
diff --git a/ash/assistant/model/ui/assistant_card_element.cc b/ash/assistant/model/ui/assistant_card_element.cc
deleted file mode 100644
index 8bf3c0f83..0000000
--- a/ash/assistant/model/ui/assistant_card_element.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/model/ui/assistant_card_element.h"
-
-#include <utility>
-
-#include "ash/assistant/ui/assistant_ui_constants.h"
-#include "ash/assistant/ui/assistant_view_ids.h"
-#include "ash/public/cpp/ash_web_view.h"
-#include "ash/public/cpp/ash_web_view_factory.h"
-#include "base/base64.h"
-#include "base/memory/raw_ptr.h"
-
-namespace ash {
-
-// AssistantCardElement::Processor ---------------------------------------------
-
-class AssistantCardElement::Processor : public AshWebView::Observer {
- public:
-  Processor(AssistantCardElement* card_element, ProcessingCallback callback)
-      : card_element_(card_element), callback_(std::move(callback)) {}
-
-  Processor(const Processor& copy) = delete;
-  Processor& operator=(const Processor& assign) = delete;
-
-  ~Processor() override {
-    if (contents_view_)
-      contents_view_->RemoveObserver(this);
-
-    if (callback_)
-      std::move(callback_).Run();
-  }
-
-  void Process() {
-    const int width_dip =
-        card_element_->viewport_width() - 2 * assistant::ui::kHorizontalMargin;
-
-    // Configure parameters for the card. We want to configure the size as:
-    // - width: It should be width_dip.
-    // - height: It should be calculated from the content.
-    AshWebView::InitParams contents_params;
-    contents_params.enable_auto_resize = true;
-    contents_params.min_size = gfx::Size(width_dip, 1);
-    contents_params.max_size = gfx::Size(width_dip, INT_MAX);
-    contents_params.suppress_navigation = true;
-    contents_params.fix_zoom_level_to_one = true;
-
-    // Create |contents_view_| and retain ownership until it is added to the
-    // view hierarchy. If that never happens, it will be still be cleaned up.
-    contents_view_ = AshWebViewFactory::Get()->Create(contents_params);
-    contents_view_->SetID(AssistantViewID::kAshWebView);
-
-    // Observe |contents_view_| so that we are notified when loading is
-    // complete.
-    contents_view_->AddObserver(this);
-
-    // Encode the html string to be URL-safe.
-    std::string encoded_html = base::Base64Encode(card_element_->html());
-
-    // Navigate to the data URL which represents the card.
-    constexpr char kDataUriPrefix[] = "data:text/html;base64,";
-    contents_view_->Navigate(GURL(kDataUriPrefix + encoded_html));
-  }
-
- private:
-  // AshWebView::Observer:
-  void DidStopLoading() override {
-    contents_view_->RemoveObserver(this);
-
-    // Pass ownership of |contents_view_| to the card element that was being
-    // processed and notify our |callback_| of the completion.
-    card_element_->set_contents_view(std::move(contents_view_));
-    std::move(callback_).Run();
-  }
-
-  // |card_element_| should outlive the Processor.
-  const raw_ptr<AssistantCardElement> card_element_;
-  ProcessingCallback callback_;
-
-  std::unique_ptr<AshWebView> contents_view_;
-};
-
-// AssistantCardElement --------------------------------------------------------
-
-AssistantCardElement::AssistantCardElement(const std::string& html,
-                                           const std::string& fallback,
-                                           int viewport_width)
-    : AssistantUiElement(AssistantUiElementType::kCard),
-      html_(html),
-      fallback_(fallback),
-      viewport_width_(viewport_width) {}
-
-AssistantCardElement::~AssistantCardElement() {
-  // |processor_| should be destroyed before |this| has been deleted.
-  processor_.reset();
-}
-
-void AssistantCardElement::Process(ProcessingCallback callback) {
-  processor_ = std::make_unique<Processor>(this, std::move(callback));
-  processor_->Process();
-}
-
-bool AssistantCardElement::has_contents_view() const {
-  return !!contents_view_;
-}
-
-bool AssistantCardElement::Compare(const AssistantUiElement& other) const {
-  return other.type() == AssistantUiElementType::kCard &&
-         static_cast<const AssistantCardElement&>(other).html() == html_;
-}
-
-}  // namespace ash
diff --git a/ash/assistant/model/ui/assistant_card_element.h b/ash/assistant/model/ui/assistant_card_element.h
deleted file mode 100644
index 03e5e5b7..0000000
--- a/ash/assistant/model/ui/assistant_card_element.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_MODEL_UI_ASSISTANT_CARD_ELEMENT_H_
-#define ASH_ASSISTANT_MODEL_UI_ASSISTANT_CARD_ELEMENT_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "ash/assistant/model/ui/assistant_ui_element.h"
-#include "ash/public/cpp/ash_web_view.h"
-#include "base/component_export.h"
-
-namespace ash {
-
-// An Assistant UI element that will be rendered as an HTML card.
-class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantCardElement
-    : public AssistantUiElement {
- public:
-  AssistantCardElement(const std::string& html,
-                       const std::string& fallback,
-                       int viewport_width);
-
-  AssistantCardElement(const AssistantCardElement&) = delete;
-  AssistantCardElement& operator=(const AssistantCardElement&) = delete;
-
-  ~AssistantCardElement() override;
-
-  // AssistantUiElement:
-  void Process(ProcessingCallback callback) override;
-
-  bool has_contents_view() const;
-  const std::string& html() const { return html_; }
-  const std::string& fallback() const { return fallback_; }
-  int viewport_width() const { return viewport_width_; }
-  std::unique_ptr<AshWebView> MoveContentsView() {
-    return std::move(contents_view_);
-  }
-
-  void set_contents_view(std::unique_ptr<AshWebView> contents_view) {
-    contents_view_ = std::move(contents_view);
-  }
-
- private:
-  class Processor;
-
-  const std::string html_;
-  const std::string fallback_;
-  const int viewport_width_;
-  std::unique_ptr<AshWebView> contents_view_;
-
-  std::unique_ptr<Processor> processor_;
-
-  // AssistantUiElement:
-  bool Compare(const AssistantUiElement& other) const override;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_MODEL_UI_ASSISTANT_CARD_ELEMENT_H_
diff --git a/ash/assistant/model/ui/assistant_error_element.cc b/ash/assistant/model/ui/assistant_error_element.cc
deleted file mode 100644
index cbf63d4..0000000
--- a/ash/assistant/model/ui/assistant_error_element.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/model/ui/assistant_error_element.h"
-
-#include "ash/assistant/ui/assistant_ui_constants.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace ash {
-
-AssistantErrorElement::AssistantErrorElement(int message_id)
-    : AssistantUiElement(AssistantUiElementType::kError),
-      message_id_(message_id) {}
-
-AssistantErrorElement::~AssistantErrorElement() = default;
-
-bool AssistantErrorElement::Compare(const AssistantUiElement& other) const {
-  return other.type() == AssistantUiElementType::kError &&
-         static_cast<const AssistantErrorElement&>(other).message_id() ==
-             message_id_;
-}
-}  // namespace ash
diff --git a/ash/assistant/model/ui/assistant_error_element.h b/ash/assistant/model/ui/assistant_error_element.h
deleted file mode 100644
index 6cb88f5..0000000
--- a/ash/assistant/model/ui/assistant_error_element.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_MODEL_UI_ASSISTANT_ERROR_ELEMENT_H_
-#define ASH_ASSISTANT_MODEL_UI_ASSISTANT_ERROR_ELEMENT_H_
-
-#include "ash/assistant/model/ui/assistant_ui_element.h"
-#include "base/component_export.h"
-
-namespace ash {
-
-// An Assistant UI error element that will be rendered as text.
-class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantErrorElement
-    : public AssistantUiElement {
- public:
-  explicit AssistantErrorElement(int message_id);
-
-  AssistantErrorElement(const AssistantErrorElement&) = delete;
-  AssistantErrorElement& operator=(const AssistantErrorElement&) = delete;
-
-  ~AssistantErrorElement() override;
-
-  int message_id() const { return message_id_; }
-
- private:
-  const int message_id_;
-
-  // AssistantUiElement:
-  bool Compare(const AssistantUiElement& other) const override;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_MODEL_UI_ASSISTANT_ERROR_ELEMENT_H_
diff --git a/ash/assistant/model/ui/assistant_text_element.cc b/ash/assistant/model/ui/assistant_text_element.cc
deleted file mode 100644
index 9633eee9..0000000
--- a/ash/assistant/model/ui/assistant_text_element.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/model/ui/assistant_text_element.h"
-
-#include "ash/assistant/ui/assistant_ui_constants.h"
-
-namespace ash {
-
-AssistantTextElement::AssistantTextElement(const std::string& text)
-    : AssistantUiElement(AssistantUiElementType::kText), text_(text) {}
-
-AssistantTextElement::~AssistantTextElement() = default;
-
-bool AssistantTextElement::Compare(const AssistantUiElement& other) const {
-  return other.type() == AssistantUiElementType::kText &&
-         static_cast<const AssistantTextElement&>(other).text() == text_;
-}
-
-}  // namespace ash
diff --git a/ash/assistant/model/ui/assistant_text_element.h b/ash/assistant/model/ui/assistant_text_element.h
deleted file mode 100644
index 6b5e680..0000000
--- a/ash/assistant/model/ui/assistant_text_element.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_MODEL_UI_ASSISTANT_TEXT_ELEMENT_H_
-#define ASH_ASSISTANT_MODEL_UI_ASSISTANT_TEXT_ELEMENT_H_
-
-#include <string>
-
-#include "ash/assistant/model/ui/assistant_ui_element.h"
-#include "base/component_export.h"
-
-namespace ash {
-
-// An Assistant UI element that will be rendered as text.
-class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantTextElement
-    : public AssistantUiElement {
- public:
-  explicit AssistantTextElement(const std::string& text);
-
-  AssistantTextElement(const AssistantTextElement&) = delete;
-  AssistantTextElement& operator=(const AssistantTextElement&) = delete;
-
-  ~AssistantTextElement() override;
-
-  const std::string& text() const { return text_; }
-
- private:
-  const std::string text_;
-
-  // AssistantUiElement:
-  bool Compare(const AssistantUiElement& other) const override;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_MODEL_UI_ASSISTANT_TEXT_ELEMENT_H_
diff --git a/ash/assistant/model/ui/assistant_ui_element.cc b/ash/assistant/model/ui/assistant_ui_element.cc
deleted file mode 100644
index a28e361..0000000
--- a/ash/assistant/model/ui/assistant_ui_element.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/model/ui/assistant_ui_element.h"
-
-#include <utility>
-
-namespace ash {
-
-AssistantUiElement::AssistantUiElement(AssistantUiElementType type)
-    : type_(type) {}
-
-AssistantUiElement::~AssistantUiElement() = default;
-
-void AssistantUiElement::Process(ProcessingCallback callback) {
-  // By default, Assistant UI elements do not require pre-rendering processing.
-  std::move(callback).Run();
-}
-
-}  // namespace ash
diff --git a/ash/assistant/model/ui/assistant_ui_element.h b/ash/assistant/model/ui/assistant_ui_element.h
deleted file mode 100644
index e6f6849..0000000
--- a/ash/assistant/model/ui/assistant_ui_element.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_MODEL_UI_ASSISTANT_UI_ELEMENT_H_
-#define ASH_ASSISTANT_MODEL_UI_ASSISTANT_UI_ELEMENT_H_
-
-#include "base/component_export.h"
-#include "base/functional/callback.h"
-
-namespace ash {
-
-// AssistantUiElementType ------------------------------------------------------
-
-// Defines possible types of Assistant UI elements.
-enum class AssistantUiElementType {
-  kCard,   // See AssistantCardElement.
-  kError,  // See AssistantErrorElement.
-  kText,   // See AssistantTextElement.
-};
-
-// AssistantUiElement ----------------------------------------------------------
-
-// Base class for a UI element that will be rendered inside of Assistant UI.
-class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantUiElement {
- public:
-  AssistantUiElement(const AssistantUiElement&) = delete;
-  AssistantUiElement& operator=(const AssistantUiElement&) = delete;
-
-  virtual ~AssistantUiElement();
-
-  bool operator==(const AssistantUiElement& other) const {
-    return this->Compare(other);
-  }
-
-  AssistantUiElementType type() const { return type_; }
-
-  // Invoke to being processing the UI element for rendering. The specified
-  // |callback| will be run upon completion. Note that we don't include the
-  // processing result in the callback, as in |AssistantResponse| we handle
-  // success/failure cases the same because failures will be skipped in view
-  // handling.
-  using ProcessingCallback = base::OnceCallback<void()>;
-  virtual void Process(ProcessingCallback callback);
-
- protected:
-  explicit AssistantUiElement(AssistantUiElementType type);
-
- private:
-  const AssistantUiElementType type_;
-
-  virtual bool Compare(const AssistantUiElement& other) const = 0;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_MODEL_UI_ASSISTANT_UI_ELEMENT_H_
diff --git a/ash/assistant/ui/BUILD.gn b/ash/assistant/ui/BUILD.gn
deleted file mode 100644
index e05c1a2..0000000
--- a/ash/assistant/ui/BUILD.gn
+++ /dev/null
@@ -1,82 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//chromeos/ash/components/assistant/assistant.gni")
-
-assert(is_chromeos)
-
-source_set("constants") {
-  defines = [ "IS_ASSISTANT_UI_CONSTANTS_IMPL" ]
-
-  sources = [
-    "assistant_ui_constants.cc",
-    "assistant_ui_constants.h",
-    "assistant_view_ids.h",
-  ]
-
-  deps = [
-    "//ash/constants",
-    "//base",
-    "//skia",
-    "//ui/aura",
-    "//ui/base",
-    "//ui/gfx",
-  ]
-}
-
-source_set("ui") {
-  defines = [ "IS_ASSISTANT_UI_IMPL" ]
-
-  sources = [
-    "assistant_view_delegate.h",
-    "assistant_web_view_delegate.h",
-    "base/stack_layout.cc",
-    "base/stack_layout.h",
-  ]
-
-  deps = [
-    "//ash/assistant/model",
-    "//ash/assistant/ui:constants",
-    "//ash/assistant/ui/colors:assistant_colors_views",
-    "//ash/assistant/util",
-    "//ash/keyboard/ui",
-    "//ash/public/cpp",
-    "//ash/resources/vector_icons",
-    "//ash/strings",
-    "//ash/style",
-    "//base",
-    "//chromeos/ash/components/assistant:buildflags",
-    "//chromeos/ash/services/assistant/public/cpp",
-    "//chromeos/ash/services/assistant/public/mojom",
-    "//chromeos/ash/services/libassistant/public/cpp:structs",
-    "//chromeos/ui/frame",
-    "//chromeos/ui/vector_icons",
-    "//components/feature_engagement/public",
-    "//components/vector_icons",
-    "//ui/aura",
-    "//ui/chromeos/styles:cros_styles_views",
-    "//ui/compositor",
-    "//ui/gfx",
-    "//ui/views",
-    "//ui/views/window/vector_icons",
-    "//ui/wm",
-  ]
-
-  if (enable_cros_libassistant) {
-    sources += [
-      "logo_view/logo_view_impl.cc",
-      "logo_view/logo_view_impl.h",
-      "logo_view/shape/mic_part_shape.cc",
-      "logo_view/shape/mic_part_shape.h",
-      "logo_view/shape/shape.cc",
-      "logo_view/shape/shape.h",
-    ]
-
-    deps += [ "//chromeos/assistant/internal/logo_view" ]
-  }
-
-  # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
-  # enable the diagnostic by removing this line.
-  configs += [ "//build/config/compiler:no_exit_time_destructors" ]
-}
diff --git a/ash/assistant/ui/DEPS b/ash/assistant/ui/DEPS
deleted file mode 100644
index 7d9aaae..0000000
--- a/ash/assistant/ui/DEPS
+++ /dev/null
@@ -1,85 +0,0 @@
-noparent = True
-
-include_rules = [
-  "+ash/app_list/views/app_list_toast_view.h",
-  "+ash/assistant/model",
-  "+ash/assistant/ui",
-  "+ash/assistant/util",
-  "+ash/constants",
-  "+ash/keyboard/ui",
-  "+ash/public",
-  "+ash/resources/vector_icons",
-  "+ash/strings",
-  "+ash/style",
-  "+base",
-  "+build/buildflag.h",
-  "+cc/base",
-  "+cc/paint",
-  "+chromeos/ash/components/assistant",
-  "+chromeos/ash/services/assistant/public/cpp",
-  "+chromeos/ash/services/libassistant/public/cpp",
-  "+chromeos/constants",
-  "+chromeos/ui/frame",
-  "+components/feature_engagement/public/feature_constants.h",
-  "+mojo/public/cpp",
-  "+net/base",
-  "+third_party/skia/include/core",
-  "+ui",
-  "+url/gurl.h",
-
-  # Abseil is allowed by default, but some features are banned. See
-  # //styleguide/c++/c++-features.md.
-  # Please keep this section in sync with //DEPS.
-  '+third_party/abseil-cpp',
-  '-third_party/abseil-cpp/absl/algorithm/container.h',
-  '-third_party/abseil-cpp/absl/base/attributes.h',
-  '-third_party/abseil-cpp/absl/base/nullability.h',
-  '-third_party/abseil-cpp/absl/container/btree_map.h',
-  '-third_party/abseil-cpp/absl/container/btree_set.h',
-  '-third_party/abseil-cpp/absl/flags',
-  '-third_party/abseil-cpp/absl/functional/any_invocable.h',
-  '-third_party/abseil-cpp/absl/functional/bind_front.h',
-  '-third_party/abseil-cpp/absl/functional/function_ref.h',
-  '-third_party/abseil-cpp/absl/hash',
-  '-third_party/abseil-cpp/absl/log',
-  '-third_party/abseil-cpp/absl/random',
-  '-third_party/abseil-cpp/absl/status/statusor.h',
-  '-third_party/abseil-cpp/absl/strings',
-  '+third_party/abseil-cpp/absl/strings/ascii.h',
-  '+third_party/abseil-cpp/absl/strings/cord.h',
-  '+third_party/abseil-cpp/absl/strings/str_format.h',
-  '-third_party/abseil-cpp/absl/synchronization',
-  '-third_party/abseil-cpp/absl/time',
-  '-third_party/abseil-cpp/absl/types/any.h',
-  '-third_party/abseil-cpp/absl/types/optional.h',
-  '-third_party/abseil-cpp/absl/types/span.h',
-  '-third_party/abseil-cpp/absl/types/variant.h',
-  '-third_party/abseil-cpp/absl/utility/utility.h',
-]
-
-specific_include_rules = {
-  ".*_unittest\.cc": [
-    "+ash/app_list/test/app_list_test_helper.h",
-    "+ash/app_list/views/search_box_view.h",
-    "+ash/assistant/assistant_controller_impl.h",
-    "+ash/assistant/assistant_interaction_controller_impl.h",
-    "+ash/assistant/assistant_ui_controller.h",
-    "+ash/assistant/assistant_web_ui_controller.h",
-    "+ash/assistant/test/assistant_ash_test_base.h",
-    "+ash/frame/non_client_frame_view_ash.h",
-    "+ash/session/session_controller_impl.h",
-    "+ash/shell.h",
-    "+ash/test/ash_test_base.h",
-    "+ash/test/ash_test_views_delegate.h",
-    "+base/test/scoped_feature_list.h",
-    "+cc/test/pixel_comparator.h",
-    "+chromeos/ash/services/assistant/test_support/mock_assistant.h",
-    "+chromeos/ui/frame/default_frame_header.h",
-    "+chromeos/ui/vector_icons/vector_icons.h",
-    "+components/feature_engagement/test/scoped_iph_feature_list.h",
-    "+components/prefs",
-    "+components/vector_icons",
-    "+testing/gmock",
-    "+testing/gtest",
-  ],
-}
diff --git a/ash/assistant/ui/assistant_ui_constants.cc b/ash/assistant/ui/assistant_ui_constants.cc
deleted file mode 100644
index 5c7c3fa7..0000000
--- a/ash/assistant/ui/assistant_ui_constants.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/assistant/ui/assistant_ui_constants.h"
-
-#include "ash/constants/ash_features.h"
-#include "base/no_destructor.h"
-#include "ui/base/class_property.h"
-#include "ui/gfx/font_list.h"
-
-namespace ash {
-namespace assistant {
-namespace ui {
-
-DEFINE_UI_CLASS_PROPERTY_KEY(bool, kOnlyAllowMouseClickEvents, false)
-
-const gfx::FontList& GetDefaultFontList() {
-  static const base::NoDestructor<gfx::FontList> font_list("Google Sans, 12px");
-  return *font_list;
-}
-
-}  // namespace ui
-}  // namespace assistant
-}  // namespace ash
diff --git a/ash/assistant/ui/assistant_view_ids.h b/ash/assistant/ui/assistant_view_ids.h
deleted file mode 100644
index 4495b7f..0000000
--- a/ash/assistant/ui/assistant_view_ids.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_UI_ASSISTANT_VIEW_IDS_H_
-#define ASH_ASSISTANT_UI_ASSISTANT_VIEW_IDS_H_
-
-namespace ash {
-
-// IDs used for the main views that compose the Assistant UI.
-// Use these for easy access to the views during the unittests.
-// Note that these IDs are only guaranteed to be unique inside
-// |AssistantPageView|.
-enum AssistantViewID {
-  // We start at 1 because 0 is not a valid view ID.
-  kMainView = 1,
-
-  // Dialog plate and its components.
-  kDialogPlate,
-  kKeyboardInputToggle,
-  kMicView,
-  kModuleIcon,
-  kTextQueryField,
-  kVoiceInputToggle,
-
-  // Main stage and its components.
-  kMainStage,
-  kFooterView,
-  kGreetingLabel,
-  kLearnMoreToast,
-  kLauncherSearchIph,
-  kOptInView,
-  kProgressIndicator,
-  kQueryView,
-  kSuggestionContainer,
-  kUiElementContainer,
-  kZeroStateView,
-  kOnboardingView,
-  kHorizontalSeparator,
-
-  // UIs in OptInView
-  kOptInViewStyledLabel,
-
-  // UIs in QueryView
-  kHighConfidenceLabel,
-  kLowConfidenceLabel,
-
-  // UIs in UiElementContainer
-  kOverflowIndicator,
-  kAshWebView,
-
-  // UIs in AssistantOnboardingSuggestionView
-  kAssistantOnboardingSuggestionViewLabel,
-
-  // UIs in SuggestionChipView
-  kSuggestionChipViewLabel
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_UI_ASSISTANT_VIEW_IDS_H_
diff --git a/ash/assistant/ui/assistant_web_view_delegate.h b/ash/assistant/ui/assistant_web_view_delegate.h
deleted file mode 100644
index 02bd253..0000000
--- a/ash/assistant/ui/assistant_web_view_delegate.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_ASSISTANT_UI_ASSISTANT_WEB_VIEW_DELEGATE_H_
-#define ASH_ASSISTANT_UI_ASSISTANT_WEB_VIEW_DELEGATE_H_
-
-#include "base/component_export.h"
-
-namespace views {
-class Widget;
-}  // namespace views
-
-namespace ash {
-
-// A delegate of web container views in assistant/ui.
-class COMPONENT_EXPORT(ASSISTANT_UI) AssistantWebViewDelegate {
- public:
-  virtual ~AssistantWebViewDelegate() = default;
-
-  // Updates the visibility of the back button in Assistant web container.
-  virtual void UpdateBackButtonVisibility(views::Widget* widget,
-                                          bool visibility) = 0;
-};
-
-}  // namespace ash
-
-#endif  // ASH_ASSISTANT_UI_ASSISTANT_WEB_VIEW_DELEGATE_H_
diff --git a/ash/assistant/ui/colors/BUILD.gn b/ash/assistant/ui/colors/BUILD.gn
deleted file mode 100644
index 3fc8136..0000000
--- a/ash/assistant/ui/colors/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2021 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//tools/style_variable_generator/style_variable_generator.gni")
-
-assert(is_chromeos)
-
-style_variable_generator("assistant_colors") {
-  sources = [
-    "//ui/chromeos/styles/cros_palette.json5",
-    "assistant_colors.json5",
-  ]
-
-  cpp_namespace = "assistant_colors"
-}
diff --git a/ash/assistant/ui/colors/assistant_colors.json5 b/ash/assistant/ui/colors/assistant_colors.json5
deleted file mode 100644
index 7127713..0000000
--- a/ash/assistant/ui/colors/assistant_colors.json5
+++ /dev/null
@@ -1,29 +0,0 @@
-/* Copyright 2021 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/*
- * Color palette for Assistant UIs.
- */
-{
-  options: {
-    // Define options for proto. We are not using it for now. But we define them
-    // as CQ builds it.
-    proto: {
-      field_name: "assistant_colors",
-      // Use 2 as a field id since cros_palette.json5 takes 1.
-      field_id: 2,
-    }
-  },
-  colors: {
-    bg_assistant_plate: {
-      // Those colors are customized colors, i.e. not in cros_palette.json5.
-      light: "#ecefee",
-      dark: "#1c2b3b",
-    },
-  },
-  opacities: {
-    // This is necessary to avoid C++ compile error.
-    fake_opacity: 0.0,
-  }
-}
diff --git a/ash/assistant/util/assistant_util.cc b/ash/assistant/util/assistant_util.cc
index 81203395..03570da 100644
--- a/ash/assistant/util/assistant_util.cc
+++ b/ash/assistant/util/assistant_util.cc
@@ -6,7 +6,6 @@
 
 #include <string>
 
-#include "ash/assistant/model/assistant_ui_model.h"
 #include "ash/constants/devicetype.h"
 #include "base/strings/string_util.h"
 
@@ -22,30 +21,15 @@
 
 bool IsStartingSession(AssistantVisibility new_visibility,
                        AssistantVisibility old_visibility) {
-  return old_visibility == AssistantVisibility::kClosed &&
-         new_visibility == AssistantVisibility::kVisible;
+  return false;
 }
 
 bool IsFinishingSession(AssistantVisibility new_visibility) {
-  return new_visibility == AssistantVisibility::kClosed;
+  return false;
 }
 
 bool IsVoiceEntryPoint(AssistantEntryPoint entry_point, bool prefer_voice) {
-  switch (entry_point) {
-    case AssistantEntryPoint::kHotword:
-      return true;
-    case AssistantEntryPoint::kHotkey:
-    case AssistantEntryPoint::kLauncherSearchBoxIcon:
-    case AssistantEntryPoint::kLongPressLauncher:
-      return prefer_voice;
-    case AssistantEntryPoint::kUnspecified:
-    case AssistantEntryPoint::kDeepLink:
-    case AssistantEntryPoint::kLauncherSearchResult:
-    case AssistantEntryPoint::kSetup:
-    case AssistantEntryPoint::kStylus:
-    case AssistantEntryPoint::kLauncherSearchIphChip:
-      return false;
-  }
+  return false;
 }
 
 bool IsGoogleDevice() {
diff --git a/ash/clipboard/clipboard_history_util.cc b/ash/clipboard/clipboard_history_util.cc
index 6d6a617b..8db54ae 100644
--- a/ash/clipboard/clipboard_history_util.cc
+++ b/ash/clipboard/clipboard_history_util.cc
@@ -192,17 +192,8 @@
   switch (Shell::Get()->keyboard_capability()->GetMetaKeyToDisplay()) {
     case ui::mojom::MetaKey::kSearch:
       return kClipboardSearchIcon;
-    case ui::mojom::MetaKey::kLauncher: {
-      const auto* const assistant_state = AssistantState::Get();
-      const bool is_assistant_available =
-          assistant_state &&
-          assistant_state->allowed_state() ==
-              assistant::AssistantAllowedState::ALLOWED &&
-          assistant_state->settings_enabled().value_or(false);
-
-      return is_assistant_available ? kClipboardLauncherIcon
-                                    : kClipboardLauncherNoAssistantIcon;
-    }
+    case ui::mojom::MetaKey::kLauncher:
+      return kClipboardLauncherNoAssistantIcon;
     case ui::mojom::MetaKey::kLauncherRefresh:
       return kCampbellHeroIcon;
     case ui::mojom::MetaKey::kExternalMeta:
diff --git a/ash/clipboard/clipboard_history_util.h b/ash/clipboard/clipboard_history_util.h
index 9b5438c..3b759f7 100644
--- a/ash/clipboard/clipboard_history_util.h
+++ b/ash/clipboard/clipboard_history_util.h
@@ -149,7 +149,7 @@
 ASH_EXPORT std::u16string GetFileSystemSources(const ui::ClipboardData& data);
 
 // Returns the icon representation of the shortcut modifier key based on
-// keyboard layout and whether the Assistant feature is enabled.
+// keyboard layout.
 ASH_EXPORT const gfx::VectorIcon& GetShortcutKeyIcon();
 
 // Returns the name of the shortcut modifier key based on keyboard layout.
diff --git a/ash/curtain/remote_maintenance_curtain_view.cc b/ash/curtain/remote_maintenance_curtain_view.cc
index 8b793e8..fbd1ea9 100644
--- a/ash/curtain/remote_maintenance_curtain_view.cc
+++ b/ash/curtain/remote_maintenance_curtain_view.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "ash/assistant/ui/base/stack_layout.h"
+#include "ash/curtain/stack_layout.h"
 #include "ash/public/cpp/ash_web_view.h"
 #include "ash/public/cpp/ash_web_view_factory.h"
 #include "ash/public/cpp/oobe_dialog_util.h"
diff --git a/ash/assistant/ui/base/stack_layout.cc b/ash/curtain/stack_layout.cc
similarity index 95%
rename from ash/assistant/ui/base/stack_layout.cc
rename to ash/curtain/stack_layout.cc
index 5c73f741..4c1ea37f 100644
--- a/ash/assistant/ui/base/stack_layout.cc
+++ b/ash/curtain/stack_layout.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/assistant/ui/base/stack_layout.h"
+#include "ash/curtain/stack_layout.h"
 
 #include <algorithm>
 #include <numeric>
@@ -43,8 +43,9 @@
 int StackLayout::GetPreferredHeightForWidth(const views::View* host,
                                             int width) const {
   const auto& children = host->children();
-  if (children.empty())
+  if (children.empty()) {
     return 0;
+  }
   std::vector<int> heights(children.size());
   std::ranges::transform(
       children, heights.begin(),
@@ -80,15 +81,17 @@
       child_x = (host_width - child_width) / 2;
     }
 
-    if (dimension & static_cast<uint32_t>(RespectDimension::kHeight))
+    if (dimension & static_cast<uint32_t>(RespectDimension::kHeight)) {
       child_height = child->GetHeightForWidth(child_width);
+    }
 
     int child_y = 0;
     auto iter = vertical_alignment_map_.find(child);
     if (iter != vertical_alignment_map_.end()) {
       VerticalAlignment vertical_alignment = iter->second;
-      if (vertical_alignment == VerticalAlignment::kCenter)
+      if (vertical_alignment == VerticalAlignment::kCenter) {
         child_y = std::max(0, (host_height - child_height) / 2);
+      }
     }
 
     layouts.child_layouts.emplace_back(
diff --git a/ash/assistant/ui/base/stack_layout.h b/ash/curtain/stack_layout.h
similarity index 89%
rename from ash/assistant/ui/base/stack_layout.h
rename to ash/curtain/stack_layout.h
index 3647161..acf4f07 100644
--- a/ash/assistant/ui/base/stack_layout.h
+++ b/ash/curtain/stack_layout.h
@@ -2,12 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_ASSISTANT_UI_BASE_STACK_LAYOUT_H_
-#define ASH_ASSISTANT_UI_BASE_STACK_LAYOUT_H_
+#ifndef ASH_CURTAIN_STACK_LAYOUT_H_
+#define ASH_CURTAIN_STACK_LAYOUT_H_
 
 #include <map>
 
-#include "base/component_export.h"
 #include "base/memory/raw_ptr.h"
 #include "ui/views/layout/layout_manager_base.h"
 #include "ui/views/layout/proposed_layout.h"
@@ -18,8 +17,7 @@
 // FillLayout in that we respect the preferred size of views during layout. It's
 // possible to explicitly specify which dimension to respect. In contrast,
 // FillLayout will cause its views to match the bounds of the host.
-class COMPONENT_EXPORT(ASSISTANT_UI) StackLayout
-    : public views::LayoutManagerBase {
+class StackLayout : public views::LayoutManagerBase {
  public:
   enum class RespectDimension : uint32_t {
     // Respect width. If enabled, child's preferred width will be used and will
@@ -70,4 +68,4 @@
 
 }  // namespace ash
 
-#endif  // ASH_ASSISTANT_UI_BASE_STACK_LAYOUT_H_
+#endif  // ASH_CURTAIN_STACK_LAYOUT_H_
diff --git a/ash/public/cpp/assistant/assistant_state_base.cc b/ash/public/cpp/assistant/assistant_state_base.cc
index 4a016d7..6b8eaf8 100644
--- a/ash/public/cpp/assistant/assistant_state_base.cc
+++ b/ash/public/cpp/assistant/assistant_state_base.cc
@@ -22,10 +22,7 @@
 
 AssistantStateBase::AssistantStateBase() = default;
 
-AssistantStateBase::~AssistantStateBase() {
-  for (auto& observer : observers_)
-    observer.OnAssistantStateDestroyed();
-}
+AssistantStateBase::~AssistantStateBase() = default;
 
 std::string AssistantStateBase::ToString() const {
 #define STRINGIFY(field) \
@@ -39,15 +36,6 @@
 #undef STRINGIFY
 }
 
-void AssistantStateBase::AddObserver(AssistantStateObserver* observer) {
-  observers_.AddObserver(observer);
-  InitializeObserver(observer);
-}
-
-void AssistantStateBase::RemoveObserver(AssistantStateObserver* observer) {
-  observers_.RemoveObserver(observer);
-}
-
 void AssistantStateBase::RegisterPrefChanges(PrefService* pref_service) {}
 
 bool AssistantStateBase::IsScreenContextAllowed() const {
@@ -101,8 +89,6 @@
     return;
   }
   consent_status_ = consent_status;
-  for (auto& observer : observers_)
-    observer.OnAssistantConsentStatusChanged(consent_status_.value());
 }
 
 void AssistantStateBase::UpdateContextEnabled() {
@@ -113,8 +99,6 @@
     return;
   }
   context_enabled_ = context_enabled;
-  for (auto& observer : observers_)
-    observer.OnAssistantContextEnabled(context_enabled_.value());
 }
 
 void AssistantStateBase::UpdateSettingsEnabled() {
@@ -125,8 +109,6 @@
     return;
   }
   settings_enabled_ = settings_enabled;
-  for (auto& observer : observers_)
-    observer.OnAssistantSettingsEnabled(settings_enabled_.value());
 }
 
 void AssistantStateBase::UpdateHotwordAlwaysOn() {
@@ -137,8 +119,6 @@
     return;
   }
   hotword_always_on_ = hotword_always_on;
-  for (auto& observer : observers_)
-    observer.OnAssistantHotwordAlwaysOn(hotword_always_on_.value());
 }
 
 void AssistantStateBase::UpdateHotwordEnabled() {
@@ -149,8 +129,6 @@
     return;
   }
   hotword_enabled_ = hotword_enabled;
-  for (auto& observer : observers_)
-    observer.OnAssistantHotwordEnabled(hotword_enabled_.value());
 }
 
 void AssistantStateBase::UpdateLaunchWithMicOpen() {
@@ -161,8 +139,6 @@
     return;
   }
   launch_with_mic_open_ = launch_with_mic_open;
-  for (auto& observer : observers_)
-    observer.OnAssistantLaunchWithMicOpen(launch_with_mic_open_.value());
 }
 
 void AssistantStateBase::UpdateNotificationEnabled() {
@@ -173,8 +149,6 @@
     return;
   }
   notification_enabled_ = notification_enabled;
-  for (auto& observer : observers_)
-    observer.OnAssistantNotificationEnabled(notification_enabled_.value());
 }
 
 void AssistantStateBase::UpdateOnboardingMode() {
@@ -186,42 +160,28 @@
     return;
 
   onboarding_mode_ = onboarding_mode;
-  for (auto& observer : observers_)
-    observer.OnAssistantOnboardingModeChanged(onboarding_mode_.value());
 }
 
 void AssistantStateBase::UpdateAssistantStatus(
     assistant::AssistantStatus status) {
   assistant_status_ = status;
-  for (auto& observer : observers_)
-    observer.OnAssistantStatusChanged(assistant_status_);
 }
 
 void AssistantStateBase::UpdateFeatureAllowedState(
     assistant::AssistantAllowedState state) {
   allowed_state_ = state;
-  for (auto& observer : observers_)
-    observer.OnAssistantFeatureAllowedChanged(allowed_state_.value());
 }
 
 void AssistantStateBase::UpdateLocale(const std::string& locale) {
   locale_ = locale;
-  for (auto& observer : observers_)
-    observer.OnLocaleChanged(locale_.value());
 }
 
 void AssistantStateBase::UpdateArcPlayStoreEnabled(bool enabled) {
   arc_play_store_enabled_ = enabled;
-  for (auto& observer : observers_)
-    observer.OnArcPlayStoreEnabledChanged(arc_play_store_enabled_.value());
 }
 
 void AssistantStateBase::UpdateLockedFullScreenState(bool enabled) {
   locked_full_screen_enabled_ = enabled;
-  for (auto& observer : observers_) {
-    observer.OnLockedFullScreenStateChanged(
-        locked_full_screen_enabled_.value());
-  }
 }
 
 }  // namespace ash
diff --git a/ash/public/cpp/assistant/assistant_state_base.h b/ash/public/cpp/assistant/assistant_state_base.h
index 67f975c..e5baea9 100644
--- a/ash/public/cpp/assistant/assistant_state_base.h
+++ b/ash/public/cpp/assistant/assistant_state_base.h
@@ -10,7 +10,6 @@
 #include <string>
 
 #include "ash/public/cpp/ash_public_export.h"
-#include "base/observer_list.h"
 #include "base/observer_list_types.h"
 #include "chromeos/ash/services/assistant/public/cpp/assistant_enums.h"
 #include "chromeos/ash/services/assistant/public/cpp/assistant_prefs.h"
@@ -113,9 +112,6 @@
 
   std::string ToString() const;
 
-  void AddObserver(AssistantStateObserver* observer);
-  void RemoveObserver(AssistantStateObserver* observer);
-
   void RegisterPrefChanges(PrefService* pref_service);
 
   bool IsScreenContextAllowed() const;
@@ -188,8 +184,6 @@
 
   // Observes user profile prefs for the Assistant.
   std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
-
-  base::ObserverList<AssistantStateObserver> observers_;
 };
 
 }  // namespace ash
diff --git a/ash/public/cpp/assistant/controller/assistant_controller.h b/ash/public/cpp/assistant/controller/assistant_controller.h
index 210238a..8a14a06 100644
--- a/ash/public/cpp/assistant/controller/assistant_controller.h
+++ b/ash/public/cpp/assistant/controller/assistant_controller.h
@@ -15,18 +15,12 @@
 
 namespace ash {
 
-class AssistantControllerObserver;
-
 // The interface for the Assistant controller.
 class ASH_PUBLIC_EXPORT AssistantController {
  public:
   // Returns the singleton instance owned by Shell.
   static AssistantController* Get();
 
-  // Adds/removes the specified |observer|.
-  virtual void AddObserver(AssistantControllerObserver* observer) = 0;
-  virtual void RemoveObserver(AssistantControllerObserver* observer) = 0;
-
   // Opens Google Assistant settings.
   virtual void OpenAssistantSettings() = 0;
 
diff --git a/ash/public/cpp/assistant/test_support/BUILD.gn b/ash/public/cpp/assistant/test_support/BUILD.gn
deleted file mode 100644
index 8680ba04..0000000
--- a/ash/public/cpp/assistant/test_support/BUILD.gn
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright 2021 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-assert(is_chromeos)
-
-static_library("test_support") {
-  testonly = true
-
-  sources = [
-    "mock_assistant_controller.cc",
-    "mock_assistant_controller.h",
-    "mock_assistant_state.cc",
-    "mock_assistant_state.h",
-  ]
-
-  deps = [
-    "//ash/public/cpp",
-    "//testing/gmock",
-    "//url",
-  ]
-}
diff --git a/ash/public/cpp/assistant/test_support/mock_assistant_controller.cc b/ash/public/cpp/assistant/test_support/mock_assistant_controller.cc
deleted file mode 100644
index 3f5a84f..0000000
--- a/ash/public/cpp/assistant/test_support/mock_assistant_controller.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/public/cpp/assistant/test_support/mock_assistant_controller.h"
-
-namespace ash {
-
-MockAssistantController::MockAssistantController() = default;
-
-MockAssistantController::~MockAssistantController() = default;
-
-}  // namespace ash
diff --git a/ash/public/cpp/assistant/test_support/mock_assistant_controller.h b/ash/public/cpp/assistant/test_support/mock_assistant_controller.h
deleted file mode 100644
index c40a190a..0000000
--- a/ash/public/cpp/assistant/test_support/mock_assistant_controller.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_PUBLIC_CPP_ASSISTANT_TEST_SUPPORT_MOCK_ASSISTANT_CONTROLLER_H_
-#define ASH_PUBLIC_CPP_ASSISTANT_TEST_SUPPORT_MOCK_ASSISTANT_CONTROLLER_H_
-
-#include <string>
-
-#include "ash/public/cpp/assistant/controller/assistant_controller.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "url/gurl.h"
-
-namespace ash {
-
-class MockAssistantController : public AssistantController {
- public:
-  MockAssistantController();
-  MockAssistantController(const MockAssistantController&) = delete;
-  MockAssistantController& operator=(const MockAssistantController&) = delete;
-  ~MockAssistantController() override;
-
-  MOCK_METHOD(void, AddObserver, (AssistantControllerObserver*), (override));
-
-  MOCK_METHOD(void, RemoveObserver, (AssistantControllerObserver*), (override));
-
-  MOCK_METHOD(void,
-              OpenUrl,
-              (const GURL& url, bool in_background, bool from_server),
-              (override));
-
-  MOCK_METHOD(void, OpenAssistantSettings, (), (override));
-
-  MOCK_METHOD(base::WeakPtr<AssistantController>, GetWeakPtr, (), (override));
-
-  MOCK_METHOD(void,
-              SetAssistant,
-              (assistant::Assistant * assistant),
-              (override));
-
-  MOCK_METHOD(void, StartSpeakerIdEnrollmentFlow, (), (override));
-
-  MOCK_METHOD(void,
-              SendAssistantFeedback,
-              (bool pii_allowed,
-               const std::string& feedback_description,
-               const std::string& screenshot_png),
-              (override));
-};
-
-}  // namespace ash
-
-#endif  // ASH_PUBLIC_CPP_ASSISTANT_TEST_SUPPORT_MOCK_ASSISTANT_CONTROLLER_H_
diff --git a/ash/public/cpp/assistant/test_support/mock_assistant_state.cc b/ash/public/cpp/assistant/test_support/mock_assistant_state.cc
deleted file mode 100644
index f5dc163..0000000
--- a/ash/public/cpp/assistant/test_support/mock_assistant_state.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/public/cpp/assistant/test_support/mock_assistant_state.h"
-
-namespace ash {
-
-MockAssistantState::MockAssistantState() {
-  allowed_state_ = assistant::AssistantAllowedState::ALLOWED;
-  settings_enabled_ = true;
-}
-
-MockAssistantState::~MockAssistantState() = default;
-
-void MockAssistantState::SetAllowedState(
-    assistant::AssistantAllowedState allowed_state) {
-  if (allowed_state_ != allowed_state) {
-    allowed_state_ = allowed_state;
-    for (auto& observer : observers_)
-      observer.OnAssistantFeatureAllowedChanged(allowed_state_.value());
-  }
-}
-
-void MockAssistantState::SetSettingsEnabled(bool enabled) {
-  if (settings_enabled_ != enabled) {
-    settings_enabled_ = enabled;
-    for (auto& observer : observers_)
-      observer.OnAssistantSettingsEnabled(settings_enabled_.value());
-  }
-}
-
-}  // namespace ash
diff --git a/ash/public/cpp/assistant/test_support/mock_assistant_state.h b/ash/public/cpp/assistant/test_support/mock_assistant_state.h
deleted file mode 100644
index b1aa99c..0000000
--- a/ash/public/cpp/assistant/test_support/mock_assistant_state.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2020 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_PUBLIC_CPP_ASSISTANT_TEST_SUPPORT_MOCK_ASSISTANT_STATE_H_
-#define ASH_PUBLIC_CPP_ASSISTANT_TEST_SUPPORT_MOCK_ASSISTANT_STATE_H_
-
-#include "ash/public/cpp/assistant/assistant_state.h"
-
-namespace ash {
-
-class MockAssistantState : public ash::AssistantState {
- public:
-  MockAssistantState();
-  MockAssistantState(const MockAssistantState&) = delete;
-  MockAssistantState& operator=(const MockAssistantState&) = delete;
-  ~MockAssistantState() override;
-
-  void SetAllowedState(assistant::AssistantAllowedState allowed_state);
-
-  void SetSettingsEnabled(bool enabled);
-};
-
-}  // namespace ash
-
-#endif  // ASH_PUBLIC_CPP_ASSISTANT_TEST_SUPPORT_MOCK_ASSISTANT_STATE_H_
diff --git a/ash/quick_pair/repository/fast_pair/footprints_fetcher_impl.cc b/ash/quick_pair/repository/fast_pair/footprints_fetcher_impl.cc
index 2dc8ed08..c0e3927 100644
--- a/ash/quick_pair/repository/fast_pair/footprints_fetcher_impl.cc
+++ b/ash/quick_pair/repository/fast_pair/footprints_fetcher_impl.cc
@@ -60,8 +60,8 @@
         })");
 
 std::unique_ptr<HttpFetcher> CreateHttpFetcher() {
-  return std::make_unique<OAuthHttpFetcher>(
-      kTrafficAnnotation, GaiaConstants::kNearbyDevicesOAuth2Scope);
+  return std::make_unique<OAuthHttpFetcher>(kTrafficAnnotation,
+                                            signin::OAuthConsumerId::kFastPair);
 }
 
 GURL GetUserDevicesUrl() {
diff --git a/ash/quick_pair/repository/oauth_http_fetcher.cc b/ash/quick_pair/repository/oauth_http_fetcher.cc
index fd9c86b..a71c379 100644
--- a/ash/quick_pair/repository/oauth_http_fetcher.cc
+++ b/ash/quick_pair/repository/oauth_http_fetcher.cc
@@ -23,10 +23,9 @@
 
 OAuthHttpFetcher::OAuthHttpFetcher(
     const net::PartialNetworkTrafficAnnotationTag& traffic_annotation,
-    const std::string& oauth_scope)
-    : traffic_annotation_(traffic_annotation) {
-  oauth_scopes_.insert(oauth_scope);
-}
+    signin::OAuthConsumerId oauth_consumer_id)
+    : traffic_annotation_(traffic_annotation),
+      oauth_consumer_id_(oauth_consumer_id) {}
 
 OAuthHttpFetcher::~OAuthHttpFetcher() = default;
 
@@ -68,7 +67,7 @@
   callback_ = std::move(callback);
   access_token_fetcher_ =
       std::make_unique<signin::PrimaryAccountAccessTokenFetcher>(
-          "fastpair_client", identity_manager, oauth_scopes_,
+          oauth_consumer_id_, identity_manager,
           base::BindOnce(&OAuthHttpFetcher::OnAccessTokenFetched,
                          weak_ptr_factory_.GetWeakPtr()),
           signin::PrimaryAccountAccessTokenFetcher::Mode::kImmediate,
diff --git a/ash/quick_pair/repository/oauth_http_fetcher.h b/ash/quick_pair/repository/oauth_http_fetcher.h
index c9c22fb..4460cdad 100644
--- a/ash/quick_pair/repository/oauth_http_fetcher.h
+++ b/ash/quick_pair/repository/oauth_http_fetcher.h
@@ -10,6 +10,7 @@
 #include "base/gtest_prod_util.h"
 #include "base/memory/weak_ptr.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
+#include "components/signin/public/identity_manager/oauth_consumer_ids.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "google_apis/gaia/oauth2_access_token_manager.h"
 #include "google_apis/gaia/oauth2_api_call_flow.h"
@@ -28,7 +29,7 @@
  public:
   explicit OAuthHttpFetcher(
       const net::PartialNetworkTrafficAnnotationTag& traffic_annotation,
-      const std::string& oauth_scope);
+      signin::OAuthConsumerId oauth_consumer_id);
   OAuthHttpFetcher(const OAuthHttpFetcher&) = delete;
   OAuthHttpFetcher& operator=(const OAuthHttpFetcher&) = delete;
   ~OAuthHttpFetcher() override;
@@ -69,7 +70,7 @@
                             signin::AccessTokenInfo access_token_info);
 
   net::PartialNetworkTrafficAnnotationTag traffic_annotation_;
-  OAuth2AccessTokenManager::ScopeSet oauth_scopes_;
+  signin::OAuthConsumerId oauth_consumer_id_;
 
   bool has_call_started_ = false;
   GURL url_;
diff --git a/ash/quick_pair/repository/oauth_http_fetcher_unittest.cc b/ash/quick_pair/repository/oauth_http_fetcher_unittest.cc
index 3f7d504..9a199e42 100644
--- a/ash/quick_pair/repository/oauth_http_fetcher_unittest.cc
+++ b/ash/quick_pair/repository/oauth_http_fetcher_unittest.cc
@@ -20,7 +20,6 @@
 
 constexpr char kBody[] = "body";
 constexpr char kTestUrl[] = "http://www.test.com/";
-constexpr char kTestScope[] = "http://www.test.com/scope";
 const net::PartialNetworkTrafficAnnotationTag kTrafficAnnotation =
     net::DefinePartialNetworkTrafficAnnotation("test_request",
                                                "oauth2_api_call_flow",
@@ -53,8 +52,8 @@
   }
 
   void SetUp() override {
-    http_fetcher_ =
-        std::make_unique<OAuthHttpFetcher>(kTrafficAnnotation, kTestScope);
+    http_fetcher_ = std::make_unique<OAuthHttpFetcher>(
+        kTrafficAnnotation, signin::OAuthConsumerId::kFastPair);
     browser_delegate_ = std::make_unique<MockQuickPairBrowserDelegate>();
     ON_CALL(*browser_delegate_, GetURLLoaderFactory())
         .WillByDefault(
diff --git a/ash/resources/vector_icons/BUILD.gn b/ash/resources/vector_icons/BUILD.gn
index 14c17a2..4ccf8cc 100644
--- a/ash/resources/vector_icons/BUILD.gn
+++ b/ash/resources/vector_icons/BUILD.gn
@@ -73,7 +73,6 @@
     "capture_mode_copied_to_clipboard.icon",
     "capture_mode_demo_tools_assistant.icon",
     "capture_mode_demo_tools_launcher_assistant_off.icon",
-    "capture_mode_demo_tools_launcher_assistant_on.icon",
     "capture_mode_demo_tools_menu.icon",
     "capture_mode_demo_tools_search.icon",
     "capture_mode_demo_tools_settings_menu_entry_point.icon",
diff --git a/ash/resources/vector_icons/capture_mode_demo_tools_launcher_assistant_on.icon b/ash/resources/vector_icons/capture_mode_demo_tools_launcher_assistant_on.icon
deleted file mode 100644
index 78c4108..0000000
--- a/ash/resources/vector_icons/capture_mode_demo_tools_launcher_assistant_on.icon
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-CANVAS_DIMENSIONS, 20,
-MOVE_TO, 10, 2,
-CUBIC_TO, 5.58, 2, 2, 5.58, 2, 10,
-CUBIC_TO, 2, 14.42, 5.58, 18, 10, 18,
-CUBIC_TO, 14.42, 18, 18, 14.42, 18, 10,
-CUBIC_TO, 18, 5.58, 14.42, 2, 10, 2,
-CLOSE,
-MOVE_TO, 10, 16,
-CUBIC_TO, 6.69, 16, 4, 13.31, 4, 10,
-CUBIC_TO, 4, 6.69, 6.69, 4, 10, 4,
-CUBIC_TO, 13.31, 4, 16, 6.69, 16, 10,
-CUBIC_TO, 16, 13.31, 13.31, 16, 10, 16,
-CLOSE,
-NEW_PATH,
-MOVE_TO, 10, 15,
-CUBIC_TO, 12.76, 15, 15, 12.76, 15, 10,
-CUBIC_TO, 15, 7.24, 12.76, 5, 10, 5,
-CUBIC_TO, 7.24, 5, 5, 7.24, 5, 10,
-CUBIC_TO, 5, 12.76, 7.24, 15, 10, 15,
-CLOSE
diff --git a/ash/shelf/home_button.cc b/ash/shelf/home_button.cc
index 25203c67..d522803b 100644
--- a/ash/shelf/home_button.cc
+++ b/ash/shelf/home_button.cc
@@ -73,7 +73,6 @@
 // The space between the home button and quick app.
 constexpr int kQuickAppStartMargin = 8;
 
-constexpr uint8_t kAssistantVisibleAlpha = 255;    // 100% alpha
 constexpr uint8_t kAssistantInvisibleAlpha = 138;  // 54% alpha
 
 // Nudge animation constants
@@ -173,10 +172,7 @@
       fg_flags.setColor(GetColorProvider()->GetColor(GetIconColorId()));
 
       if (is_long_press_action_available) {
-        // active: 100% alpha, inactive: 54% alpha
-        fg_flags.setAlphaf(button_controller_->IsAssistantVisible()
-                               ? kAssistantVisibleAlpha / 255.0f
-                               : kAssistantInvisibleAlpha / 255.0f);
+        fg_flags.setAlphaf(kAssistantInvisibleAlpha / 255.0f);
       }
 
       const float thickness = std::ceil(ring_thickness_dp * dsf);
diff --git a/ash/shelf/home_button_controller.cc b/ash/shelf/home_button_controller.cc
index 6405fb1..3e95b2d 100644
--- a/ash/shelf/home_button_controller.cc
+++ b/ash/shelf/home_button_controller.cc
@@ -5,9 +5,7 @@
 #include "ash/shelf/home_button_controller.h"
 
 #include "ash/app_list/app_list_controller_impl.h"
-#include "ash/assistant/model/assistant_ui_model.h"
 #include "ash/capture_mode/capture_mode_controller.h"
-#include "ash/public/cpp/assistant/controller/assistant_ui_controller.h"
 #include "ash/root_window_controller.h"
 #include "ash/scanner/scanner_metrics.h"
 #include "ash/shelf/home_button.h"
@@ -45,8 +43,6 @@
   sunfish_scanner_feature_observation_.Observe(
       shell->sunfish_scanner_feature_watcher());
   shell->app_list_controller()->AddObserver(this);
-  AssistantUiController::Get()->GetModel()->AddObserver(this);
-  AssistantState::Get()->AddObserver(this);
 }
 
 HomeButtonController::~HomeButtonController() {
@@ -54,19 +50,15 @@
 
   // AppListController are destroyed early when Shel is being destroyed, so they
   // may not exist.
-  if (AssistantUiController::Get())
-    AssistantUiController::Get()->GetModel()->RemoveObserver(this);
   if (shell->app_list_controller())
     shell->app_list_controller()->RemoveObserver(this);
-  if (AssistantState::Get())
-    AssistantState::Get()->RemoveObserver(this);
 }
 
 bool HomeButtonController::MaybeHandleGestureEvent(ui::GestureEvent* event) {
   switch (event->type()) {
     case ui::EventType::kGestureTap:
     case ui::EventType::kGestureTapCancel:
-      // Unconditionally stop the animation, even if Assistant / Sunfish/Scanner
+      // Unconditionally stop the animation, even if Sunfish/Scanner
       // is not currently available - because the animation could have been
       // started when they _were_ available.
       // These are no-ops if the animation did not start.
@@ -76,7 +68,7 @@
       // After animating the ripple, let the button handle the event.
       return false;
     case ui::EventType::kGestureTapDown:
-      if (IsAssistantAvailable() || IsSunfishOrScannerAvailable()) {
+      if (IsSunfishOrScannerAvailable()) {
         tap_animation_delay_timer_->Start(
             FROM_HERE, kAssistantAnimationDelay,
             base::BindOnce(&HomeButtonController::StartAssistantAnimation,
@@ -99,23 +91,10 @@
         return true;
       }
 
-      if (IsAssistantAvailable()) {
-        base::RecordAction(base::UserMetricsAction(
-            "VoiceInteraction.Started.HomeButtonLongPress"));
-        tap_overlay_->BurstAnimation();
-        event->SetHandled();
-        Shell::SetRootWindowForNewWindows(
-            button_->GetWidget()->GetNativeWindow()->GetRootWindow());
-        AssistantUiController::Get()->ShowUi(
-            AssistantEntryPoint::kLongPressLauncher);
-        return true;
-      }
-
       return false;
     case ui::EventType::kGestureLongTap:
-      // Only consume the long tap event if Assistant / Sunfish/Scanner is
-      // available.
-      if (!(IsAssistantAvailable() || IsSunfishOrScannerAvailable())) {
+      // Only consume the long tap event if Sunfish/Scanner is available.
+      if (!IsSunfishOrScannerAvailable()) {
         return false;
       }
 
@@ -129,18 +108,7 @@
 }
 
 bool HomeButtonController::IsLongPressActionAvailable() {
-  return IsAssistantAvailable() || IsSunfishOrScannerAvailable();
-}
-
-bool HomeButtonController::IsAssistantVisible() {
-  return AssistantUiController::Get()->GetModel()->visibility() ==
-         AssistantVisibility::kVisible;
-}
-
-bool HomeButtonController::IsAssistantAvailable() {
-  AssistantStateBase* state = AssistantState::Get();
-  return state->allowed_state() == assistant::AssistantAllowedState::ALLOWED &&
-         state->settings_enabled().value_or(false);
+  return IsSunfishOrScannerAvailable();
 }
 
 bool HomeButtonController::IsSunfishOrScannerAvailable() const {
@@ -165,23 +133,6 @@
   }
 }
 
-void HomeButtonController::OnAssistantFeatureAllowedChanged(
-    assistant::AssistantAllowedState state) {
-  button_->OnIconUpdated();
-}
-
-void HomeButtonController::OnAssistantSettingsEnabled(bool enabled) {
-  button_->OnIconUpdated();
-}
-
-void HomeButtonController::OnUiVisibilityChanged(
-    AssistantVisibility new_visibility,
-    AssistantVisibility old_visibility,
-    std::optional<AssistantEntryPoint> entry_point,
-    std::optional<AssistantExitPoint> exit_point) {
-  button_->OnIconUpdated();
-}
-
 void HomeButtonController::OnSunfishScannerFeatureStatesChanged(
     SunfishScannerFeatureWatcher& source) {
   button_->OnIconUpdated();
diff --git a/ash/shelf/home_button_controller.h b/ash/shelf/home_button_controller.h
index 2827dbc..b6b01c8 100644
--- a/ash/shelf/home_button_controller.h
+++ b/ash/shelf/home_button_controller.h
@@ -7,7 +7,6 @@
 
 #include <memory>
 
-#include "ash/assistant/model/assistant_ui_model_observer.h"
 #include "ash/capture_mode/sunfish_scanner_feature_watcher.h"
 #include "ash/public/cpp/app_list/app_list_controller_observer.h"
 #include "ash/public/cpp/assistant/assistant_state.h"
@@ -33,8 +32,6 @@
 // Behavior is tested indirectly in HomeButtonTest and ShelfViewInkDropTest.
 class HomeButtonController : public AppListControllerObserver,
                              public display::DisplayObserver,
-                             public AssistantStateObserver,
-                             public AssistantUiModelObserver,
                              public SunfishScannerFeatureWatcher::Observer {
  public:
   explicit HomeButtonController(HomeButton* button);
@@ -53,13 +50,7 @@
   // opening the Assistant UI or opening a Sunfish-behavior capture session.
   bool IsLongPressActionAvailable();
 
-  // Whether the Assistant UI currently showing.
-  bool IsAssistantVisible();
-
  private:
-  // Whether the Assistant is available via long-press.
-  bool IsAssistantAvailable();
-
   // Whether Sunfish or Scanner's UI can be shown.
   bool IsSunfishOrScannerAvailable() const;
 
@@ -69,18 +60,6 @@
   // display::DisplayObserver:
   void OnDisplayTabletStateChanged(display::TabletState state) override;
 
-  // AssistantStateObserver:
-  void OnAssistantFeatureAllowedChanged(
-      assistant::AssistantAllowedState) override;
-  void OnAssistantSettingsEnabled(bool enabled) override;
-
-  // AssistantUiModelObserver:
-  void OnUiVisibilityChanged(
-      AssistantVisibility new_visibility,
-      AssistantVisibility old_visibility,
-      std::optional<AssistantEntryPoint> entry_point,
-      std::optional<AssistantExitPoint> exit_point) override;
-
   // SunfishScannerFeatureWatcher::Observer:
   void OnSunfishScannerFeatureStatesChanged(
       SunfishScannerFeatureWatcher& source) override;
diff --git a/ash/shelf/hotseat_widget_unittest.cc b/ash/shelf/hotseat_widget_unittest.cc
index 92fa611..c8e7156 100644
--- a/ash/shelf/hotseat_widget_unittest.cc
+++ b/ash/shelf/hotseat_widget_unittest.cc
@@ -11,7 +11,6 @@
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/app_list/test/app_list_test_helper.h"
 #include "ash/app_list/views/app_list_view.h"
-#include "ash/assistant/assistant_controller_impl.h"
 #include "ash/capture_mode/capture_mode_controller.h"
 #include "ash/constants/ash_features.h"
 #include "ash/focus/focus_cycler.h"
@@ -404,8 +403,7 @@
   EXPECT_EQ(CaptureModeController::Get()->IsActive(),
             sunfish_or_scanner_enabled());
 
-  // Hotseat should not change when starting a Sunfish-session or showing
-  // Assistant.
+  // Hotseat should not change when starting a Sunfish-session
   watcher.CheckEqual({});
 }
 
diff --git a/ash/shell.cc b/ash/shell.cc
index f872b50..376d6f7 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -38,7 +38,6 @@
 #include "ash/api/tasks/tasks_delegate.h"
 #include "ash/app_list/app_list_controller_impl.h"
 #include "ash/app_list/app_list_feature_usage_metrics.h"
-#include "ash/assistant/assistant_controller_impl.h"
 #include "ash/auth/active_session_auth_controller_impl.h"
 #include "ash/birch/birch_model.h"
 #include "ash/booting/booting_animation_controller.h"
@@ -877,14 +876,8 @@
   // Accelerometer file reader stops listening to tablet mode controller.
   AccelerometerReader::GetInstance()->StopListenToTabletModeController();
 
-  // Destroy |ambient_controller_| before |assistant_controller_|.
   ambient_controller_.reset();
 
-  // Destroy |assistant_controller_| earlier than |tablet_mode_controller_| so
-  // that the former will destroy the Assistant view hierarchy which has a
-  // dependency on the latter.
-  assistant_controller_.reset();
-
   // Because this function will call |TabletModeController::RemoveObserver|, do
   // it before destroying |tablet_mode_controller_|.
   accessibility_controller_->Shutdown();
@@ -1607,7 +1600,6 @@
   fullscreen_magnifier_controller_ =
       std::make_unique<FullscreenMagnifierController>();
   mru_window_tracker_ = std::make_unique<MruWindowTracker>();
-  assistant_controller_ = std::make_unique<AssistantControllerImpl>();
 
   // MultiDisplayMetricsController has a dependency on `mru_window_tracker_`.
   multi_display_metrics_controller_ =
@@ -1630,8 +1622,8 @@
       std::make_unique<SunfishScannerFeatureWatcher>(*session_controller_,
                                                      *this);
 
-  // |tablet_mode_controller_| |mru_window_tracker_|, and
-  // |assistant_controller_| are put before |app_list_controller_| as they are
+  // |tablet_mode_controller_| |mru_window_tracker_|
+  // are put before |app_list_controller_| as they are
   // used in its constructor.
   app_list_controller_ = std::make_unique<AppListControllerImpl>();
 
diff --git a/ash/shell.h b/ash/shell.h
index 8f53f65..f6b16f58 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -114,7 +114,6 @@
 class AshDBusServices;
 class AshFocusRules;
 class AshTouchTransformController;
-class AssistantControllerImpl;
 class AudioEffectsController;
 class AutoclickController;
 class AutozoomControllerImpl;
@@ -446,9 +445,6 @@
     return ash_accelerator_configuration_.get();
   }
   AcceleratorLookup* accelerator_lookup() { return accelerator_lookup_.get(); }
-  AssistantControllerImpl* assistant_controller() {
-    return assistant_controller_.get();
-  }
   AudioEffectsController* audio_effects_controller() {
     return audio_effects_controller_.get();
   }
@@ -1036,7 +1032,6 @@
   // May be null in tests or when running on linux-chromeos.
   scoped_refptr<dbus::Bus> dbus_bus_;
   std::unique_ptr<AshDBusServices> ash_dbus_services_;
-  std::unique_ptr<AssistantControllerImpl> assistant_controller_;
   std::unique_ptr<AudioEffectsController> audio_effects_controller_;
   std::unique_ptr<AutozoomControllerImpl> autozoom_controller_;
   std::unique_ptr<BacklightsForcedOffSetter> backlights_forced_off_setter_;
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc
index 95d46a0..23941613 100644
--- a/ash/test/ash_test_helper.cc
+++ b/ash/test/ash_test_helper.cc
@@ -10,7 +10,6 @@
 #include "ash/accelerometer/accelerometer_reader.h"
 #include "ash/ambient/test/ambient_ash_test_helper.h"
 #include "ash/app_list/test/app_list_test_helper.h"
-#include "ash/assistant/assistant_controller_impl.h"
 #include "ash/constants/ash_features.h"
 #include "ash/constants/ash_switches.h"
 #include "ash/display/display_configuration_controller_test_api.h"
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 516f7d85..9cf9079 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -1759,7 +1759,8 @@
           "clang_revision=\"$_clang_revision\" but clang_version=\"$clang_version\". clang_version in build/toolchain/toolchain.gni is likely outdated.")
     }
 
-    if (toolchain_has_rust && _perform_consistency_checks) {
+    if (toolchain_has_rust && _perform_consistency_checks &&
+        !rust_force_head_revision) {
       # Ensure that the synced rust version matches what's in git.
       _rust_revision_lines =
           filter_include(read_file("//tools/rust/update_rust.py", "list lines"),
diff --git a/build/toolchain/toolchain.gni b/build/toolchain/toolchain.gni
index ed381d0..ab22a746 100644
--- a/build/toolchain/toolchain.gni
+++ b/build/toolchain/toolchain.gni
@@ -13,6 +13,11 @@
   # `gclient runhooks` is run as well.
   llvm_force_head_revision = false
 
+  # Equivalent to llvm_force_head_revision, but for rust. When true, we expect
+  # to find a locally-build version of rust rather than the version specified
+  # in //tools/clang/scripts/update.py.
+  rust_force_head_revision = false
+
   # Cronet is shipped in AOSP, where it is built using the Android Mainline
   # Clang. Please refer to go/cronet-builders-with-mainline-clang-design for
   # more information.
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index 2d24b5952..136f77d 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision var in //DEPS.
-  libcxx_revision = "65a5746fb4cc5fd7fdd1773b0c50bc556ff8900a"
+  libcxx_revision = "23b5bc93867b93b73f7be97cf2e8a71e95770e07"
 }
diff --git a/buildtools/third_party/libc++/libcxx_headers.gni b/buildtools/third_party/libc++/libcxx_headers.gni
index f2df8494..8eaa0fe 100644
--- a/buildtools/third_party/libc++/libcxx_headers.gni
+++ b/buildtools/third_party/libc++/libcxx_headers.gni
@@ -11,7 +11,7 @@
 import("//buildtools/deps_revisions.gni")
 
 assert(
-    libcxx_revision == "65a5746fb4cc5fd7fdd1773b0c50bc556ff8900a",
+    libcxx_revision == "23b5bc93867b93b73f7be97cf2e8a71e95770e07",
     "libcxx_headers.gni and third_party/libc++ are out of sync.$0x0A$0x0AIf you were messing around with the libc++ repository, run:$0x0A`buildtools/third_party/libc++/generate_libcxx_headers.py`$0x0A$0x0AIf the script doesn't resolve the error, file a bug to msta@ with reproduction details.$0x0A")
 
 libcxx_headers = [
@@ -795,7 +795,6 @@
   "//third_party/libc++/src/include/__tree",
   "//third_party/libc++/src/include/__tuple/find_index.h",
   "//third_party/libc++/src/include/__tuple/ignore.h",
-  "//third_party/libc++/src/include/__tuple/make_tuple_types.h",
   "//third_party/libc++/src/include/__tuple/sfinae_helpers.h",
   "//third_party/libc++/src/include/__tuple/tuple_element.h",
   "//third_party/libc++/src/include/__tuple/tuple_like.h",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index e205206..0977009 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -744,6 +744,7 @@
   "java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java",
   "java/src/org/chromium/chrome/browser/metrics/LegacyTabStartupMetricsTracker.java",
   "java/src/org/chromium/chrome/browser/metrics/StartupMetricsTracker.java",
+  "java/src/org/chromium/chrome/browser/metrics/StorageSystem.java",
   "java/src/org/chromium/chrome/browser/metrics/UmaActivityObserver.java",
   "java/src/org/chromium/chrome/browser/metrics/UmaSessionStats.java",
   "java/src/org/chromium/chrome/browser/metrics/VariationsSession.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml
index cfe56f096..1088d38 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_message_card_item.xml
@@ -28,6 +28,7 @@
         android:layout_gravity="start|center_vertical"
         android:layout_marginVertical="@dimen/message_card_description_vertical_margin"
         android:layout_weight="1"
+        android:screenReaderFocusable="true"
         android:textAlignment="viewStart"
         android:textAppearance="@style/TextAppearance.TextMedium.Primary" />
     <org.chromium.ui.widget.ButtonCompat
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
index 9cf638b..0882d0e 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
@@ -556,7 +556,7 @@
                     LayoutInflater.from(mActivity)
                             .inflate(R.layout.new_tab_page_feed_header, null, false);
             mHeaderView.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
-            if (treatment.equals("none")) {
+            if (!treatment.equals("label")) {
                 mHeaderView.setVisibility(View.GONE);
             }
         } else {
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
index e5a1707..31a5d8c 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -1230,12 +1230,12 @@
 
     /** Returns the feed header text. */
     private @Nullable String getHeaderText(boolean isExpanded) {
-        if (isExpanded) {
+        if (isExpanded && ChromeFeatureList.isEnabled(ChromeFeatureList.FEED_HEADER_REMOVAL)) {
             String treatment =
                     ChromeFeatureList.getFieldTrialParamByFeature(
                             ChromeFeatureList.FEED_HEADER_REMOVAL, "treatment");
             // Returns null to indicate that no feed header is shown.
-            if (treatment.equals("none")) return null;
+            if (!treatment.equals("label")) return null;
         }
 
         Resources res = mContext.getResources();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridge.java
index 6af5496e..3257c58 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataBridge.java
@@ -144,9 +144,9 @@
             int[] dataTypes,
             @TimePeriod int timePeriod,
             String[] excludedDomains,
-            int[] excludedDomainReasons,
-            String[] ignoredDomains,
-            int[] ignoredDomainReasons) {
+            int @Nullable [] excludedDomainReasons,
+            String @Nullable [] ignoredDomains,
+            int @Nullable [] ignoredDomainReasons) {
         BrowsingDataBridgeJni.get()
                 .clearBrowsingData(
                         mProfile,
@@ -324,9 +324,9 @@
                 @JniType("std::vector<int32_t>") int[] dataTypes,
                 int timePeriod,
                 @JniType("std::vector<std::string>") String[] excludedDomains,
-                @JniType("std::vector<int32_t>") int[] excludedDomainReasons,
-                @JniType("std::vector<std::string>") String[] ignoredDomains,
-                @JniType("std::vector<int32_t>") int[] ignoredDomainReasons);
+                @JniType("std::vector<int32_t>") int @Nullable [] excludedDomainReasons,
+                @JniType("std::vector<std::string>") String @Nullable [] ignoredDomains,
+                @JniType("std::vector<int32_t>") int @Nullable [] ignoredDomainReasons);
 
         void requestInfoAboutOtherFormsOfBrowsingHistory(
                 @JniType("Profile*") Profile profile, OtherFormsOfBrowsingHistoryListener listener);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
index 428effc5..940bbcb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.browsing_data;
 
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.chrome.browser.browsing_data.TimePeriodUtils.getTimePeriodSpinnerOptions;
 
 import android.app.Activity;
@@ -27,7 +29,6 @@
 import androidx.annotation.ColorRes;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
-import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.collection.ArraySet;
 import androidx.preference.Preference;
@@ -40,6 +41,8 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.supplier.ObservableSupplier;
 import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.browsing_data.BrowsingDataCounterBridge.BrowsingDataCounterCallback;
 import org.chromium.chrome.browser.browsing_data.TimePeriodUtils.TimePeriodSpinnerOption;
@@ -79,6 +82,7 @@
  * Settings screen that allows the user to clear browsing data. The user can choose which types of
  * data to clear (history, cookies, etc), and the time range from which to clear data.
  */
+@NullMarked
 public class ClearBrowsingDataFragment extends ChromeBaseSettingsFragment
         implements BrowsingDataBridge.OnClearBrowsingDataListener,
                 Preference.OnPreferenceClickListener,
@@ -95,7 +99,7 @@
         private final ClearBrowsingDataFragment mParent;
         private final @DialogOption int mOption;
         private final ClearBrowsingDataCheckBoxPreference mCheckbox;
-        private BrowsingDataCounterBridge mCounter;
+        private @Nullable BrowsingDataCounterBridge mCounter;
         private @TimePeriod int mSelectedTimePeriod;
 
         public Item(
@@ -226,17 +230,17 @@
 
     public static final String CLEAR_BROWSING_DATA_FETCHER = "clearBrowsingDataFetcher";
 
-    private OtherFormsOfHistoryDialogFragment mDialogAboutOtherFormsOfBrowsingHistory;
+    private @Nullable OtherFormsOfHistoryDialogFragment mDialogAboutOtherFormsOfBrowsingHistory;
 
     private SigninManager mSigninManager;
 
-    private ProgressDialog mProgressDialog;
+    private @Nullable ProgressDialog mProgressDialog;
     private Item[] mItems;
     private ClearBrowsingDataFetcher mFetcher;
 
     // This is the dialog we show to the user that lets them 'uncheck' (or exclude) the above
     // important domains from being cleared.
-    private ConfirmImportantSitesDialogFragment mConfirmImportantSitesDialog;
+    private @Nullable ConfirmImportantSitesDialogFragment mConfirmImportantSitesDialog;
 
     private @TimePeriod int mLastSelectedTimePeriod;
     private boolean mShouldShowPostDeleteFeedback;
@@ -363,10 +367,10 @@
      */
     private void clearBrowsingData(
             Set<Integer> options,
-            @Nullable String[] excludedDomains,
-            @Nullable int[] excludedDomainReasons,
-            @Nullable String[] ignoredDomains,
-            @Nullable int[] ignoredDomainReasons) {
+            String @Nullable [] excludedDomains,
+            int @Nullable [] excludedDomainReasons,
+            String @Nullable [] ignoredDomains,
+            int @Nullable [] ignoredDomainReasons) {
         onClearBrowsingData();
         showProgressDialog();
         Set<Integer> dataTypes = new ArraySet<>();
@@ -398,6 +402,7 @@
 
         Object spinnerSelection =
                 ((SpinnerPreference) findPreference(PREF_TIME_RANGE)).getSelectedOption();
+        assumeNonNull(spinnerSelection);
         mLastSelectedTimePeriod = ((TimePeriodSpinnerOption) spinnerSelection).getTimePeriod();
         int[] dataTypesArray = CollectionUtil.integerCollectionToIntArray(dataTypes);
         if (excludedDomains != null && excludedDomains.length != 0) {
@@ -573,7 +578,7 @@
 
     /** Disable the "Clear" button if none of the options are selected. Otherwise, enable it. */
     private void updateButtonState() {
-        Button clearButton = (Button) getView().findViewById(R.id.clear_button);
+        Button clearButton = (Button) assumeNonNull(getView()).findViewById(R.id.clear_button);
         boolean isEnabled = !getSelectedOptions().isEmpty();
         clearButton.setEnabled(isEnabled);
     }
@@ -590,9 +595,9 @@
         return spinnerOptionIndex;
     }
 
-    private void setUpClearBrowsingDataFetcher(Bundle savedInstanceState) {
+    private void setUpClearBrowsingDataFetcher(@Nullable Bundle savedInstanceState) {
         if (savedInstanceState != null) {
-            mFetcher = savedInstanceState.getParcelable(CLEAR_BROWSING_DATA_FETCHER);
+            mFetcher = assertNonNull(savedInstanceState.getParcelable(CLEAR_BROWSING_DATA_FETCHER));
             return;
         }
 
@@ -610,7 +615,8 @@
         setUpClearBrowsingDataFetcher(savedInstanceState);
         mPageTitle.set(getString(R.string.clear_browsing_data_title));
         SettingsUtils.addPreferencesFromResource(this, R.xml.clear_browsing_data_preferences);
-        mSigninManager = IdentityServicesProvider.get().getSigninManager(getProfile());
+        mSigninManager =
+                assertNonNull(IdentityServicesProvider.get().getSigninManager(getProfile()));
         List<Integer> options = getDialogOptions(fragmentArgs);
         mItems = new Item[options.size()];
 
@@ -639,6 +645,7 @@
 
         Object spinnerSelection =
                 ((SpinnerPreference) findPreference(PREF_TIME_RANGE)).getSelectedOption();
+        assumeNonNull(spinnerSelection);
         mLastSelectedTimePeriod = ((TimePeriodSpinnerOption) spinnerSelection).getTimePeriod();
 
         for (int i = 0; i < options.size(); i++) {
@@ -758,12 +765,12 @@
     }
 
     @VisibleForTesting
-    ProgressDialog getProgressDialog() {
+    @Nullable ProgressDialog getProgressDialog() {
         return mProgressDialog;
     }
 
     @VisibleForTesting
-    ConfirmImportantSitesDialogFragment getImportantSitesDialogFragment() {
+    @Nullable ConfirmImportantSitesDialogFragment getImportantSitesDialogFragment() {
         return mConfirmImportantSitesDialog;
     }
 
@@ -813,12 +820,13 @@
                         mFetcher.getSortedExampleOrigins());
         mConfirmImportantSitesDialog.setTargetFragment(this, IMPORTANT_SITES_DIALOG_CODE);
         mConfirmImportantSitesDialog.show(
-                getFragmentManager(), ConfirmImportantSitesDialogFragment.FRAGMENT_TAG);
+                assertNonNull(getFragmentManager()),
+                ConfirmImportantSitesDialogFragment.FRAGMENT_TAG);
     }
 
     /** Used only to access the dialog about other forms of browsing history from tests. */
     @VisibleForTesting
-    OtherFormsOfHistoryDialogFragment getDialogAboutOtherFormsOfBrowsingHistory() {
+    @Nullable OtherFormsOfHistoryDialogFragment getDialogAboutOtherFormsOfBrowsingHistory() {
         return mDialogAboutOtherFormsOfBrowsingHistory;
     }
 
@@ -827,8 +835,9 @@
      * positive button response.
      */
     @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
         if (requestCode == IMPORTANT_SITES_DIALOG_CODE && resultCode == Activity.RESULT_OK) {
+            assert data != null;
             // Deselected means that the user is excluding the domain from being cleared.
             String[] deselectedDomains =
                     data.getStringArrayExtra(
@@ -850,6 +859,7 @@
                         1,
                         mFetcher.getMaxImportantSites() + 1,
                         mFetcher.getMaxImportantSites() + 1);
+                assert ignoredDomains != null;
                 RecordHistogram.recordCustomCountHistogram(
                         "History.ClearBrowsingData.ImportantIgnoredNum",
                         ignoredDomains.length,
@@ -911,7 +921,7 @@
     }
 
     /** Get the last focused activity that has not been destroyed. */
-    private Activity getLastFocusedActivity() {
+    private @Nullable Activity getLastFocusedActivity() {
         if (ApplicationStatus.hasVisibleActivities()) {
             return ApplicationStatus.getLastTrackedFocusedActivity();
         } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java
index 83cd360a..b8d6399 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser.browsing_data;
 
+import static org.chromium.build.NullUtil.assumeNonNull;
+
 import android.app.Activity;
 import android.app.ActivityManager;
 import android.app.Dialog;
@@ -30,6 +32,9 @@
 
 import org.chromium.base.CollectionUtil;
 import org.chromium.base.ContextUtils;
+import org.chromium.build.annotations.Initializer;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileManager;
@@ -55,6 +60,7 @@
  * We use proper bundle construction (through the {@link #newInstance(String[], int[], String[])}
  * method) and onActivityResult return conventions.
  */
+@NullMarked
 public class ConfirmImportantSitesDialogFragment extends DialogFragment {
     private class ClearBrowsingDataAdapter extends ArrayAdapter<String>
             implements AdapterView.OnItemClickListener {
@@ -63,7 +69,7 @@
         private final RoundedIconGenerator mIconGenerator;
 
         private ClearBrowsingDataAdapter(
-                String[] domains, String[] faviconURLs, Resources resources) {
+                String[] domains, String @Nullable [] faviconURLs, Resources resources) {
             super(getActivity(), R.layout.confirm_important_sites_list_row, domains);
             mDomains = domains;
             mFaviconURLs = faviconURLs;
@@ -77,7 +83,7 @@
         }
 
         @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
+        public View getView(int position, @Nullable View convertView, ViewGroup parent) {
             View childView = convertView;
             if (childView == null) {
                 LayoutInflater inflater = LayoutInflater.from(getActivity());
@@ -96,8 +102,10 @@
 
         private void configureChildView(int position, ViewAndFaviconHolder viewHolder) {
             String domain = mDomains[position];
-            viewHolder.checkboxView.setChecked(mCheckedState.get(domain));
+            assumeNonNull(viewHolder.checkboxView)
+                    .setChecked(Boolean.TRUE.equals(mCheckedState.get(domain)));
             viewHolder.checkboxView.setText(domain);
+            assert mFaviconURLs != null;
             loadFavicon(viewHolder, mFaviconURLs[position]);
         }
 
@@ -109,9 +117,9 @@
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             String domain = mDomains[position];
             ViewAndFaviconHolder viewHolder = (ViewAndFaviconHolder) view.getTag();
-            boolean isChecked = mCheckedState.get(domain);
+            boolean isChecked = Boolean.TRUE.equals(mCheckedState.get(domain));
             mCheckedState.put(domain, !isChecked);
-            viewHolder.checkboxView.setChecked(!isChecked);
+            assumeNonNull(viewHolder.checkboxView).setChecked(!isChecked);
         }
 
         private void loadFavicon(final ViewAndFaviconHolder viewHolder, final String url) {
@@ -119,7 +127,7 @@
                     new LargeIconCallback() {
                         @Override
                         public void onLargeIconAvailable(
-                                Bitmap icon,
+                                @Nullable Bitmap icon,
                                 int fallbackColor,
                                 boolean isFallbackColorDefault,
                                 @IconType int iconType) {
@@ -132,10 +140,11 @@
                                             mIconGenerator,
                                             getResources(),
                                             mFaviconSize);
-                            viewHolder.imageView.setImageDrawable(image);
+                            assumeNonNull(viewHolder.imageView).setImageDrawable(image);
                         }
                     };
-            mLargeIconBridge.getLargeIconForStringUrl(url, mFaviconSize, viewHolder.imageCallback);
+            assumeNonNull(mLargeIconBridge)
+                    .getLargeIconForStringUrl(url, mFaviconSize, viewHolder.imageCallback);
         }
     }
 
@@ -145,9 +154,9 @@
      * the favicon image callback so that we can make sure we load the correct favicon.
      */
     private static class ViewAndFaviconHolder {
-        public CheckBox checkboxView;
-        public ImageView imageView;
-        public LargeIconCallback imageCallback;
+        public @Nullable CheckBox checkboxView;
+        public @Nullable ImageView imageView;
+        public @Nullable LargeIconCallback imageCallback;
     }
 
     /**
@@ -158,7 +167,9 @@
      * @return An instance of ConfirmImportantSitesDialogFragment with the bundle arguments set.
      */
     public static ConfirmImportantSitesDialogFragment newInstance(
-            String[] importantDomains, int[] importantDomainReasons, String[] faviconURLs) {
+            String @Nullable [] importantDomains,
+            int @Nullable [] importantDomainReasons,
+            String @Nullable [] faviconURLs) {
         ConfirmImportantSitesDialogFragment dialogFragment =
                 new ConfirmImportantSitesDialogFragment();
         Bundle bundle = new Bundle();
@@ -206,36 +217,39 @@
     private final Map<String, Integer> mImportantDomainsReasons;
 
     /** Array of favicon urls to use for each important domain above. */
-    private String[] mFaviconURLs;
+    private String @Nullable [] mFaviconURLs;
 
     /** The map of domains to the checked state, where true is checked. */
     private final Map<String, Boolean> mCheckedState;
 
     /** The alert dialog shown to the user. */
-    private AlertDialog mDialog;
+    private @Nullable AlertDialog mDialog;
 
     /** Our adapter that we use with the list view in the dialog. */
-    private ClearBrowsingDataAdapter mAdapter;
+    private @Nullable ClearBrowsingDataAdapter mAdapter;
 
-    private LargeIconBridge mLargeIconBridge;
+    private @Nullable LargeIconBridge mLargeIconBridge;
 
-    private Profile mProfile;
+    private @Nullable Profile mProfile;
 
     /** We store the custom list view for testing */
-    private ListView mSitesListView;
+    private @Nullable ListView mSitesListView;
 
     public ConfirmImportantSitesDialogFragment() {
         mImportantDomainsReasons = new HashMap<>();
         mCheckedState = new HashMap<>();
     }
 
+    @Initializer
     @Override
-    public void setArguments(Bundle args) {
+    public void setArguments(@Nullable Bundle args) {
+        assumeNonNull(args);
         super.setArguments(args);
-        mImportantDomains = args.getStringArray(IMPORTANT_DOMAINS_TAG);
+        mImportantDomains = assumeNonNull(args.getStringArray(IMPORTANT_DOMAINS_TAG));
         mFaviconURLs = args.getStringArray(FAVICON_URLS_TAG);
         int[] importantDomainReasons = args.getIntArray(IMPORTANT_DOMAIN_REASONS_TAG);
         for (int i = 0; i < mImportantDomains.length; ++i) {
+            assert importantDomainReasons != null;
             mImportantDomainsReasons.put(mImportantDomains[i], importantDomainReasons[i]);
             mCheckedState.put(mImportantDomains[i], true);
         }
@@ -251,7 +265,7 @@
     }
 
     @VisibleForTesting
-    public ListView getSitesList() {
+    public @Nullable ListView getSitesList() {
         return mSitesListView;
     }
 
@@ -264,7 +278,7 @@
     }
 
     @Override
-    public Dialog onCreateDialog(Bundle savedInstanceState) {
+    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
         // We check the domains and urls as well due to crbug.com/622879.
         if (savedInstanceState != null) {
             // The important domains and favicon URLs aren't currently saved, so if this dialog
@@ -326,11 +340,11 @@
                                     IGNORED_DOMAIN_REASONS_TAG,
                                     CollectionUtil.integerCollectionToIntArray(
                                             ignoredDomainReasons));
-                            getTargetFragment()
+                            assumeNonNull(getTargetFragment())
                                     .onActivityResult(
                                             getTargetRequestCode(), Activity.RESULT_OK, data);
                         } else {
-                            getTargetFragment()
+                            assumeNonNull(getTargetFragment())
                                     .onActivityResult(
                                             getTargetRequestCode(),
                                             Activity.RESULT_CANCELED,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
index 43277a23..2e1714a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -77,6 +77,7 @@
 import org.chromium.chrome.browser.media.MediaViewerUtils;
 import org.chromium.chrome.browser.metrics.LaunchMetrics;
 import org.chromium.chrome.browser.metrics.PackageMetrics;
+import org.chromium.chrome.browser.metrics.StorageSystem;
 import org.chromium.chrome.browser.metrics.UmaUtils;
 import org.chromium.chrome.browser.notifications.TrampolineActivityTracker;
 import org.chromium.chrome.browser.notifications.channels.ChannelsUpdater;
@@ -652,6 +653,8 @@
                 () -> {
                     initAsyncDiskTask();
 
+                    StorageSystem.recordStorageType();
+
                     DefaultBrowserInfo.initBrowserFetcher();
 
                     AfterStartupTaskUtils.setStartupComplete();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/StorageSystem.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/StorageSystem.java
new file mode 100644
index 0000000..f820f1a
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/StorageSystem.java
@@ -0,0 +1,86 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.metrics;
+
+import androidx.annotation.Nullable;
+
+import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.base.task.PostTask;
+import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+
+import java.io.File;
+import java.io.IOException;
+
+/** Methods for determining and recording the storage system type (e.g., eMMC, UFS). */
+@NullMarked
+public class StorageSystem {
+    // These values are persisted to logs. Entries should not be renumbered and numeric values
+    // should never be reused.
+    public @interface StorageType {
+        int UFS = 0;
+        int EMMC = 1;
+        int UNKNOWN = 2;
+        int UNDETERMINED = 3;
+        int COUNT = 4;
+    }
+
+    /** Asynchronously determines the storage type and records it to a UMA histogram. */
+    public static void recordStorageType() {
+        PostTask.postTask(
+                TaskTraits.BEST_EFFORT_MAY_BLOCK,
+                () -> {
+                    @StorageType int storageType = getStorageType();
+                    RecordHistogram.recordEnumeratedHistogram(
+                            "Android.StorageSystem.Type", storageType, StorageType.COUNT);
+                });
+    }
+
+    /**
+     * Determines the storage type by inspecting system files.
+     *
+     * @return The detected storage type.
+     */
+    private static @StorageType int getStorageType() {
+        try {
+            String userdataBlock = getResolvedLink("/dev/block/by-name/userdata");
+            if (userdataBlock == null) {
+                return StorageType.UNKNOWN;
+            }
+
+            // Remove the "/dev/block/" part.
+            userdataBlock = new File(userdataBlock).getName();
+
+            if (userdataBlock.startsWith("mmc")) {
+                return StorageType.EMMC;
+            }
+
+            String sysfsLink = getResolvedLink("/sys/class/block/" + userdataBlock);
+            if (sysfsLink == null) {
+                return StorageType.UNKNOWN;
+            }
+
+            if (sysfsLink.contains("/host0/")) {
+                return StorageType.UFS;
+            }
+
+            return StorageType.UNDETERMINED;
+        } catch (Exception e) {
+            return StorageType.UNKNOWN;
+        }
+    }
+
+    private static @Nullable String getResolvedLink(String path) {
+        try {
+            File file = new File(path);
+            if (!file.exists()) {
+                return null;
+            }
+            return file.getCanonicalPath();
+        } catch (IOException e) {
+            return null;
+        }
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
index 8224c10..e3fa37a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -2556,7 +2556,7 @@
         }
     }
 
-    private @UserAgentOverrideOption int calculateUserAgentOverrideOption(@Nullable GURL url) {
+    public @UserAgentOverrideOption int calculateUserAgentOverrideOption(@Nullable GURL url) {
         WebContents webContents = getWebContents();
         boolean currentRequestDesktopSite = TabUtils.isUsingDesktopUserAgent(webContents);
         // INHERIT means use the same UA that was used last time.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
index af2939b..4bd07d85 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
@@ -52,6 +52,7 @@
 import org.chromium.components.find_in_page.FindNotificationDetails;
 import org.chromium.content_public.browser.InvalidateTypes;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.content_public.browser.navigation_controller.UserAgentOverrideOption;
 import org.chromium.content_public.common.ResourceRequestBody;
 import org.chromium.url.GURL;
 
@@ -636,6 +637,11 @@
     }
 
     @Override
+    public @UserAgentOverrideOption int shouldOverrideUserAgentForPrerender2(GURL url) {
+        return mTab.calculateUserAgentOverrideOption(url);
+    }
+
+    @Override
     public void didChangeCloseSignalInterceptStatus() {
         mTab.didChangeCloseSignalInterceptStatus();
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
index f05d3a9..41a93c6b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceMediatorTest.java
@@ -85,7 +85,11 @@
 /** Tests for {@link FeedSurfaceMediator}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
-@EnableFeatures({ChromeFeatureList.WEB_FEED_SORT, ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP})
+@EnableFeatures({
+    ChromeFeatureList.WEB_FEED_SORT,
+    ChromeFeatureList.UNO_PHASE_2_FOLLOW_UP,
+    ChromeFeatureList.FEED_HEADER_REMOVAL
+})
 public class FeedSurfaceMediatorTest {
     static final @Px int TOOLBAR_HEIGHT = 10;
     @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 6a3af2c1..6065f17 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -10984,33 +10984,6 @@
         <message name="IDS_PASSWORD_MANAGER_EXPORT_DIALOG_TITLE" desc="The title of the file selection dialog for exporting passwords">
           Export Passwords From Chrome
         </message>
-        <message name="IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_TITLE_GPM" desc="The title of the 'save unsynced credentials' bubble.">
-          Save passwords?
-        </message>
-        <message name="IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_DESCRIPTION_GPM" desc="The description text of the 'save unsynced credentials' bubble.">
-          Google Password Manager couldn't save these passwords in your Google Account. You can save them to this device.
-        </message>
-
-        <if expr="not use_titlecase">
-          <message name="IDS_PASSWORD_MANAGER_SAVE_UNSYNCED_CREDENTIALS_BUTTON_GPM" desc="Button text for the 'save unsynced credentials' bubble's save option.">
-            Save to device
-          </message>
-        </if>
-        <if expr="use_titlecase">
-          <message name="IDS_PASSWORD_MANAGER_SAVE_UNSYNCED_CREDENTIALS_BUTTON_GPM" desc="In Title Case: Button text for the 'save unsynced credentials' bubble's save option.">
-            Save to Device
-          </message>
-        </if>
-        <if expr="not use_titlecase">
-          <message name="IDS_PASSWORD_MANAGER_DISCARD_UNSYNCED_CREDENTIALS_BUTTON" desc="Button text for the 'save unsynced credentials' bubble's discard option.">
-            No thanks
-          </message>
-        </if>
-        <if expr="use_titlecase">
-          <message name="IDS_PASSWORD_MANAGER_DISCARD_UNSYNCED_CREDENTIALS_BUTTON" desc="In Title Case: Button text for the 'save unsynced credentials' bubble's discard option.">
-            No Thanks
-          </message>
-        </if>
       </if>
       <if expr="is_android">
         <message name="IDS_PASSWORD_MANAGER_SAVE_BUTTON" desc="Mobile: Button text for the 'Save Password' infobar's 'Remember password' option"  formatter_data="android_java">
diff --git a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_DISCARD_UNSYNCED_CREDENTIALS_BUTTON.png.sha1 b/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_DISCARD_UNSYNCED_CREDENTIALS_BUTTON.png.sha1
deleted file mode 100644
index 9a8f8281..0000000
--- a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_DISCARD_UNSYNCED_CREDENTIALS_BUTTON.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9ebec308091b1bb9bab8a6baccb905d83daf2a23
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_SAVE_UNSYNCED_CREDENTIALS_BUTTON_GPM.png.sha1 b/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_SAVE_UNSYNCED_CREDENTIALS_BUTTON_GPM.png.sha1
deleted file mode 100644
index 8b2ef99..0000000
--- a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_SAVE_UNSYNCED_CREDENTIALS_BUTTON_GPM.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c65ce842292e418d38c0a55ddc3ecc37c052313d
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_DESCRIPTION_GPM.png.sha1 b/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_DESCRIPTION_GPM.png.sha1
deleted file mode 100644
index 8b2ef99..0000000
--- a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_DESCRIPTION_GPM.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c65ce842292e418d38c0a55ddc3ecc37c052313d
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_TITLE_GPM.png.sha1 b/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_TITLE_GPM.png.sha1
deleted file mode 100644
index 8b2ef99..0000000
--- a/chrome/app/generated_resources_grd/IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_TITLE_GPM.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c65ce842292e418d38c0a55ddc3ecc37c052313d
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 2d476881..ac05a7553 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1845,6 +1845,10 @@
     # TODO(crbug.com/): Remove this circular dependency when
     # c/b/net/system_network_context_manager.h gets componentized.
     "//chrome/browser/assist_ranker:impl",
+
+    # TODO(crbug.com/353332589): Remove once profile_manager.h has been moved
+    # into the //chrome/browser/profiles target.
+    "//chrome/browser/regional_capabilities:metrics_provider_impl",
   ]
 
   public_deps = [
@@ -1987,6 +1991,8 @@
     "//chrome/browser/profiling_host",
     "//chrome/browser/promos:utils",
     "//chrome/browser/reading_list",
+    "//chrome/browser/regional_capabilities",
+    "//chrome/browser/regional_capabilities:metrics_provider_impl",
     "//chrome/browser/resource_coordinator:tab_manager_features",
     "//chrome/browser/resources/accessibility:resources",
     "//chrome/browser/safe_browsing",
@@ -2453,6 +2459,7 @@
     "//components/sqlite_proto",
     "//components/startup_metric_utils",
     "//components/storage_monitor",
+    "//components/strike_database:features",
     "//components/strings",
     "//components/subresource_filter/content/browser",
     "//components/subresource_filter/content/shared/browser",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bedf007..eb424480 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -177,6 +177,7 @@
 #include "components/soda/soda_features.h"
 #include "components/spellcheck/common/spellcheck_features.h"
 #include "components/spellcheck/spellcheck_buildflags.h"
+#include "components/strike_database/strike_database_features.h"
 #include "components/supervised_user/core/common/features.h"
 #include "components/supervised_user/core/common/supervised_user_constants.h"
 #include "components/sync/base/command_line_switches.h"
@@ -11018,6 +11019,10 @@
                                     kAndroidTabHighlightingVariations,
                                     "AndroidTabHighlightingVariations")},
 
+    {"android-zoom-indicator", flag_descriptions::kAndroidZoomIndicatorName,
+     flag_descriptions::kAndroidZoomIndicatorDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kAndroidZoomIndicator)},
+
     {"android-tips-notifications",
      flag_descriptions::kAndroidTipsNotificationsName,
      flag_descriptions::kAndroidTipsNotificationsDescription, kOsAndroid,
@@ -12765,7 +12770,7 @@
     {"disable-autofill-strike-system",
      flag_descriptions::kDisableAutofillStrikeSystemName,
      flag_descriptions::kDisableAutofillStrikeSystemDescription, kOsAll,
-     FEATURE_VALUE_TYPE(autofill::features::kDisableAutofillStrikeSystem)},
+     FEATURE_VALUE_TYPE(strike_database::features::kDisableStrikeSystem)},
 
 #if BUILDFLAG(IS_ANDROID)
     {"allow-non-family-link-url-filter-mode",
diff --git a/chrome/browser/ash/app_list/search/BUILD.gn b/chrome/browser/ash/app_list/search/BUILD.gn
index d6e5f3c9..0f5cb01 100644
--- a/chrome/browser/ash/app_list/search/BUILD.gn
+++ b/chrome/browser/ash/app_list/search/BUILD.gn
@@ -166,7 +166,6 @@
     "//ash",
     "//ash/constants",
     "//ash/public/cpp",
-    "//ash/public/cpp/assistant/test_support",
     "//ash/public/mojom:accelerator_info",
     "//ash/webui/help_app_ui",
     "//ash/webui/personalization_app",
diff --git a/chrome/browser/ash/app_list/search/assistant_text_search_provider.cc b/chrome/browser/ash/app_list/search/assistant_text_search_provider.cc
index 0665044d..038ec3d 100644
--- a/chrome/browser/ash/app_list/search/assistant_text_search_provider.cc
+++ b/chrome/browser/ash/app_list/search/assistant_text_search_provider.cc
@@ -97,10 +97,6 @@
 AssistantTextSearchProvider::AssistantTextSearchProvider()
     : SearchProvider(SearchCategory::kAssistant) {
   UpdateResults();
-
-  // Bind observers.
-  assistant_controller_observation_.Observe(ash::AssistantController::Get());
-  assistant_state_observation_.Observe(ash::AssistantState::Get());
 }
 
 AssistantTextSearchProvider::~AssistantTextSearchProvider() = default;
@@ -119,12 +115,6 @@
 }
 
 void AssistantTextSearchProvider::OnAssistantControllerDestroying() {
-  DCHECK(assistant_state_observation_.IsObservingSource(
-      ash::AssistantState::Get()));
-  assistant_state_observation_.Reset();
-  DCHECK(assistant_controller_observation_.IsObservingSource(
-      ash::AssistantController::Get()));
-  assistant_controller_observation_.Reset();
 }
 
 void AssistantTextSearchProvider::OnAssistantFeatureAllowedChanged(
diff --git a/chrome/browser/ash/app_list/search/assistant_text_search_provider.h b/chrome/browser/ash/app_list/search/assistant_text_search_provider.h
index 128cebda..6f23a08 100644
--- a/chrome/browser/ash/app_list/search/assistant_text_search_provider.h
+++ b/chrome/browser/ash/app_list/search/assistant_text_search_provider.h
@@ -8,7 +8,6 @@
 #include "ash/public/cpp/assistant/assistant_state.h"
 #include "ash/public/cpp/assistant/controller/assistant_controller.h"
 #include "ash/public/cpp/assistant/controller/assistant_controller_observer.h"
-#include "base/scoped_observation.h"
 #include "chrome/browser/ash/app_list/search/search_provider.h"
 
 namespace app_list {
@@ -48,13 +47,6 @@
   void UpdateResults();
 
   std::u16string query_;
-
-  base::ScopedObservation<ash::AssistantController,
-                          ash::AssistantControllerObserver>
-      assistant_controller_observation_{this};
-
-  base::ScopedObservation<ash::AssistantStateBase, ash::AssistantStateObserver>
-      assistant_state_observation_{this};
 };
 
 }  // namespace app_list
diff --git a/chrome/browser/ash/system_web_apps/apps/help_app/help_app_untrusted_ui_config.cc b/chrome/browser/ash/system_web_apps/apps/help_app/help_app_untrusted_ui_config.cc
index 6f9004d..02f1f5f 100644
--- a/chrome/browser/ash/system_web_apps/apps/help_app/help_app_untrusted_ui_config.cc
+++ b/chrome/browser/ash/system_web_apps/apps/help_app/help_app_untrusted_ui_config.cc
@@ -212,8 +212,7 @@
   source->AddBoolean(
       "assistantAllowed",
       assistant_allowed_state == assistant::AssistantAllowedState::ALLOWED);
-  source->AddBoolean("assistantEnabled",
-                     AssistantState::Get()->settings_enabled().value_or(false));
+  source->AddBoolean("assistantEnabled", false);
   source->AddBoolean("playStoreEnabled",
                      arc::IsArcPlayStoreEnabledForProfile(profile));
   source->AddBoolean("pinEnabled", quick_unlock::IsPinEnabled());
diff --git a/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_unittest.cc b/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_unittest.cc
index 55be864..09e63c01 100644
--- a/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/analysis/local_binary_upload_service_unittest.cc
@@ -24,7 +24,6 @@
 
 using ::safe_browsing::BinaryUploadService;
 using ::testing::_;
-using ::testing::Invoke;
 using ::testing::NiceMock;
 using ::testing::NotNull;
 using ::testing::Return;
@@ -69,7 +68,7 @@
   void SetFileSystemSignals(bool is_os_verified,
                             const char* subject_name = nullptr) {
     EXPECT_CALL(mock_system_signals_service_, GetFileSystemSignals(_, _))
-        .WillRepeatedly(Invoke(
+        .WillRepeatedly(
             [is_os_verified, subject_name](
                 const std::vector<device_signals::GetFileSystemInfoOptions>&
                     options,
@@ -93,7 +92,7 @@
                         std::move(callback).Run({item});
                       },
                       is_os_verified, subject_name, std::move(callback)));
-            }));
+            });
   }
 
  private:
@@ -152,14 +151,13 @@
         settings);
     request->set_tab_title("tab_title");
     ON_CALL(*request, GetRequestData(_))
-        .WillByDefault(
-            Invoke([](BinaryUploadService::Request::DataCallback callback) {
-              BinaryUploadService::Request::Data data;
-              data.contents = "contents";
-              data.size = data.contents.size();
-              std::move(callback).Run(BinaryUploadService::Result::SUCCESS,
-                                      std::move(data));
-            }));
+        .WillByDefault([](BinaryUploadService::Request::DataCallback callback) {
+          BinaryUploadService::Request::Data data;
+          data.contents = "contents";
+          data.size = data.contents.size();
+          std::move(callback).Run(BinaryUploadService::Result::SUCCESS,
+                                  std::move(data));
+        });
     return request;
   }
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_impl_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_impl_unittest.cc
index 0ce3ecf..47a1cde 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_impl_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_impl_unittest.cc
@@ -36,7 +36,6 @@
 
 using base::test::RunOnceCallback;
 using testing::_;
-using testing::Invoke;
 using testing::StrictMock;
 
 namespace enterprise_connectors {
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service_unittest.cc
index b3a27245..7239c905 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/browser_attestation_service_unittest.cc
@@ -19,7 +19,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
-using testing::Invoke;
 using testing::StrictMock;
 
 namespace enterprise_connectors {
@@ -146,21 +145,21 @@
 
   void MockDecorateKeyInfo() {
     EXPECT_CALL(*mock_device_attester_, DecorateKeyInfo(_, _, _))
-        .WillOnce(Invoke([](const std::set<DTCPolicyLevel>& levels,
-                            KeyInfo& key_info, base::OnceClosure done_closure) {
+        .WillOnce([](const std::set<DTCPolicyLevel>& levels, KeyInfo& key_info,
+                     base::OnceClosure done_closure) {
           std::move(done_closure).Run();
-        }));
+        });
 
     EXPECT_CALL(*mock_profile_attester_, DecorateKeyInfo(_, _, _))
-        .WillOnce(Invoke([](const std::set<DTCPolicyLevel>& levels,
-                            KeyInfo& key_info, base::OnceClosure done_closure) {
+        .WillOnce([](const std::set<DTCPolicyLevel>& levels, KeyInfo& key_info,
+                     base::OnceClosure done_closure) {
           std::move(done_closure).Run();
-        }));
+        });
   }
 
   void MockSignResponse(bool add_browser_signature = true) {
     EXPECT_CALL(*mock_device_attester_, SignResponse(_, _, _, _))
-        .WillOnce(Invoke(
+        .WillOnce(
             [add_browser_signature](const std::set<DTCPolicyLevel>& levels,
                                     const std::string& challenge_response,
                                     SignedData& signed_data,
@@ -171,16 +170,15 @@
                 signed_data.set_signature(kFakeSignature);
               }
               std::move(done_closure).Run();
-            }));
+            });
 
     EXPECT_CALL(*mock_profile_attester_, SignResponse(_, _, _, _))
-        .WillOnce(
-            Invoke([](const std::set<DTCPolicyLevel>& levels,
-                      const std::string& challenge_response,
-                      SignedData& signed_data, base::OnceClosure done_closure) {
-              ASSERT_FALSE(challenge_response.empty());
-              std::move(done_closure).Run();
-            }));
+        .WillOnce([](const std::set<DTCPolicyLevel>& levels,
+                     const std::string& challenge_response,
+                     SignedData& signed_data, base::OnceClosure done_closure) {
+          ASSERT_FALSE(challenge_response.empty());
+          std::move(done_closure).Run();
+        });
   }
 
   void VerifyAttestationResponse(
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/device_attester_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/device_attester_unittest.cc
index 632346837..16a50f1 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/browser/device_attester_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/browser/device_attester_unittest.cc
@@ -15,7 +15,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
-using testing::Invoke;
 
 namespace enterprise_connectors {
 
@@ -52,7 +51,7 @@
 
   void SetupPubkeyExport(bool can_export_pubkey = true) {
     EXPECT_CALL(mock_key_manager_, ExportPublicKeyAsync(_))
-        .WillOnce(Invoke(
+        .WillOnce(
             [&, can_export_pubkey](
                 base::OnceCallback<void(std::optional<std::string>)> callback) {
               if (can_export_pubkey) {
@@ -65,15 +64,16 @@
               } else {
                 std::move(callback).Run(std::nullopt);
               }
-            }));
+            });
   }
 
   void SetupSignature(bool can_sign = true) {
     EXPECT_CALL(mock_key_manager_, SignStringAsync(_, _))
-        .WillOnce(Invoke(
-            [&, can_sign](const std::string& str,
-                          base::OnceCallback<void(
-                              std::optional<std::vector<uint8_t>>)> callback) {
+        .WillOnce(
+            [&, can_sign](
+                const std::string& str,
+                base::OnceCallback<void(std::optional<std::vector<uint8_t>>)>
+                    callback) {
               if (can_sign) {
                 signature =
                     test_key_pair_->key()->SignSlowly(base::as_byte_span(str));
@@ -81,7 +81,7 @@
               } else {
                 std::move(callback).Run(std::nullopt);
               }
-            }));
+            });
   }
 
   base::test::SingleThreadTaskEnvironment task_environment_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
index c11244ac..0e95860 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
@@ -26,7 +26,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
-using testing::Invoke;
 using testing::NotNull;
 
 namespace {
@@ -177,14 +176,14 @@
 
   std::string fake_display_name = "fake_display_name";
   EXPECT_CALL(*mock_signals_service_, CollectSignals(_))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&fake_display_name](
               base::OnceCallback<void(base::Value::Dict)> signals_callback) {
             auto fake_signals = std::make_unique<base::Value::Dict>();
             fake_signals->Set(device_signals::names::kDisplayName,
                               fake_display_name);
             std::move(signals_callback).Run(std::move(*fake_signals));
-          }));
+          });
 
   const DTAttestationResult result_code = DTAttestationResult::kSuccess;
   AttestationResponse attestation_response = {kAttestationResponse,
@@ -192,16 +191,16 @@
   EXPECT_CALL(*mock_attestation_service_,
               BuildChallengeResponseForVAChallenge(
                   GetSerializedSignedChallenge(kJsonChallenge), _, levels_, _))
-      .WillOnce(Invoke([&fake_display_name, &attestation_response](
-                           const std::string& challenge,
-                           const base::Value::Dict signals,
-                           const std::set<DTCPolicyLevel> levels,
-                           AttestationService::AttestationCallback callback) {
+      .WillOnce([&fake_display_name, &attestation_response](
+                    const std::string& challenge,
+                    const base::Value::Dict signals,
+                    const std::set<DTCPolicyLevel> levels,
+                    AttestationService::AttestationCallback callback) {
         EXPECT_EQ(
             signals.FindString(device_signals::names::kDisplayName)->c_str(),
             fake_display_name);
         std::move(callback).Run(attestation_response);
-      }));
+      });
 
   base::test::TestFuture<const DeviceTrustResponse&> future;
   device_trust_service->BuildChallengeResponse(
@@ -222,14 +221,14 @@
 
   std::string fake_display_name = "fake_display_name";
   EXPECT_CALL(*mock_signals_service_, CollectSignals(_))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&fake_display_name](
               base::OnceCallback<void(base::Value::Dict)> signals_callback) {
             auto fake_signals = std::make_unique<base::Value::Dict>();
             fake_signals->Set(device_signals::names::kDisplayName,
                               fake_display_name);
             std::move(signals_callback).Run(std::move(*fake_signals));
-          }));
+          });
 
   const DTAttestationResult result_code =
       DTAttestationResult::kMissingSigningKey;
@@ -238,13 +237,13 @@
   EXPECT_CALL(*mock_attestation_service_,
               BuildChallengeResponseForVAChallenge(
                   GetSerializedSignedChallenge(kJsonChallenge), _, levels_, _))
-      .WillOnce(Invoke([&attestation_response](
-                           const std::string& challenge,
-                           const base::Value::Dict signals,
-                           const std::set<DTCPolicyLevel> levels,
-                           AttestationService::AttestationCallback callback) {
+      .WillOnce([&attestation_response](
+                    const std::string& challenge,
+                    const base::Value::Dict signals,
+                    const std::set<DTCPolicyLevel> levels,
+                    AttestationService::AttestationCallback callback) {
         std::move(callback).Run(attestation_response);
-      }));
+      });
 
   base::test::TestFuture<const DeviceTrustResponse&> future;
   device_trust_service->BuildChallengeResponse(
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
index c6b6ce3..a4eda79 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
@@ -37,7 +37,6 @@
 using testing::_;
 using testing::ElementsAre;
 using testing::InSequence;
-using testing::Invoke;
 using testing::Pair;
 using testing::Return;
 
@@ -181,26 +180,25 @@
       result.response_code = response_code;
 
       EXPECT_CALL(*mock_cloud_delegate_, UploadBrowserPublicKey(_, _))
-          .WillOnce(Invoke(
+          .WillOnce(
               [response_code, result, this](
                   const enterprise_management::DeviceManagementRequest& request,
                   base::OnceCallback<void(policy::DMServerJobResult)>
                       callback) {
                 this->PostUploadSetup(response_code);
                 std::move(callback).Run(result);
-              }));
+              });
     } else {
       EXPECT_CALL(
           *mock_network_delegate_,
           SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
-          .WillOnce(
-              Invoke([response_code, this](
-                         const GURL& url, const std::string& dm_token,
-                         const std::string& body,
-                         base::OnceCallback<void(HttpResponseCode)> callback) {
-                this->PostUploadSetup(response_code);
-                std::move(callback).Run(response_code);
-              }));
+          .WillOnce([response_code, this](
+                        const GURL& url, const std::string& dm_token,
+                        const std::string& body,
+                        base::OnceCallback<void(HttpResponseCode)> callback) {
+            this->PostUploadSetup(response_code);
+            std::move(callback).Run(response_code);
+          });
     }
   }
 
@@ -258,8 +256,9 @@
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
   CheckForPermission();
-  EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair())
-      .WillOnce(Invoke([]() { return nullptr; }));
+  EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair()).WillOnce([]() {
+    return nullptr;
+  });
   SetUpDmToken();
 
   base::test::TestFuture<KeyRotationCommand::Status> future;
@@ -430,12 +429,12 @@
   if (is_key_uploaded_by_shared_api()) {
     base::OnceCallback<void(policy::DMServerJobResult)> captured_callback;
     EXPECT_CALL(*mock_cloud_delegate_, UploadBrowserPublicKey(_, _))
-        .WillOnce(Invoke(
+        .WillOnce(
             [&captured_callback](
                 const enterprise_management::DeviceManagementRequest& request,
                 base::OnceCallback<void(policy::DMServerJobResult)> callback) {
               captured_callback = std::move(callback);
-            }));
+            });
 
     base::test::TestFuture<KeyRotationCommand::Status> future;
     rotation_command_->Trigger(params_, future.GetCallback());
@@ -452,12 +451,12 @@
     EXPECT_CALL(
         *mock_network_delegate_,
         SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
-        .WillOnce(Invoke(
-            [&captured_callback](const GURL& url, const std::string& dm_token,
-                                 const std::string& body,
-                                 base::OnceCallback<void(int)> callback) {
-              captured_callback = std::move(callback);
-            }));
+        .WillOnce([&captured_callback](const GURL& url,
+                                       const std::string& dm_token,
+                                       const std::string& body,
+                                       base::OnceCallback<void(int)> callback) {
+          captured_callback = std::move(callback);
+        });
 
     base::test::TestFuture<KeyRotationCommand::Status> future;
     rotation_command_->Trigger(params_, future.GetCallback());
@@ -489,12 +488,12 @@
   if (is_key_uploaded_by_shared_api()) {
     base::OnceCallback<void(policy::DMServerJobResult)> captured_callback;
     EXPECT_CALL(*mock_cloud_delegate_, UploadBrowserPublicKey(_, _))
-        .WillOnce(Invoke(
+        .WillOnce(
             [&captured_callback](
                 const enterprise_management::DeviceManagementRequest& request,
                 base::OnceCallback<void(policy::DMServerJobResult)> callback) {
               captured_callback = std::move(callback);
-            }));
+            });
 
     base::test::TestFuture<KeyRotationCommand::Status> future;
     rotation_command_->Trigger(params_, future.GetCallback());
@@ -513,12 +512,12 @@
     EXPECT_CALL(
         *mock_network_delegate_,
         SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
-        .WillOnce(Invoke(
-            [&captured_callback](const GURL& url, const std::string& dm_token,
-                                 const std::string& body,
-                                 base::OnceCallback<void(int)> callback) {
-              captured_callback = std::move(callback);
-            }));
+        .WillOnce([&captured_callback](const GURL& url,
+                                       const std::string& dm_token,
+                                       const std::string& body,
+                                       base::OnceCallback<void(int)> callback) {
+          captured_callback = std::move(callback);
+        });
 
     base::test::TestFuture<KeyRotationCommand::Status> future;
     rotation_command_->Trigger(params_, future.GetCallback());
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc
index e0dbfa1..2e6e3373 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl_unittest.cc
@@ -29,7 +29,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 using testing::StrictMock;
 
@@ -82,30 +81,29 @@
   void SetUpKeyLoadAndSyncWithSideEffect(base::RepeatingClosure& side_effect) {
     EXPECT_CALL(*mock_loader_, LoadKey(_))
         .WillRepeatedly(
-            Invoke([side_effect, this](KeyLoader::LoadKeyCallback callback) {
+            [side_effect, this](KeyLoader::LoadKeyCallback callback) {
               side_effect.Run();
               std::move(callback).Run(
                   DTCLoadKeyResult(kSuccessUploadCode, test_key_pair_));
-            }));
+            });
   }
 
   void SetUpKeyLoadAndSyncWithSideEffect(
       const DTCLoadKeyResult& load_key_result,
       base::RepeatingClosure& side_effect) {
     EXPECT_CALL(*mock_loader_, LoadKey(_))
-        .WillRepeatedly(Invoke([side_effect, load_key_result](
-                                   KeyLoader::LoadKeyCallback callback) {
+        .WillRepeatedly([side_effect,
+                         load_key_result](KeyLoader::LoadKeyCallback callback) {
           side_effect.Run();
           std::move(callback).Run(load_key_result);
-        }));
+        });
   }
 
   void SetUpKeyLoadAndSync(const DTCLoadKeyResult& load_key_result) {
     EXPECT_CALL(*mock_loader_, LoadKey(_))
-        .WillRepeatedly(
-            Invoke([load_key_result](KeyLoader::LoadKeyCallback callback) {
-              std::move(callback).Run(load_key_result);
-            }));
+        .WillRepeatedly([load_key_result](KeyLoader::LoadKeyCallback callback) {
+          std::move(callback).Run(load_key_result);
+        });
   }
 
   void RunUntilIdle() { task_environment_.RunUntilIdle(); }
@@ -233,11 +231,11 @@
   base::RunLoop create_key_loop;
   KeyRotationCommand::Callback key_rotation_callback;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             key_rotation_callback = std::move(callback);
             create_key_loop.Quit();
-          }));
+          });
 
   key_manager()->StartInitialization();
 
@@ -279,11 +277,11 @@
   base::RunLoop create_key_loop;
   KeyRotationCommand::Callback key_rotation_callback;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             key_rotation_callback = std::move(callback);
             create_key_loop.Quit();
-          }));
+          });
 
   key_manager()->StartInitialization();
 
@@ -324,11 +322,11 @@
   KeyRotationCommand::Callback key_rotation_callback;
   base::RunLoop create_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             key_rotation_callback = std::move(callback);
             create_key_loop.Quit();
-          }));
+          });
 
   key_manager()->StartInitialization();
 
@@ -392,9 +390,9 @@
     if (test_case.triggers_creation) {
       SetUpKeyLoadAndSync(load_key_result);
       EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-          .WillOnce(Invoke(
+          .WillOnce(
               [&](const std::string& nonce,
-                  KeyRotationCommand::Callback callback) { run_loop.Quit(); }));
+                  KeyRotationCommand::Callback callback) { run_loop.Quit(); });
     } else {
       base::RepeatingClosure side_effect =
           base::BindLambdaForTesting([&run_loop, this]() {
@@ -432,11 +430,11 @@
   KeyRotationCommand::Callback failed_rotation_callback;
   base::RunLoop create_key_fail_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             failed_rotation_callback = std::move(callback);
             create_key_fail_loop.Quit();
-          }));
+          });
 
   key_manager()->StartInitialization();
 
@@ -453,11 +451,11 @@
   KeyRotationCommand::Callback success_rotation_callback;
   base::RunLoop create_key_success_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             success_rotation_callback = std::move(callback);
             create_key_success_loop.Quit();
-          }));
+          });
 
   // Should not be treated as a permanent failure.
   EXPECT_FALSE(key_manager()->HasPermanentFailure());
@@ -514,11 +512,11 @@
   KeyRotationCommand::Callback key_rotation_callback;
   base::RunLoop create_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             key_rotation_callback = std::move(callback);
             create_key_loop.Quit();
-          }));
+          });
 
   key_manager()->StartInitialization();
 
@@ -588,11 +586,11 @@
   KeyRotationCommand::Callback rotation_callback;
   base::RunLoop rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             rotation_callback = std::move(callback);
             rotate_key_loop.Quit();
-          }));
+          });
 
   std::optional<KeyRotationResult> captured_result;
   auto completion_callback =
@@ -628,11 +626,11 @@
   KeyRotationCommand::Callback rotation_callback;
   base::RunLoop rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             rotation_callback = std::move(callback);
             rotate_key_loop.Quit();
-          }));
+          });
 
   std::optional<KeyRotationResult> captured_result;
   auto completion_callback =
@@ -669,11 +667,11 @@
   KeyRotationCommand::Callback rotation_callback;
   base::RunLoop rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             rotation_callback = std::move(callback);
             rotate_key_loop.Quit();
-          }));
+          });
 
   std::optional<KeyRotationResult> captured_result;
   auto completion_callback =
@@ -714,11 +712,11 @@
   KeyRotationCommand::Callback rotation_callback;
   base::RunLoop rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             rotation_callback = std::move(callback);
             rotate_key_loop.Quit();
-          }));
+          });
 
   std::optional<KeyRotationResult> captured_result;
   auto completion_callback =
@@ -756,11 +754,11 @@
   KeyRotationCommand::Callback first_rotation_callback;
   base::RunLoop first_rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             first_rotation_callback = std::move(callback);
             first_rotate_key_loop.Quit();
-          }));
+          });
 
   // Create callback parameters for all calls.
   std::optional<KeyRotationResult> first_captured_result;
@@ -791,11 +789,11 @@
   KeyRotationCommand::Callback second_rotation_callback;
   base::RunLoop second_rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kOtherFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             second_rotation_callback = std::move(callback);
             second_rotate_key_loop.Quit();
-          }));
+          });
 
   // Make the key rotation return a successful status.
   ASSERT_FALSE(first_rotation_callback.is_null());
@@ -866,11 +864,11 @@
     KeyRotationCommand::Callback first_rotation_callback;
     base::RunLoop first_rotate_key_loop;
     EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-        .WillOnce(Invoke([&](const std::string& nonce,
-                             KeyRotationCommand::Callback callback) {
+        .WillOnce([&](const std::string& nonce,
+                      KeyRotationCommand::Callback callback) {
           first_rotation_callback = std::move(callback);
           first_rotate_key_loop.Quit();
-        }));
+        });
 
     // Create callback parameters for all calls.
     std::optional<KeyRotationResult> first_captured_result;
@@ -894,11 +892,11 @@
     KeyRotationCommand::Callback second_rotation_callback;
     base::RunLoop second_rotate_key_loop;
     EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kOtherFakeNonce, _))
-        .WillOnce(Invoke([&](const std::string& nonce,
-                             KeyRotationCommand::Callback callback) {
+        .WillOnce([&](const std::string& nonce,
+                      KeyRotationCommand::Callback callback) {
           second_rotation_callback = std::move(callback);
           second_rotate_key_loop.Quit();
-        }));
+        });
 
     // Make the key rotation return a successful status.
     ASSERT_FALSE(first_rotation_callback.is_null());
@@ -940,11 +938,11 @@
   KeyRotationCommand::Callback rotation_callback;
   base::RunLoop rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             rotation_callback = std::move(callback);
             rotate_key_loop.Quit();
-          }));
+          });
 
   // Binding the rotate request to the main thread, as the sequence checker will
   // be expecting that.
@@ -991,11 +989,11 @@
   KeyRotationCommand::Callback rotation_callback;
   base::RunLoop rotate_key_loop;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(kFakeNonce, _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             rotation_callback = std::move(callback);
             rotate_key_loop.Quit();
-          }));
+          });
 
   // Binding the rotate request to the main thread, as the sequence checker will
   // be expecting that.
@@ -1066,11 +1064,11 @@
     KeyRotationCommand::Callback failed_rotation_callback;
     base::RunLoop create_key_fail_loop;
     EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-        .WillOnce(Invoke([&](const std::string& nonce,
-                             KeyRotationCommand::Callback callback) {
+        .WillOnce([&](const std::string& nonce,
+                      KeyRotationCommand::Callback callback) {
           failed_rotation_callback = std::move(callback);
           create_key_fail_loop.Quit();
-        }));
+        });
 
     key_manager()->StartInitialization();
 
@@ -1122,11 +1120,11 @@
   base::RunLoop create_key_loop;
   KeyRotationCommand::Callback key_creation_callback;
   EXPECT_CALL(*mock_launcher(), LaunchKeyRotation(std::string(), _))
-      .WillOnce(Invoke(
+      .WillOnce(
           [&](const std::string& nonce, KeyRotationCommand::Callback callback) {
             key_creation_callback = std::move(callback);
             create_key_loop.Quit();
-          }));
+          });
 
   key_manager()->StartInitialization();
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader_unittest.cc
index 7e326a2..288ba32 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_loader_unittest.cc
@@ -38,7 +38,6 @@
 
 using test::MockKeyPersistenceDelegate;
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 using testing::StrictMock;
 
@@ -86,15 +85,15 @@
         std::make_unique<StrictMock<MockKeyPersistenceDelegate>>();
     EXPECT_CALL(*mock_persistence_delegate,
                 LoadKeyPair(KeyStorageType::kPermanent, _))
-        .WillOnce(Invoke([this, has_key](KeyStorageType key_type,
-                                         LoadPersistedKeyResult* result) {
+        .WillOnce([this, has_key](KeyStorageType key_type,
+                                  LoadPersistedKeyResult* result) {
           if (has_key) {
             *result = LoadPersistedKeyResult::kSuccess;
             return test_key_pair_;
           }
           *result = LoadPersistedKeyResult::kNotFound;
           return scoped_refptr<SigningKeyPair>(nullptr);
-        }));
+        });
     persistence_delegate_factory_.set_next_instance(
         std::move(mock_persistence_delegate));
   }
@@ -103,12 +102,12 @@
     policy::DMServerJobResult result;
     result.response_code = response_code;
     EXPECT_CALL(*mock_management_delegate_, UploadBrowserPublicKey(_, _))
-        .WillOnce(Invoke(
+        .WillOnce(
             [&, result](
                 const enterprise_management::DeviceManagementRequest& request,
                 base::OnceCallback<void(policy::DMServerJobResult)> callback) {
               std::move(callback).Run(result);
-            }));
+            });
   }
 
   void RunAndValidateLoadKey(DTCLoadKeyResult expected_result) {
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher_unittest.cc
index e68ce3f..29274df4 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/key_rotation_launcher_unittest.cc
@@ -85,12 +85,11 @@
 
   std::optional<KeyRotationCommand::Params> params;
   EXPECT_CALL(*mock_command_, Trigger(testing::_, testing::_))
-      .WillOnce(testing::Invoke(
-          [&params](const KeyRotationCommand::Params given_params,
-                    KeyRotationCommand::Callback callback) {
-            params = given_params;
-            std::move(callback).Run(KeyRotationCommand::Status::SUCCEEDED);
-          }));
+      .WillOnce([&params](const KeyRotationCommand::Params given_params,
+                          KeyRotationCommand::Callback callback) {
+        params = given_params;
+        std::move(callback).Run(KeyRotationCommand::Status::SUCCEEDED);
+      });
 
   launcher_->LaunchKeyRotation(kNonce, base::DoNothing());
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.cc
index 19ff8f5..86093591 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.cc
@@ -63,7 +63,7 @@
 
   auto mocked_delegate = std::make_unique<MockKeyPersistenceDelegate>();
   ON_CALL(*mocked_delegate.get(), LoadKeyPair)
-      .WillByDefault(testing::Invoke(
+      .WillByDefault(
           [&side_effect](KeyStorageType type, LoadPersistedKeyResult* result) {
             side_effect.Run();
             if (result) {
@@ -71,12 +71,11 @@
             }
             return base::MakeRefCounted<SigningKeyPair>(
                 GenerateHardwareSigningKey(), BPKUR::CHROME_BROWSER_HW_KEY);
-          }));
-  ON_CALL(*mocked_delegate.get(), CreateKeyPair)
-      .WillByDefault(testing::Invoke([]() {
-        return base::MakeRefCounted<SigningKeyPair>(
-            GenerateHardwareSigningKey(), BPKUR::CHROME_BROWSER_HW_KEY);
-      }));
+          });
+  ON_CALL(*mocked_delegate.get(), CreateKeyPair).WillByDefault([]() {
+    return base::MakeRefCounted<SigningKeyPair>(GenerateHardwareSigningKey(),
+                                                BPKUR::CHROME_BROWSER_HW_KEY);
+  });
   return mocked_delegate;
 }
 
@@ -88,19 +87,17 @@
 
   auto mocked_delegate = std::make_unique<MockKeyPersistenceDelegate>();
   ON_CALL(*mocked_delegate.get(), LoadKeyPair)
-      .WillByDefault(testing::Invoke([](KeyStorageType type,
-                                        LoadPersistedKeyResult* result) {
+      .WillByDefault([](KeyStorageType type, LoadPersistedKeyResult* result) {
         if (result) {
           *result = LoadPersistedKeyResult::kSuccess;
         }
         return base::MakeRefCounted<SigningKeyPair>(
             GenerateECSigningKey(), BPKUR::CHROME_BROWSER_OS_KEY);
-      }));
-  ON_CALL(*mocked_delegate.get(), CreateKeyPair)
-      .WillByDefault(testing::Invoke([]() {
-        return base::MakeRefCounted<SigningKeyPair>(
-            GenerateECSigningKey(), BPKUR::CHROME_BROWSER_OS_KEY);
-      }));
+      });
+  ON_CALL(*mocked_delegate.get(), CreateKeyPair).WillByDefault([]() {
+    return base::MakeRefCounted<SigningKeyPair>(GenerateECSigningKey(),
+                                                BPKUR::CHROME_BROWSER_OS_KEY);
+  });
   return mocked_delegate;
 }
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc
index 825c998d..25445c53 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc
@@ -34,7 +34,6 @@
 using testing::ByMove;
 using testing::ElementsAre;
 using testing::InSequence;
-using testing::Invoke;
 using testing::Not;
 using testing::Pair;
 using testing::Return;
@@ -120,13 +119,13 @@
   void SetUploadCode(HttpResponseCode response_code) {
     EXPECT_CALL(*mock_network_delegate_,
                 SendPublicKeyToDmServer(GURL(kDmServerUrl), kDmToken, _, _))
-        .WillOnce(Invoke(
-            [&, response_code](const GURL& url, const std::string& dm_token,
-                               const std::string& body,
-                               base::OnceCallback<void(int)> callback) {
-              captured_upload_body_ = body;
-              std::move(callback).Run(response_code);
-            }));
+        .WillOnce([&, response_code](const GURL& url,
+                                     const std::string& dm_token,
+                                     const std::string& body,
+                                     base::OnceCallback<void(int)> callback) {
+          captured_upload_body_ = body;
+          std::move(callback).Run(response_code);
+        });
   }
 
   void SetUpOldKey(bool exists = true) {
@@ -140,7 +139,7 @@
       old_key_pair_.reset();
       EXPECT_CALL(*mock_persistence_delegate_,
                   LoadKeyPair(KeyStorageType::kPermanent, _))
-          .WillOnce(Invoke([]() { return nullptr; }));
+          .WillOnce([]() { return nullptr; });
     }
   }
 
@@ -156,8 +155,9 @@
       EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair())
           .WillOnce(Return(new_key_pair_));
     } else {
-      EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair())
-          .WillOnce(Invoke([]() { return nullptr; }));
+      EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair()).WillOnce([]() {
+        return nullptr;
+      });
     }
   }
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc
index 23509e3..9e562d2 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc
@@ -33,7 +33,6 @@
     enterprise_connectors::test::MockKeyNetworkDelegate::HttpResponseCode;
 
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 
 namespace {
@@ -109,11 +108,11 @@
   EXPECT_CALL(
       *mock_network_delegate_,
       SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
-      .WillOnce(Invoke([](const GURL& url, const std::string& dm_token,
-                          const std::string& body,
-                          base::OnceCallback<void(int)> callback) {
+      .WillOnce([](const GURL& url, const std::string& dm_token,
+                   const std::string& body,
+                   base::OnceCallback<void(int)> callback) {
         std::move(callback).Run(kSuccessCode);
-      }));
+      });
 
   EXPECT_EQ(
       RotateDeviceTrustKey(
@@ -264,11 +263,11 @@
   EXPECT_CALL(
       *mock_network_delegate_,
       SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
-      .WillOnce(Invoke([](const GURL& url, const std::string& dm_token,
-                          const std::string& body,
-                          base::OnceCallback<void(int)> callback) {
+      .WillOnce([](const GURL& url, const std::string& dm_token,
+                   const std::string& body,
+                   base::OnceCallback<void(int)> callback) {
         std::move(callback).Run(kFailureCode);
-      }));
+      });
 
   EXPECT_EQ(
       RotateDeviceTrustKey(
@@ -296,11 +295,11 @@
   EXPECT_CALL(
       *mock_network_delegate_,
       SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
-      .WillOnce(Invoke([](const GURL& url, const std::string& dm_token,
-                          const std::string& body,
-                          base::OnceCallback<void(int)> callback) {
+      .WillOnce([](const GURL& url, const std::string& dm_token,
+                   const std::string& body,
+                   base::OnceCallback<void(int)> callback) {
         std::move(callback).Run(kConflictCode);
-      }));
+      });
 
   EXPECT_EQ(
       RotateDeviceTrustKey(
diff --git a/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc
index 865e922..ea895e2 100644
--- a/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/navigation_throttle_unittest.cc
@@ -43,7 +43,6 @@
 
 using content::NavigationThrottle;
 using ::testing::_;
-using ::testing::Invoke;
 using ::testing::Return;
 
 namespace enterprise_connectors {
@@ -140,8 +139,8 @@
         std::make_unique<FakeDeviceTrustConnectorService>(test_prefs_);
 
     ON_CALL(mock_device_trust_service_, Watches(_))
-        .WillByDefault(Invoke(
-            [this](const GURL& url) { return fake_connector_->Watches(url); }));
+        .WillByDefault(
+            [this](const GURL& url) { return fake_connector_->Watches(url); });
   }
 
   void CreateAndSetMockConsentRequester() {
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc
index 92930b9..66b0a16 100644
--- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc
@@ -35,7 +35,6 @@
 #endif
 
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 using testing::StrictMock;
 
@@ -202,12 +201,12 @@
 
   void SetUpAggregatorExpectations() {
     EXPECT_CALL(mock_aggregator_, GetSignals(CreateExpectedRequest(), _))
-        .WillOnce(Invoke(
+        .WillOnce(
             [this](const device_signals::SignalsAggregationRequest& request,
                    base::OnceCallback<void(
                        device_signals::SignalsAggregationResponse)> callback) {
               std::move(callback).Run(CreateFilledResponse());
-            }));
+            });
   }
 
   virtual device_signals::SignalsAggregationResponse CreateFilledResponse() {
@@ -362,13 +361,12 @@
   SetFakeUserPolicyData();
 
   EXPECT_CALL(mock_aggregator_, GetSignals(CreateExpectedRequest(), _))
-      .WillOnce(
-          Invoke([](const device_signals::SignalsAggregationRequest& request,
-                    base::OnceCallback<void(
-                        device_signals::SignalsAggregationResponse)> callback) {
-            device_signals::SignalsAggregationResponse empty_response;
-            std::move(callback).Run(std::move(empty_response));
-          }));
+      .WillOnce([](const device_signals::SignalsAggregationRequest& request,
+                   base::OnceCallback<void(
+                       device_signals::SignalsAggregationResponse)> callback) {
+        device_signals::SignalsAggregationResponse empty_response;
+        std::move(callback).Run(std::move(empty_response));
+      });
 
   auto decorator = CreateDecorator();
   base::RunLoop run_loop;
diff --git a/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc b/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc
index d707e69..fc7f468b 100644
--- a/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc
@@ -28,7 +28,6 @@
 #include "testing/gmock/include/gmock/gmock.h"
 
 using testing::_;
-using testing::Invoke;
 using testing::StrictMock;
 
 using BPKUR = enterprise_management::BrowserPublicKeyUploadRequest;
@@ -55,18 +54,18 @@
   auto mock_network_delegate =
       std::make_unique<StrictMock<MockKeyNetworkDelegate>>();
   EXPECT_CALL(*mock_network_delegate, SendPublicKeyToDmServer(_, _, _, _))
-      .WillOnce(Invoke(
-          [upload_response_code, expected_dm_token, expected_client_id, args](
-              const GURL& url, const std::string& dm_token,
-              const std::string& body, base::OnceCallback<void(int)> callback) {
-            // Check if the DM Server URL contains the correct Client ID
-            CHECK(url.spec().find(expected_client_id) != std::string::npos);
-            // Check if the correct DM Token is being uploaded
-            CHECK_EQ(dm_token, expected_dm_token);
-            // TODO(b/269746642): add a check for the 'body' parameter above
+      .WillOnce([upload_response_code, expected_dm_token, expected_client_id,
+                 args](const GURL& url, const std::string& dm_token,
+                       const std::string& body,
+                       base::OnceCallback<void(int)> callback) {
+        // Check if the DM Server URL contains the correct Client ID
+        CHECK(url.spec().find(expected_client_id) != std::string::npos);
+        // Check if the correct DM Token is being uploaded
+        CHECK_EQ(dm_token, expected_dm_token);
+        // TODO(b/269746642): add a check for the 'body' parameter above
 
-            std::move(callback).Run(upload_response_code);
-          }));
+        std::move(callback).Run(upload_response_code);
+      });
   const auto result = enterprise_connectors::RotateDeviceTrustKey(
       enterprise_connectors::KeyRotationManager::Create(
           std::move(mock_network_delegate)),
diff --git a/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc b/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc
index 26772f1..4259615 100644
--- a/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc
+++ b/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc
@@ -247,12 +247,11 @@
 
   base::RunLoop run_loop;
   EXPECT_CALL(*client_.get(), UploadSecurityEventReport(_, _, _))
-      .WillOnce(testing::Invoke(
-          [&](bool include_device_info, base::Value::Dict&& report,
-              policy::CloudPolicyClient::ResultCallback callback) {
-            upload_callback_ = std::move(callback);
-            run_loop.Quit();
-          }));
+      .WillOnce([&](bool include_device_info, base::Value::Dict&& report,
+                    policy::CloudPolicyClient::ResultCallback callback) {
+        upload_callback_ = std::move(callback);
+        run_loop.Quit();
+      });
   reporting_client_->ReportRealtimeEvent(kExtensionInstallEvent,
                                          std::move(settings), std::move(event));
   run_loop.Run();
@@ -298,13 +297,13 @@
 
   base::RunLoop run_loop;
   EXPECT_CALL(*client_.get(), UploadSecurityEvent(_, _, _))
-      .WillOnce(testing::Invoke(
+      .WillOnce(
           [&](bool include_device_info,
               ::chrome::cros::reporting::proto::UploadEventsRequest&& request,
               policy::CloudPolicyClient::ResultCallback callback) {
             upload_callback_ = std::move(callback);
             run_loop.Quit();
-          }));
+          });
   reporting_client_->ReportEvent(std::move(extension_install_event),
                                  std::move(settings));
   run_loop.Run();
@@ -337,12 +336,11 @@
 
   base::RunLoop run_loop;
   EXPECT_CALL(*client_.get(), UploadSecurityEventReport(_, _, _))
-      .WillOnce(testing::Invoke(
-          [&](bool include_device_info, base::Value::Dict&& report,
-              policy::CloudPolicyClient::ResultCallback callback) {
-            upload_callback_ = std::move(callback);
-            run_loop.Quit();
-          }));
+      .WillOnce([&](bool include_device_info, base::Value::Dict&& report,
+                    policy::CloudPolicyClient::ResultCallback callback) {
+        upload_callback_ = std::move(callback);
+        run_loop.Quit();
+      });
   reporting_client_->ReportRealtimeEvent(kExtensionInstallEvent,
                                          std::move(settings), std::move(event));
   run_loop.Run();
@@ -388,13 +386,13 @@
 
   base::RunLoop run_loop;
   EXPECT_CALL(*client_.get(), UploadSecurityEvent(_, _, _))
-      .WillOnce(testing::Invoke(
+      .WillOnce(
           [&](bool include_device_info,
               ::chrome::cros::reporting::proto::UploadEventsRequest&& request,
               policy::CloudPolicyClient::ResultCallback callback) {
             upload_callback_ = std::move(callback);
             run_loop.Quit();
-          }));
+          });
   reporting_client_->ReportEvent(std::move(extension_install_event),
                                  std::move(settings));
   run_loop.Run();
diff --git a/chrome/browser/enterprise/data_protection/data_protection_clipboard_utils_unittest.cc b/chrome/browser/enterprise/data_protection/data_protection_clipboard_utils_unittest.cc
index 1979eed..93af361 100644
--- a/chrome/browser/enterprise/data_protection/data_protection_clipboard_utils_unittest.cc
+++ b/chrome/browser/enterprise/data_protection/data_protection_clipboard_utils_unittest.cc
@@ -174,14 +174,14 @@
        DataTransferPolicyController_Allowed) {
   PolicyControllerTest policy_controller;
   EXPECT_CALL(policy_controller, PasteIfAllowed)
-      .WillOnce(testing::Invoke(
+      .WillOnce(
           [](base::optional_ref<const ui::DataTransferEndpoint> data_src,
              base::optional_ref<const ui::DataTransferEndpoint> data_dst,
              std::variant<size_t, std::vector<base::FilePath>> pasted_content,
              content::RenderFrameHost* rfh,
              base::OnceCallback<void(bool)> callback) {
             std::move(callback).Run(true);
-          }));
+          });
 
   base::test::TestFuture<std::optional<content::ClipboardPasteData>> future;
   PasteIfAllowedByPolicy(
@@ -200,14 +200,14 @@
        DataTransferPolicyController_Blocked) {
   PolicyControllerTest policy_controller;
   EXPECT_CALL(policy_controller, PasteIfAllowed)
-      .WillOnce(testing::Invoke(
+      .WillOnce(
           [](base::optional_ref<const ui::DataTransferEndpoint> data_src,
              base::optional_ref<const ui::DataTransferEndpoint> data_dst,
              std::variant<size_t, std::vector<base::FilePath>> pasted_content,
              content::RenderFrameHost* rfh,
              base::OnceCallback<void(bool)> callback) {
             std::move(callback).Run(false);
-          }));
+          });
 
   base::test::TestFuture<std::optional<content::ClipboardPasteData>> future;
   PasteIfAllowedByPolicy(
diff --git a/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle_unittest.cc b/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle_unittest.cc
index 2edd0fb..bb6c12b 100644
--- a/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle_unittest.cc
+++ b/chrome/browser/enterprise/platform_auth/platform_auth_navigation_throttle_unittest.cc
@@ -39,7 +39,6 @@
 
 using content::NavigationThrottle;
 using ::testing::_;
-using ::testing::Invoke;
 using ::testing::Return;
 
 namespace {
diff --git a/chrome/browser/enterprise/remote_commands/rotate_attestation_credential_job_unittest.cc b/chrome/browser/enterprise/remote_commands/rotate_attestation_credential_job_unittest.cc
index e1bece7..36ae554f 100644
--- a/chrome/browser/enterprise/remote_commands/rotate_attestation_credential_job_unittest.cc
+++ b/chrome/browser/enterprise/remote_commands/rotate_attestation_credential_job_unittest.cc
@@ -22,7 +22,6 @@
     enterprise_connectors::DeviceTrustKeyManager::KeyRotationResult;
 
 using testing::_;
-using testing::Invoke;
 
 namespace enterprise_commands {
 
@@ -69,11 +68,11 @@
 
   void MockKeyRotationWith(KeyRotationResult result) {
     EXPECT_CALL(mock_key_manager_, RotateKey(kNonceValue, _))
-        .WillOnce(Invoke(
+        .WillOnce(
             [result](const std::string& nonce,
                      base::OnceCallback<void(KeyRotationResult)> callback) {
               std::move(callback).Run(result);
-            }));
+            });
   }
 
   std::unique_ptr<RotateAttestationCredentialJob> CreateJob(
diff --git a/chrome/browser/enterprise/reporting/real_time_report_controller_unittest.cc b/chrome/browser/enterprise/reporting/real_time_report_controller_unittest.cc
index 8445456..5c3ac23 100644
--- a/chrome/browser/enterprise/reporting/real_time_report_controller_unittest.cc
+++ b/chrome/browser/enterprise/reporting/real_time_report_controller_unittest.cc
@@ -32,7 +32,6 @@
 using ::testing::_;
 using ::testing::ByMove;
 using ::testing::DoAll;
-using ::testing::Invoke;
 using ::testing::Return;
 using ::testing::WithArgs;
 
@@ -104,12 +103,12 @@
               Generate(RealTimeReportType::kExtensionRequest, _))
       .WillOnce(DoAll(
           WithArgs<1>(
-              Invoke([profile](const MockRealTimeReportGenerator::Data& data) {
+              [profile](const MockRealTimeReportGenerator::Data& data) {
                 EXPECT_EQ(profile,
                           static_cast<const ExtensionRequestReportGenerator::
                                           ExtensionRequestData&>(data)
                               .profile);
-              })),
+              }),
           Return(ByMove(std::move(reports)))));
   EXPECT_CALL(*report_uploader, Upload(_, _)).Times(2);
 
@@ -139,13 +138,13 @@
   EXPECT_CALL(*report_generator.get(),
               Generate(RealTimeReportType::kLegacyTech, _))
       .WillOnce(DoAll(
-          WithArgs<1>(Invoke([](const MockRealTimeReportGenerator::Data& data) {
+          WithArgs<1>([](const MockRealTimeReportGenerator::Data& data) {
             EXPECT_EQ(
                 kLegacyTechType,
                 static_cast<const LegacyTechReportGenerator::LegacyTechData&>(
                     data)
                     .type);
-          })),
+          }),
           Return(ByMove(std::move(reports)))));
   EXPECT_CALL(*report_uploader, Upload(_, _)).Times(1);
 
diff --git a/chrome/browser/enterprise/signin/oidc_authentication_signin_interceptor_unittest.cc b/chrome/browser/enterprise/signin/oidc_authentication_signin_interceptor_unittest.cc
index 1d04d67f..6b33a20 100644
--- a/chrome/browser/enterprise/signin/oidc_authentication_signin_interceptor_unittest.cc
+++ b/chrome/browser/enterprise/signin/oidc_authentication_signin_interceptor_unittest.cc
@@ -57,7 +57,6 @@
 #include "url/gurl.h"
 
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 
 using policy::MockCloudPolicyClient;
@@ -469,41 +468,41 @@
           *mock_client_ptr,
           RegisterWithOidcResponse(_, kExampleOidcTokens.auth_token,
                                    kExampleOidcTokens.id_token, _, _, _, _))
-          .WillOnce(Invoke([&](const RegistrationParameters&,
-                               const std::string&, const std::string&,
-                               const std::string&, const base::TimeDelta&, bool,
-                               CloudPolicyClient::ResultCallback callback) {
+          .WillOnce([&](const RegistrationParameters&, const std::string&,
+                        const std::string&, const std::string&,
+                        const base::TimeDelta&, bool,
+                        CloudPolicyClient::ResultCallback callback) {
             mock_client_ptr->SetStatus(policy::DM_STATUS_TEMPORARY_UNAVAILABLE);
             mock_client_ptr->NotifyClientError();
             std::move(callback).Run(CloudPolicyClient::Result(
                 policy::DM_STATUS_TEMPORARY_UNAVAILABLE, /*net_error=*/1));
             register_run_loop.Quit();
-          }));
+          });
     } else if (expect_registration_attempt == RegistrationResult::kTimeout) {
       EXPECT_CALL(
           *mock_client_ptr,
           RegisterWithOidcResponse(_, kExampleOidcTokens.auth_token,
                                    kExampleOidcTokens.id_token, _, _, _, _))
-          .WillOnce(Invoke([&](const RegistrationParameters&,
-                               const std::string&, const std::string&,
-                               const std::string&, const base::TimeDelta&, bool,
-                               CloudPolicyClient::ResultCallback callback) {
+          .WillOnce([&](const RegistrationParameters&, const std::string&,
+                        const std::string&, const std::string&,
+                        const base::TimeDelta&, bool,
+                        CloudPolicyClient::ResultCallback callback) {
             mock_client_ptr->SetStatus(policy::DM_STATUS_TEMPORARY_UNAVAILABLE);
             mock_client_ptr->NotifyClientError();
             std::move(callback).Run(CloudPolicyClient::Result(
                 policy::DM_STATUS_TEMPORARY_UNAVAILABLE,
                 /*net_error=*/net::ERR_TIMED_OUT));
             register_run_loop.Quit();
-          }));
+          });
     } else if (expect_registration_attempt == RegistrationResult::kSuccess) {
       EXPECT_CALL(
           *mock_client_ptr,
           RegisterWithOidcResponse(_, kExampleOidcTokens.auth_token,
                                    kExampleOidcTokens.id_token, _, _, _, _))
-          .WillOnce(Invoke([&](const RegistrationParameters&,
-                               const std::string&, const std::string&,
-                               const std::string&, const base::TimeDelta&, bool,
-                               CloudPolicyClient::ResultCallback callback) {
+          .WillOnce([&](const RegistrationParameters&, const std::string&,
+                        const std::string&, const std::string&,
+                        const base::TimeDelta&, bool,
+                        CloudPolicyClient::ResultCallback callback) {
             mock_client_ptr->SetDMToken(kExampleDmToken);
             mock_client_ptr->SetStatus(policy::DM_STATUS_SUCCESS);
             mock_client_ptr->client_id_ = kExampleClientId;
@@ -518,7 +517,7 @@
             std::move(callback).Run(CloudPolicyClient::Result(
                 policy::DM_STATUS_SUCCESS, /*net_error=*/0));
             register_run_loop.Quit();
-          }));
+          });
     }
 
     interceptor_->SetCloudPolicyClientForTesting(std::move(mock_client));
@@ -549,17 +548,17 @@
             OidcProfileCreationResult::kSwitchedToExistingProfile) {
       EXPECT_CALL(*delegate_, ShowSigninInterceptionBubble(_, _, _))
           .Times(1)
-          .WillRepeatedly(Invoke(
+          .WillRepeatedly(
               [](content::WebContents*,
                  const WebSigninInterceptor::Delegate::BubbleParameters&,
                  base::OnceCallback<void(SigninInterceptionResult)> callback) {
                 std::move(callback).Run(SigninInterceptionResult::kAccepted);
                 return nullptr;
-              }));
+              });
     } else if (expect_dialog_to_show) {
       EXPECT_CALL(*delegate_, ShowOidcInterceptionDialog(_, _, _, _, _))
           .Times(1)
-          .WillRepeatedly(Invoke(
+          .WillRepeatedly(
               [&](content::WebContents*,
                   const WebSigninInterceptor::Delegate::BubbleParameters&,
                   signin::SigninChoiceWithConfirmAndRetryCallback callback,
@@ -569,7 +568,7 @@
                     expected_operation_result);
                 fake_bubble_handle_ = fake_bubble_handle->AsWeakPtr();
                 return fake_bubble_handle;
-              }));
+              });
     } else {
       EXPECT_CALL(*delegate_, ShowOidcInterceptionDialog(_, _, _, _, _))
           .Times(0);
diff --git a/chrome/browser/enterprise/signin/profile_token_web_signin_interceptor_unittest.cc b/chrome/browser/enterprise/signin/profile_token_web_signin_interceptor_unittest.cc
index 9dec7dc..cfb9add2 100644
--- a/chrome/browser/enterprise/signin/profile_token_web_signin_interceptor_unittest.cc
+++ b/chrome/browser/enterprise/signin/profile_token_web_signin_interceptor_unittest.cc
@@ -23,7 +23,6 @@
 #include "url/gurl.h"
 
 using testing::_;
-using testing::Invoke;
 using testing::WithArgs;
 
 namespace {
@@ -158,13 +157,13 @@
   EXPECT_CALL(*delegate_, ShowSigninInterceptionBubble(
                               _, MatchBubbleParameters(expected_parameters), _))
       .Times(1)
-      .WillOnce(Invoke(
+      .WillOnce(
           [](content::WebContents*,
              const WebSigninInterceptor::Delegate::BubbleParameters&,
              base::OnceCallback<void(SigninInterceptionResult)> callback) {
             std::move(callback).Run(SigninInterceptionResult::kDeclined);
             return nullptr;
-          }));
+          });
   interceptor_->MaybeInterceptSigninProfile(web_contents(), "id", "token");
 
   base::RunLoop().RunUntilIdle();
@@ -195,13 +194,13 @@
   EXPECT_CALL(*delegate_, ShowSigninInterceptionBubble(
                               _, MatchBubbleParameters(expected_parameters), _))
       .Times(1)
-      .WillOnce(Invoke(
+      .WillOnce(
           [](content::WebContents*,
              const WebSigninInterceptor::Delegate::BubbleParameters&,
              base::OnceCallback<void(SigninInterceptionResult)> callback) {
             std::move(callback).Run(SigninInterceptionResult::kAccepted);
             return nullptr;
-          }));
+          });
   interceptor_->MaybeInterceptSigninProfile(web_contents(), "id", "token");
 
   base::RunLoop().RunUntilIdle();
@@ -232,13 +231,13 @@
   EXPECT_CALL(*delegate_, ShowSigninInterceptionBubble(
                               _, MatchBubbleParameters(expected_parameters), _))
       .Times(1)
-      .WillOnce(Invoke(
+      .WillOnce(
           [](content::WebContents*,
              const WebSigninInterceptor::Delegate::BubbleParameters&,
              base::OnceCallback<void(SigninInterceptionResult)> callback) {
             std::move(callback).Run(SigninInterceptionResult::kAccepted);
             return nullptr;
-          }));
+          });
   interceptor_->MaybeInterceptSigninProfile(web_contents(), std::string(),
                                             "token");
 
@@ -269,13 +268,13 @@
   EXPECT_CALL(*delegate_, ShowSigninInterceptionBubble(
                               _, MatchBubbleParameters(expected_parameters), _))
       .Times(1)
-      .WillOnce(Invoke(
+      .WillOnce(
           [](content::WebContents*,
              const WebSigninInterceptor::Delegate::BubbleParameters&,
              base::OnceCallback<void(SigninInterceptionResult)> callback) {
             std::move(callback).Run(SigninInterceptionResult::kAccepted);
             return nullptr;
-          }));
+          });
 
   const int num_profiles_before = TestingBrowserProcess::GetGlobal()
                                       ->profile_manager()
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 8330abc..52c6c57 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -442,6 +442,15 @@
     "expiry_milestone": 145
   },
   {
+    "name": "android-zoom-indicator",
+    "owners": [
+      "hitarthkothari@google.com",
+      "ckitagawa@google.com",
+      "clank-tab-dev@google.com"
+    ],
+    "expiry_milestone": 150
+  },
+  {
     "name": "animate-suggestions-list-appearance",
     "owners": [ "pnoland@chromium.org", "chrome-mobile-search@google.com" ],
     "expiry_milestone": 145
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index e1294c2..a3bc813 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -4867,6 +4867,10 @@
 const char kAndroidTipsNotificationsDescription[] =
     "Enable tips notifications for supported features on Android.";
 
+const char kAndroidZoomIndicatorName[] = "Android Zoom Indicator";
+const char kAndroidZoomIndicatorDescription[] =
+    "Enable zoom indicator on Android.";
+
 const char kAnimatedImageDragShadowName[] =
     "Enable animated image drag shadow on Android.";
 const char kAnimatedImageDragShadowDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 69d676a..936058dd 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -2820,6 +2820,9 @@
 extern const char kAndroidTipsNotificationsName[];
 extern const char kAndroidTipsNotificationsDescription[];
 
+extern const char kAndroidZoomIndicatorName[];
+extern const char kAndroidZoomIndicatorDescription[];
+
 extern const char kAppSpecificHistoryName[];
 extern const char kAppSpecificHistoryDescription[];
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index ecf209b1c..e66a728 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -243,6 +243,7 @@
     &kAndroidWindowPopupPredictFinalBounds,
     &kAndroidWindowPopupResizeAfterSpawn,
     &kAndroidXRUsesSurfaceControl,
+    &kAndroidZoomIndicator,
     &kAnimatedGifRefactor,
     &kAnimatedImageDragShadow,
     &kAnnotatedPageContentsVirtualStructure,
@@ -728,6 +729,10 @@
              "AndroidWindowPopupResizeAfterSpawn",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kAndroidZoomIndicator,
+             "AndroidZoomIndicator",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kAnimatedGifRefactor,
              "AnimatedGifRefactor",
              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 b2c9c18..4c00f8ce 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -66,6 +66,7 @@
 BASE_DECLARE_FEATURE(kAndroidWindowPopupPredictFinalBounds);
 BASE_DECLARE_FEATURE(kAndroidWindowPopupResizeAfterSpawn);
 BASE_DECLARE_FEATURE(kAndroidXRUsesSurfaceControl);
+BASE_DECLARE_FEATURE(kAndroidZoomIndicator);
 BASE_DECLARE_FEATURE(kAnimatedGifRefactor);
 BASE_DECLARE_FEATURE(kAnimatedImageDragShadow);
 BASE_DECLARE_FEATURE(kAnnotatedPageContentsVirtualStructure);
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 9d0609c..4d29c91 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
@@ -230,6 +230,7 @@
             "AndroidWindowPopupResizeAfterSpawn";
     public static final String ANDROID_XR_USES_SURFACE_CONTROL =
             "AndroidWindowPopupResizeAfterSpawn";
+    public static final String ANDROID_ZOOM_INDICATOR = "AndroidZoomIndicator";
     public static final String ANIMATED_GIF_REFACTOR = "AnimatedGifRefactor";
     public static final String ANIMATED_IMAGE_DRAG_SHADOW = "AnimatedImageDragShadow";
     public static final String ANNOTATED_PAGE_CONTENTS_VIRTUAL_STRUCTURE =
@@ -1313,6 +1314,8 @@
             newMutableFlagWithSafeDefault(ANDROID_TAB_HIGHLIGHTING, false);
     public static final MutableFlagWithSafeDefault sAndroidTipsNotifications =
             newMutableFlagWithSafeDefault(ANDROID_TIPS_NOTIFICATIONS, false);
+    public static final MutableFlagWithSafeDefault sAndroidZoomIndicator =
+            newMutableFlagWithSafeDefault(ANDROID_ZOOM_INDICATOR, false);
     public static final MutableFlagWithSafeDefault sBcivBottomControls =
             newMutableFlagWithSafeDefault(BCIV_BOTTOM_CONTROLS, true);
     public static final MutableFlagWithSafeDefault sBrowserControlsEarlyResize =
@@ -1628,7 +1631,7 @@
 
     public static final StringCachedFeatureParam sEdgeToEdgeEverywhereOemMinVersions =
             newStringCachedFeatureParam(
-                    EDGE_TO_EDGE_EVERYWHERE, "e2e_field_trial_oem_min_versions", "");
+                    EDGE_TO_EDGE_EVERYWHERE, "e2e_field_trial_oem_min_versions", "35");
 
     public static final StringCachedFeatureParam sEdgeToEdgeUseBackupNavbarInsetsOemMinVersions =
             newStringCachedFeatureParam(
@@ -1646,7 +1649,8 @@
                     EDGE_TO_EDGE_BOTTOM_CHIN, "e2e_field_trial_oem_list", "oppo,xiaomi");
 
     public static final StringCachedFeatureParam sEdgeToEdgeEverywhereOemList =
-            newStringCachedFeatureParam(EDGE_TO_EDGE_EVERYWHERE, "e2e_field_trial_oem_list", "");
+            newStringCachedFeatureParam(
+                    EDGE_TO_EDGE_EVERYWHERE, "e2e_field_trial_oem_list", "realme");
 
     public static final StringCachedFeatureParam sEdgeToEdgeUseBackupNavbarInsetsOemList =
             newStringCachedFeatureParam(
diff --git a/chrome/browser/metrics/BUILD.gn b/chrome/browser/metrics/BUILD.gn
index 55d9f9f..1691060 100644
--- a/chrome/browser/metrics/BUILD.gn
+++ b/chrome/browser/metrics/BUILD.gn
@@ -19,7 +19,7 @@
     "//base",
     "//chrome/browser",
     "//chrome/browser/sync",
-    "//chrome/test:sync_integration_test_support",
+    "//chrome/browser/sync/test/integration:sync_integration_test_support",
     "//components/metrics_services_manager",
     "//components/signin/public/identity_manager",
     "//components/sync:test_support",
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index 896be61..2bbdcc52 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -60,6 +60,7 @@
 #include "chrome/browser/privacy_budget/privacy_budget_ukm_entry_filter.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/profiles/profiles_state.h"
+#include "chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.h"
 #include "chrome/browser/safe_browsing/metrics/safe_browsing_metrics_provider.h"
 #include "chrome/browser/sync/device_info_sync_service_factory.h"
 #include "chrome/browser/sync/sync_service_factory.h"
@@ -1009,6 +1010,10 @@
   metrics_service_->RegisterMetricsProvider(
       std::make_unique<glic::GlicMetricsProvider>());
 #endif
+
+  metrics_service_->RegisterMetricsProvider(
+      std::make_unique<
+          regional_capabilities::RegionalCapabilitiesMetricsProvider>());
 }
 
 void ChromeMetricsServiceClient::RegisterUKMProviders() {
diff --git a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
index f97c689..cee469d 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client_unittest.cc
@@ -202,7 +202,7 @@
   size_t expected_providers = 2;
 
   // This is the number of metrics providers that are outside any #if macros.
-  expected_providers += 24;
+  expected_providers += 25;
 
   int sample_rate;
   if (ChromeMetricsServicesManagerClient::GetSamplingRatePerMille(
diff --git a/chrome/browser/metrics/chromeos_family_link_user_metrics_provider.cc b/chrome/browser/metrics/chromeos_family_link_user_metrics_provider.cc
index 0bf7f0e..b013a87 100644
--- a/chrome/browser/metrics/chromeos_family_link_user_metrics_provider.cc
+++ b/chrome/browser/metrics/chromeos_family_link_user_metrics_provider.cc
@@ -76,8 +76,8 @@
   DCHECK(!access_token_fetcher_);
   access_token_fetcher_ = std::make_unique<
       signin::PrimaryAccountAccessTokenFetcher>(
-      /*consumer_name=*/"ChromeOSFamilyLinkUserMetricsProvider",
-      identity_manager, signin::ScopeSet(),
+      signin::OAuthConsumerId::kChromeosFamilyLinkUserMetricsProvider,
+      identity_manager,
       base::BindOnce(
           &ChromeOSFamilyLinkUserMetricsProvider::OnAccessTokenRequestCompleted,
           // It is safe to use base::Unretained as |this| owns
diff --git a/chrome/browser/password_manager/account_password_store_factory.cc b/chrome/browser/password_manager/account_password_store_factory.cc
index 2104214..d923429 100644
--- a/chrome/browser/password_manager/account_password_store_factory.cc
+++ b/chrome/browser/password_manager/account_password_store_factory.cc
@@ -55,42 +55,6 @@
 using password_manager::PasswordForm;
 using password_manager::PasswordStore;
 using password_manager::PasswordStoreInterface;
-using password_manager::UnsyncedCredentialsDeletionNotifier;
-
-#if !BUILDFLAG(IS_ANDROID)
-// Returns a repeating callback that to show warning UI that credentials are
-// about to be deleted. Note that showing the UI is asynchronous, but safe to
-// call from any sequence.
-UnsyncedCredentialsDeletionNotifier CreateUnsyncedCredentialsDeletionNotifier(
-    Profile& profile) {
-  CHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  // Tries to show warning UI that `credentials` will be deleted.
-  auto try_to_show_ui = base::BindRepeating(
-      [](base::WeakPtr<Profile> profile,
-         std::vector<PasswordForm> credentials) {
-        if (!profile) {
-          return;
-        }
-        Browser* browser = chrome::FindBrowserWithProfile(profile.get());
-        if (!browser) {
-          return;
-        }
-        content::WebContents* web_contents =
-            browser->tab_strip_model()->GetActiveWebContents();
-        if (!web_contents) {
-          return;
-        }
-        if (auto* ui_controller =
-                ManagePasswordsUIController::FromWebContents(web_contents)) {
-          ui_controller->NotifyUnsyncedCredentialsWillBeDeleted(
-              std::move(credentials));
-        }
-      },
-      profile.GetWeakPtr());
-  return base::BindPostTask(content::GetUIThreadTaskRunner({}),
-                            std::move(try_to_show_ui));
-}
-#endif  // !BUILDFLAG(IS_ANDROID)
 
 scoped_refptr<RefcountedKeyedService> BuildPasswordStore(
     content::BrowserContext* context) {
@@ -114,16 +78,9 @@
       g_browser_process->os_crypt_async();
 
   scoped_refptr<password_manager::PasswordStore> ps =
-#if BUILDFLAG(IS_ANDROID)
       new password_manager::PasswordStore(CreateAccountPasswordStoreBackend(
           profile->GetPath(), profile->GetPrefs(),
-          /*unsynced_deletions_notifier=*/base::NullCallback(),
           os_crypt_async));
-#else
-      new password_manager::PasswordStore(CreateAccountPasswordStoreBackend(
-          profile->GetPath(), profile->GetPrefs(),
-          CreateUnsyncedCredentialsDeletionNotifier(*profile), os_crypt_async));
-#endif
 
   affiliations::AffiliationService* affiliation_service =
       AffiliationServiceFactory::GetForProfile(profile);
diff --git a/chrome/browser/password_manager/factories/password_store_backend_factory.cc b/chrome/browser/password_manager/factories/password_store_backend_factory.cc
index 78d8951..768d11c 100644
--- a/chrome/browser/password_manager/factories/password_store_backend_factory.cc
+++ b/chrome/browser/password_manager/factories/password_store_backend_factory.cc
@@ -152,8 +152,6 @@
 std::unique_ptr<PasswordStoreBackend> CreateAccountPasswordStoreBackend(
     const base::FilePath& login_db_directory,
     PrefService* prefs,
-    password_manager::UnsyncedCredentialsDeletionNotifier
-        unsynced_deletions_notifier,
     os_crypt_async::OSCryptAsync* os_crypt_async) {
   std::unique_ptr<password_manager::LoginDatabase> login_db(
       password_manager::CreateLoginDatabaseForAccountStorage(login_db_directory,
@@ -171,8 +169,7 @@
 #else
   backend = std::make_unique<PasswordStoreBuiltInBackend>(
       std::move(login_db), syncer::WipeModelUponSyncDisabledBehavior::kAlways,
-      prefs, os_crypt_async, std::move(unsynced_deletions_notifier));
-
+      prefs, os_crypt_async);
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
   base::FilePath user_data_dir;
diff --git a/chrome/browser/password_manager/factories/password_store_backend_factory.h b/chrome/browser/password_manager/factories/password_store_backend_factory.h
index 22af915c..f74d390 100644
--- a/chrome/browser/password_manager/factories/password_store_backend_factory.h
+++ b/chrome/browser/password_manager/factories/password_store_backend_factory.h
@@ -35,8 +35,6 @@
 CreateAccountPasswordStoreBackend(
     const base::FilePath& login_db_directory,
     PrefService* prefs,
-    password_manager::UnsyncedCredentialsDeletionNotifier
-        unsynced_deletions_notifier,
     os_crypt_async::OSCryptAsync* os_crypt_async);
 
 #endif  // CHROME_BROWSER_PASSWORD_MANAGER_FACTORIES_PASSWORD_STORE_BACKEND_FACTORY_H_
diff --git a/chrome/browser/password_manager/password_manager_test_base.cc b/chrome/browser/password_manager/password_manager_test_base.cc
index e975f3e..112e659 100644
--- a/chrome/browser/password_manager/password_manager_test_base.cc
+++ b/chrome/browser/password_manager/password_manager_test_base.cc
@@ -148,11 +148,6 @@
   return false;
 }
 
-void BubbleObserver::WaitForSaveUnsyncedCredentialsPrompt() const {
-  WaitForState(
-      password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE);
-}
-
 void BubbleObserver::WaitForState(
     password_manager::ui::State target_state) const {
   auto IsTargetStateObserved = [this, target_state]() {
diff --git a/chrome/browser/password_manager/password_manager_test_base.h b/chrome/browser/password_manager/password_manager_test_base.h
index 9801c7a..d89bbfa9 100644
--- a/chrome/browser/password_manager/password_manager_test_base.h
+++ b/chrome/browser/password_manager/password_manager_test_base.h
@@ -96,9 +96,6 @@
   // PasswordManagerBrowserTestBase.
   bool WaitForFallbackForSaving() const;
 
-  // Returns once the prompt for saving unsynced credentials pops up.
-  void WaitForSaveUnsyncedCredentialsPrompt() const;
-
  private:
   void WaitForState(password_manager::ui::State target_state) const;
 
diff --git a/chrome/browser/password_manager/profile_password_store_factory.cc b/chrome/browser/password_manager/profile_password_store_factory.cc
index 5f46c693..18aed654 100644
--- a/chrome/browser/password_manager/profile_password_store_factory.cc
+++ b/chrome/browser/password_manager/profile_password_store_factory.cc
@@ -59,16 +59,9 @@
 
   DCHECK(!profile->IsOffTheRecord());
 
-  scoped_refptr<PasswordStore> ps;
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || \
-    BUILDFLAG(IS_OZONE)
-  ps = new password_manager::PasswordStore(
+  scoped_refptr<PasswordStore> ps = new password_manager::PasswordStore(
       CreateProfilePasswordStoreBackend(profile->GetPath(), profile->GetPrefs(),
                                         g_browser_process->os_crypt_async()));
-#else
-  NOTIMPLEMENTED();
-#endif
-  DCHECK(ps);
 
   affiliations::AffiliationService* affiliation_service =
       AffiliationServiceFactory::GetForProfile(profile);
diff --git a/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.cc
index 6e71aeab..97a8890 100644
--- a/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.cc
+++ b/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.cc
@@ -482,9 +482,8 @@
 
 void PredictionBasedPermissionUiSelector::OnTimeout() {
   VLOG(1) << "[CPSS] Overall timeout for prediction reached.";
-  // TODO(crbug.com/441889637): Add a UMA metric for this timeout event.
   Cleanup();
-  FinishRequest(Decision::UseNormalUiAndShowNoWarning());
+  FinishRequest(Decision::UseNormalUiAndShowNoWarning(), /*timeout=*/true);
 }
 
 void PredictionBasedPermissionUiSelector::Cancel() {
@@ -493,9 +492,12 @@
   Cleanup();
 }
 
-void PredictionBasedPermissionUiSelector::FinishRequest(Decision decision) {
+void PredictionBasedPermissionUiSelector::FinishRequest(Decision decision,
+                                                        bool timeout) {
   timeout_timer_.Stop();
+  PermissionUmaUtil::RecordPredictionServiceTimeout(timeout);
   if (!callback_) {
+    VLOG(1) << "[CPSS] FinishRequest called but callback is null";
     return;
   }
 
diff --git a/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.h b/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.h
index df924e1..bac23eed 100644
--- a/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.h
+++ b/chrome/browser/permissions/prediction_service/prediction_based_permission_ui_selector.h
@@ -143,7 +143,7 @@
                            HoldbackDecisionTest);
 
   // A safe way to invoke the callback with a decision.
-  void FinishRequest(Decision decision);
+  void FinishRequest(Decision decision, bool timeout = false);
 
   // Resets the permission request, the language detection observer and the
   // passage embedder delegate, which cancels all async operations managed by
diff --git a/chrome/browser/permissions/prediction_service/prediction_service_browsertest.cc b/chrome/browser/permissions/prediction_service/prediction_service_browsertest.cc
index 32a14c1..116203c 100644
--- a/chrome/browser/permissions/prediction_service/prediction_service_browsertest.cc
+++ b/chrome/browser/permissions/prediction_service/prediction_service_browsertest.cc
@@ -135,6 +135,8 @@
     "Permissions.OnDevicePredictionService.InquiryDuration";
 constexpr char kCpssV3InquiryDurationHistogram[] =
     "Permissions.PredictionService.InquiryDuration";
+constexpr char kPredictionServiceTimeoutHistogram[] =
+    "Permissions.PredictionService.Timeout";
 constexpr char kTFLiteLibAvailableHistogram[] =
     "Permissions.PredictionService.TFLiteLibAvailable";
 constexpr char kMSBBHistogram[] = "Permissions.PredictionService.MSBB";
@@ -603,10 +605,14 @@
                 .Run(/*lookup_successful=*/true,
                      /*response_from_cache=*/true, prediction_service_response);
           })));
+
   TriggerPromptAndVerifyUi(test_url, PermissionAction::DISMISSED,
                            GetParam().should_expect_quiet_ui,
                            /*expected_relevance=*/std::nullopt,
                            GetParam().prediction_service_likelihood);
+
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 1);
 }
 
 IN_PROC_BROWSER_TEST_P(PredictionServiceHoldbackBrowserTest,
@@ -629,6 +635,9 @@
       /*should_expect_quiet_ui=*/false,
       /*expected_relevance=*/std::nullopt,
       /*expected_prediction_likelihood=*/std::nullopt);
+
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        true, 1);
 }
 
 // -----------------------------------------------------------------------------
@@ -772,6 +781,10 @@
 
   histogram_tester().ExpectTotalCount(kCpssV1InquiryDurationHistogram,
                                       /*expected_count=*/1);
+  // Because of the action history we need to trigger the CPSSv1 model we expect
+  // 5 records here.
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 5);
 }
 
 // -----------------------------------------------------------------------------
@@ -1056,6 +1069,9 @@
           ? kAIv3NotificationsHoldbackResponseHistogram
           : kAIv3GeolocationHoldbackResponseHistogram,
       /*sample=*/false, /*expected_count=*/1);
+
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 1);
 }
 
 // -----------------------------------------------------------------------------
@@ -1271,6 +1287,9 @@
                                        /*sample=*/GetParam().expected_status,
                                        /*expected_count=*/1);
 
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 1);
+
   // Avoid dangling raw_ptr warning:
   model_handler_provider()->set_passage_embedder_for_testing(nullptr);
 }
@@ -1426,6 +1445,9 @@
       kAiv4NotificationsPermissionRequestRelevanceHistogram,
       /*expected_count=*/0);
 
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 1);
+
   // Avoid dangling raw_ptr warning:
   model_handler_provider()->set_passage_embedder_for_testing(nullptr);
 }
@@ -1491,6 +1513,9 @@
       /*sample=*/1,
       /*expected_count=*/1);
 
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 1);
+
   // Avoid dangling raw_ptr warning:
   model_handler_provider()->set_passage_embedder_for_testing(nullptr);
 }
@@ -1681,6 +1706,9 @@
           : kAiv4GeolocationRenderedTextSizeHistogram,
       /*sample=*/55,
       /*expected_bucket_count=*/1);
+
+  histogram_tester().ExpectUniqueSample(kPredictionServiceTimeoutHistogram,
+                                        false, 1);
 }
 
 }  // namespace permissions
diff --git a/chrome/browser/privacy_budget/BUILD.gn b/chrome/browser/privacy_budget/BUILD.gn
index 76ab1f2..7a7d564 100644
--- a/chrome/browser/privacy_budget/BUILD.gn
+++ b/chrome/browser/privacy_budget/BUILD.gn
@@ -110,8 +110,8 @@
     "//chrome/browser",
     "//chrome/browser:browser_process",
     "//chrome/browser/metrics:test_support",
+    "//chrome/browser/sync/test/integration:sync_integration_test_support",
     "//chrome/common/privacy_budget:test_support",
-    "//chrome/test:sync_integration_test_support",
     "//chrome/test:test_support",
     "//components/metrics_services_manager",
     "//components/sync:test_support",
diff --git a/chrome/browser/regional_capabilities/BUILD.gn b/chrome/browser/regional_capabilities/BUILD.gn
index 3278f15..cc06bf4 100644
--- a/chrome/browser/regional_capabilities/BUILD.gn
+++ b/chrome/browser/regional_capabilities/BUILD.gn
@@ -8,6 +8,7 @@
 
 source_set("regional_capabilities") {
   sources = [
+    "regional_capabilities_metrics_provider.h",
     "regional_capabilities_service_client.cc",
     "regional_capabilities_service_client.h",
     "regional_capabilities_service_factory.cc",
@@ -19,6 +20,7 @@
     "//chrome/browser:browser_process",
     "//chrome/browser/profiles",
     "//components/country_codes",
+    "//components/metrics",
     "//components/regional_capabilities",
     "//components/variations/service",
   ]
@@ -50,9 +52,22 @@
   }
 }
 
+source_set("metrics_provider_impl") {
+  sources = [ "regional_capabilities_metrics_provider.cc" ]
+  deps = [
+    ":regional_capabilities",
+    "//chrome/browser:browser_process",
+    "//chrome/browser/profiles:profile",
+    "//components/regional_capabilities",
+    "//components/regional_capabilities:data",
+  ]
+  public_deps = [ "//chrome/browser:browser_public_dependencies" ]
+}
+
 source_set("unit_tests") {
   testonly = true
   sources = [
+    "regional_capabilities_metrics_provider_unittest.cc",
     "regional_capabilities_service_client_unittest.cc",
     "regional_capabilities_test_environment.cc",
     "regional_capabilities_test_environment.h",
@@ -61,6 +76,7 @@
   deps = [
     ":regional_capabilities",
     "//base/test:test_support",
+    "//chrome/test:test_support",
     "//components/country_codes",
     "//components/metrics",
     "//components/metrics:test_support",
diff --git a/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.cc b/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.cc
new file mode 100644
index 0000000..2b902c5
--- /dev/null
+++ b/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.cc
@@ -0,0 +1,38 @@
+// Copyright 2025 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/regional_capabilities/regional_capabilities_metrics_provider.h"
+
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/regional_capabilities/regional_capabilities_service_factory.h"
+#include "components/regional_capabilities/program_settings.h"
+#include "components/regional_capabilities/regional_capabilities_metrics.h"
+#include "components/regional_capabilities/regional_capabilities_service.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
+
+namespace regional_capabilities {
+
+void RegionalCapabilitiesMetricsProvider::ProvideCurrentSessionData(
+    metrics::ChromeUserMetricsExtension* uma_proto) {
+  absl::flat_hash_set<ActiveRegionalProgram> programs;
+  for (Profile* profile :
+       g_browser_process->profile_manager()->GetLoadedProfiles()) {
+    RegionalCapabilitiesService* regional_capabilities =
+        RegionalCapabilitiesServiceFactory::GetForProfile(profile);
+    if (!regional_capabilities) {
+      // Ignore profiles such as the system profile that don't have a
+      // RegionalCapabilitiesService.
+      continue;
+    }
+
+    programs.insert(regional_capabilities->GetActiveProgramForMetrics());
+  }
+
+  RecordActiveRegionalProgram(programs);
+}
+
+}  // namespace regional_capabilities
diff --git a/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.h b/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.h
new file mode 100644
index 0000000..897ce00d
--- /dev/null
+++ b/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider.h
@@ -0,0 +1,28 @@
+// Copyright 2025 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_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_METRICS_PROVIDER_H_
+#define CHROME_BROWSER_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_METRICS_PROVIDER_H_
+
+#include "components/metrics/metrics_provider.h"
+
+namespace regional_capabilities {
+
+class RegionalCapabilitiesMetricsProvider : public metrics::MetricsProvider {
+ public:
+  RegionalCapabilitiesMetricsProvider() = default;
+  RegionalCapabilitiesMetricsProvider(
+      const RegionalCapabilitiesMetricsProvider&) = delete;
+  RegionalCapabilitiesMetricsProvider& operator=(
+      const RegionalCapabilitiesMetricsProvider&) = delete;
+  ~RegionalCapabilitiesMetricsProvider() override = default;
+
+  // metrics::MetricsProvider
+  void ProvideCurrentSessionData(
+      metrics::ChromeUserMetricsExtension* uma_proto) override;
+};
+
+}  // namespace regional_capabilities
+
+#endif  // CHROME_BROWSER_REGIONAL_CAPABILITIES_REGIONAL_CAPABILITIES_METRICS_PROVIDER_H_
diff --git a/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider_unittest.cc b/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider_unittest.cc
new file mode 100644
index 0000000..9c3b1e5
--- /dev/null
+++ b/chrome/browser/regional_capabilities/regional_capabilities_metrics_provider_unittest.cc
@@ -0,0 +1,143 @@
+// Copyright 2025 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/regional_capabilities/regional_capabilities_metrics_provider.h"
+
+#include <map>
+#include <memory>
+#include <string>
+
+#include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/regional_capabilities/regional_capabilities_service_factory.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 "components/country_codes/country_codes.h"
+#include "components/keyed_service/core/keyed_service.h"
+#include "components/regional_capabilities/regional_capabilities_metrics.h"
+#include "components/regional_capabilities/regional_capabilities_service.h"
+#include "components/regional_capabilities/regional_capabilities_switches.h"
+#include "components/regional_capabilities/regional_capabilities_test_utils.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace regional_capabilities {
+
+namespace {
+
+std::unique_ptr<KeyedService> BuildServiceWithFakeClient(
+    country_codes::CountryId country_id,
+    content::BrowserContext* context) {
+  Profile* profile = Profile::FromBrowserContext(context);
+  return CreateServiceWithFakeClient(*profile->GetPrefs(), country_id);
+}
+
+}  // namespace
+
+class RegionalCapabilitiesMetricsProviderTest : public testing::Test {
+ public:
+  RegionalCapabilitiesMetricsProviderTest()
+      : profile_manager_(TestingBrowserProcess::GetGlobal()) {}
+
+  void SetUp() override {
+    ASSERT_TRUE(profile_manager_.SetUp());
+#if BUILDFLAG(IS_ANDROID)
+    // TODO(https://crbug.com/438133907): once it's supported by the test
+    // environment, set the regional capabilities directly for this test.
+    scoped_feature_list_.InitAndDisableFeature(
+        switches::kResolveRegionalCapabilitiesFromDevice);
+#endif  // BUILDFLAG(IS_ANDROID)
+  }
+
+  void TearDown() override {
+    // The profile manager needs to be destroyed before the task environment.
+    profile_manager_.DeleteAllTestingProfiles();
+  }
+
+  // Creates a profile and associates it with a country.
+  void CreateProfileWithCountry(const std::string& profile_name,
+                                country_codes::CountryId country_id) {
+    profile_manager_.CreateTestingProfile(
+        profile_name,
+        {TestingProfile::TestingFactory(
+            RegionalCapabilitiesServiceFactory::GetInstance(),
+            base::BindRepeating(&BuildServiceWithFakeClient, country_id))});
+  }
+
+ protected:
+  base::HistogramTester histogram_tester_;
+  RegionalCapabilitiesMetricsProvider metrics_provider_;
+  TestingProfileManager profile_manager_;
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+TEST_F(RegionalCapabilitiesMetricsProviderTest, NoProfiles) {
+  metrics_provider_.ProvideCurrentSessionData(nullptr);
+
+  histogram_tester_.ExpectUniqueSample(
+      "RegionalCapabilities.ActiveRegionalProgram",
+      ActiveRegionalProgram::kDefault, 1);
+}
+
+TEST_F(RegionalCapabilitiesMetricsProviderTest, SingleProfile_Default) {
+  CreateProfileWithCountry("profile1", country_codes::CountryId("US"));
+
+  metrics_provider_.ProvideCurrentSessionData(nullptr);
+
+  histogram_tester_.ExpectUniqueSample(
+      "RegionalCapabilities.ActiveRegionalProgram",
+      ActiveRegionalProgram::kDefault, 1);
+}
+
+TEST_F(RegionalCapabilitiesMetricsProviderTest, SingleProfile_Waffle) {
+  CreateProfileWithCountry("profile1", country_codes::CountryId("FR"));
+
+  metrics_provider_.ProvideCurrentSessionData(nullptr);
+
+  histogram_tester_.ExpectUniqueSample(
+      "RegionalCapabilities.ActiveRegionalProgram",
+      ActiveRegionalProgram::kWaffle, 1);
+}
+
+// Skip on platforms that don't have a system profile.
+#if !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
+TEST_F(RegionalCapabilitiesMetricsProviderTest,
+       SystemProfileAndRegularProfile_Waffle) {
+  profile_manager_.CreateSystemProfile();
+  CreateProfileWithCountry("profile1", country_codes::CountryId("FR"));
+
+  metrics_provider_.ProvideCurrentSessionData(nullptr);
+
+  histogram_tester_.ExpectUniqueSample(
+      "RegionalCapabilities.ActiveRegionalProgram",
+      ActiveRegionalProgram::kWaffle, 1);
+}
+#endif  // !BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(IS_ANDROID)
+
+TEST_F(RegionalCapabilitiesMetricsProviderTest, MultipleProfiles_Same) {
+  CreateProfileWithCountry("profile1", country_codes::CountryId("FR"));
+  CreateProfileWithCountry("profile2", country_codes::CountryId("FR"));
+
+  metrics_provider_.ProvideCurrentSessionData(nullptr);
+
+  histogram_tester_.ExpectUniqueSample(
+      "RegionalCapabilities.ActiveRegionalProgram",
+      ActiveRegionalProgram::kWaffle, 1);
+}
+
+TEST_F(RegionalCapabilitiesMetricsProviderTest, MultipleProfiles_Different) {
+  CreateProfileWithCountry("profile1", country_codes::CountryId("FR"));
+  CreateProfileWithCountry("profile2", country_codes::CountryId("US"));
+  metrics_provider_.ProvideCurrentSessionData(nullptr);
+  histogram_tester_.ExpectUniqueSample(
+      "RegionalCapabilities.ActiveRegionalProgram",
+      ActiveRegionalProgram::kMixed, 1);
+}
+
+}  // namespace regional_capabilities
diff --git a/chrome/browser/save_to_drive/BUILD.gn b/chrome/browser/save_to_drive/BUILD.gn
index 74b9895..2712cce 100644
--- a/chrome/browser/save_to_drive/BUILD.gn
+++ b/chrome/browser/save_to_drive/BUILD.gn
@@ -50,7 +50,6 @@
   testonly = true
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
   sources = [
-    "drive_uploader_browsertest.cc",
     "pdf_content_reader_browsertest.cc",
     "save_to_drive_event_dispatcher_browsertest.cc",
   ]
@@ -70,7 +69,10 @@
 
 source_set("unit_tests") {
   testonly = true
-  sources = [ "save_to_drive_flow_unittest.cc" ]
+  sources = [
+    "drive_uploader_unittest.cc",
+    "save_to_drive_flow_unittest.cc",
+  ]
   deps = [
     ":save_to_drive",
     "//chrome/browser/pdf:pdf_extension_test_utils",
diff --git a/chrome/browser/save_to_drive/drive_uploader_browsertest.cc b/chrome/browser/save_to_drive/drive_uploader_browsertest.cc
deleted file mode 100644
index 9434044b..0000000
--- a/chrome/browser/save_to_drive/drive_uploader_browsertest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2025 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/save_to_drive/drive_uploader.h"
-
-#include "base/test/gmock_callback_support.h"
-#include "base/test/mock_callback.h"
-#include "base/test/test_future.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/common/extensions/api/pdf_viewer_private.h"
-#include "chrome/test/base/in_process_browser_test.h"
-#include "components/signin/public/identity_manager/identity_test_environment.h"
-#include "content/public/test/browser_test.h"
-#include "google_apis/gaia/gaia_urls.h"
-#include "google_apis/gaia/google_service_auth_error.h"
-#include "net/http/http_request_headers.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::test::TestFuture;
-using extensions::api::pdf_viewer_private::SaveToDriveErrorType;
-using extensions::api::pdf_viewer_private::SaveToDriveProgress;
-using extensions::api::pdf_viewer_private::SaveToDriveStatus;
-using testing::_;
-using testing::Field;
-using testing::IsEmpty;
-using testing::StartsWith;
-
-namespace save_to_drive {
-
-using ProgressCallback = DriveUploader::ProgressCallback;
-
-class FakeDriveUploader : public DriveUploader {
- public:
-  FakeDriveUploader(std::string title,
-                    AccountInfo account_info,
-                    ProgressCallback progress_callback,
-                    Profile* profile)
-      : DriveUploader(DriveUploaderType::kUnknown,
-                      std::move(title),
-                      std::move(account_info),
-                      std::move(progress_callback),
-                      profile) {}
-  FakeDriveUploader(const FakeDriveUploader&) = delete;
-  FakeDriveUploader& operator=(const FakeDriveUploader&) = delete;
-  ~FakeDriveUploader() override = default;
-
-  // DriveUploader:
-  void UploadFile() override {}
-
-  const std::vector<std::string>& get_oauth_headers() const {
-    return oauth_headers_;
-  }
-};
-
-class DriveUploaderBrowserTest : public InProcessBrowserTest {
- public:
-  void SetUpOnMainThread() override {
-    InProcessBrowserTest::SetUpOnMainThread();
-    adaptor_ = std::make_unique<IdentityTestEnvironmentProfileAdaptor>(
-        browser()->profile());
-
-    identity_test_env_ = adaptor_->identity_test_env();
-  }
-
-  void SetUpBrowserContextKeyedServices(
-      content::BrowserContext* context) override {
-    IdentityTestEnvironmentProfileAdaptor::
-        SetIdentityTestEnvironmentFactoriesOnBrowserContext(context);
-  }
-
-  void TearDownOnMainThread() override {
-    identity_test_env_ = nullptr;
-    adaptor_.reset();
-
-    InProcessBrowserTest::TearDownOnMainThread();
-  }
-
- protected:
-  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> adaptor_;
-  raw_ptr<signin::IdentityTestEnvironment> identity_test_env_ = nullptr;
-};
-
-IN_PROC_BROWSER_TEST_F(DriveUploaderBrowserTest, CreateOAuthHeadersSuccess) {
-  auto account_info = identity_test_env_->MakePrimaryAccountAvailable(
-      "test@example.com", signin::ConsentLevel::kSignin);
-  base::MockCallback<ProgressCallback> progress_callback;
-  FakeDriveUploader uploader("test_title", std::move(account_info),
-                             progress_callback.Get(), browser()->profile());
-  TestFuture<void> future;
-  EXPECT_CALL(progress_callback, Run(Field(&SaveToDriveProgress::status,
-                                           SaveToDriveStatus::kFetchOauth)))
-      .WillOnce(base::test::RunOnceClosure(future.GetCallback()));
-  uploader.Start();
-
-  identity_test_env_->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
-      "access_token", base::Time::Now() + base::Hours(1));
-
-  EXPECT_TRUE(future.Wait());
-  EXPECT_THAT(uploader.get_oauth_headers(),
-              ElementsAre("X-Developer-Key",
-                          GaiaUrls::GetInstance()->oauth2_chrome_client_id(),
-                          net::HttpRequestHeaders::kAuthorization,
-                          StartsWith("Bearer access_token")));
-}
-
-IN_PROC_BROWSER_TEST_F(DriveUploaderBrowserTest, CreateOAuthHeadersFailure) {
-  auto account_info = identity_test_env_->MakePrimaryAccountAvailable(
-      "test@example.com", signin::ConsentLevel::kSignin);
-  base::MockCallback<ProgressCallback> progress_callback;
-  FakeDriveUploader uploader("test_title", std::move(account_info),
-                             progress_callback.Get(), browser()->profile());
-  TestFuture<void> future;
-  EXPECT_CALL(progress_callback,
-              Run(AllOf(Field(&SaveToDriveProgress::status,
-                              SaveToDriveStatus::kUploadFailed),
-                        Field(&SaveToDriveProgress::error_type,
-                              SaveToDriveErrorType::kOauthError))))
-      .WillOnce(base::test::RunOnceClosure(future.GetCallback()));
-  uploader.Start();
-
-  identity_test_env_->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
-      GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED));
-  EXPECT_TRUE(future.Wait());
-  EXPECT_THAT(uploader.get_oauth_headers(), IsEmpty());
-}
-
-}  // namespace save_to_drive
diff --git a/chrome/browser/save_to_drive/drive_uploader_unittest.cc b/chrome/browser/save_to_drive/drive_uploader_unittest.cc
new file mode 100644
index 0000000..5449f40
--- /dev/null
+++ b/chrome/browser/save_to_drive/drive_uploader_unittest.cc
@@ -0,0 +1,139 @@
+// Copyright 2025 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/save_to_drive/drive_uploader.h"
+
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/test/mock_callback.h"
+#include "chrome/browser/save_to_drive/content_reader.h"
+#include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
+#include "chrome/common/extensions/api/pdf_viewer_private.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "content/public/test/browser_task_environment.h"
+#include "google_apis/gaia/core_account_id.h"
+#include "google_apis/gaia/google_service_auth_error.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace save_to_drive {
+
+namespace {
+
+using extensions::api::pdf_viewer_private::SaveToDriveErrorType;
+using extensions::api::pdf_viewer_private::SaveToDriveProgress;
+using extensions::api::pdf_viewer_private::SaveToDriveStatus;
+using testing::_;
+using testing::AllOf;
+using testing::Field;
+
+class MockContentReader : public ContentReader {
+ public:
+  MOCK_METHOD(void, Open, (OpenCallback callback), (override));
+  MOCK_METHOD(size_t, GetSize, (), (override));
+  MOCK_METHOD(void,
+              Read,
+              (uint32_t offset, uint32_t size, ContentReadCallback callback),
+              (override));
+  MOCK_METHOD(void, Close, (), (override));
+};
+
+class FakeDriveUploader : public DriveUploader {
+ public:
+  FakeDriveUploader(std::string title,
+                    AccountInfo account_info,
+                    ProgressCallback progress_callback,
+                    Profile* profile)
+      : DriveUploader(DriveUploaderType::kUnknown,
+                      std::move(title),
+                      std::move(account_info),
+                      std::move(progress_callback),
+                      profile) {}
+  FakeDriveUploader(const FakeDriveUploader&) = delete;
+  FakeDriveUploader& operator=(const FakeDriveUploader&) = delete;
+  ~FakeDriveUploader() override = default;
+
+  MOCK_METHOD(void, UploadFile, (), (override));
+};
+
+class DriveUploaderTest : public testing::Test {
+ public:
+  DriveUploaderTest()
+      : profile_(IdentityTestEnvironmentProfileAdaptor::
+                     CreateProfileForIdentityTestEnvironment()),
+        adaptor_(std::make_unique<IdentityTestEnvironmentProfileAdaptor>(
+            profile_.get())) {}
+  DriveUploaderTest(const DriveUploaderTest&) = delete;
+  DriveUploaderTest& operator=(const DriveUploaderTest&) = delete;
+  ~DriveUploaderTest() override = default;
+
+ protected:
+  signin::IdentityTestEnvironment* test_env() {
+    return adaptor_->identity_test_env();
+  }
+
+  content::BrowserTaskEnvironment task_environment_;
+  std::unique_ptr<TestingProfile> profile_;
+  std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> adaptor_;
+  base::MockCallback<DriveUploader::ProgressCallback> progress_callback_;
+  MockContentReader mock_content_reader_;
+};
+
+TEST_F(DriveUploaderTest, FetchAccessTokenSuccess) {
+  auto account_info = test_env()->MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSignin);
+  auto uploader = std::make_unique<FakeDriveUploader>(
+      "test_title", account_info, progress_callback_.Get(), profile_.get());
+
+  EXPECT_CALL(progress_callback_,
+              Run(AllOf(Field(&SaveToDriveProgress::status,
+                              SaveToDriveStatus::kFetchOauth),
+                        Field(&SaveToDriveProgress::error_type,
+                              SaveToDriveErrorType::kNoError))));
+
+  uploader->Start();
+  test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
+      "test_token", base::Time::Max());
+}
+
+TEST_F(DriveUploaderTest, FetchAccessTokenFailure) {
+  auto account_info = test_env()->MakePrimaryAccountAvailable(
+      "test@example.com", signin::ConsentLevel::kSignin);
+  auto uploader = std::make_unique<FakeDriveUploader>(
+      "test_title", account_info, progress_callback_.Get(), profile_.get());
+
+  EXPECT_CALL(progress_callback_,
+              Run(AllOf(Field(&SaveToDriveProgress::status,
+                              SaveToDriveStatus::kUploadFailed),
+                        Field(&SaveToDriveProgress::error_type,
+                              SaveToDriveErrorType::kOauthError))));
+
+  uploader->Start();
+  test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError(
+      GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED));
+}
+
+TEST_F(DriveUploaderTest, NoRefreshToken) {
+  AccountInfo account_info;
+  account_info.email = "test@example.com";
+  account_info.account_id = CoreAccountId::FromGaiaId(GaiaId("12345"));
+
+  auto uploader = std::make_unique<FakeDriveUploader>(
+      "test_title", account_info, progress_callback_.Get(), profile_.get());
+
+  EXPECT_CALL(progress_callback_,
+              Run(AllOf(Field(&SaveToDriveProgress::status,
+                              SaveToDriveStatus::kUploadFailed),
+                        Field(&SaveToDriveProgress::error_type,
+                              SaveToDriveErrorType::kOauthError))));
+
+  uploader->Start();
+}
+
+}  // namespace
+
+}  // namespace save_to_drive
diff --git a/chrome/browser/sync/chrome_sync_controller_builder.cc b/chrome/browser/sync/chrome_sync_controller_builder.cc
index 394b541..a1bc7e3 100644
--- a/chrome/browser/sync/chrome_sync_controller_builder.cc
+++ b/chrome/browser/sync/chrome_sync_controller_builder.cc
@@ -272,16 +272,9 @@
           /*delegate_for_full_sync_mode=*/
           std::make_unique<syncer::ForwardingDataTypeControllerDelegate>(
               delegate),
-      // TODO(crbug.com/424698545): This special-casing shouldn't be necessary
-      // for ChromeOS, but currently the transport mode delegate may be
-      // exercised in some unexpected cases.
-#if BUILDFLAG(IS_CHROMEOS)
-          /*delegate_for_transport_mode=*/nullptr
-#else   // BUILDFLAG(IS_CHROMEOS)
           /*delegate_for_transport_mode=*/
           std::make_unique<syncer::ForwardingDataTypeControllerDelegate>(
               delegate)
-#endif  // BUILDFLAG(IS_CHROMEOS)
           ));
     }
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/browser/sync/test/integration/BUILD.gn b/chrome/browser/sync/test/integration/BUILD.gn
index ff3b4021..59a2366cf 100644
--- a/chrome/browser/sync/test/integration/BUILD.gn
+++ b/chrome/browser/sync/test/integration/BUILD.gn
@@ -17,6 +17,7 @@
   configs += [ "//build/config:precompiled_headers" ]
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
   deps = [
+    ":sync_integration_test_support",
     "//chrome/browser/password_manager/factories",
     "//chrome/browser/plus_addresses",
     "//chrome/browser/prefs",
@@ -27,7 +28,6 @@
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/browser/ui:ui_features",
     "//chrome/test:browser_tests_runner",
-    "//chrome/test:sync_integration_test_support",
     "//chrome/test:test_support",
     "//components/bookmarks/browser",
     "//components/commerce/core:feature_list",
@@ -347,3 +347,245 @@
     ]
   }
 }
+
+# For Android, this target has to be built along with the
+# sync_integration_test_support_java target from the test target dependencies.
+source_set("sync_integration_test_support") {
+  testonly = true
+  sources = [
+    "autofill_helper.cc",
+    "autofill_helper.h",
+    "await_match_status_change_checker.cc",
+    "await_match_status_change_checker.h",
+    "bookmarks_helper.cc",
+    "bookmarks_helper.h",
+    "committed_all_nudged_changes_checker.cc",
+    "committed_all_nudged_changes_checker.h",
+    "contact_info_helper.cc",
+    "contact_info_helper.h",
+    "device_info_helper.cc",
+    "device_info_helper.h",
+    "encryption_helper.cc",
+    "encryption_helper.h",
+    "exponential_backoff_helper.cc",
+    "exponential_backoff_helper.h",
+    "fake_server_match_status_checker.cc",
+    "fake_server_match_status_checker.h",
+    "fake_sync_gcm_driver_for_instance_id.cc",
+    "fake_sync_gcm_driver_for_instance_id.h",
+    "history_helper.cc",
+    "history_helper.h",
+    "invalidations/fake_server_sync_invalidation_sender.cc",
+    "invalidations/fake_server_sync_invalidation_sender.h",
+    "invalidations/invalidations_status_checker.cc",
+    "invalidations/invalidations_status_checker.h",
+    "multi_client_status_change_checker.cc",
+    "multi_client_status_change_checker.h",
+    "offer_helper.cc",
+    "offer_helper.h",
+    "password_sharing_invitation_helper.cc",
+    "password_sharing_invitation_helper.h",
+    "passwords_helper.cc",
+    "passwords_helper.h",
+    "preferences_helper.cc",
+    "preferences_helper.h",
+    "quiesce_status_change_checker.cc",
+    "quiesce_status_change_checker.h",
+    "saved_tab_groups_helper.cc",
+    "saved_tab_groups_helper.h",
+    "secondary_account_helper.cc",
+    "secondary_account_helper.h",
+    "send_tab_to_self_helper.cc",
+    "send_tab_to_self_helper.h",
+    "session_hierarchy_match_checker.cc",
+    "session_hierarchy_match_checker.h",
+    "shared_tab_group_data_helper.cc",
+    "shared_tab_group_data_helper.h",
+    "single_client_status_change_checker.cc",
+    "single_client_status_change_checker.h",
+    "status_change_checker.cc",
+    "status_change_checker.h",
+    "sync_datatype_helper.cc",
+    "sync_datatype_helper.h",
+    "sync_disabled_checker.cc",
+    "sync_disabled_checker.h",
+    "sync_engine_stopped_checker.cc",
+    "sync_engine_stopped_checker.h",
+    "sync_service_impl_harness.cc",
+    "sync_service_impl_harness.h",
+    "sync_signin_delegate.cc",
+    "sync_signin_delegate.h",
+    "sync_test.cc",
+    "sync_test.h",
+    "sync_test_account.h",
+    "sync_test_tab_utils.cc",
+    "sync_test_tab_utils.h",
+    "updated_progress_marker_checker.cc",
+    "updated_progress_marker_checker.h",
+    "wallet_helper.cc",
+    "wallet_helper.h",
+  ]
+
+  public_deps = [
+    "//chrome/browser",
+    "//chrome/browser/favicon",
+    "//chrome/test:test_support",
+    "//components/autofill/content/browser",
+    "//components/power_bookmarks/core:features",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome/browser:main_extra_parts",
+    "//chrome/browser/autofill",
+    "//chrome/browser/password_manager/factories",
+    "//chrome/browser/profiles",
+    "//chrome/browser/search_engines",
+    "//chrome/browser/sync",
+    "//components/autofill/core/common:credit_card_number_validation",
+    "//components/bookmarks/browser",
+    "//components/bookmarks/browser:test_support",
+    "//components/bookmarks/managed",
+    "//components/browser_sync",
+    "//components/commerce/core:feature_list",
+    "//components/favicon/core",
+    "//components/os_crypt/sync:test_support",
+    "//components/password_manager/core/browser:password_manager_buildflags",
+    "//components/plus_addresses/core/common:features",
+    "//components/saved_tab_groups/public",
+    "//components/send_tab_to_self",
+    "//components/signin/public/identity_manager:test_support",
+    "//components/sync",
+    "//components/sync:test_support",
+    "//components/sync_bookmarks",
+    "//components/tab_groups",
+    "//components/tabs:public",
+    "//components/webapps/common",
+    "//content/public/browser",
+    "//content/test:test_support",
+    "//net",
+    "//services/network/public/mojom",
+    "//skia",
+  ]
+
+  if (is_android) {
+    sources += [
+      "fake_sync_signin_delegate_android.cc",
+      "fake_sync_signin_delegate_android.h",
+      "live_sync_signin_delegate_android.cc",
+      "live_sync_signin_delegate_android.h",
+      "sync_test_utils_android.cc",
+      "sync_test_utils_android.h",
+      "webapks_helper.cc",
+      "webapks_helper.h",
+    ]
+
+    deps += [
+      "//chrome/browser/android/webapk:webapk_sources",
+      "//chrome/browser/password_manager/android:utils",
+      "//chrome/browser/ui/android/tab_model",
+      "//chrome/test:sync_integration_test_support_jni_headers",
+      "//chrome/test:test_support_jni_headers",
+      "//components/saved_tab_groups/public:conversion_utils",
+    ]
+  } else {
+    sources += [
+      "apps_helper.cc",
+      "apps_helper.h",
+      "cookie_helper.cc",
+      "cookie_helper.h",
+      "extension_settings_helper.cc",
+      "extension_settings_helper.h",
+      "fake_sync_signin_delegate_desktop.cc",
+      "fake_sync_signin_delegate_desktop.h",
+      "live_sync_signin_delegate_desktop.cc",
+      "live_sync_signin_delegate_desktop.h",
+      "migration_waiter.cc",
+      "migration_waiter.h",
+      "migration_watcher.cc",
+      "migration_watcher.h",
+      "search_engines_helper.cc",
+      "search_engines_helper.h",
+      "sessions_helper.cc",
+      "sessions_helper.h",
+      "sync_app_helper.cc",
+      "sync_app_helper.h",
+      "sync_integration_test_util.cc",
+      "sync_integration_test_util.h",
+      "themes_helper.cc",
+      "themes_helper.h",
+      "user_events_helper.cc",
+      "user_events_helper.h",
+      "webauthn_credentials_helper.cc",
+      "webauthn_credentials_helper.h",
+    ]
+
+    deps += [
+      "//chrome/browser/apps/app_service",
+      "//chrome/browser/themes",
+      "//chrome/browser/ui/webui/signin:login",
+      "//chrome/browser/ui/webui/signin:test_support_ui",
+      "//chrome/browser/web_applications:web_applications_test_support",
+      "//chrome/browser/webauthn",
+      "//components/send_tab_to_self",
+      "//components/trusted_vault",
+      "//components/webapps/browser",
+      "//components/webauthn/core/browser",
+      "//components/webauthn/core/browser:passkey_model",
+    ]
+
+    if (!is_mac) {
+      sources += [
+        "dictionary_helper.cc",
+        "dictionary_helper.h",
+        "dictionary_load_observer.cc",
+        "dictionary_load_observer.h",
+      ]
+    }
+  }
+
+  if (is_chromeos) {
+    sources += [
+      "printers_helper.cc",
+      "printers_helper.h",
+      "sync_app_list_helper.cc",
+      "sync_app_list_helper.h",
+      "sync_arc_package_helper.cc",
+      "sync_arc_package_helper.h",
+      "workspace_desk_helper.cc",
+      "workspace_desk_helper.h",
+    ]
+
+    public_deps += [ "//chrome/browser/ash/app_list" ]
+
+    deps += [
+      "//ash/app_list:test_support",
+      "//chrome/browser/ash/app_list/arc",
+      "//chrome/browser/ash/app_list/test:test_support",
+      "//chrome/browser/ash/arc",
+      "//chrome/browser/ash/arc:arc_util",
+      "//chrome/browser/ash/arc/session",
+      "//chrome/browser/ash/net",
+      "//chrome/browser/ash/printing",
+      "//chrome/browser/ash/system_web_apps/test_support",
+      "//chromeos/ash/components/browser_context_helper",
+      "//chromeos/ash/components/network/portal_detector",
+      "//chromeos/ash/experiences/arc:arc_test_support",
+      "//chromeos/ash/experiences/arc/mojom",
+      "//chromeos/printing",
+      "//components/desks_storage",
+      "//components/user_manager:test_support",
+    ]
+  }
+
+  if (enable_extensions_core) {
+    sources += [
+      "extensions_helper.cc",
+      "extensions_helper.h",
+      "sync_extension_helper.cc",
+      "sync_extension_helper.h",
+    ]
+
+    deps += [ "//chrome/browser/extensions" ]
+  }
+}
diff --git a/chrome/browser/sync/test/integration/password_manager_sync_test.cc b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
index e97212a3..dad4524 100644
--- a/chrome/browser/sync/test/integration/password_manager_sync_test.cc
+++ b/chrome/browser/sync/test/integration/password_manager_sync_test.cc
@@ -805,32 +805,6 @@
   bubble_observer.WaitForAutomaticUpdatePrompt();
 }
 
-IN_PROC_BROWSER_TEST_F(PasswordManagerSyncTest,
-                       SignOutWithUnsyncedPasswordsOpensBubble) {
-  ASSERT_TRUE(SetupClients());
-  content::WebContents* web_contents = GetNewTab(GetBrowser(0));
-
-  SetupSyncTransportWithPasswordAccountStorage();
-
-  // Force credentials saved to the account to be unsynced.
-  GetFakeServer()->SetHttpError(net::HTTP_BAD_REQUEST);
-
-  NavigateToFile(web_contents, kExampleHostname,
-                 "/password/password_form.html");
-  FillAndSubmitPasswordForm(web_contents, "accountuser", "accountpass");
-
-  // Save the password in the account store.
-  BubbleObserver bubble_observer(web_contents);
-  bubble_observer.AcceptSavePrompt();
-  std::vector<std::unique_ptr<password_manager::PasswordForm>>
-      account_credentials = GetAllLoginsFromAccountPasswordStore();
-  ASSERT_THAT(account_credentials,
-              ElementsAre(MatchesLogin("accountuser", "accountpass")));
-
-  SignOut();
-  bubble_observer.WaitForSaveUnsyncedCredentialsPrompt();
-}
-
 #if BUILDFLAG(ENABLE_DICE_SUPPORT)
 
 // TODO(b/327118794): Delete this test once implicit signin no longer exists.
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 7ef6949..fa04e03 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -1115,7 +1115,7 @@
 
 #if BUILDFLAG(IS_CHROMEOS)
   // OS sync types run in transport mode.
-  allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE,
+  allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE, syncer::WEB_APPS,
                         syncer::OS_PREFERENCES,
                         syncer::OS_PRIORITY_PREFERENCES});
 #endif  // BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 9a7231e41..26ee98a 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4035,8 +4035,6 @@
       "views/passwords/password_cross_domain_confirmation_popup_view_views.h",
       "views/passwords/password_generation_popup_view_views.cc",
       "views/passwords/password_generation_popup_view_views.h",
-      "views/passwords/password_save_unsynced_credentials_locally_view.cc",
-      "views/passwords/password_save_unsynced_credentials_locally_view.h",
       "views/passwords/password_save_update_view.cc",
       "views/passwords/password_save_update_view.h",
       "views/passwords/post_save_compromised_bubble_view.cc",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
index 67508a6..22b0892d 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -92,7 +92,7 @@
 
     protected ThemeColorProvider mThemeColorProvider;
     protected IncognitoStateProvider mIncognitoStateProvider;
-    private MenuButtonCoordinator mMenuButtonCoordinator;
+    protected MenuButtonCoordinator mMenuButtonCoordinator;
     private @Nullable AppMenuButtonHelper mAppMenuButtonHelper;
 
     private ToggleTabStackButtonCoordinator mTabSwitcherButtonCoordinator;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
index b20fe60..19632bc 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTablet.java
@@ -403,6 +403,7 @@
         mToolbarWidthConsumers[ToolbarComponentId.ADAPTIVE_BUTTON] =
                 mOptionalButtonToolbarWidthConsumer;
         mToolbarWidthConsumers[ToolbarComponentId.TAB_SWITCHER] = tabSwitcherButtonCoordinator;
+        mToolbarWidthConsumers[ToolbarComponentId.MENU] = menuButtonCoordinator;
     }
 
     @Override
@@ -450,11 +451,6 @@
     @VisibleForTesting
     int getWidthForStaticComponents() {
         int width = 0;
-        int buttonWidth =
-                getContext().getResources().getDimensionPixelSize(R.dimen.toolbar_button_width);
-        if (getMenuButtonCoordinator().isVisible()) {
-            width += buttonWidth;
-        }
         // Account for the minimum width of the location bar.
         width +=
                 (int)
@@ -757,4 +753,10 @@
     void setTabStackButtonCoordinatorForTesting(ToggleTabStackButtonCoordinator coordinator) {
         mToolbarWidthConsumers[ToolbarComponentId.TAB_SWITCHER] = coordinator;
     }
+
+    @Override
+    void setMenuButtonCoordinatorForTesting(MenuButtonCoordinator coordinator) {
+        mMenuButtonCoordinator = coordinator;
+        mToolbarWidthConsumers[ToolbarComponentId.MENU] = coordinator;
+    }
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java
index 4d70ec5..24b9635 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarTabletUnitTest.java
@@ -25,6 +25,7 @@
 import static org.chromium.chrome.browser.toolbar.top.ToolbarUtils.ToolbarComponentId.BACK;
 import static org.chromium.chrome.browser.toolbar.top.ToolbarUtils.ToolbarComponentId.FORWARD;
 import static org.chromium.chrome.browser.toolbar.top.ToolbarUtils.ToolbarComponentId.HOME;
+import static org.chromium.chrome.browser.toolbar.top.ToolbarUtils.ToolbarComponentId.MENU;
 import static org.chromium.chrome.browser.toolbar.top.ToolbarUtils.ToolbarComponentId.RELOAD;
 import static org.chromium.chrome.browser.toolbar.top.ToolbarUtils.ToolbarComponentId.TAB_SWITCHER;
 
@@ -214,6 +215,7 @@
         doReturn(buttonWidth).when(mReloadButtonCoordinator).updateVisibility(anyInt());
         doReturn(buttonWidth).when(mBackButtonCoordinator).updateVisibility(anyInt());
         doReturn(buttonWidth).when(mTabSwitcherButtonCoordinator).updateVisibility(anyInt());
+        doReturn(buttonWidth).when(mMenuButtonCoordinator).updateVisibility(anyInt());
 
         mForwardButtonCoordinator =
                 new ForwardButtonCoordinator(
@@ -842,40 +844,46 @@
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(2 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(3 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK, RELOAD, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(4 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-
-        assertToolbarComponentsReceivedWidth(Set.of(BACK, FORWARD, RELOAD, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK, RELOAD, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(5 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(HOME, BACK, FORWARD, RELOAD, TAB_SWITCHER));
+
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK, FORWARD, RELOAD, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(6 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
         assertToolbarComponentsReceivedWidth(
-                Set.of(HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
+                Set.of(MENU, HOME, BACK, FORWARD, RELOAD, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(7 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
         assertToolbarComponentsReceivedWidth(
-                Set.of(HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
+                Set.of(MENU, HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
+
+        mToolbarTablet.onMeasure(
+                MeasureSpec.makeMeasureSpec(8 * buttonWidth + widthForStaticComponents, EXACTLY),
+                UNSPECIFIED);
+        assertToolbarComponentsReceivedWidth(
+                Set.of(MENU, HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
     }
 
     @SuppressLint("WrongCall")
@@ -890,41 +898,47 @@
                         .getDimensionPixelSize(R.dimen.toolbar_button_width);
 
         mToolbarTablet.onMeasure(
+                MeasureSpec.makeMeasureSpec(8 * buttonWidth + widthForStaticComponents, EXACTLY),
+                UNSPECIFIED);
+        assertToolbarComponentsReceivedWidth(
+                Set.of(MENU, HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
+
+        mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(7 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
         assertToolbarComponentsReceivedWidth(
-                Set.of(HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
+                Set.of(MENU, HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(6 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
         assertToolbarComponentsReceivedWidth(
-                Set.of(HOME, BACK, FORWARD, RELOAD, ADAPTIVE_BUTTON, TAB_SWITCHER));
+                Set.of(MENU, HOME, BACK, FORWARD, RELOAD, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(5 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(HOME, BACK, FORWARD, RELOAD, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK, FORWARD, RELOAD, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(4 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK, FORWARD, RELOAD, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK, RELOAD, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(3 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK, RELOAD, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK, TAB_SWITCHER));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(2 * buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK, TAB_SWITCHER));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU, BACK));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(buttonWidth + widthForStaticComponents, EXACTLY),
                 UNSPECIFIED);
-        assertToolbarComponentsReceivedWidth(Set.of(BACK));
+        assertToolbarComponentsReceivedWidth(Set.of(MENU));
 
         mToolbarTablet.onMeasure(
                 MeasureSpec.makeMeasureSpec(widthForStaticComponents, EXACTLY), UNSPECIFIED);
@@ -964,11 +978,18 @@
             verify(mTabSwitcherButtonCoordinator, never()).updateVisibility(geq(buttonWidth));
         }
 
+        if (visibleComponents.contains(MENU)) {
+            verify(mMenuButtonCoordinator).updateVisibility(geq(buttonWidth));
+        } else {
+            verify(mMenuButtonCoordinator, never()).updateVisibility(geq(buttonWidth));
+        }
+
         Mockito.clearInvocations(
                 mHomeButtonCoordinator,
                 mBackButtonCoordinator,
                 mReloadButtonCoordinator,
-                mTabSwitcherButtonCoordinator);
+                mTabSwitcherButtonCoordinator,
+                mMenuButtonCoordinator);
 
         // Replace with a mock when the ForwardButtonCoordinator has its own unit tests.
         assertEquals(
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarUtils.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarUtils.java
index 3b67559..065e2d5 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarUtils.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarUtils.java
@@ -69,6 +69,7 @@
 
     public static final @ToolbarComponentId int[] RANKED_TOOLBAR_COMPONENTS =
             new int[] {
+                ToolbarComponentId.MENU,
                 ToolbarComponentId.BACK,
                 ToolbarComponentId.TAB_SWITCHER,
                 ToolbarComponentId.ADAPTIVE_BUTTON,
@@ -84,6 +85,7 @@
         ToolbarComponentId.RELOAD,
         ToolbarComponentId.ADAPTIVE_BUTTON,
         ToolbarComponentId.TAB_SWITCHER,
+        ToolbarComponentId.MENU,
         ToolbarComponentId.COUNT
     })
     @Retention(RetentionPolicy.SOURCE)
@@ -94,7 +96,8 @@
         int RELOAD = 3;
         int ADAPTIVE_BUTTON = 4;
         int TAB_SWITCHER = 5;
-        int COUNT = 6;
+        int MENU = 6;
+        int COUNT = 7;
     }
 
     /**
diff --git a/chrome/browser/ui/passwords/bubble_controllers/BUILD.gn b/chrome/browser/ui/passwords/bubble_controllers/BUILD.gn
index 33236f0..af3a7e5d 100644
--- a/chrome/browser/ui/passwords/bubble_controllers/BUILD.gn
+++ b/chrome/browser/ui/passwords/bubble_controllers/BUILD.gn
@@ -13,7 +13,6 @@
     "move_to_account_store_bubble_controller.h",
     "password_bubble_controller_base.h",
     "post_save_compromised_bubble_controller.h",
-    "save_unsynced_credentials_locally_bubble_controller.h",
     "save_update_bubble_controller.h",
     "shared_passwords_notifications_bubble_controller.h",
   ]
@@ -53,7 +52,6 @@
       "move_to_account_store_bubble_controller.cc",
       "password_bubble_controller_base.cc",
       "post_save_compromised_bubble_controller.cc",
-      "save_unsynced_credentials_locally_bubble_controller.cc",
       "save_update_bubble_controller.cc",
       "shared_passwords_notifications_bubble_controller.cc",
     ]
@@ -117,7 +115,6 @@
       "manage_passwords_bubble_controller_unittest.cc",
       "move_to_account_store_bubble_controller_unittest.cc",
       "post_save_compromised_bubble_controller_unittest.cc",
-      "save_unsynced_credentials_locally_bubble_controller_unittest.cc",
       "save_update_bubble_controller_unittest.cc",
       "shared_passwords_notifications_bubble_controller_unittest.cc",
     ]
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.cc b/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.cc
deleted file mode 100644
index 9f3c398b..0000000
--- a/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2020 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/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h"
-
-#include <utility>
-
-#include "chrome/browser/ui/passwords/passwords_model_delegate.h"
-#include "chrome/grit/generated_resources.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "components/password_manager/core/browser/password_form_metrics_recorder.h"
-#include "ui/base/l10n/l10n_util.h"
-
-namespace metrics_util = password_manager::metrics_util;
-
-SaveUnsyncedCredentialsLocallyBubbleController::
-    SaveUnsyncedCredentialsLocallyBubbleController(
-        base::WeakPtr<PasswordsModelDelegate> delegate)
-    : PasswordBubbleControllerBase(
-          std::move(delegate),
-          /*display_disposition=*/metrics_util::
-              AUTOMATIC_SAVE_UNSYNCED_CREDENTIALS_LOCALLY),
-      dismissal_reason_(metrics_util::NO_DIRECT_INTERACTION),
-      unsynced_credentials_(delegate_->GetUnsyncedCredentials()) {}
-
-SaveUnsyncedCredentialsLocallyBubbleController::
-    ~SaveUnsyncedCredentialsLocallyBubbleController() {
-  OnBubbleClosing();
-}
-
-void SaveUnsyncedCredentialsLocallyBubbleController::OnSaveClicked(
-    const std::vector<bool>& was_credential_selected) {
-  DCHECK(was_credential_selected.size() == unsynced_credentials_.size());
-  std::vector<password_manager::PasswordForm> credentials_to_save;
-  for (size_t i = 0; i < unsynced_credentials_.size(); i++) {
-    if (was_credential_selected[i]) {
-      credentials_to_save.push_back(unsynced_credentials_[i]);
-    }
-  }
-  delegate_->SaveUnsyncedCredentialsInProfileStore(credentials_to_save);
-}
-
-void SaveUnsyncedCredentialsLocallyBubbleController::OnCancelClicked() {
-  delegate_->DiscardUnsyncedCredentials();
-}
-
-void SaveUnsyncedCredentialsLocallyBubbleController::ReportInteractions() {
-  metrics_util::LogGeneralUIDismissalReason(dismissal_reason_);
-  // Record UKM statistics on dismissal reason.
-  if (metrics_recorder_) {
-    metrics_recorder_->RecordUIDismissalReason(dismissal_reason_);
-  }
-}
-
-std::u16string SaveUnsyncedCredentialsLocallyBubbleController::GetTitle()
-    const {
-  return l10n_util::GetStringUTF16(
-      IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_TITLE_GPM);
-}
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h b/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h
deleted file mode 100644
index c41ea07..0000000
--- a/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2020 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_UI_PASSWORDS_BUBBLE_CONTROLLERS_SAVE_UNSYNCED_CREDENTIALS_LOCALLY_BUBBLE_CONTROLLER_H_
-#define CHROME_BROWSER_UI_PASSWORDS_BUBBLE_CONTROLLERS_SAVE_UNSYNCED_CREDENTIALS_LOCALLY_BUBBLE_CONTROLLER_H_
-
-#include <vector>
-
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/ui/passwords/bubble_controllers/password_bubble_controller_base.h"
-
-class PasswordsModelDelegate;
-
-namespace password_manager {
-struct PasswordForm;
-}  // namespace password_manager
-
-// This controller provides data and actions for the
-// PasswordSaveUnsyncedCredentialsLocallyView.
-class SaveUnsyncedCredentialsLocallyBubbleController
-    : public PasswordBubbleControllerBase {
- public:
-  explicit SaveUnsyncedCredentialsLocallyBubbleController(
-      base::WeakPtr<PasswordsModelDelegate> delegate);
-  ~SaveUnsyncedCredentialsLocallyBubbleController() override;
-
-  // Called by the view code when the save button is clicked by the user. Saves
-  // the credentials whose corresponding position in |was_credential_selected|
-  // holds true.
-  void OnSaveClicked(const std::vector<bool>& was_credential_selected);
-
-  // Called by the view code when the cancel button is clicked by the user.
-  // Drops the unsynced credentials.
-  void OnCancelClicked();
-
-  const std::vector<password_manager::PasswordForm>& unsynced_credentials()
-      const {
-    return unsynced_credentials_;
-  }
-
- private:
-  // PasswordBubbleControllerBase methods:
-  std::u16string GetTitle() const override;
-  void ReportInteractions() override;
-
-  password_manager::metrics_util::UIDismissalReason dismissal_reason_;
-  std::vector<password_manager::PasswordForm> unsynced_credentials_;
-};
-
-#endif  // CHROME_BROWSER_UI_PASSWORDS_BUBBLE_CONTROLLERS_SAVE_UNSYNCED_CREDENTIALS_LOCALLY_BUBBLE_CONTROLLER_H_
diff --git a/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller_unittest.cc b/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller_unittest.cc
deleted file mode 100644
index 44f6aca..0000000
--- a/chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2020 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/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h"
-
-#include <vector>
-
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/passwords/passwords_model_delegate_mock.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::ASCIIToUTF16;
-using testing::NiceMock;
-using testing::ReturnRef;
-
-class SaveUnsyncedCredentialsLocallyBubbleControllerTest
-    : public ::testing::Test {
- public:
-  SaveUnsyncedCredentialsLocallyBubbleControllerTest() {
-    unsynced_credentials_.resize(2);
-    unsynced_credentials_[0].username_value = u"user1";
-    unsynced_credentials_[0].password_value = u"password1";
-    unsynced_credentials_[1].username_value = u"user2";
-    unsynced_credentials_[1].password_value = u"password2";
-  }
-  ~SaveUnsyncedCredentialsLocallyBubbleControllerTest() override = default;
-
- protected:
-  NiceMock<PasswordsModelDelegateMock> model_delegate_mock_;
-  std::vector<password_manager::PasswordForm> unsynced_credentials_;
-};
-
-TEST_F(SaveUnsyncedCredentialsLocallyBubbleControllerTest,
-       ShouldGetCredentialsFromDelegate) {
-  EXPECT_CALL(model_delegate_mock_, GetUnsyncedCredentials())
-      .WillOnce(ReturnRef(unsynced_credentials_));
-  SaveUnsyncedCredentialsLocallyBubbleController controller(
-      model_delegate_mock_.AsWeakPtr());
-  EXPECT_EQ(controller.unsynced_credentials(), unsynced_credentials_);
-}
-
-TEST_F(SaveUnsyncedCredentialsLocallyBubbleControllerTest,
-       ShouldSaveSelectedCredentialsInProfileStoreOnSaveButtonClicked) {
-  EXPECT_CALL(model_delegate_mock_, GetUnsyncedCredentials())
-      .WillOnce(ReturnRef(unsynced_credentials_));
-  SaveUnsyncedCredentialsLocallyBubbleController controller(
-      model_delegate_mock_.AsWeakPtr());
-  EXPECT_CALL(model_delegate_mock_,
-              SaveUnsyncedCredentialsInProfileStore(
-                  std::vector<password_manager::PasswordForm>{
-                      unsynced_credentials_[1]}));
-  controller.OnSaveClicked({false, true});
-}
-
-TEST_F(SaveUnsyncedCredentialsLocallyBubbleControllerTest,
-       ShouldDiscardCredentialsInProfileStoreOnCancelButtonClicked) {
-  EXPECT_CALL(model_delegate_mock_, GetUnsyncedCredentials())
-      .WillOnce(ReturnRef(unsynced_credentials_));
-  SaveUnsyncedCredentialsLocallyBubbleController controller(
-      model_delegate_mock_.AsWeakPtr());
-  EXPECT_CALL(model_delegate_mock_, DiscardUnsyncedCredentials);
-  controller.OnCancelClicked();
-}
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.cc b/chrome/browser/ui/passwords/manage_passwords_state.cc
index cf9c692..08c0a34 100644
--- a/chrome/browser/ui/passwords/manage_passwords_state.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_state.cc
@@ -316,12 +316,6 @@
   }
 }
 
-void ManagePasswordsState::ProcessUnsyncedCredentialsWillBeDeleted(
-    std::vector<password_manager::PasswordForm> unsynced_credentials) {
-  unsynced_credentials_ = std::move(unsynced_credentials);
-  SetState(password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE);
-}
-
 void ManagePasswordsState::ChooseCredential(const PasswordForm* form) {
   DCHECK_EQ(password_manager::ui::CREDENTIAL_REQUEST_STATE, state());
   DCHECK(!credentials_callback_.is_null());
@@ -348,7 +342,6 @@
   clear_selected_password();
   local_credentials_forms_.clear();
   credentials_callback_.Reset();
-  unsynced_credentials_.clear();
   single_credential_mode_credential_.reset();
   gpm_pin_created_during_recent_passkey_creation_ = false;
   passkey_rp_id_.clear();
diff --git a/chrome/browser/ui/passwords/manage_passwords_state.h b/chrome/browser/ui/passwords/manage_passwords_state.h
index c6316b7..147dd1c2 100644
--- a/chrome/browser/ui/passwords/manage_passwords_state.h
+++ b/chrome/browser/ui/passwords/manage_passwords_state.h
@@ -123,9 +123,6 @@
   void ProcessLoginsChanged(
       const password_manager::PasswordStoreChangeList& changes);
 
-  void ProcessUnsyncedCredentialsWillBeDeleted(
-      std::vector<password_manager::PasswordForm> unsynced_credentials);
-
   // Called when the user chooses a credential. |form| is passed to the
   // credentials callback. Method should be called in the
   // CREDENTIAL_REQUEST_STATE state.
@@ -140,10 +137,6 @@
                                  const std::u16string& new_password);
 
   password_manager::ui::State state() const { return state_; }
-  const std::vector<password_manager::PasswordForm>& unsynced_credentials()
-      const {
-    return unsynced_credentials_;
-  }
   const url::Origin& origin() const { return origin_; }
   password_manager::PasswordFormManagerForUI* form_manager() const {
     return form_manager_.get();
@@ -221,9 +214,6 @@
   std::vector<std::unique_ptr<password_manager::PasswordForm>>
       local_credentials_forms_;
 
-  // Contains any non synced credentials.
-  std::vector<password_manager::PasswordForm> unsynced_credentials_;
-
   // A callback to be invoked when user selects a credential.
   CredentialsCallback credentials_callback_;
 
diff --git a/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc
index 29d4f1d..0fd82d8e 100644
--- a/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_state_unittest.cc
@@ -628,17 +628,6 @@
   EXPECT_EQ(url::Origin::Create(saved_match().url), passwords_data().origin());
 }
 
-TEST_F(ManagePasswordsStateTest, ProcessUnsyncedCredentialsWillBeDeleted) {
-  std::vector<PasswordForm> unsynced_credentials(1);
-  unsynced_credentials[0].username_value = u"user";
-  unsynced_credentials[0].password_value = u"password";
-  passwords_data().ProcessUnsyncedCredentialsWillBeDeleted(
-      unsynced_credentials);
-  EXPECT_EQ(passwords_data().state(),
-            password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE);
-  EXPECT_EQ(passwords_data().unsynced_credentials(), unsynced_credentials);
-}
-
 TEST_F(ManagePasswordsStateTest, OnMovablePasswordSubmitted) {
   std::vector<PasswordForm> password_forms = {saved_match()};
   std::vector<PasswordForm> federated_matches = {local_federated_form()};
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
index e1efc57ee..4098e3c 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -687,16 +687,6 @@
   UpdateBubbleAndIconVisibility();
 }
 
-void ManagePasswordsUIController::NotifyUnsyncedCredentialsWillBeDeleted(
-    std::vector<password_manager::PasswordForm> unsynced_credentials) {
-  passwords_data_.ProcessUnsyncedCredentialsWillBeDeleted(
-      std::move(unsynced_credentials));
-  DCHECK(GetState() ==
-         password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE);
-  bubble_status_ = BubbleStatus::SHOULD_POP_UP;
-  UpdateBubbleAndIconVisibility();
-}
-
 void ManagePasswordsUIController::OnLoginsChanged(
     password_manager::PasswordStoreInterface* /*store*/,
     const password_manager::PasswordStoreChangeList& changes) {
@@ -823,11 +813,6 @@
              : password_manager::metrics_util::CredentialSourceType::kUnknown;
 }
 
-const std::vector<password_manager::PasswordForm>&
-ManagePasswordsUIController::GetUnsyncedCredentials() const {
-  return passwords_data_.unsynced_credentials();
-}
-
 const std::vector<std::unique_ptr<password_manager::PasswordForm>>&
 ManagePasswordsUIController::GetCurrentForms() const {
   return passwords_data_.GetCurrentForms();
@@ -1048,30 +1033,6 @@
   }
 }
 
-void ManagePasswordsUIController::SaveUnsyncedCredentialsInProfileStore(
-    const std::vector<password_manager::PasswordForm>& selected_credentials) {
-  auto profile_store_form_saver =
-      std::make_unique<password_manager::FormSaverImpl>(
-          passwords_data_.client()->GetProfilePasswordStore());
-  for (const password_manager::PasswordForm& form : selected_credentials) {
-    // Only newly-saved or newly-updated credentials can be unsynced. Since
-    // conflicts are solved in that process, any entry in the profile store
-    // similar to |form| actually contains the same essential information. This
-    // means Save() can be safely called here, no password loss happens.
-    profile_store_form_saver->Save(form, /*matches=*/{},
-                                   /*old_password=*/std::u16string());
-  }
-  ClearPopUpFlagForBubble();
-  passwords_data_.OnInactive();
-  UpdateBubbleAndIconVisibility();
-}
-
-void ManagePasswordsUIController::DiscardUnsyncedCredentials() {
-  ClearPopUpFlagForBubble();
-  passwords_data_.OnInactive();
-  UpdateBubbleAndIconVisibility();
-}
-
 void ManagePasswordsUIController::MovePasswordToAccountStore() {
   CHECK(GetState() ==
             password_manager::ui::MOVE_CREDENTIAL_AFTER_LOG_IN_STATE ||
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.h b/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
index 1a742dc..d99e2bd 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.h
@@ -133,9 +133,6 @@
   void OnPasskeyNotAccepted(std::string passkey_rp_id) override;
   void OnPasskeyUpgrade(std::string passkey_rp_id) override;
 
-  virtual void NotifyUnsyncedCredentialsWillBeDeleted(
-      std::vector<password_manager::PasswordForm> unsynced_credentials);
-
   // PasswordStoreInterface::Observer:
   void OnLoginsChanged(
       password_manager::PasswordStoreInterface* store,
@@ -169,8 +166,6 @@
       override;
   password_manager::ui::State GetState() const override;
   const password_manager::PasswordForm& GetPendingPassword() const override;
-  const std::vector<password_manager::PasswordForm>& GetUnsyncedCredentials()
-      const override;
   password_manager::metrics_util::CredentialSourceType GetCredentialSource()
       const override;
   const std::vector<std::unique_ptr<password_manager::PasswordForm>>&
@@ -194,10 +189,6 @@
   void OnPasswordsRevealed() override;
   void SavePassword(const std::u16string& username,
                     const std::u16string& password) override;
-  void SaveUnsyncedCredentialsInProfileStore(
-      const std::vector<password_manager::PasswordForm>& selected_credentials)
-      override;
-  void DiscardUnsyncedCredentials() override;
   void MovePasswordToAccountStore() override;
   void MovePendingPasswordToAccountStoreUsingHelper(
       const password_manager::PasswordForm& form,
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
index 3132d6a..03dca2a 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller_unittest.cc
@@ -235,18 +235,6 @@
   }
 }
 
-password_manager::PasswordForm BuildFormFromLoginAndURL(
-    const std::string& username,
-    const std::string& password,
-    const std::string& url) {
-  password_manager::PasswordForm form;
-  form.username_value = base::ASCIIToUTF16(username);
-  form.password_value = base::ASCIIToUTF16(password);
-  form.url = GURL(url);
-  form.signon_realm = form.url.DeprecatedGetOriginAsURL().spec();
-  return form;
-}
-
 password_manager::PasswordForm CreateInsecureCredential(PasswordForm form) {
   form.password_issues.insert(
       {InsecureType::kLeaked,
@@ -1711,74 +1699,6 @@
       password_manager::ui::PENDING_PASSWORD_UPDATE_STATE);
 }
 
-TEST_F(ManagePasswordsUIControllerTest,
-       NotifyUnsyncedCredentialsWillBeDeleted) {
-  EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
-  std::vector<password_manager::PasswordForm> credentials(2);
-  credentials[0] =
-      BuildFormFromLoginAndURL("user1", "password1", "http://a.com");
-  credentials[1] =
-      BuildFormFromLoginAndURL("user2", "password2", "http://b.com");
-
-  controller()->NotifyUnsyncedCredentialsWillBeDeleted(credentials);
-
-  EXPECT_EQ(controller()->GetUnsyncedCredentials(), credentials);
-  EXPECT_TRUE(controller()->opened_automatic_bubble());
-  ExpectIconAndControllerStateIs(
-      password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE);
-}
-
-TEST_F(ManagePasswordsUIControllerTest, SaveUnsyncedCredentialsInProfileStore) {
-  std::vector<password_manager::PasswordForm> credentials = {
-      BuildFormFromLoginAndURL("user1", "password1", "http://a.com"),
-      BuildFormFromLoginAndURL("user2", "password2", "http://b.com")};
-
-  // Set expectations on the store.
-  MockPasswordStoreInterface* profile_store =
-      client().GetProfilePasswordStore();
-  EXPECT_CALL(*profile_store,
-              AddLogin(MatchesLoginAndURL(credentials[0].username_value,
-                                          credentials[0].password_value,
-                                          credentials[0].url),
-                       _));
-  EXPECT_CALL(*profile_store,
-              AddLogin(MatchesLoginAndURL(credentials[1].username_value,
-                                          credentials[1].password_value,
-                                          credentials[1].url),
-                       _));
-
-  // Save.
-  EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
-  controller()->SaveUnsyncedCredentialsInProfileStore(credentials);
-
-  // Check the credentials are gone and the bubble is closed.
-  EXPECT_TRUE(controller()->GetUnsyncedCredentials().empty());
-  EXPECT_FALSE(controller()->opened_automatic_bubble());
-  ExpectIconAndControllerStateIs(password_manager::ui::INACTIVE_STATE);
-}
-
-TEST_F(ManagePasswordsUIControllerTest, DiscardUnsyncedCredentials) {
-  // Setup state with unsynced credentials.
-  EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
-  std::vector<password_manager::PasswordForm> credentials = {
-      BuildFormFromLoginAndURL("user", "password", "http://a.com")};
-  controller()->NotifyUnsyncedCredentialsWillBeDeleted(std::move(credentials));
-
-  // No save should happen on the profile store.
-  MockPasswordStoreInterface* profile_store =
-      client().GetProfilePasswordStore();
-  EXPECT_CALL(*profile_store, AddLogin).Times(0);
-
-  // Discard.
-  EXPECT_CALL(*controller(), OnUpdateBubbleAndIconVisibility());
-  controller()->DiscardUnsyncedCredentials();
-
-  // Check the credentials are gone and the bubble is closed.
-  EXPECT_TRUE(controller()->GetUnsyncedCredentials().empty());
-  EXPECT_FALSE(controller()->opened_automatic_bubble());
-  ExpectIconAndControllerStateIs(password_manager::ui::INACTIVE_STATE);
-}
-
 TEST_F(ManagePasswordsUIControllerTest, OpenBubbleForMovableForm) {
   base::HistogramTester histogram_tester;
 
diff --git a/chrome/browser/ui/passwords/passwords_model_delegate.h b/chrome/browser/ui/passwords/passwords_model_delegate.h
index 8aa2c060..95c1937 100644
--- a/chrome/browser/ui/passwords/passwords_model_delegate.h
+++ b/chrome/browser/ui/passwords/passwords_model_delegate.h
@@ -62,10 +62,6 @@
   // SAVE_CONFIRMATION_STATE, the returned credential in AUTO_SIGNIN_STATE.
   virtual const password_manager::PasswordForm& GetPendingPassword() const = 0;
 
-  // Returns unsynced credentials being deleted upon signout.
-  virtual const std::vector<password_manager::PasswordForm>&
-  GetUnsyncedCredentials() const = 0;
-
   // Returns the source of the credential to be saved.
   virtual password_manager::metrics_util::CredentialSourceType
   GetCredentialSource() const = 0;
@@ -136,17 +132,6 @@
   virtual void SavePassword(const std::u16string& username,
                             const std::u16string& password) = 0;
 
-  // Called when the user chooses to save locally some of the unsynced
-  // credentials that were deleted from the account store on signout.
-  virtual void SaveUnsyncedCredentialsInProfileStore(
-      const std::vector<password_manager::PasswordForm>&
-          selected_credentials) = 0;
-
-  // Called when the user chooses not to save locally the unsynced credentials
-  // deleted from the account store on signout (the ones returned by
-  // GetUnsyncedCredentials()).
-  virtual void DiscardUnsyncedCredentials() = 0;
-
   // Called from the dialog controller when a user confirms moving the recently
   // used or selected credential to their account store.
   virtual void MovePasswordToAccountStore() = 0;
diff --git a/chrome/browser/ui/passwords/passwords_model_delegate_mock.h b/chrome/browser/ui/passwords/passwords_model_delegate_mock.h
index 92daddf..580ee47 100644
--- a/chrome/browser/ui/passwords/passwords_model_delegate_mock.h
+++ b/chrome/browser/ui/passwords/passwords_model_delegate_mock.h
@@ -39,10 +39,6 @@
               GetPendingPassword,
               (),
               (const override));
-  MOCK_METHOD(const std::vector<password_manager::PasswordForm>&,
-              GetUnsyncedCredentials,
-              (),
-              (const override));
   MOCK_METHOD(password_manager::metrics_util::CredentialSourceType,
               GetCredentialSource,
               (),
@@ -86,11 +82,6 @@
               SavePassword,
               (const std::u16string&, const std::u16string&),
               (override));
-  MOCK_METHOD(void,
-              SaveUnsyncedCredentialsInProfileStore,
-              (const std::vector<password_manager::PasswordForm>&),
-              (override));
-  MOCK_METHOD(void, DiscardUnsyncedCredentials, (), (override));
   MOCK_METHOD(void, MovePasswordToAccountStore, (), (override));
   MOCK_METHOD(void, BlockMovingPasswordToAccountStore, (), (override));
   MOCK_METHOD(void,
diff --git a/chrome/browser/ui/signin/BUILD.gn b/chrome/browser/ui/signin/BUILD.gn
index 9603f038..3bec370d 100644
--- a/chrome/browser/ui/signin/BUILD.gn
+++ b/chrome/browser/ui/signin/BUILD.gn
@@ -189,12 +189,12 @@
       "//base/test:test_support",
       "//chrome/browser",
       "//chrome/browser/sync",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/ui",
       "//chrome/browser/ui:ui_features",
       "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/views/frame:toolbar_button_provider",
       "//chrome/browser/ui/webui/signin:test_support_ui",
-      "//chrome/test:sync_integration_test_support",
       "//chrome/test:test_support_ui",
       "//components/signin/public/base",
       "//components/signin/public/base:signin_switches",
@@ -216,7 +216,6 @@
         "//chrome/browser/ui/toasts/api:toasts",
         "//chrome/browser/ui/webui/signin/signout_confirmation",
         "//chrome/browser/web_applications:web_applications_test_support",
-        "//chrome/test:sync_integration_test_support",
         "//chrome/test:test_support",
         "//components/sync:test_support",
       ]
diff --git a/chrome/browser/ui/views/passwords/manage_passwords_page_action_controller.cc b/chrome/browser/ui/views/passwords/manage_passwords_page_action_controller.cc
index 5ef27d6..50eb552 100644
--- a/chrome/browser/ui/views/passwords/manage_passwords_page_action_controller.cc
+++ b/chrome/browser/ui/views/passwords/manage_passwords_page_action_controller.cc
@@ -48,7 +48,6 @@
     case password_manager::ui::UPDATE_CONFIRMATION_STATE:
     case password_manager::ui::CREDENTIAL_REQUEST_STATE:
     case password_manager::ui::AUTO_SIGNIN_STATE:
-    case password_manager::ui::WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE:
     case password_manager::ui::MANAGE_STATE:
     case password_manager::ui::PASSWORD_UPDATED_SAFE_STATE:
     case password_manager::ui::PASSWORD_UPDATED_MORE_TO_FIX:
diff --git a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
index d699091..d7eacfb 100644
--- a/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
+++ b/chrome/browser/ui/views/passwords/password_bubble_view_base.cc
@@ -25,7 +25,6 @@
 #include "chrome/browser/ui/views/passwords/password_add_username_view.h"
 #include "chrome/browser/ui/views/passwords/password_auto_sign_in_view.h"
 #include "chrome/browser/ui/views/passwords/password_change/successful_password_change_view.h"
-#include "chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.h"
 #include "chrome/browser/ui/views/passwords/password_save_update_view.h"
 #include "chrome/browser/ui/views/passwords/post_save_compromised_bubble_view.h"
 #include "chrome/browser/ui/views/passwords/shared_passwords_notification_view.h"
@@ -131,10 +130,6 @@
                  password_manager::ui::PENDING_PASSWORD_UPDATE_STATE ||
              model_state == password_manager::ui::PENDING_PASSWORD_STATE) {
     view = new PasswordSaveUpdateView(web_contents, anchor_view, reason);
-  } else if (model_state == password_manager::ui::
-                                WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE) {
-    view = new PasswordSaveUnsyncedCredentialsLocallyView(web_contents,
-                                                          anchor_view);
   } else if (model_state ==
                  password_manager::ui::MOVE_CREDENTIAL_AFTER_LOG_IN_STATE ||
              model_state == password_manager::ui::
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
deleted file mode 100644
index 74ed27d..0000000
--- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright 2020 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/ui/views/passwords/password_save_unsynced_credentials_locally_view.h"
-
-#include <numeric>
-#include <string>
-#include <utility>
-
-#include "chrome/browser/ui/passwords/passwords_model_delegate.h"
-#include "chrome/browser/ui/passwords/ui_utils.h"
-#include "chrome/browser/ui/views/chrome_layout_provider.h"
-#include "chrome/browser/ui/views/chrome_typography.h"
-#include "chrome/browser/ui/views/passwords/views_utils.h"
-#include "chrome/grit/generated_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/metadata/metadata_impl_macros.h"
-#include "ui/base/mojom/dialog_button.mojom.h"
-#include "ui/base/ui_base_types.h"
-#include "ui/views/accessibility/view_accessibility.h"
-#include "ui/views/border.h"
-#include "ui/views/controls/label.h"
-#include "ui/views/layout/box_layout.h"
-#include "ui/views/window/dialog_delegate.h"
-
-PasswordSaveUnsyncedCredentialsLocallyView::
-    PasswordSaveUnsyncedCredentialsLocallyView(
-        content::WebContents* web_contents,
-        views::View* anchor_view)
-    : PasswordBubbleViewBase(web_contents,
-                             anchor_view,
-                             /*easily_dismissable=*/false),
-      controller_(PasswordsModelDelegateFromWebContents(web_contents)) {
-  SetButtons(static_cast<int>(ui::mojom::DialogButton::kOk) |
-             static_cast<int>(ui::mojom::DialogButton::kCancel));
-  SetAcceptCallback(
-      base::BindOnce(&PasswordSaveUnsyncedCredentialsLocallyView::OnSaveClicked,
-                     base::Unretained(this)));
-  SetButtonLabel(
-      ui::mojom::DialogButton::kOk,
-      l10n_util::GetStringUTF16(
-          IDS_PASSWORD_MANAGER_SAVE_UNSYNCED_CREDENTIALS_BUTTON_GPM));
-  SetButtonLabel(ui::mojom::DialogButton::kCancel,
-                 l10n_util::GetStringUTF16(
-                     IDS_PASSWORD_MANAGER_DISCARD_UNSYNCED_CREDENTIALS_BUTTON));
-  SetCancelCallback(base::BindOnce(
-      &SaveUnsyncedCredentialsLocallyBubbleController::OnCancelClicked,
-      base::Unretained(&controller_)));
-  SetShowIcon(true);
-  CreateLayout();
-}
-
-PasswordSaveUnsyncedCredentialsLocallyView::
-    ~PasswordSaveUnsyncedCredentialsLocallyView() = default;
-
-PasswordBubbleControllerBase*
-PasswordSaveUnsyncedCredentialsLocallyView::GetController() {
-  return &controller_;
-}
-
-const PasswordBubbleControllerBase*
-PasswordSaveUnsyncedCredentialsLocallyView::GetController() const {
-  return &controller_;
-}
-
-ui::ImageModel PasswordSaveUnsyncedCredentialsLocallyView::GetWindowIcon() {
-  return ui::ImageModel::FromVectorIcon(GooglePasswordManagerVectorIcon(),
-                                        ui::kColorIcon);
-}
-
-void PasswordSaveUnsyncedCredentialsLocallyView::CreateLayout() {
-  SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kVertical));
-
-  auto description = std::make_unique<views::Label>(
-      l10n_util::GetStringUTF16(
-          IDS_PASSWORD_MANAGER_UNSYNCED_CREDENTIALS_BUBBLE_DESCRIPTION_GPM),
-      views::style::CONTEXT_DIALOG_BODY_TEXT, views::style::STYLE_HINT);
-  description->SetMultiLine(true);
-  description->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  description->SetBorder(views::CreateEmptyBorder(
-      gfx::Insets::TLBR(0, 0,
-                        ChromeLayoutProvider::Get()->GetDistanceMetric(
-                            DISTANCE_RELATED_CONTROL_VERTICAL_SMALL),
-                        0)));
-  AddChildView(std::move(description));
-
-  DCHECK(!controller_.unsynced_credentials().empty());
-  for (const password_manager::PasswordForm& form :
-       controller_.unsynced_credentials()) {
-    auto* row_view = AddChildView(std::make_unique<views::View>());
-    auto* checkbox = row_view->AddChildView(std::make_unique<views::Checkbox>(
-        std::u16string(), views::Button::PressedCallback()));
-    checkbox->SetCallback(base::BindRepeating(
-        &PasswordSaveUnsyncedCredentialsLocallyView::ButtonPressed,
-        base::Unretained(this), base::Unretained(checkbox)));
-    checkbox->SetBorder(views::CreateEmptyBorder(
-        gfx::Insets::TLBR(0, 0, 0,
-                          ChromeLayoutProvider::Get()->GetDistanceMetric(
-                              DISTANCE_RELATED_CONTROL_HORIZONTAL_SMALL))));
-    // Usually all passwords should be saved, so they're selected by default.
-    checkbox->SetChecked(true);
-    num_selected_checkboxes_++;
-    auto* username_label = row_view->AddChildView(CreateUsernameLabel(form));
-    checkbox->GetViewAccessibility().SetName(*username_label);
-    auto* password_label = row_view->AddChildView(CreatePasswordLabel(form));
-    auto* row_layout =
-        row_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
-            views::BoxLayout::Orientation::kHorizontal));
-    row_layout->SetFlexForView(username_label, 1);
-    row_layout->SetFlexForView(password_label, 1);
-
-    checkboxes_.push_back(checkbox);
-  }
-}
-
-void PasswordSaveUnsyncedCredentialsLocallyView::ButtonPressed(
-    views::Checkbox* checkbox) {
-  num_selected_checkboxes_ += checkbox->GetChecked() ? 1 : -1;
-  GetOkButton()->SetState(num_selected_checkboxes_
-                              ? views::Button::ButtonState::STATE_NORMAL
-                              : views::Button::ButtonState::STATE_DISABLED);
-}
-
-void PasswordSaveUnsyncedCredentialsLocallyView::OnSaveClicked() {
-  std::vector<bool> was_credential_selected;
-  for (const views::Checkbox* checkbox : checkboxes_) {
-    was_credential_selected.push_back(checkbox->GetChecked());
-  }
-  controller_.OnSaveClicked(was_credential_selected);
-}
-
-BEGIN_METADATA(PasswordSaveUnsyncedCredentialsLocallyView)
-END_METADATA
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.h b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.h
deleted file mode 100644
index b1d300b6..0000000
--- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view.h
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2020 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_UI_VIEWS_PASSWORDS_PASSWORD_SAVE_UNSYNCED_CREDENTIALS_LOCALLY_VIEW_H_
-#define CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_SAVE_UNSYNCED_CREDENTIALS_LOCALLY_VIEW_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/ui/passwords/bubble_controllers/save_unsynced_credentials_locally_bubble_controller.h"
-#include "chrome/browser/ui/views/passwords/password_bubble_view_base.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "content/public/browser/web_contents.h"
-#include "ui/base/metadata/metadata_header_macros.h"
-#include "ui/views/controls/button/checkbox.h"
-#include "ui/views/view.h"
-
-// A dialog that shows up on sign out in case there are passwords not committed
-// to the user account. By clicking the save button, the user can save those
-// passwords locally.
-class PasswordSaveUnsyncedCredentialsLocallyView
-    : public PasswordBubbleViewBase {
-  METADATA_HEADER(PasswordSaveUnsyncedCredentialsLocallyView,
-                  PasswordBubbleViewBase)
-
- public:
-  PasswordSaveUnsyncedCredentialsLocallyView(content::WebContents* web_contents,
-                                             views::View* anchor_view);
-  ~PasswordSaveUnsyncedCredentialsLocallyView() override;
-
- private:
-  // PasswordBubbleViewBase:
-  PasswordBubbleControllerBase* GetController() override;
-  const PasswordBubbleControllerBase* GetController() const override;
-  ui::ImageModel GetWindowIcon() override;
-
-  void CreateLayout();
-
-  void ButtonPressed(views::Checkbox* checkbox);
-
-  void OnSaveClicked();
-
-  SaveUnsyncedCredentialsLocallyBubbleController controller_;
-  int num_selected_checkboxes_ = 0;
-  std::vector<raw_ptr<views::Checkbox, VectorExperimental>> checkboxes_;
-};
-
-#endif  // CHROME_BROWSER_UI_VIEWS_PASSWORDS_PASSWORD_SAVE_UNSYNCED_CREDENTIALS_LOCALLY_VIEW_H_
diff --git a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view_unittest.cc b/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view_unittest.cc
deleted file mode 100644
index 3a2e210..0000000
--- a/chrome/browser/ui/views/passwords/password_save_unsynced_credentials_locally_view_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2020 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/ui/views/passwords/password_save_unsynced_credentials_locally_view.h"
-
-#include <utility>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/ui/passwords/passwords_model_delegate_mock.h"
-#include "chrome/browser/ui/views/passwords/password_bubble_view_test_base.h"
-#include "components/password_manager/core/browser/password_form.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/views/bubble/bubble_dialog_delegate_view.h"
-#include "ui/views/widget/widget.h"
-
-using base::ASCIIToUTF16;
-using testing::ReturnRef;
-
-class PasswordSaveUnsyncedCredentialsLocallyViewTest
-    : public PasswordBubbleViewTestBase {
- public:
-  PasswordSaveUnsyncedCredentialsLocallyViewTest() {
-    ON_CALL(*model_delegate_mock(), GetUnsyncedCredentials())
-        .WillByDefault(ReturnRef(unsynced_credentials_));
-
-    unsynced_credentials_.resize(1);
-    unsynced_credentials_[0].username_value = u"user";
-    unsynced_credentials_[0].password_value = u"password";
-  }
-  ~PasswordSaveUnsyncedCredentialsLocallyViewTest() override = default;
-
-  void CreateViewAndShow();
-
-  void TearDown() override;
-
- protected:
-  raw_ptr<PasswordSaveUnsyncedCredentialsLocallyView> view_ = nullptr;
-  std::vector<password_manager::PasswordForm> unsynced_credentials_;
-};
-
-void PasswordSaveUnsyncedCredentialsLocallyViewTest::CreateViewAndShow() {
-  CreateAnchorViewAndShow();
-
-  view_ = new PasswordSaveUnsyncedCredentialsLocallyView(web_contents(),
-                                                         anchor_view());
-  views::BubbleDialogDelegateView::CreateBubble(view_)->Show();
-}
-
-void PasswordSaveUnsyncedCredentialsLocallyViewTest::TearDown() {
-  std::exchange(view_, nullptr)
-      ->GetWidget()
-      ->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked);
-
-  PasswordBubbleViewTestBase::TearDown();
-}
-
-TEST_F(PasswordSaveUnsyncedCredentialsLocallyViewTest, HasTitleAndTwoButtons) {
-  CreateViewAndShow();
-  EXPECT_TRUE(view_->ShouldShowWindowTitle());
-  EXPECT_TRUE(view_->GetOkButton());
-  EXPECT_TRUE(view_->GetCancelButton());
-}
diff --git a/chrome/browser/ui/webui/ash/edu_coexistence/edu_coexistence_login_handler.cc b/chrome/browser/ui/webui/ash/edu_coexistence/edu_coexistence_login_handler.cc
index 5e8b14fd..7c4bc05 100644
--- a/chrome/browser/ui/webui/ash/edu_coexistence/edu_coexistence_login_handler.cc
+++ b/chrome/browser/ui/webui/ash/edu_coexistence/edu_coexistence_login_handler.cc
@@ -157,17 +157,11 @@
   // Start observing IdentityManager.
   identity_manager->AddObserver(this);
 
-  OAuth2AccessTokenManager::ScopeSet scopes;
-  scopes.insert(GaiaConstants::kKidsSupervisionSetupChildOAuth2Scope);
-  scopes.insert(GaiaConstants::kAccountsReauthOAuth2Scope);
-  scopes.insert(GaiaConstants::kAuditRecordingOAuth2Scope);
-  scopes.insert(GaiaConstants::kClearCutOAuth2Scope);
-  scopes.insert(GaiaConstants::kKidManagementPrivilegedOAuth2Scope);
-
   // Start fetching oauth access token.
   access_token_fetcher_ =
       std::make_unique<signin::PrimaryAccountAccessTokenFetcher>(
-          "EduCoexistenceLoginHandler", identity_manager, scopes,
+          signin::OAuthConsumerId::kEduCoexistenceLoginHandler,
+          identity_manager,
           base::BindOnce(
               &EduCoexistenceLoginHandler::OnOAuthAccessTokensFetched,
               base::Unretained(this)),
diff --git a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
index 2aef280..f90ad537 100644
--- a/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
+++ b/chrome/browser/ui/webui/ntp/ntp_resource_cache.cc
@@ -94,8 +94,10 @@
   SkColor color = cp.GetColor(id);
   // If web contents are being inverted because the system is in high-contrast
   // mode, any system theme colors we use must be inverted too to cancel out.
-  return native_theme->GetPlatformHighContrastColorScheme() ==
-                 ui::NativeTheme::PlatformHighContrastColorScheme::kDark
+  // TODO(pkasting): I'm not sure this conditional is correct anymore.
+  return (native_theme->InForcedColorsMode() &&
+          native_theme->GetPreferredColorScheme() ==
+              ui::NativeTheme::PreferredColorScheme::kDark)
              ? color_utils::InvertColor(color)
              : color;
 }
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
index 7f7f9ef..aa5a236 100644
--- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -340,9 +340,9 @@
 
 class SiteSettingsHandlerBaseTest : public testing::Test {
  public:
-  SiteSettingsHandlerBaseTest() {
-    // Fully initialize |profile_| in the constructor since some children
-    // classes need it right away for SetUp().
+  SiteSettingsHandlerBaseTest() = default;
+
+  void SetUp() override {
     testing_profile_manager_ = std::make_unique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
     EXPECT_TRUE(testing_profile_manager_->SetUp());
@@ -356,9 +356,7 @@
 #if BUILDFLAG(IS_CHROMEOS)
     SetUpUserManager(profile_.get());
 #endif
-  }
 
-  void SetUp() override {
     browsing_topics::BrowsingTopicsServiceFactory::GetInstance()
         ->SetTestingFactoryAndUse(
             profile(),
@@ -380,6 +378,8 @@
 
     safety_hub_test_util::CreateNotificationPermissionsReviewService(profile());
 
+    SetUpIsolatedWebApp();
+
     handler_ = std::make_unique<SiteSettingsHandler>(profile());
     handler()->set_web_ui(web_ui());
     handler()->AllowJavascript();
@@ -1174,6 +1174,9 @@
        /*storage_size=*/0,
        /*cookie_count=*/1}};
 
+ protected:
+  virtual void SetUpIsolatedWebApp() {}
+
  private:
   content::BrowserTaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
@@ -2951,12 +2954,10 @@
 
 class SiteSettingsHandlerIsolatedWebAppTest
     : public SiteSettingsHandlerBaseTest {
- public:
-  void SetUp() override {
+ protected:
+  void SetUpIsolatedWebApp() override {
     web_app::test::AwaitStartWebAppProviderAndSubsystems(profile());
     iwa_url_info_ = InstallIsolatedWebApp("IWA Name");
-
-    SiteSettingsHandlerBaseTest::SetUp();
   }
 
  protected:
@@ -3980,26 +3981,12 @@
 
 class PersistentPermissionsSiteSettingsHandlerTest
     : public SiteSettingsHandlerBaseTest {
-  void SetUp() override {
-    SiteSettingsHandlerBaseTest::SetUp();
-    handler_ = std::make_unique<SiteSettingsHandler>(&profile_);
-    handler_->set_web_ui(web_ui());
-    handler_->AllowJavascript();
-    web_ui()->ClearTrackedCalls();
-  }
-
-  void TearDown() override { handler_->DisallowJavascript(); }
-
  public:
   PersistentPermissionsSiteSettingsHandlerTest() {
     feature_list_.InitAndEnableFeature(
         features::kFileSystemAccessPersistentPermissions);
   }
 
- protected:
-  TestingProfile profile_;
-  std::unique_ptr<SiteSettingsHandler> handler_;
-
  private:
   base::test::ScopedFeatureList feature_list_;
 };
@@ -4009,7 +3996,7 @@
 TEST_F(PersistentPermissionsSiteSettingsHandlerTest,
        HandleGetFileSystemGrants) {
   ChromeFileSystemAccessPermissionContext* context =
-      FileSystemAccessPermissionContextFactory::GetForProfile(&profile_);
+      FileSystemAccessPermissionContextFactory::GetForProfile(profile());
 
   auto kTestOrigin1 = url::Origin::Create(GURL("https://www.a.com"));
   auto kTestOrigin2 = url::Origin::Create(GURL("https://www.b.com"));
@@ -4054,7 +4041,7 @@
   base::Value::List get_file_system_permissions_args;
   get_file_system_permissions_args.Append(kCallbackId);
 
-  handler_->HandleGetFileSystemGrants(get_file_system_permissions_args);
+  handler()->HandleGetFileSystemGrants(get_file_system_permissions_args);
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   const base::Value::List& grants = data.arg3()->GetList();
 
@@ -4109,7 +4096,7 @@
 TEST_F(PersistentPermissionsSiteSettingsHandlerTest,
        HandleRevokeFileSystemGrant) {
   ChromeFileSystemAccessPermissionContext* context =
-      FileSystemAccessPermissionContextFactory::GetForProfile(&profile_);
+      FileSystemAccessPermissionContextFactory::GetForProfile(profile());
 
   auto kTestOrigin1 = url::Origin::Create(GURL("https://www.a.com"));
   auto kTestOrigin2 = url::Origin::Create(GURL("https://www.b.com"));
@@ -4146,8 +4133,8 @@
   base::Value::List get_file_system_grants_permissions_args;
   get_file_system_grants_permissions_args.Append(kCallbackId);
 
-  handler_->HandleRevokeFileSystemGrant(revoke_origin1_grant_permissions_args);
-  handler_->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
+  handler()->HandleRevokeFileSystemGrant(revoke_origin1_grant_permissions_args);
+  handler()->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   const base::Value::List& grants = data.arg3()->GetList();
 
@@ -4168,8 +4155,8 @@
   revoke_origin2_grant_permissions_args.Append("https://www.b.com");
   revoke_origin2_grant_permissions_args.Append("/e/");
 
-  handler_->HandleRevokeFileSystemGrant(revoke_origin2_grant_permissions_args);
-  handler_->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
+  handler()->HandleRevokeFileSystemGrant(revoke_origin2_grant_permissions_args);
+  handler()->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
   const content::TestWebUI::CallData& updated_data =
       *web_ui()->call_data().back();
   const base::Value::List& updated_grants = updated_data.arg3()->GetList();
@@ -4191,7 +4178,7 @@
 TEST_F(PersistentPermissionsSiteSettingsHandlerTest,
        HandleRevokeFileSystemGrants) {
   ChromeFileSystemAccessPermissionContext* context =
-      FileSystemAccessPermissionContextFactory::GetForProfile(&profile_);
+      FileSystemAccessPermissionContextFactory::GetForProfile(profile());
 
   auto kTestOrigin1 = url::Origin::Create(GURL("https://www.a.com"));
   auto kTestOrigin2 = url::Origin::Create(GURL("https://www.b.com"));
@@ -4223,7 +4210,7 @@
   base::Value::List get_file_system_grants_permissions_args;
   get_file_system_grants_permissions_args.Append(kCallbackId);
 
-  handler_->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
+  handler()->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
   const content::TestWebUI::CallData& data = *web_ui()->call_data().back();
   const base::Value::List& grants = data.arg3()->GetList();
 
@@ -4234,9 +4221,9 @@
   base::Value::List revoke_origin1_grants_permissions_args;
   revoke_origin1_grants_permissions_args.Append("https://www.a.com");
 
-  handler_->HandleRevokeFileSystemGrants(
+  handler()->HandleRevokeFileSystemGrants(
       revoke_origin1_grants_permissions_args);
-  handler_->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
+  handler()->HandleGetFileSystemGrants(get_file_system_grants_permissions_args);
   const content::TestWebUI::CallData& updated_data =
       *web_ui()->call_data().back();
   const base::Value::List& updated_grants = updated_data.arg3()->GetList();
diff --git a/chrome/browser/ui/webui/signin/ash/edu_account_login_handler.cc b/chrome/browser/ui/webui/signin/ash/edu_account_login_handler.cc
index d892831..80332df1 100644
--- a/chrome/browser/ui/webui/signin/ash/edu_account_login_handler.cc
+++ b/chrome/browser/ui/webui/signin/ash/edu_account_login_handler.cc
@@ -221,11 +221,9 @@
   Profile* profile = Profile::FromWebUI(web_ui());
   signin::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForProfile(profile);
-  OAuth2AccessTokenManager::ScopeSet scopes;
-  scopes.insert(GaiaConstants::kAccountsReauthOAuth2Scope);
   access_token_fetcher_ =
       std::make_unique<signin::PrimaryAccountAccessTokenFetcher>(
-          "EduAccountLoginHandler", identity_manager, scopes,
+          signin::OAuthConsumerId::kEduAccountLoginHandler, identity_manager,
           base::BindOnce(
               &EduAccountLoginHandler::CreateReAuthProofTokenForParent,
               base::Unretained(this), std::move(obfuscated_gaia_id),
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
index c364d1c..65a1857 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
+++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler.cc
@@ -1454,8 +1454,12 @@
 
   tab_data->show_icon = tab_renderer_data.show_icon;
 
+  // https://crbug.com/435697558: Use the max value of
+  // GetLastInteractionTimeTicks and GetLastActiveTimeTicks to account for
+  // interaction without across multiple windows without switching tabs.
   const base::TimeTicks last_active_time_ticks =
-      contents->GetLastActiveTimeTicks();
+      std::max(contents->GetLastInteractionTimeTicks(),
+               contents->GetLastActiveTimeTicks());
   tab_data->last_active_time_ticks = last_active_time_ticks;
 
   // last_active_time_for_testing can affect pixel tests depending on when the
diff --git a/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc b/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
index 3203d2a..32d6548 100644
--- a/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc
@@ -405,6 +405,52 @@
   handler()->GetProfileData(std::move(callback3));
 }
 
+TEST_F(TabSearchPageHandlerTest, TabActivationChangedByInteraction) {
+  EXPECT_CALL(page_, TabUpdated(_)).Times(1);
+  EXPECT_CALL(page_, TabsRemoved(_)).Times(1);
+
+  AddTabWithTitle(browser1(), GURL(kTabUrl1), kTabName1);
+  AddTabWithTitle(browser1(), GURL(kTabUrl2), kTabName2);
+
+  base::TimeTicks tab1_ticks;
+  base::TimeTicks tab2_ticks;
+
+  // Get initial last active time ticks.
+  tab_search::mojom::PageHandler::GetProfileDataCallback callback1 =
+      base::BindLambdaForTesting(
+          [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+            ASSERT_EQ(2u, profile_tabs->windows.size());
+            auto* window1 = profile_tabs->windows[0].get();
+            ASSERT_EQ(2u, window1->tabs.size());
+            // Tabs are in index order.
+            tab1_ticks = window1->tabs[0]->last_active_time_ticks;
+            tab2_ticks = window1->tabs[1]->last_active_time_ticks;
+          });
+  handler()->GetProfileData(std::move(callback1));
+
+  auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
+  task_runner->FastForwardBy(base::Seconds(1));
+
+  // Simulate interaction with the first tab.
+  browser1()->tab_strip_model()->GetWebContentsAt(0)->Copy();
+
+  // Get last active time ticks again and verify.
+  tab_search::mojom::PageHandler::GetProfileDataCallback callback2 =
+      base::BindLambdaForTesting(
+          [&](tab_search::mojom::ProfileDataPtr profile_tabs) {
+            ASSERT_EQ(2u, profile_tabs->windows.size());
+            auto* window1 = profile_tabs->windows[0].get();
+            ASSERT_EQ(2u, window1->tabs.size());
+            base::TimeTicks new_tab1_ticks =
+                window1->tabs[0]->last_active_time_ticks;
+            base::TimeTicks new_tab2_ticks =
+                window1->tabs[1]->last_active_time_ticks;
+            EXPECT_GT(new_tab1_ticks, tab1_ticks);
+            EXPECT_EQ(new_tab2_ticks, tab2_ticks);
+          });
+  handler()->GetProfileData(std::move(callback2));
+}
+
 TEST_F(TabSearchPageHandlerTest, TabsAndGroups) {
   ASSERT_TRUE(browser()->tab_strip_model()->SupportsTabGroups());
 
diff --git a/chrome/browser/web_applications/commands/internal/command_internal.cc b/chrome/browser/web_applications/commands/internal/command_internal.cc
index 753d1c54..af612d4 100644
--- a/chrome/browser/web_applications/commands/internal/command_internal.cc
+++ b/chrome/browser/web_applications/commands/internal/command_internal.cc
@@ -11,6 +11,7 @@
 #include "base/atomic_sequence_num.h"
 #include "base/check.h"
 #include "base/functional/bind.h"
+#include "base/i18n/time_formatting.h"
 #include "base/location.h"
 #include "base/values.h"
 #include "chrome/browser/web_applications/locks/all_apps_lock.h"
@@ -71,6 +72,14 @@
       ->Set("scheduled_location", location.ToString());
 }
 
+void CommandBase::SetScheduledAt(base::PassKey<WebAppCommandManager>) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(command_sequence_checker_);
+  GetMutableDebugValue()
+      .EnsureDict("!metadata")
+      ->Set("scheduled_at",
+            base::TimeFormatTimeOfDayWithMilliseconds(base::Time::Now()));
+}
+
 void CommandBase::SetCommandManager(base::PassKey<WebAppCommandManager>,
                                     WebAppCommandManager* command_manager) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(command_sequence_checker_);
@@ -93,7 +102,10 @@
 void CommandBase::SetStarted() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(command_sequence_checker_);
   started_ = true;
-  GetMutableDebugValue().EnsureDict("!metadata")->Set("started", true);
+  auto* metadata = GetMutableDebugValue().EnsureDict("!metadata");
+  metadata->Set("started", true);
+  metadata->Set("started_at",
+                base::TimeFormatTimeOfDayWithMilliseconds(base::Time::Now()));
 }
 
 void CommandBase::CompleteAndSelfDestructInternal(
diff --git a/chrome/browser/web_applications/commands/internal/command_internal.h b/chrome/browser/web_applications/commands/internal/command_internal.h
index 65c1f70..aa0cb9b 100644
--- a/chrome/browser/web_applications/commands/internal/command_internal.h
+++ b/chrome/browser/web_applications/commands/internal/command_internal.h
@@ -68,6 +68,8 @@
   void SetScheduledLocation(base::PassKey<WebAppCommandManager>,
                             const base::Location& location);
 
+  void SetScheduledAt(base::PassKey<WebAppCommandManager>);
+
   // Sets the command manager, allowing `CompleteAndSelfDestruct` to
   // work correctly.
   void SetCommandManager(base::PassKey<WebAppCommandManager>,
diff --git a/chrome/browser/web_applications/commands/web_app_command.h b/chrome/browser/web_applications/commands/web_app_command.h
index cb3c618..72cb1ce 100644
--- a/chrome/browser/web_applications/commands/web_app_command.h
+++ b/chrome/browser/web_applications/commands/web_app_command.h
@@ -13,10 +13,12 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/i18n/time_formatting.h"
 #include "base/location.h"
 #include "base/memory/raw_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/strings/to_string.h"
+#include "base/time/time.h"
 #include "base/types/pass_key.h"
 #include "base/values.h"
 #include "chrome/browser/web_applications/commands/command_result.h"
@@ -191,6 +193,8 @@
         "result",
         base::ToString(std::tie<CallbackArgs&...>(args_for_callback...)));
     metadata->Set("completion_location", base::ToString(location));
+    metadata->Set("completed_at",
+                  base::TimeFormatTimeOfDayWithMilliseconds(base::Time::Now()));
 
     // Note: `BindOnce` should correctly handle copying any ref or move
     // arguments internally. This allows the callback arguments to contain ref
diff --git a/chrome/browser/web_applications/web_app_command_manager.cc b/chrome/browser/web_applications/web_app_command_manager.cc
index dd08b3d0..7521821 100644
--- a/chrome/browser/web_applications/web_app_command_manager.cc
+++ b/chrome/browser/web_applications/web_app_command_manager.cc
@@ -71,6 +71,7 @@
 
   command->SetScheduledLocation(base::PassKey<WebAppCommandManager>(),
                                 location);
+  command->SetScheduledAt(base::PassKey<WebAppCommandManager>());
   command->SetCommandManager(base::PassKey<WebAppCommandManager>(), this);
   internal::CommandBase::Id command_id = command->id();
   CHECK(!base::Contains(commands_, command_id));
diff --git a/chrome/browser/web_applications/web_app_command_manager_unittest.cc b/chrome/browser/web_applications/web_app_command_manager_unittest.cc
index 66bbf46..ff4812c 100644
--- a/chrome/browser/web_applications/web_app_command_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_command_manager_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/barrier_callback.h"
 #include "base/barrier_closure.h"
 #include "base/containers/flat_set.h"
+#include "base/containers/to_vector.h"
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
 #include "base/location.h"
@@ -527,14 +528,8 @@
 
   auto get_metadata_field_names =
       [](const base::Value::Dict& command_dict) -> std::vector<std::string> {
-    std::vector<std::string> names;
-    const base::Value::Dict* metadata = command_dict.FindDict("!metadata");
-    std::transform(
-        metadata->cbegin(), metadata->cend(), std::back_inserter(names),
-        [](base::Value::Dict::const_iterator::reference pair) -> std::string {
-          return pair.first;
-        });
-    return names;
+    return base::ToVector(*command_dict.FindDict("!metadata"),
+                          [](const auto& kv) { return kv.first; });
   };
 
   base::Value::List* log = command_manager_debug_value.FindList("command_log");
@@ -544,16 +539,17 @@
       get_metadata_field_names(log->front().GetDict()),
       ::testing::UnorderedElementsAre(
           "command_result", "completion_location", "id", "initial_lock_request",
-          "name", "result", "started", "scheduled_location"));
+          "name", "result", "started", "scheduled_location", "scheduled_at",
+          "completed_at", "started_at"));
 
   base::Value::List* queue =
       command_manager_debug_value.FindList("command_queue");
   ASSERT_TRUE(queue);
   ASSERT_GT(queue->size(), 0ul);
-  EXPECT_THAT(
-      get_metadata_field_names(queue->front().GetDict()),
-      ::testing::UnorderedElementsAre("id", "initial_lock_request", "name",
-                                      "started", "scheduled_location"));
+  EXPECT_THAT(get_metadata_field_names(queue->front().GetDict()),
+              ::testing::UnorderedElementsAre(
+                  "id", "initial_lock_request", "name", "started",
+                  "scheduled_location", "scheduled_at"));
 }
 
 TEST_F(WebAppCommandManagerTest, DestroySharedWebContentsOnPostTask) {
diff --git a/chrome/browser/webauthn/BUILD.gn b/chrome/browser/webauthn/BUILD.gn
index d1c1579..3b292b6 100644
--- a/chrome/browser/webauthn/BUILD.gn
+++ b/chrome/browser/webauthn/BUILD.gn
@@ -62,8 +62,8 @@
       "//base",
       "//chrome/browser",
       "//chrome/browser/sync",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/ui",
-      "//chrome/test:sync_integration_test_support",
       "//chrome/test:test_support_ui",
       "//components/os_crypt/sync:test_support",
       "//components/signin/public/identity_manager:test_support",
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 95d7761..c7b19af 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1756808038-42f3c2ceed4891c17825eae90f8ec65a2dc31edd-261d2c3616964b8c9aec27336821e08d357cc369.profdata
+chrome-android64-main-1756822069-de4bd7d7669f6757eebc12283731a9eadfb5bee8-28a1ee4d22e556527709ae0c833a2580a4f89f7e.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 27f9a6d..02692ac 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1756792286-23a5fed8d4f940fb4cffa6de6aafd24341e80dbf-5b682b34bdc7b7dad38231dc003c5d91394fea45.profdata
+chrome-mac-main-1756814343-34e64840d94a4f8c078e502eea400f9b678dc550-af4c4b4a345d0ad4a3f8aa22f873f21587a1a6e3.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 4e0bf1b..0127685 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1756792286-1adc25df1df8c6dab97915e7e465f29198eafbb6-5b682b34bdc7b7dad38231dc003c5d91394fea45.profdata
+chrome-win32-main-1756803502-220b7b3c12588346e324a15b398e7a00e4fa5edb-dde15930c4bf0c6c6424b21021203dbd21508dfe.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 6cca337..38203c0 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1756792286-1cd0881349dc5206f671cdd3251586cbad7e5b32-5b682b34bdc7b7dad38231dc003c5d91394fea45.profdata
+chrome-win64-main-1756803502-2c048ae3b0371bc55013ee081f39516aa2cf9532-dde15930c4bf0c6c6424b21021203dbd21508dfe.profdata
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc
index 8bce1a8f..80e7805 100644
--- a/chrome/renderer/autofill/form_autofill_browsertest.cc
+++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -317,7 +317,6 @@
   if (auto p = FindFormAndFieldForFormControlElement(
           element, *base::MakeRefCounted<FieldDataManager>(),
           kExtractFormDataCallTimerStateDummy, /*button_titles_cache=*/nullptr,
-          /*extract_options=*/{},
           /*form_cache=*/{})) {
     return p->first;
   }
@@ -371,23 +370,17 @@
     test::AutofillRendererTest::TearDown();
   }
 
-  std::optional<FormData> ExtractFormData(
-      WebFormElement form,
-      DenseSet<ExtractOption> extract_options = {}) {
+  std::optional<FormData> ExtractFormData(WebFormElement form) {
     return form_util::ExtractFormData(
         GetDocument(), form, *base::MakeRefCounted<FieldDataManager>(),
-        kExtractFormDataCallTimerStateDummy, /*button_titles_cache=*/nullptr,
-        extract_options);
+        kExtractFormDataCallTimerStateDummy, /*button_titles_cache=*/nullptr);
   }
 
   std::optional<std::pair<FormData, raw_ref<const FormFieldData>>>
-  FindFormAndFieldForFormControlElement(
-      WebFormControlElement control,
-      DenseSet<ExtractOption> extract_options = {}) {
+  FindFormAndFieldForFormControlElement(WebFormControlElement control) {
     return form_util::FindFormAndFieldForFormControlElement(
         control, *base::MakeRefCounted<FieldDataManager>(),
         kExtractFormDataCallTimerStateDummy, /*button_titles_cache=*/nullptr,
-        extract_options,
         /*form_cache=*/{});
   }
 
@@ -1840,7 +1833,7 @@
 
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             /*extract_options=*/{}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_form_control_type(FormControlType::kInputText);
@@ -1861,7 +1854,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -1883,7 +1876,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -1905,7 +1898,7 @@
   element.SetAutofillState(WebAutofillState::kAutofilled);
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -1930,7 +1923,7 @@
   element.SetAutofillState(WebAutofillState::kAutofilled);
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"checkbox");
@@ -1945,7 +1938,7 @@
   element = GetInputElementById("radio");
   element.SetAutofillState(WebAutofillState::kAutofilled);
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   expected.set_id_attribute(u"radio");
   expected.set_name(expected.id_attribute());
   expected.set_value(u"male");
@@ -1969,7 +1962,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -2004,7 +1997,7 @@
 
   FormFieldData result1;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result1);
+                                             &result1);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -2042,7 +2035,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   EXPECT_TRUE(result.options().empty());
 }
@@ -2061,7 +2054,7 @@
 
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   ASSERT_EQ(2u, result.options().size());
   EXPECT_EQ(u"usa", result.options()[0].text);
   EXPECT_EQ(u"uk", result.options()[1].text);
@@ -2081,7 +2074,7 @@
 
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   ASSERT_EQ(1u, result.options().size());
   EXPECT_EQ(u"+1 (Canada)", result.options()[0].text);
 }
@@ -2097,7 +2090,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -2121,7 +2114,7 @@
   FormFieldData result_sans_value;
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(WebFormElement(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_id_attribute(u"element");
@@ -2144,7 +2137,7 @@
   WebFormControlElement element = GetFormControlElementById("password");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
 
   FormFieldData expected;
   expected.set_max_length(FormFieldData::kDefaultMaxLength);
@@ -2220,8 +2213,7 @@
         GetFormControlElementById(test_case.element_id);
     FormFieldData result;
     WebFormControlElementToFormFieldForTesting(WebFormElement(), element,
-                                               nullptr,
-                                               /*extract_options=*/{}, &result);
+                                               nullptr, &result);
 
     FormFieldData expected;
     expected.set_id_attribute(ASCIIToUTF16(test_case.element_id));
@@ -2254,7 +2246,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction());
 }
 
@@ -2269,7 +2261,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction());
 }
 
@@ -2285,7 +2277,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction());
 }
 
@@ -2300,7 +2292,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction());
 }
 
@@ -2316,7 +2308,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction());
 }
 
@@ -2333,7 +2325,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction());
 
   // text-align: left
@@ -2347,7 +2339,7 @@
 
   element = GetFormControlElementById("element");
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction());
 }
 
@@ -2364,7 +2356,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction());
 }
 
@@ -2381,7 +2373,7 @@
   WebFormControlElement element = GetFormControlElementById("element");
   FormFieldData result;
   WebFormControlElementToFormFieldForTesting(element.Form(), element, nullptr,
-                                             {}, &result);
+                                             &result);
   EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction());
 }
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index c60cdd5..29200c3 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1720,11 +1720,11 @@
       "../browser/devtools/protocol/devtools_protocol_browsertest.cc",
     ]
     deps += [
-      ":sync_integration_test_support",
       "//chrome/browser/data_saver",
       "//chrome/browser/devtools",
       "//chrome/browser/devtools:test_support",
       "//chrome/browser/preloading:prefs",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/ui/autofill",
       "//components/infobars/content",
       "//components/javascript_dialogs",
@@ -1832,7 +1832,6 @@
       ":chrome_test_launcher",
       ":persisted_tab_data_test_proto",
       ":platform_browser_tests",
-      ":sync_integration_test_support",
       ":sync_integration_test_support_java",
       ":test_support",
       ":test_support_java",
@@ -1868,6 +1867,7 @@
       "//chrome/browser/segmentation_platform:test_utils",
       "//chrome/browser/supervised_user:android_browser_tests",
       "//chrome/browser/sync",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/touch_to_fill/password_manager/password_generation/android:public",
       "//chrome/browser/ui:ui_features",
       "//chrome/browser/ui/android/hats:browser_tests",
@@ -2286,7 +2286,6 @@
     deps = [
       ":browser_tests_runner",
       ":platform_browser_tests",
-      ":sync_integration_test_support",
       ":test_support",
       ":test_support_ui",
       ":webrtc_browser_tests_base",
@@ -2417,6 +2416,7 @@
       "//chrome/browser/supervised_user:test_support",
       "//chrome/browser/support_tool:support_tool_proto",
       "//chrome/browser/sync",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/tab_group_sync:factories",
       "//chrome/browser/task_manager/common",
       "//chrome/browser/themes",
@@ -8163,7 +8163,6 @@
       "../browser/ui/views/passwords/password_bubble_view_test_base.h",
       "../browser/ui/views/passwords/password_change/password_change_toast_unittest.cc",
       "../browser/ui/views/passwords/password_change/successful_password_change_view_unittest.cc",
-      "../browser/ui/views/passwords/password_save_unsynced_credentials_locally_view_unittest.cc",
       "../browser/ui/views/passwords/password_save_update_view_unittest.cc",
       "../browser/ui/views/passwords/post_save_compromised_bubble_view_unittest.cc",
       "../browser/ui/views/passwords/shared_passwords_notification_view_unittest.cc",
@@ -8854,7 +8853,6 @@
       "//ash/assistant/model",
       "//ash/assistant/util",
       "//ash/public/cpp:test_support",
-      "//ash/public/cpp/assistant/test_support",
       "//ash/public/cpp/resources:ash_public_unscaled_resources",
       "//ash/resources/vector_icons",
       "//ash/strings",
@@ -11269,7 +11267,6 @@
 
     deps = [
       ":chrome_test_launcher",
-      ":sync_integration_test_support",
       ":test_support",
       ":test_support_ui",
       ":webrtc_browser_tests_base",
@@ -11319,6 +11316,7 @@
       "//chrome/browser/signin/e2e_tests:test_support",
       "//chrome/browser/status_icons",
       "//chrome/browser/sync",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/themes",
       "//chrome/browser/ui",
       "//chrome/browser/ui:browser_element_identifiers",
@@ -12231,247 +12229,6 @@
   }
 }
 
-# For Android, this target has to be built along with the
-# sync_integration_test_support_java target from the test target dependencies.
-source_set("sync_integration_test_support") {
-  testonly = true
-  sources = [
-    "../browser/sync/test/integration/autofill_helper.cc",
-    "../browser/sync/test/integration/autofill_helper.h",
-    "../browser/sync/test/integration/await_match_status_change_checker.cc",
-    "../browser/sync/test/integration/await_match_status_change_checker.h",
-    "../browser/sync/test/integration/bookmarks_helper.cc",
-    "../browser/sync/test/integration/bookmarks_helper.h",
-    "../browser/sync/test/integration/committed_all_nudged_changes_checker.cc",
-    "../browser/sync/test/integration/committed_all_nudged_changes_checker.h",
-    "../browser/sync/test/integration/contact_info_helper.cc",
-    "../browser/sync/test/integration/contact_info_helper.h",
-    "../browser/sync/test/integration/device_info_helper.cc",
-    "../browser/sync/test/integration/device_info_helper.h",
-    "../browser/sync/test/integration/encryption_helper.cc",
-    "../browser/sync/test/integration/encryption_helper.h",
-    "../browser/sync/test/integration/exponential_backoff_helper.cc",
-    "../browser/sync/test/integration/exponential_backoff_helper.h",
-    "../browser/sync/test/integration/fake_server_match_status_checker.cc",
-    "../browser/sync/test/integration/fake_server_match_status_checker.h",
-    "../browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.cc",
-    "../browser/sync/test/integration/fake_sync_gcm_driver_for_instance_id.h",
-    "../browser/sync/test/integration/history_helper.cc",
-    "../browser/sync/test/integration/history_helper.h",
-    "../browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.cc",
-    "../browser/sync/test/integration/invalidations/fake_server_sync_invalidation_sender.h",
-    "../browser/sync/test/integration/invalidations/invalidations_status_checker.cc",
-    "../browser/sync/test/integration/invalidations/invalidations_status_checker.h",
-    "../browser/sync/test/integration/multi_client_status_change_checker.cc",
-    "../browser/sync/test/integration/multi_client_status_change_checker.h",
-    "../browser/sync/test/integration/offer_helper.cc",
-    "../browser/sync/test/integration/offer_helper.h",
-    "../browser/sync/test/integration/password_sharing_invitation_helper.cc",
-    "../browser/sync/test/integration/password_sharing_invitation_helper.h",
-    "../browser/sync/test/integration/passwords_helper.cc",
-    "../browser/sync/test/integration/passwords_helper.h",
-    "../browser/sync/test/integration/preferences_helper.cc",
-    "../browser/sync/test/integration/preferences_helper.h",
-    "../browser/sync/test/integration/quiesce_status_change_checker.cc",
-    "../browser/sync/test/integration/quiesce_status_change_checker.h",
-    "../browser/sync/test/integration/saved_tab_groups_helper.cc",
-    "../browser/sync/test/integration/saved_tab_groups_helper.h",
-    "../browser/sync/test/integration/secondary_account_helper.cc",
-    "../browser/sync/test/integration/secondary_account_helper.h",
-    "../browser/sync/test/integration/send_tab_to_self_helper.cc",
-    "../browser/sync/test/integration/send_tab_to_self_helper.h",
-    "../browser/sync/test/integration/session_hierarchy_match_checker.cc",
-    "../browser/sync/test/integration/session_hierarchy_match_checker.h",
-    "../browser/sync/test/integration/shared_tab_group_data_helper.cc",
-    "../browser/sync/test/integration/shared_tab_group_data_helper.h",
-    "../browser/sync/test/integration/single_client_status_change_checker.cc",
-    "../browser/sync/test/integration/single_client_status_change_checker.h",
-    "../browser/sync/test/integration/status_change_checker.cc",
-    "../browser/sync/test/integration/status_change_checker.h",
-    "../browser/sync/test/integration/sync_datatype_helper.cc",
-    "../browser/sync/test/integration/sync_datatype_helper.h",
-    "../browser/sync/test/integration/sync_disabled_checker.cc",
-    "../browser/sync/test/integration/sync_disabled_checker.h",
-    "../browser/sync/test/integration/sync_engine_stopped_checker.cc",
-    "../browser/sync/test/integration/sync_engine_stopped_checker.h",
-    "../browser/sync/test/integration/sync_service_impl_harness.cc",
-    "../browser/sync/test/integration/sync_service_impl_harness.h",
-    "../browser/sync/test/integration/sync_signin_delegate.cc",
-    "../browser/sync/test/integration/sync_signin_delegate.h",
-    "../browser/sync/test/integration/sync_test.cc",
-    "../browser/sync/test/integration/sync_test.h",
-    "../browser/sync/test/integration/sync_test_account.h",
-    "../browser/sync/test/integration/sync_test_tab_utils.cc",
-    "../browser/sync/test/integration/sync_test_tab_utils.h",
-    "../browser/sync/test/integration/updated_progress_marker_checker.cc",
-    "../browser/sync/test/integration/updated_progress_marker_checker.h",
-    "../browser/sync/test/integration/wallet_helper.cc",
-    "../browser/sync/test/integration/wallet_helper.h",
-  ]
-  if (!is_android) {
-    sources += [
-      "../browser/sync/test/integration/apps_helper.cc",
-      "../browser/sync/test/integration/apps_helper.h",
-      "../browser/sync/test/integration/cookie_helper.cc",
-      "../browser/sync/test/integration/cookie_helper.h",
-      "../browser/sync/test/integration/dictionary_helper.cc",
-      "../browser/sync/test/integration/dictionary_helper.h",
-      "../browser/sync/test/integration/dictionary_load_observer.cc",
-      "../browser/sync/test/integration/dictionary_load_observer.h",
-      "../browser/sync/test/integration/extension_settings_helper.cc",
-      "../browser/sync/test/integration/extension_settings_helper.h",
-      "../browser/sync/test/integration/fake_sync_signin_delegate_desktop.cc",
-      "../browser/sync/test/integration/fake_sync_signin_delegate_desktop.h",
-      "../browser/sync/test/integration/live_sync_signin_delegate_desktop.cc",
-      "../browser/sync/test/integration/live_sync_signin_delegate_desktop.h",
-      "../browser/sync/test/integration/migration_waiter.cc",
-      "../browser/sync/test/integration/migration_waiter.h",
-      "../browser/sync/test/integration/migration_watcher.cc",
-      "../browser/sync/test/integration/migration_watcher.h",
-      "../browser/sync/test/integration/search_engines_helper.cc",
-      "../browser/sync/test/integration/search_engines_helper.h",
-      "../browser/sync/test/integration/sessions_helper.cc",
-      "../browser/sync/test/integration/sessions_helper.h",
-      "../browser/sync/test/integration/sync_app_helper.cc",
-      "../browser/sync/test/integration/sync_app_helper.h",
-      "../browser/sync/test/integration/sync_integration_test_util.cc",
-      "../browser/sync/test/integration/sync_integration_test_util.h",
-      "../browser/sync/test/integration/themes_helper.cc",
-      "../browser/sync/test/integration/themes_helper.h",
-      "../browser/sync/test/integration/user_events_helper.cc",
-      "../browser/sync/test/integration/user_events_helper.h",
-      "../browser/sync/test/integration/webauthn_credentials_helper.cc",
-      "../browser/sync/test/integration/webauthn_credentials_helper.h",
-    ]
-  } else {
-    sources += [
-      "../browser/sync/test/integration/fake_sync_signin_delegate_android.cc",
-      "../browser/sync/test/integration/fake_sync_signin_delegate_android.h",
-      "../browser/sync/test/integration/live_sync_signin_delegate_android.cc",
-      "../browser/sync/test/integration/live_sync_signin_delegate_android.h",
-      "../browser/sync/test/integration/sync_test_utils_android.cc",
-      "../browser/sync/test/integration/sync_test_utils_android.h",
-      "../browser/sync/test/integration/webapks_helper.cc",
-      "../browser/sync/test/integration/webapks_helper.h",
-    ]
-  }
-  if (enable_extensions_core) {
-    sources += [
-      "../browser/sync/test/integration/extensions_helper.cc",
-      "../browser/sync/test/integration/extensions_helper.h",
-      "../browser/sync/test/integration/sync_extension_helper.cc",
-      "../browser/sync/test/integration/sync_extension_helper.h",
-    ]
-  }
-  public_deps = [
-    ":test_support",
-    "//chrome/browser",
-    "//chrome/browser/favicon",
-    "//components/autofill/content/browser",
-    "//components/power_bookmarks/core:features",
-  ]
-  deps = [
-    "//base",
-    "//chrome/browser:main_extra_parts",
-    "//chrome/browser/autofill",
-    "//chrome/browser/password_manager/factories",
-    "//chrome/browser/profiles",
-    "//chrome/browser/search_engines",
-    "//chrome/browser/sync",
-    "//components/autofill/core/common:credit_card_number_validation",
-    "//components/bookmarks/browser",
-    "//components/bookmarks/browser:test_support",
-    "//components/bookmarks/managed",
-    "//components/browser_sync",
-    "//components/commerce/core:feature_list",
-    "//components/favicon/core",
-    "//components/os_crypt/sync:test_support",
-    "//components/password_manager/core/browser:password_manager_buildflags",
-    "//components/plus_addresses/core/common:features",
-    "//components/saved_tab_groups/public",
-    "//components/send_tab_to_self",
-    "//components/signin/public/identity_manager:test_support",
-    "//components/sync",
-    "//components/sync:test_support",
-    "//components/sync_bookmarks",
-    "//components/tab_groups",
-    "//components/tabs:public",
-    "//components/webapps/common",
-    "//content/public/browser",
-    "//content/test:test_support",
-    "//net",
-    "//services/network/public/mojom",
-    "//skia",
-  ]
-
-  if (is_mac) {
-    sources -= [
-      "../browser/sync/test/integration/dictionary_helper.cc",
-      "../browser/sync/test/integration/dictionary_helper.h",
-      "../browser/sync/test/integration/dictionary_load_observer.cc",
-      "../browser/sync/test/integration/dictionary_load_observer.h",
-    ]
-  }
-  if (is_chromeos) {
-    sources += [
-      "../browser/sync/test/integration/printers_helper.cc",
-      "../browser/sync/test/integration/printers_helper.h",
-      "../browser/sync/test/integration/sync_app_list_helper.cc",
-      "../browser/sync/test/integration/sync_app_list_helper.h",
-      "../browser/sync/test/integration/sync_arc_package_helper.cc",
-      "../browser/sync/test/integration/sync_arc_package_helper.h",
-      "../browser/sync/test/integration/workspace_desk_helper.cc",
-      "../browser/sync/test/integration/workspace_desk_helper.h",
-    ]
-    public_deps += [ "//chrome/browser/ash/app_list" ]
-    deps += [
-      "//ash/app_list:test_support",
-      "//chrome/browser/ash/app_list/arc",
-      "//chrome/browser/ash/app_list/test:test_support",
-      "//chrome/browser/ash/arc",
-      "//chrome/browser/ash/arc:arc_util",
-      "//chrome/browser/ash/arc/session",
-      "//chrome/browser/ash/net",
-      "//chrome/browser/ash/printing",
-      "//chrome/browser/ash/system_web_apps/test_support",
-      "//chromeos/ash/components/browser_context_helper",
-      "//chromeos/ash/components/network/portal_detector",
-      "//chromeos/ash/experiences/arc:arc_test_support",
-      "//chromeos/ash/experiences/arc/mojom",
-      "//chromeos/printing",
-      "//components/desks_storage",
-      "//components/user_manager:test_support",
-    ]
-  }
-  if (is_android) {
-    deps += [
-      ":sync_integration_test_support_jni_headers",
-      ":test_support_jni_headers",
-      "//chrome/browser/android/webapk:webapk_sources",
-      "//chrome/browser/password_manager/android:utils",
-      "//chrome/browser/ui/android/tab_model",
-      "//components/saved_tab_groups/public:conversion_utils",
-    ]
-    if (enable_extensions_core) {
-      deps += [ "//chrome/browser/extensions" ]
-    }
-  } else {
-    deps += [
-      "//chrome/browser/apps/app_service",
-      "//chrome/browser/themes",
-      "//chrome/browser/ui/webui/signin:login",
-      "//chrome/browser/ui/webui/signin:test_support_ui",
-      "//chrome/browser/web_applications:web_applications_test_support",
-      "//chrome/browser/webauthn",
-      "//components/send_tab_to_self",
-      "//components/trusted_vault",
-      "//components/webapps/browser",
-      "//components/webauthn/core/browser",
-      "//components/webauthn/core/browser:passkey_model",
-    ]
-  }
-}
-
 if (!is_android) {
   test("sync_integration_tests") {
     use_xvfb = use_xvfb_in_this_config
@@ -12499,11 +12256,11 @@
 
     deps = [
       ":chrome_test_launcher",
-      ":sync_integration_test_support",
       ":test_support",
       ":test_support_ui",
       "//chrome/app:chrome_dll_resources",
       "//chrome/app:command_ids",
+      "//chrome/browser/sync/test/integration:sync_integration_test_support",
       "//chrome/browser/ui",
       "//components/bookmarks/browser",
       "//components/password_manager/core/browser",
diff --git a/chrome/test/supervised_user/BUILD.gn b/chrome/test/supervised_user/BUILD.gn
index 2587a5f..1fe0daa 100644
--- a/chrome/test/supervised_user/BUILD.gn
+++ b/chrome/test/supervised_user/BUILD.gn
@@ -18,7 +18,7 @@
   public_deps = [
     ":child_accounts",
     "//base",
-    "//chrome/test:sync_integration_test_support",
+    "//chrome/browser/sync/test/integration:sync_integration_test_support",
     "//chrome/test:test_support",
     "//components/signin/public/identity_manager:test_support",
     "//components/supervised_user/test_support",
diff --git a/clank b/clank
index ced3635..adb0ed2 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit ced3635c6f861e027c3f1c20a71be39b4fd724d1
+Subproject commit adb0ed24d1920f5972d5e07ce95ed892fdb9e1f5
diff --git a/components/autofill/content/renderer/autofill_agent.cc b/components/autofill/content/renderer/autofill_agent.cc
index cb9d112..175515d 100644
--- a/components/autofill/content/renderer/autofill_agent.cc
+++ b/components/autofill/content/renderer/autofill_agent.cc
@@ -641,11 +641,10 @@
   DCHECK(form_util::MaybeWasOwnedByFrame(element, unsafe_render_frame()));
 
   if (std::optional<FormAndField> form_and_field =
-          FindFormAndFieldForFormControlElement(
+          form_util::FindFormAndFieldForFormControlElement(
               element, field_data_manager(),
               GetCallTimerState(kDidChangeScrollOffsetImpl),
               button_titles_cache(),
-              MaybeExtractDatalist({form_util::ExtractOption::kBounds}),
               /*form_cache=*/{})) {
     auto& [form, field] = *form_and_field;
     if (auto* autofill_driver = unsafe_autofill_driver()) {
@@ -704,11 +703,10 @@
 
   if (auto control = new_focused_element.DynamicTo<WebFormControlElement>()) {
     if (std::optional<FormAndField> form_and_field =
-            FindFormAndFieldForFormControlElement(
+            form_util::FindFormAndFieldForFormControlElement(
                 control, field_data_manager(),
                 GetCallTimerState(kFocusedElementChanged),
                 button_titles_cache(),
-                MaybeExtractDatalist({form_util::ExtractOption::kBounds}),
                 /*form_cache=*/{})) {
       auto& [form, field] = *form_and_field;
       if (auto* autofill_driver = unsafe_autofill_driver()) {
@@ -767,12 +765,10 @@
     if (WebFormControlElement control =
             element.DynamicTo<WebFormControlElement>()) {
       if (std::optional<FormAndField> form_and_field =
-              FindFormAndFieldForFormControlElement(
+              form_util::FindFormAndFieldForFormControlElement(
                   control, self.field_data_manager(),
                   self.GetCallTimerState(kHandleCaretMovedInFormField),
                   self.button_titles_cache(),
-                  self.MaybeExtractDatalist(
-                      {form_util::ExtractOption::kBounds}),
                   /*form_cache=*/{})) {
         auto& [form, field] = *form_and_field;
         if (auto* autofill_driver = self.unsafe_autofill_driver()) {
@@ -1027,12 +1023,10 @@
   }
 
   if (std::optional<FormAndField> form_and_field =
-          FindFormAndFieldForFormControlElement(
+          form_util::FindFormAndFieldForFormControlElement(
               element, field_data_manager(),
               GetCallTimerState(kOnTextFieldValueChanged),
-              button_titles_cache(),
-              MaybeExtractDatalist({form_util::ExtractOption::kBounds}),
-              form_cache)) {
+              button_titles_cache(), form_cache)) {
     auto& [form, field] = *form_and_field;
     if (auto* autofill_driver = unsafe_autofill_driver()) {
       autofill_driver->TextFieldValueChanged(form, field->renderer_id(),
@@ -1046,12 +1040,10 @@
     const SynchronousFormCache& form_cache) {
   DCHECK(form_util::MaybeWasOwnedByFrame(element, unsafe_render_frame()));
   if (std::optional<FormAndField> form_and_field =
-          FindFormAndFieldForFormControlElement(
+          form_util::FindFormAndFieldForFormControlElement(
               element, field_data_manager(),
               GetCallTimerState(kOnProvisionallySaveForm),
-              button_titles_cache(),
-              MaybeExtractDatalist({form_util::ExtractOption::kBounds}),
-              form_cache)) {
+              button_titles_cache(), form_cache)) {
     auto& [form, field] = *form_and_field;
     if (auto* autofill_driver = unsafe_autofill_driver()) {
       autofill_driver->SelectControlSelectionChanged(form,
@@ -1573,8 +1565,6 @@
       form_util::FindFormAndFieldForFormControlElement(
           element, field_data_manager(),
           GetCallTimerState(kQueryAutofillSuggestions), button_titles_cache(),
-          {form_util::ExtractOption::kDatalist,
-           form_util::ExtractOption::kBounds},
           form_cache);
   if (!form_and_field) {
     return;
@@ -1663,13 +1653,10 @@
     std::move(callback).Run(std::nullopt);
     return;
   }
-  DenseSet<form_util::ExtractOption> extract_options =
-      MaybeExtractDatalist({form_util::ExtractOption::kBounds});
   if (!form_id) {
     if (std::optional<FormData> form = form_util::ExtractFormData(
             document, WebFormElement(), field_data_manager(),
-            GetCallTimerState(kExtractForm), button_titles_cache(),
-            extract_options)) {
+            GetCallTimerState(kExtractForm), button_titles_cache())) {
       std::move(callback).Run(std::move(form));
       return;
     }
@@ -1677,8 +1664,7 @@
   if (WebFormElement form_element = form_util::GetFormByRendererId(form_id)) {
     if (std::optional<FormData> form = form_util::ExtractFormData(
             document, form_element, field_data_manager(),
-            GetCallTimerState(kExtractForm), button_titles_cache(),
-            extract_options)) {
+            GetCallTimerState(kExtractForm), button_titles_cache())) {
       std::move(callback).Run(std::move(form));
       return;
     }
@@ -1964,8 +1950,7 @@
           form_util::FindFormAndFieldForFormControlElement(
               element, field_data_manager(),
               GetCallTimerState(kBatchSelectOptionChange),
-              button_titles_cache(),
-              /*extract_options=*/{}, /*form_cache=*/{})) {
+              button_titles_cache(), /*form_cache=*/{})) {
     auto& [form, field] = *form_and_field;
     if (auto* autofill_driver = unsafe_autofill_driver();
         autofill_driver && !field->options().empty()) {
@@ -2100,7 +2085,7 @@
           form_util::FindFormAndFieldForFormControlElement(
               element, field_data_manager(),
               GetCallTimerState(kJavaScriptChangedValue), button_titles_cache(),
-              /*extract_options=*/{}, /*form_cache=*/{})) {
+              /*form_cache=*/{})) {
     auto& [form, field] = *form_and_field;
     if (auto* autofill_driver = unsafe_autofill_driver()) {
       autofill_driver->JavaScriptChangedAutofilledValue(
@@ -2146,9 +2131,6 @@
           form_element, WebInputElement(),
           SynchronousFormCache(form_util::GetFormRendererId(form_element),
                                provisionally_saved_form()));
-      // TODO(crbug.com/40281981): Figure out if this is still needed, and
-      // document the reason, otherwise remove.
-      update_submission_data_on_user_edit();
       // Fire the form submission event to avoid missing submissions where
       // websites handle the onsubmit event. This also gets the form before
       // Javascript's submit event handler could change it. We don't clear
@@ -2376,14 +2358,6 @@
   submitted_forms_.clear();
 }
 
-DenseSet<form_util::ExtractOption> AutofillAgent::MaybeExtractDatalist(
-    DenseSet<form_util::ExtractOption> extract_options) {
-  if (config_.extract_all_datalists) {
-    extract_options.insert(form_util::ExtractOption::kDatalist);
-  }
-  return extract_options;
-}
-
 mojom::AutofillDriver* AutofillAgent::unsafe_autofill_driver() {
   if (IsPrerendering()) {
     if (!deferring_autofill_driver_) {
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 1715f41..206e4c1 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -441,10 +441,6 @@
   // cleared in this method.
   void OnFormNoLongerSubmittable();
 
-  // Amends the given `extract_options` with datalists if required.
-  DenseSet<form_util::ExtractOption> MaybeExtractDatalist(
-      DenseSet<form_util::ExtractOption> extract_options);
-
   // Helpers for SelectFieldOptionsChanged() and
   // DataListOptionsChanged(), which get called after a timer that is restarted
   // when another event of the same type started.
diff --git a/components/autofill/content/renderer/autofill_agent_browsertest.cc b/components/autofill/content/renderer/autofill_agent_browsertest.cc
index 36e4b392..a5dc1c0 100644
--- a/components/autofill/content/renderer/autofill_agent_browsertest.cc
+++ b/components/autofill/content/renderer/autofill_agent_browsertest.cc
@@ -996,7 +996,7 @@
   FormFieldData form_field;
   form_util::WebFormControlElementToFormFieldForTesting(
       blink::WebFormElement(), field, &autofill_agent().field_data_manager(),
-      {}, &form_field);
+      &form_field);
 
   form_field.set_value(u"autofilled");
   form_field.set_is_autofilled(true);
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc
index ba9825b..2a821b8 100644
--- a/components/autofill/content/renderer/form_autofill_util.cc
+++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -1889,15 +1889,14 @@
   return form_controls;
 }
 
-// Fills out a FormField object from a given autofillable WebFormControlElement.
-// |extract_options|: See the enum ExtractOption above for details. Field
-// properties will be copied from |field_data_manager|, if the argument is not
-// null and has entry for |element| (see properties in FieldPropertiesFlags).
+// Populates out a FormField object from a given autofillable
+// WebFormControlElement. Field properties are copied from |field_data_manager|,
+// if the argument is not null and has entry for |element| (see properties in
+// FieldPropertiesFlags).
 void WebFormControlElementToFormField(
     const WebFormElement& form_element,
     const WebFormControlElement& element,
     const FieldDataManager* field_data_manager,
-    DenseSet<ExtractOption> extract_options,
     FormFieldData* field,
     ShadowFieldData* shadow_data) {
   DCHECK(field);
@@ -2065,8 +2064,7 @@
     const WebDocument& document,
     const WebFormElement& form_element,
     const FieldDataManager& field_data_manager,
-    ButtonTitlesCache* button_titles_cache,
-    DenseSet<ExtractOption> extract_options) {
+    ButtonTitlesCache* button_titles_cache) {
   CHECK(!form_element || form_element.GetDocument() == document,
         base::NotFatalUntil::M142);
 
@@ -2124,8 +2122,8 @@
     fields.emplace_back();
     shadow_fields.emplace_back();
     WebFormControlElementToFormField(form_element, control_element,
-                                     &field_data_manager, extract_options,
-                                     &fields.back(), &shadow_fields.back());
+                                     &field_data_manager, &fields.back(),
+                                     &shadow_fields.back());
 
     // Finds the last frame that precedes |control_element|.
     while (next_iframe < iframe_elements.size() &&
@@ -2246,12 +2244,10 @@
     const WebFormElement& form_element,
     const FieldDataManager& field_data_manager,
     const CallTimerState& timer_state,
-    ButtonTitlesCache* button_titles_cache,
-    DenseSet<ExtractOption> extract_options) {
+    ButtonTitlesCache* button_titles_cache) {
   ScopedCallTimer timer("ExtractFormData", timer_state);
   return ExtractFormDataWithFieldsAndFrames(
-      document, form_element, field_data_manager, button_titles_cache,
-      extract_options);
+      document, form_element, field_data_manager, button_titles_cache);
 }
 
 GURL GetCanonicalActionForForm(const WebFormElement& form) {
@@ -2419,7 +2415,6 @@
     const FieldDataManager& field_data_manager,
     const CallTimerState& timer_state,
     form_util::ButtonTitlesCache* button_titles_cache,
-    DenseSet<ExtractOption> extract_options,
     const SynchronousFormCache& form_cache) {
   DCHECK(element);
 
@@ -2429,17 +2424,16 @@
 
   WebDocument document = element.GetDocument();
   WebFormElement owning_form = element.GetOwningFormForAutofill();
-  std::optional<FormData> form = form_cache.GetOrExtractForm(
-      document, owning_form, field_data_manager, timer_state,
-      button_titles_cache, extract_options);
+  std::optional<FormData> form =
+      form_cache.GetOrExtractForm(document, owning_form, field_data_manager,
+                                  timer_state, button_titles_cache);
   const bool extract_form_data_succeeded = form.has_value();
 
   if (!form) {
     // If we couldn't extract the form, ignore the fields other than `element`.
     // This gives Autocomplete and other handlers the chance to handle it.
     FormFieldData field;
-    WebFormControlElementToFormField(owning_form, element, nullptr,
-                                     extract_options, &field,
+    WebFormControlElementToFormField(owning_form, element, nullptr, &field,
                                      /*shadow_data=*/nullptr);
     form.emplace();
     form->set_fields({std::move(field)});
@@ -3075,10 +3069,9 @@
     const WebFormElement& form_element,
     const WebFormControlElement& element,
     const FieldDataManager* field_data_manager,
-    DenseSet<ExtractOption> extract_options,
     FormFieldData* field) {
   WebFormControlElementToFormField(form_element, element, field_data_manager,
-                                   extract_options, field,
+                                   field,
                                    /*shadow_data=*/nullptr);
 }
 
diff --git a/components/autofill/content/renderer/form_autofill_util.h b/components/autofill/content/renderer/form_autofill_util.h
index 162ea86..6b43eaf2 100644
--- a/components/autofill/content/renderer/form_autofill_util.h
+++ b/components/autofill/content/renderer/form_autofill_util.h
@@ -64,18 +64,6 @@
 // heuristics for a given form element.
 using ButtonTitlesCache = base::flat_map<FormRendererId, ButtonTitleList>;
 
-// A bit field mask to extract data from WebFormControlElement.
-// Copied to components/autofill/ios/browser/resources/autofill_controller.js.
-enum class ExtractOption {
-  kBounds,    // Extract bounds from WebFormControlElement, could
-              // trigger layout if needed.
-  kDatalist,  // Extract datalist from WebFormControlElement, the total
-              // number of options is up to kMaxListSize and each option
-              // has as far as kMaxDataLength.
-  kMinValue = kBounds,
-  kMaxValue = kDatalist,
-};
-
 // Extract FormData from `form_element` or the unowned form if
 // `form_element.IsNull()`.
 //
@@ -90,8 +78,7 @@
     const blink::WebFormElement& form_element,
     const FieldDataManager& field_data_manager,
     const CallTimerState& timer_state,
-    ButtonTitlesCache* button_titles_cache,
-    DenseSet<ExtractOption> extract_options = {});
+    ButtonTitlesCache* button_titles_cache);
 
 // Helper function to assist in getting the canonical form of the action and
 // origin. The action will properly take into account <BASE>, and both will
@@ -155,7 +142,6 @@
     const FieldDataManager& field_data_manager,
     const CallTimerState& timer_state,
     form_util::ButtonTitlesCache* button_titles_cache,
-    DenseSet<ExtractOption> extract_options,
     const SynchronousFormCache& form_cache);
 
 // Creates a FormData containing a single field out of a contenteditable
@@ -356,7 +342,6 @@
     const blink::WebFormElement& form_element,
     const blink::WebFormControlElement& element,
     const FieldDataManager* field_data_manager,
-    DenseSet<ExtractOption> extract_options,
     FormFieldData* field);
 
 }  // namespace form_util
diff --git a/components/autofill/content/renderer/form_autofill_util_browsertest.cc b/components/autofill/content/renderer/form_autofill_util_browsertest.cc
index dc916238..e42c35d09 100644
--- a/components/autofill/content/renderer/form_autofill_util_browsertest.cc
+++ b/components/autofill/content/renderer/form_autofill_util_browsertest.cc
@@ -226,21 +226,17 @@
 
   WebDocument GetDocument() { return GetMainFrame()->GetDocument(); }
 
-  std::optional<FormData> ExtractFormData(
-      WebFormElement form,
-      DenseSet<ExtractOption> extract_options = {}) {
-    return form_util::ExtractFormData(
-        GetDocument(), form, field_data_manager(), kCallTimerStateDummy,
-        /*button_titles_cache=*/nullptr, extract_options);
+  std::optional<FormData> ExtractFormData(WebFormElement form) {
+    return form_util::ExtractFormData(GetDocument(), form, field_data_manager(),
+                                      kCallTimerStateDummy,
+                                      /*button_titles_cache=*/nullptr);
   }
 
   std::optional<std::pair<FormData, raw_ref<const FormFieldData>>>
-  FindFormAndFieldForFormControlElement(
-      WebFormControlElement control,
-      DenseSet<ExtractOption> extract_options = {}) {
+  FindFormAndFieldForFormControlElement(WebFormControlElement control) {
     return form_util::FindFormAndFieldForFormControlElement(
         control, field_data_manager(), kCallTimerStateDummy,
-        /*button_titles_cache=*/nullptr, extract_options,
+        /*button_titles_cache=*/nullptr,
         /*form_cache=*/{});
   }
 
@@ -966,8 +962,7 @@
   WebDocument doc = GetDocument();
   auto web_control = GetFormControlElementById(doc, "i1");
   std::optional<std::pair<FormData, raw_ref<const FormFieldData>>>
-      form_and_field = FindFormAndFieldForFormControlElement(
-          web_control, {ExtractOption::kBounds});
+      form_and_field = FindFormAndFieldForFormControlElement(web_control);
 
   ASSERT_TRUE(form_and_field);
   auto& [form, field] = *form_and_field;
@@ -980,8 +975,7 @@
   WebDocument doc = GetDocument();
   auto web_control = GetFormControlElementById(doc, "i1");
   std::optional<std::pair<FormData, raw_ref<const FormFieldData>>>
-      form_and_field = FindFormAndFieldForFormControlElement(
-          web_control, {ExtractOption::kBounds});
+      form_and_field = FindFormAndFieldForFormControlElement(web_control);
 
   ASSERT_TRUE(form_and_field);
   auto& [form, field] = *form_and_field;
@@ -1029,8 +1023,7 @@
   WebDocument doc = GetDocument();
   auto web_control = GetElementById(doc, "i1").To<WebInputElement>();
   std::optional<std::pair<FormData, raw_ref<const FormFieldData>>>
-      form_and_field = FindFormAndFieldForFormControlElement(
-          web_control, {ExtractOption::kDatalist});
+      form_and_field = FindFormAndFieldForFormControlElement(web_control);
 
   ASSERT_TRUE(form_and_field);
   auto& [form, field] = *form_and_field;
diff --git a/components/autofill/content/renderer/form_cache.cc b/components/autofill/content/renderer/form_cache.cc
index a161a389..b2ed67172 100644
--- a/components/autofill/content/renderer/form_cache.cc
+++ b/components/autofill/content/renderer/form_cache.cc
@@ -24,8 +24,6 @@
 
 namespace autofill {
 
-using form_util::ExtractOption;
-
 namespace {
 
 // Determines whether the form is interesting enough to be sent to the browser
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc
index 3c29361..dafb672 100644
--- a/components/autofill/content/renderer/password_autofill_agent.cc
+++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -102,7 +102,6 @@
 
 namespace {
 
-using form_util::ExtractOption;
 using form_util::GetFieldRendererId;
 using form_util::GetFormByRendererId;
 using form_util::GetFormControlByRendererId;
@@ -1210,8 +1209,7 @@
           user_input, field_data_manager(),
           autofill_agent_->GetCallTimerState(
               CallTimerState::CallSite::kShowSuggestionPopup),
-          autofill_agent_->button_titles_cache(),
-          /*extract_options=*/{}, form_cache);
+          autofill_agent_->button_titles_cache(), form_cache);
   if (!form_and_field) {
     return std::nullopt;
   }
diff --git a/components/autofill/content/renderer/password_form_conversion_utils.cc b/components/autofill/content/renderer/password_form_conversion_utils.cc
index 1b6af21..14c16ebb 100644
--- a/components/autofill/content/renderer/password_form_conversion_utils.cc
+++ b/components/autofill/content/renderer/password_form_conversion_utils.cc
@@ -33,8 +33,6 @@
 
 namespace autofill {
 
-using form_util::ExtractOption;
-
 namespace {
 
 const char kPasswordSiteUrlRegex[] =
diff --git a/components/autofill/content/renderer/synchronous_form_cache.cc b/components/autofill/content/renderer/synchronous_form_cache.cc
index 39a921e..1608331 100644
--- a/components/autofill/content/renderer/synchronous_form_cache.cc
+++ b/components/autofill/content/renderer/synchronous_form_cache.cc
@@ -39,8 +39,7 @@
     const blink::WebFormElement& form_element,
     const FieldDataManager& field_data_manager,
     const CallTimerState& timer_state,
-    form_util::ButtonTitlesCache* button_titles_cache,
-    DenseSet<form_util::ExtractOption> extract_options) const {
+    form_util::ButtonTitlesCache* button_titles_cache) const {
   if (!cache_.empty()) {
     if (FormRendererId form_id = form_util::GetFormRendererId(form_element);
         cache_.contains(form_id)) {
@@ -62,8 +61,7 @@
 #endif  // !BUILDFLAG(IS_ANDROID)
   }
   return form_util::ExtractFormData(document, form_element, field_data_manager,
-                                    timer_state, button_titles_cache,
-                                    extract_options);
+                                    timer_state, button_titles_cache);
 }
 
 void SynchronousFormCache::Insert(FormRendererId form_id,
diff --git a/components/autofill/content/renderer/synchronous_form_cache.h b/components/autofill/content/renderer/synchronous_form_cache.h
index e86fbd9..c3b68a7f 100644
--- a/components/autofill/content/renderer/synchronous_form_cache.h
+++ b/components/autofill/content/renderer/synchronous_form_cache.h
@@ -54,8 +54,7 @@
       const blink::WebFormElement& form_element,
       const FieldDataManager& field_data_manager,
       const CallTimerState& timer_state,
-      form_util::ButtonTitlesCache* button_titles_cache,
-      DenseSet<form_util::ExtractOption> extract_options = {}) const;
+      form_util::ButtonTitlesCache* button_titles_cache) const;
 
  private:
   // Stores for a given FormRendererId the last result of trying to extract the
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index eab6b060..debe4cc 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -1260,6 +1260,7 @@
     ":browser",
     "//components/autofill/core/common:test_support",
     "//components/optimization_guide/core:features",
+    "//components/strike_database:proto",
     "//components/strike_database:test_support",
   ]
 
@@ -1715,6 +1716,7 @@
     "//components/security_state/core",
     "//components/signin/public/base:test_support",
     "//components/signin/public/identity_manager:test_support",
+    "//components/strike_database:features",
     "//components/strings",
     "//components/sync",
     "//components/sync:test_support",
diff --git a/components/autofill/core/browser/foundations/browser_autofill_manager.cc b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
index 7dcfcb1..c30e1dd 100644
--- a/components/autofill/core/browser/foundations/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/foundations/browser_autofill_manager.cc
@@ -3013,8 +3013,6 @@
     return {};
   }
 #endif
-  metrics_->address_form_event_logger.OnDidPollSuggestions(
-      trigger_field.global_id());
 
   // If the user triggers suggestions on an autofilled field, field-by-field
   // filling suggestions should be shown so that the user could easily correct
@@ -3062,8 +3060,6 @@
     autofill_metrics::SuggestionRankingContext& ranking_context) {
   metrics_->credit_card_form_event_logger.set_signin_state_for_metrics(
       metrics_->signin_state_for_metrics);
-  metrics_->credit_card_form_event_logger.OnDidPollSuggestions(
-      trigger_field.global_id());
 
   std::u16string card_number_field_value = u"";
   bool is_card_number_autofilled = false;
@@ -3134,8 +3130,6 @@
   if (!valuables_manager) {
     return {};
   }
-  metrics_->loyalty_card_form_event_logger.OnDidPollSuggestions(
-      field.global_id());
   return GetSuggestionsForLoyaltyCards(form, form_structure, field,
                                        autofill_field, client());
 }
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
index fa87cc9..aa878b91 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -691,15 +691,6 @@
 
   autofill_manager().AddSeenForm(form, field_types);
 
-  // Simulate an Autofill query on a credit card field.
-  {
-    base::UserActionTester user_action_tester;
-    autofill_manager().OnAskForValuesToFillTest(
-        form, form.fields().front().global_id());
-    EXPECT_EQ(1, user_action_tester.GetActionCount(
-                     "Autofill_PolledCreditCardSuggestions"));
-  }
-
   // Simulate showing a credit card suggestion polled from "Name on card" field.
   {
     base::UserActionTester user_action_tester;
@@ -887,15 +878,6 @@
 
   autofill_manager().AddSeenForm(form, field_types);
 
-  // Simulate an Autofill query on a profile field.
-  {
-    base::UserActionTester user_action_tester;
-    autofill_manager().OnAskForValuesToFillTest(form,
-                                                form.fields()[0].global_id());
-    EXPECT_EQ(1, user_action_tester.GetActionCount(
-                     "Autofill_PolledProfileSuggestions"));
-  }
-
   // Simulate showing a profile suggestion polled from "State" field.
   {
     base::UserActionTester user_action_tester;
@@ -1009,14 +991,6 @@
         1, user_action_tester.GetActionCount("Autofill_ParsedLoyaltyCardForm"));
   }
 
-  // Simulate an Autofill query on a loyalty card field.
-  {
-    base::UserActionTester user_action_tester;
-    autofill_manager().OnAskForValuesToFillTest(form,
-                                                form.fields()[1].global_id());
-    EXPECT_EQ(1, user_action_tester.GetActionCount(
-                     "Autofill_PolledLoyaltyCardSuggestions"));
-  }
   // Simulate showing a loyalty card suggestion polled from "Loyalty Number"
   // field.
   {
@@ -1027,55 +1001,6 @@
   }
 }
 
-// Tests that the Autofill_PolledCreditCardSuggestions user action is only
-// logged once if the field is queried repeatedly.
-TEST_F(AutofillMetricsTest, PolledCreditCardSuggestions_DebounceLogs) {
-  RecreateCreditCards(/*include_local_credit_card=*/true,
-                      /*include_masked_server_credit_card=*/false,
-                      /*masked_card_is_enrolled_for_virtual_card=*/false);
-
-  FormData form =
-      CreateForm({CreateTestFormField("Name on card", "cc-name", "",
-                                      FormControlType::kInputText),
-                  CreateTestFormField("Credit card", "cardnum", "",
-                                      FormControlType::kInputText),
-                  CreateTestFormField("Expiration date", "expdate", "",
-                                      FormControlType::kInputText)});
-
-  std::vector<FieldType> field_types = {CREDIT_CARD_NAME_FULL,
-                                        CREDIT_CARD_NUMBER,
-                                        CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR};
-
-  autofill_manager().AddSeenForm(form, field_types);
-
-  // Simulate an Autofill query on a credit card field. A poll should be logged.
-  base::UserActionTester user_action_tester;
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[0].global_id());
-  EXPECT_EQ(1, user_action_tester.GetActionCount(
-                   "Autofill_PolledCreditCardSuggestions"));
-
-  // Simulate a second query on the same field. There should still only be one
-  // logged poll.
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[0].global_id());
-  EXPECT_EQ(1, user_action_tester.GetActionCount(
-                   "Autofill_PolledCreditCardSuggestions"));
-
-  // Simulate a query to another field. There should be a second poll logged.
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[1].global_id());
-  EXPECT_EQ(2, user_action_tester.GetActionCount(
-                   "Autofill_PolledCreditCardSuggestions"));
-
-  // Simulate a query back to the initial field. There should be a third poll
-  // logged.
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[0].global_id());
-  EXPECT_EQ(3, user_action_tester.GetActionCount(
-                   "Autofill_PolledCreditCardSuggestions"));
-}
-
 // Tests that the Autofill.QueriedCreditCardFormIsSecure histogram is logged
 // properly.
 TEST_F(AutofillMetricsTest, QueriedCreditCardFormIsSecure) {
@@ -1135,50 +1060,6 @@
   }
 }
 
-// Tests that the Autofill_PolledProfileSuggestions user action is only logged
-// once if the field is queried repeatedly.
-TEST_F(AutofillMetricsTest, PolledProfileSuggestions_DebounceLogs) {
-  RecreateProfile();
-
-  FormData form = CreateForm(
-      {CreateTestFormField("State", "state", "", FormControlType::kInputText),
-       CreateTestFormField("City", "city", "", FormControlType::kInputText),
-       CreateTestFormField("Street", "street", "",
-                           FormControlType::kInputText)});
-
-  std::vector<FieldType> field_types = {ADDRESS_HOME_STATE, ADDRESS_HOME_CITY,
-                                        ADDRESS_HOME_STREET_ADDRESS};
-
-  autofill_manager().AddSeenForm(form, field_types);
-
-  // Simulate an Autofill query on a profile field. A poll should be logged.
-  base::UserActionTester user_action_tester;
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[0].global_id());
-  EXPECT_EQ(1, user_action_tester.GetActionCount(
-                   "Autofill_PolledProfileSuggestions"));
-
-  // Simulate a second query on the same field. There should still only be poll
-  // logged.
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[0].global_id());
-  EXPECT_EQ(1, user_action_tester.GetActionCount(
-                   "Autofill_PolledProfileSuggestions"));
-
-  // Simulate a query to another field. There should be a second poll logged.
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[1].global_id());
-  EXPECT_EQ(2, user_action_tester.GetActionCount(
-                   "Autofill_PolledProfileSuggestions"));
-
-  // Simulate a query back to the initial field. There should be a third poll
-  // logged.
-  autofill_manager().OnAskForValuesToFillTest(form,
-                                              form.fields()[0].global_id());
-  EXPECT_EQ(3, user_action_tester.GetActionCount(
-                   "Autofill_PolledProfileSuggestions"));
-}
-
 // Test that we log submitted form events for credit cards.
 TEST_F(AutofillMetricsTest, CreditCardGetRealPanDuration_ServerCard) {
   // Creating masked card
diff --git a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc
index a1b5eb0..da630e6 100644
--- a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.cc
@@ -269,11 +269,6 @@
   }
 }
 
-void AddressFormEventLogger::RecordPollSuggestions() {
-  base::RecordAction(
-      base::UserMetricsAction("Autofill_PolledProfileSuggestions"));
-}
-
 void AddressFormEventLogger::RecordParseForm() {
   base::RecordAction(base::UserMetricsAction("Autofill_ParsedProfileForm"));
 }
diff --git a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h
index e648cda..0ad293f 100644
--- a/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h
+++ b/components/autofill/core/browser/metrics/form_events/address_form_event_logger.h
@@ -89,7 +89,6 @@
   void OnDestroyed() override;
 
  protected:
-  void RecordPollSuggestions() override;
   void RecordParseForm() override;
   void RecordShowSuggestions() override;
   void OnLog(const std::string& name,
diff --git a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
index 89c096e..3d0d2c3d 100644
--- a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.cc
@@ -590,11 +590,6 @@
   return filled_credit_card_;
 }
 
-void CreditCardFormEventLogger::RecordPollSuggestions() {
-  base::RecordAction(
-      base::UserMetricsAction("Autofill_PolledCreditCardSuggestions"));
-}
-
 void CreditCardFormEventLogger::RecordParseForm() {
   base::RecordAction(base::UserMetricsAction("Autofill_ParsedCreditCardForm"));
 }
diff --git a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h
index 853395f..e28babe 100644
--- a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h
+++ b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger.h
@@ -153,7 +153,6 @@
 
  protected:
   // FormEventLoggerBase pure-virtual overrides.
-  void RecordPollSuggestions() override;
   void RecordParseForm() override;
   void RecordShowSuggestions() override;
 
diff --git a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger_unittest.cc b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger_unittest.cc
index 2192603..1276aae 100644
--- a/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger_unittest.cc
+++ b/components/autofill/core/browser/metrics/form_events/credit_card_form_event_logger_unittest.cc
@@ -1915,25 +1915,16 @@
 
   autofill_manager().AddSeenForm(form, field_types);
 
-  // Simulate an Autofill query on a credit card field.
-  {
-    base::UserActionTester user_action_tester;
-    autofill_manager().OnAskForValuesToFillTest(
-        form, form.fields().front().global_id());
-    EXPECT_EQ(1, user_action_tester.GetActionCount(
-                     "Autofill_PolledCreditCardSuggestions"));
-  }
-
   // Simulate submitting the credit card form.
-  {
-    base::HistogramTester histograms;
-    SubmitForm(form);
-    histograms.ExpectBucketCount("Autofill.FormEvents.CreditCard",
-                                 FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1);
-    histograms.ExpectBucketCount(
-        "Autofill.FormEvents.CreditCard.WithOnlyLocalData",
-        FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1);
-  }
+  base::HistogramTester histograms;
+  autofill_manager().OnAskForValuesToFillTest(
+      form, form.fields().front().global_id());
+  SubmitForm(form);
+  histograms.ExpectBucketCount("Autofill.FormEvents.CreditCard",
+                               FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1);
+  histograms.ExpectBucketCount(
+      "Autofill.FormEvents.CreditCard.WithOnlyLocalData",
+      FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1);
 }
 
 // Tests that credit card form submissions are *not* logged specially when the
@@ -1947,24 +1938,15 @@
   auto [form, field_types] = CreateNameNumberYearForm();
   autofill_manager().AddSeenForm(form, field_types);
 
-  // Simulate an Autofill query on a credit card field.
-  {
-    base::UserActionTester user_action_tester;
-    autofill_manager().OnAskForValuesToFillTest(
-        form, form.fields().back().global_id());
-    EXPECT_EQ(1, user_action_tester.GetActionCount(
-                     "Autofill_PolledCreditCardSuggestions"));
-  }
-
   // Simulate submitting the credit card form.
-  {
-    base::HistogramTester histograms;
-    SubmitForm(form);
-    histograms.ExpectBucketCount("Autofill.FormEvents.CreditCard",
-                                 FORM_EVENT_NO_SUGGESTION_WILL_SUBMIT_ONCE, 1);
-    histograms.ExpectBucketCount("Autofill.FormEvents.CreditCard",
-                                 FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1);
-  }
+  base::HistogramTester histograms;
+  autofill_manager().OnAskForValuesToFillTest(form,
+                                              form.fields().back().global_id());
+  SubmitForm(form);
+  histograms.ExpectBucketCount("Autofill.FormEvents.CreditCard",
+                               FORM_EVENT_NO_SUGGESTION_WILL_SUBMIT_ONCE, 1);
+  histograms.ExpectBucketCount("Autofill.FormEvents.CreditCard",
+                               FORM_EVENT_NO_SUGGESTION_SUBMITTED_ONCE, 1);
 }
 
 }  // namespace autofill::autofill_metrics
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
index d65f8e4..7af37a2 100644
--- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
+++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.cc
@@ -96,17 +96,6 @@
   }
 }
 
-void FormEventLoggerBase::OnDidPollSuggestions(FieldGlobalId field_id) {
-  // Record only one poll user action for consecutive polls of the same field.
-  // This is to avoid recording too many poll actions (for example when a user
-  // types in a field, triggering multiple queries) to make the analysis more
-  // simple.
-  if (field_id != last_polled_field_id_) {
-    RecordPollSuggestions();
-    last_polled_field_id_ = field_id;
-  }
-}
-
 void FormEventLoggerBase::OnDidIdentifyForm(
     const FormStructure& form,
     FormIdentificationTime identification_time) {
diff --git a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
index ca5d8c4..87e3f8d 100644
--- a/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
+++ b/components/autofill/core/browser/metrics/form_events/form_event_logger_base.h
@@ -45,8 +45,6 @@
 
   void OnDidInteractWithAutofillableForm(const FormStructure& form);
 
-  void OnDidPollSuggestions(FieldGlobalId field_id);
-
   void OnDidIdentifyForm(const FormStructure& form,
                          FormIdentificationTime identification_time);
 
@@ -113,7 +111,6 @@
   AutofillClient& client();
   AutofillDriver& driver();
 
-  virtual void RecordPollSuggestions() = 0;
   virtual void RecordParseForm() = 0;
   virtual void RecordShowSuggestions() = 0;
 
@@ -234,9 +231,6 @@
   AblationGroup conditional_ablation_group_ = AblationGroup::kDefault;
   std::optional<base::TimeDelta> time_from_interaction_to_submission_;
 
-  // The ID of the last field that was polled for suggestions.
-  FieldGlobalId last_polled_field_id_;
-
   // Used to count consecutive modifications on the same field as one change.
   FieldGlobalId last_field_global_id_modified_by_user_;
   // Keeps counts of Autofill fills and form elements that were modified by the
diff --git a/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.cc b/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.cc
index 56f3c0e..326d6e6d 100644
--- a/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.cc
+++ b/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.cc
@@ -104,11 +104,6 @@
   card_categories_filled_.insert(loyalty_card.GetAffiliationCategory(url));
 }
 
-void LoyaltyCardFormEventLogger::RecordPollSuggestions() {
-  base::RecordAction(
-      base::UserMetricsAction("Autofill_PolledLoyaltyCardSuggestions"));
-}
-
 void LoyaltyCardFormEventLogger::RecordParseForm() {
   base::RecordAction(base::UserMetricsAction("Autofill_ParsedLoyaltyCardForm"));
 }
diff --git a/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.h b/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.h
index 29cffcef..835ad50 100644
--- a/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.h
+++ b/components/autofill/core/browser/metrics/form_events/loyalty_card_form_event_logger.h
@@ -46,7 +46,6 @@
       const GURL& url);
 
  protected:
-  void RecordPollSuggestions() override;
   void RecordParseForm() override;
   void RecordShowSuggestions() override;
 
diff --git a/components/autofill/core/browser/payments/save_and_fill_manager_impl_unittest.cc b/components/autofill/core/browser/payments/save_and_fill_manager_impl_unittest.cc
index 47b3543..703afd3a 100644
--- a/components/autofill/core/browser/payments/save_and_fill_manager_impl_unittest.cc
+++ b/components/autofill/core/browser/payments/save_and_fill_manager_impl_unittest.cc
@@ -21,6 +21,7 @@
 #include "components/autofill/core/browser/strike_databases/payments/test_strike_database.h"
 #include "components/autofill/core/browser/test_utils/autofill_test_utils.h"
 #include "components/autofill/core/common/autofill_prefs.h"
+#include "components/strike_database/strike_database_features.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -236,7 +237,7 @@
 TEST_F(SaveAndFillManagerImplTest, OnUserDidDecideOnLocalSave_Accepted) {
   // Disable StrikeDB check so it will not block feature prompt.
   base::test::ScopedFeatureList feature_list(
-      features::kDisableAutofillStrikeSystem);
+      strike_database::features::kDisableStrikeSystem);
   SaveAndFillStrikeDatabase save_and_fill_strike_database(strike_database_);
   // Add an existing strike.
   save_and_fill_strike_database.AddStrike();
@@ -621,7 +622,7 @@
 TEST_F(SaveAndFillManagerImplTest, OnUserDidDecideOnUploadSave_Accepted) {
   // Disable StrikeDB check so it will not block feature prompt.
   base::test::ScopedFeatureList feature_list(
-      features::kDisableAutofillStrikeSystem);
+      strike_database::features::kDisableStrikeSystem);
   SaveAndFillStrikeDatabase save_and_fill_strike_database(strike_database_);
   // Add an existing strike.
   save_and_fill_strike_database.AddStrike();
diff --git a/components/autofill/core/browser/proto/BUILD.gn b/components/autofill/core/browser/proto/BUILD.gn
index abb310e..e3741ea 100644
--- a/components/autofill/core/browser/proto/BUILD.gn
+++ b/components/autofill/core/browser/proto/BUILD.gn
@@ -13,7 +13,6 @@
     "password_requirements_shard.proto",
     "server.proto",
     "states.proto",
-    "strike_data.proto",
   ]
 }
 
diff --git a/components/autofill/core/browser/strike_databases/addresses/address_suggestion_strike_database.cc b/components/autofill/core/browser/strike_databases/addresses/address_suggestion_strike_database.cc
index 007735b..0efacd0 100644
--- a/components/autofill/core/browser/strike_databases/addresses/address_suggestion_strike_database.cc
+++ b/components/autofill/core/browser/strike_databases/addresses/address_suggestion_strike_database.cc
@@ -7,7 +7,6 @@
 #include <string>
 
 #include "base/strings/string_number_conversions.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
 #include "components/autofill/core/browser/strike_databases/addresses/autofill_profile_save_strike_database.h"
 #include "components/autofill/core/common/signatures.h"
 
diff --git a/components/autofill/core/browser/strike_databases/payments/test_strike_database.cc b/components/autofill/core/browser/strike_databases/payments/test_strike_database.cc
index 11d35087..526d4d4 100644
--- a/components/autofill/core/browser/strike_databases/payments/test_strike_database.cc
+++ b/components/autofill/core/browser/strike_databases/payments/test_strike_database.cc
@@ -4,7 +4,7 @@
 
 #include "components/autofill/core/browser/strike_databases/payments/test_strike_database.h"
 
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
+#include "components/strike_database/strike_data.pb.h"
 
 namespace autofill {
 
diff --git a/components/autofill/core/browser/strike_databases/payments/test_strike_database.h b/components/autofill/core/browser/strike_databases/payments/test_strike_database.h
index c90006b..08b5f30d 100644
--- a/components/autofill/core/browser/strike_databases/payments/test_strike_database.h
+++ b/components/autofill/core/browser/strike_databases/payments/test_strike_database.h
@@ -10,7 +10,7 @@
 #include <unordered_map>
 #include <utility>
 
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
+#include "components/strike_database/strike_data.pb.h"
 #include "components/strike_database/strike_database.h"
 
 namespace autofill {
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index 54c00439..71a0dbb 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -330,12 +330,6 @@
              base::FEATURE_ENABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_ANDROID)
 
-// If enabled, the Autofill strike system will not block features. Intended for
-// debugging/testing use only and should never be launched to users.
-BASE_FEATURE(kDisableAutofillStrikeSystem,
-             "DisableAutofillStrikeSystem",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 bool ShouldShowImprovedUserConsentForCreditCardSave() {
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX)
   // The new user consent UI is fully launched on MacOS, Windows and Linux.
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h
index 664d1c5..6e87b482 100644
--- a/components/autofill/core/common/autofill_payments_features.h
+++ b/components/autofill/core/common/autofill_payments_features.h
@@ -124,9 +124,6 @@
 COMPONENT_EXPORT(AUTOFILL)
 extern const base::FeatureParam<int> kAutofillVcnEnrollStrikeExpiryTimeDays;
 
-COMPONENT_EXPORT(AUTOFILL)
-BASE_DECLARE_FEATURE(kDisableAutofillStrikeSystem);
-
 // Return whether a [No thanks] button and new messaging is shown in the save
 // card bubbles. This will be called only on desktop platforms.
 COMPONENT_EXPORT(AUTOFILL)
diff --git a/components/autofill_prediction_improvements_strings_grdp/OWNERS b/components/autofill_prediction_improvements_strings_grdp/OWNERS
deleted file mode 100644
index 50a21bb..0000000
--- a/components/autofill_prediction_improvements_strings_grdp/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://components/autofill/OWNERS
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index 72075da..497c416 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "64.3",
-  "log_list_timestamp": "2025-09-01T12:54:38Z",
+  "version": "64.4",
+  "log_list_timestamp": "2025-09-02T12:52:33Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/AndroidRequestFinishedInfoWrapper.java b/components/cronet/android/java/src/org/chromium/net/impl/AndroidRequestFinishedInfoWrapper.java
index 28246fd..24373ec 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/AndroidRequestFinishedInfoWrapper.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/AndroidRequestFinishedInfoWrapper.java
@@ -59,8 +59,7 @@
                 new AndroidRequestFinishedInfoWrapper(
                         url,
                         annotations,
-                        new CronetMetrics(
-                                -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, false, 0, 0),
+                        CronetMetrics.empty(),
                         finishedReason,
                         responseInfo,
                         exception);
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
index a3b47ec..46e1aee 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetBidirectionalStream.java
@@ -861,12 +861,9 @@
         mMetrics = metrics;
         if (mMetrics == null) {
             // mMetrics can be null if the native counterpart never created an underlying native
-            // component for this request. In this scenario, initialize the mMetrics with sentinel
-            // values. This is not ideal, but this is how Cronet historically behaved and so we
-            // cannot change this behavior without running the risk of breaking apps.
-            mMetrics =
-                    new CronetMetrics(
-                            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, false, 0, 0);
+            // component for this request. Make sure we provide users with a non-null metrics object
+            // as some users would be broken otherwise.
+            mMetrics = CronetMetrics.empty();
         }
         mQuicConnectionMigrationAttempted = quicConnectionMigrationAttempted;
         mQuicConnectionMigrationSuccessful = quicConnectionMigrationSuccessful;
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java
index ede49ae..610b7e38 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetMetrics.java
@@ -54,6 +54,16 @@
         return (end >= start && start != -1) || end == -1;
     }
 
+    /**
+     * Returns a metrics object populated with empty values.
+     *
+     * <p>Ideally we should just provide Cronet users with a null Metrics object instead, but sadly,
+     * for historical reasons not all users handle a null object properly.
+     */
+    public static CronetMetrics empty() {
+        return new CronetMetrics(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, false, 0, 0);
+    }
+
     /** New-style constructor */
     @CalledByNative
     public CronetMetrics(
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
index 532697c..cf9cbee 100644
--- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
+++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequest.java
@@ -523,9 +523,14 @@
         }
     }
 
+    // The metrics are available once a terminal callback has started executing.
+    public CronetMetrics getFinishedRequestTimings() {
+        return mMetrics;
+    }
+
     /**
-     * Helper method to set final status of CronetUrlRequest and clean up the
-     * native request adapter.
+     * Helper method to set final status of CronetUrlRequest and clean up the native request
+     * adapter.
      */
     @GuardedBy("mUrlRequestAdapterLock")
     private void destroyRequestAdapterLocked(
@@ -802,6 +807,15 @@
     @SuppressWarnings("unused")
     @CalledByNative
     private void onCanceled() {
+        if (mMetrics == null) {
+            // It's possible for a race condition to happen where the user cancels the request
+            // before we've created the native adapter. This means that the native metrics
+            // does not even exist. So instead of not reporting anything, we'll report
+            // metrics with sentinel values.
+            //
+            // See crbug.com/328065446 for more details.
+            mMetrics = CronetMetrics.empty();
+        }
         Runnable task =
                 new Runnable() {
                     @Override
@@ -900,6 +914,14 @@
                     return;
                 }
             }
+            if (mMetrics == null) {
+                // there's no way to get the metrics once the native adapter has been destroyed.
+                // So if it was never reported from the native side which could happen for
+                // several reasons (e.g. failure before setting up the underlying request), then
+                // create the default empty sentinel valued metric object.
+                // See crbug.com/328065446 for more details.
+                mMetrics = CronetMetrics.empty();
+            }
             Runnable task =
                     new Runnable() {
                         @Override
@@ -1109,12 +1131,9 @@
         final RefCountDelegate inflightCallbackCount =
                 new RefCountDelegate(() -> mRequestContext.onRequestFinished());
         try {
-            // If the native adapter was never started, onMetricsCollected() was not called and so
-            // we have no metrics to report.
-            // TODO: https://issuetracker.google.com/328065446 - we should really prevent this from
-            // happening because we will end up not logging the metrics, and the user may end up
-            // waiting forever for a request finished callback that will never come.
-            if (mMetrics == null) return;
+            if (mMetrics == null) {
+                throw new IllegalStateException("The metrics should have been initialized.");
+            }
 
             if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                 try {
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
index 3c42f56c..d04a722 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/TestUrlRequestCallback.java
@@ -12,6 +12,8 @@
 import android.os.ConditionVariable;
 import android.os.StrictMode;
 
+import org.chromium.net.impl.CronetUrlRequest;
+
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.concurrent.ExecutorService;
@@ -266,6 +268,9 @@
     @Override
     public void onSucceeded(UrlRequest request, UrlResponseInfo info) {
         checkExecutorThread();
+        if (request instanceof CronetUrlRequest cronetUrlRequest) {
+            assertThat(cronetUrlRequest.getFinishedRequestTimings()).isNotNull();
+        }
         assertThat(request.isDone()).isTrue();
         assertThat(mResponseStep)
                 .isAnyOf(ResponseStep.ON_RESPONSE_STARTED, ResponseStep.ON_READ_COMPLETED);
@@ -287,6 +292,9 @@
         if (error.getCause() instanceof InlineExecutionProhibitedException) {
             mAllowDirectExecutor = true;
         }
+        if (request instanceof CronetUrlRequest cronetUrlRequest) {
+            assertThat(cronetUrlRequest.getFinishedRequestTimings()).isNotNull();
+        }
         checkExecutorThread();
         assertThat(request.isDone()).isTrue();
         // Shouldn't happen after success.
@@ -315,6 +323,9 @@
     @Override
     public void onCanceled(UrlRequest request, UrlResponseInfo info) {
         checkExecutorThread();
+        if (request instanceof CronetUrlRequest cronetUrlRequest) {
+            assertThat(cronetUrlRequest.getFinishedRequestTimings()).isNotNull();
+        }
         assertThat(request.isDone()).isTrue();
         // Should happen at most once for a single request.
         assertThat(mOnCanceledCalled).isFalse();
diff --git a/components/data_sharing/internal/group_data_model_unittest.cc b/components/data_sharing/internal/group_data_model_unittest.cc
index 3a4dabf..ad44adf 100644
--- a/components/data_sharing/internal/group_data_model_unittest.cc
+++ b/components/data_sharing/internal/group_data_model_unittest.cc
@@ -253,12 +253,12 @@
     size_t call_count = 0;
     EXPECT_CALL(observer_, OnGroupAdded(_, NotNullTime()))
         .Times(::testing::AtLeast(0))
-        .WillRepeatedly(::testing::DoAll(::testing::Invoke([&]() {
+        .WillRepeatedly(::testing::DoAll([&]() {
           ++call_count;
           if (call_count == number_of_groups) {
             run_loop.Quit();
           }
-        })));
+        }));
     run_loop.Run();
   }
 
diff --git a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_service_impl_unittest.cc b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_service_impl_unittest.cc
index 845f610..e652d21 100644
--- a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_service_impl_unittest.cc
+++ b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_service_impl_unittest.cc
@@ -20,7 +20,6 @@
 namespace {
 
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 using testing::ReturnRef;
 
@@ -54,9 +53,9 @@
 
     base::RunLoop run_loop;
     base::RepeatingClosure quit_closure = run_loop.QuitClosure();
-    EXPECT_CALL(mock_processor_, ModelReadyToSync).WillOnce(Invoke([&]() {
+    EXPECT_CALL(mock_processor_, ModelReadyToSync).WillOnce([&]() {
       quit_closure.Run();
-    }));
+    });
     EXPECT_CALL(mock_observer_, OnInitialized());
 
     service_ = std::make_unique<PersonalCollaborationDataServiceImpl>(
diff --git a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc
index cb73986..b047ea19 100644
--- a/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc
+++ b/components/data_sharing/internal/personal_collaboration_data/personal_collaboration_data_sync_bridge_unittest.cc
@@ -33,7 +33,6 @@
 using base::test::EqualsProto;
 using syncer::CollaborationId;
 using testing::_;
-using testing::Invoke;
 using testing::Return;
 using testing::ReturnRef;
 
@@ -120,9 +119,9 @@
 
     base::RunLoop run_loop;
     base::RepeatingClosure quit_closure = run_loop.QuitClosure();
-    EXPECT_CALL(processor_, ModelReadyToSync).WillOnce(Invoke([&]() {
+    EXPECT_CALL(processor_, ModelReadyToSync).WillOnce([&]() {
       quit_closure.Run();
-    }));
+    });
 
     bridge_ = std::make_unique<PersonalCollaborationDataSyncBridge>(
         processor_.CreateForwardingProcessor(),
@@ -631,9 +630,9 @@
   // Now, initialize the bridge.
   base::RunLoop run_loop;
   base::RepeatingClosure quit_closure = run_loop.QuitClosure();
-  EXPECT_CALL(processor_, ModelReadyToSync).WillOnce(Invoke([&]() {
+  EXPECT_CALL(processor_, ModelReadyToSync).WillOnce([&]() {
     quit_closure.Run();
-  }));
+  });
   bridge().MergeFullSyncData(bridge().CreateMetadataChangeList(),
                              syncer::EntityChangeList());
   run_loop.Run();
@@ -660,19 +659,18 @@
        ShouldReportErrorOnLoadFailure) {
   auto mock_store = std::make_unique<syncer::MockDataTypeStore>();
   EXPECT_CALL(*mock_store, ReadAllDataAndMetadata)
-      .WillOnce(Invoke([](syncer::DataTypeStore::ReadAllDataAndMetadataCallback
-                              callback) {
+      .WillOnce([](syncer::DataTypeStore::ReadAllDataAndMetadataCallback
+                       callback) {
         std::move(callback).Run(
             syncer::ModelError(
                 FROM_HERE,
                 syncer::ModelError::Type::kDataTypeStoreBackendDbReadFailed),
             /*entries=*/nullptr, /*metadata_batch=*/nullptr);
-      }));
+      });
 
   base::RunLoop run_loop;
   EXPECT_CALL(mock_processor(), ReportError(_))
-      .WillOnce(
-          Invoke([&](const syncer::ModelError& error) { run_loop.Quit(); }));
+      .WillOnce([&](const syncer::ModelError& error) { run_loop.Quit(); });
   CreateBridgeWithMockStore(std::move(mock_store));
   run_loop.Run();
   EXPECT_FALSE(bridge().IsInitialized());
@@ -684,41 +682,41 @@
 
   // Mock ReadAllDataAndMetadata to succeed.
   EXPECT_CALL(*mock_store, ReadAllDataAndMetadata)
-      .WillOnce(Invoke(
+      .WillOnce(
           [](syncer::DataTypeStore::ReadAllDataAndMetadataCallback callback) {
             std::move(callback).Run(
                 /*error=*/std::nullopt,
                 std::make_unique<syncer::DataTypeStore::RecordList>(),
                 std::make_unique<syncer::MetadataBatch>());
-          }));
+          });
 
   // Mock CreateWriteBatch to return a valid batch.
-  ON_CALL(*mock_store, CreateWriteBatch).WillByDefault(Invoke([]() {
+  ON_CALL(*mock_store, CreateWriteBatch).WillByDefault([]() {
     return std::make_unique<FakeWriteBatch>();
-  }));
+  });
 
   // Mock CommitWriteBatch to fail.
   EXPECT_CALL(*mock_store, CommitWriteBatch)
       .WillOnce(
-          Invoke([](std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch,
-                    syncer::DataTypeStore::CallbackWithResult callback) {
+          [](std::unique_ptr<syncer::DataTypeStore::WriteBatch> batch,
+             syncer::DataTypeStore::CallbackWithResult callback) {
             std::move(callback).Run(syncer::ModelError(
                 FROM_HERE,
                 syncer::ModelError::Type::kDataTypeStoreBackendDbWriteFailed));
-          }));
+          });
 
   base::RunLoop run_loop;
-  EXPECT_CALL(mock_processor(), ModelReadyToSync).WillOnce(Invoke([&]() {
+  EXPECT_CALL(mock_processor(), ModelReadyToSync).WillOnce([&]() {
     run_loop.Quit();
-  }));
+  });
   CreateBridgeWithMockStore(std::move(mock_store));
   run_loop.Run();
   ASSERT_TRUE(bridge().IsInitialized());
 
   base::RunLoop commit_run_loop;
   EXPECT_CALL(mock_processor(), ReportError(_))
-      .WillOnce(Invoke(
-          [&](const syncer::ModelError& error) { commit_run_loop.Quit(); }));
+      .WillOnce(
+          [&](const syncer::ModelError& error) { commit_run_loop.Quit(); });
   syncer::EntityChangeList change_list;
   change_list.push_back(CreateAddEntityChange(CreateTabGroupAccountSpecifics(
       CollaborationId(kTestCollaborationId), kTestTabGuid, kTestGroupGuid,
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.cc b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
index a560d65e..192297dc 100644
--- a/components/embedder_support/android/delegate/web_contents_delegate_android.cc
+++ b/components/embedder_support/android/delegate/web_contents_delegate_android.cc
@@ -10,6 +10,7 @@
 #include "base/android/jni_array.h"
 #include "base/android/jni_callback.h"
 #include "base/android/jni_string.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/notimplemented.h"
@@ -698,4 +699,29 @@
   Java_WebContentsDelegateAndroid_contentsZoomChange(env, obj, zoom_in);
 }
 
+content::NavigationController::UserAgentOverrideOption
+WebContentsDelegateAndroid::ShouldOverrideUserAgentForPrerender2(
+    const GURL& url) {
+  // Killswitch
+  if (!base::FeatureList::IsEnabled(
+          features::kPreloadingRespectUserAgentOverride)) {
+    return WebContentsDelegate::ShouldOverrideUserAgentForPrerender2(url);
+  }
+
+  JNIEnv* env = AttachCurrentThread();
+  ScopedJavaLocalRef<jobject> obj = GetJavaDelegate(env);
+  if (obj.is_null()) {
+    // Fallback to base class version when JNI is unavailable.
+    return WebContentsDelegate::ShouldOverrideUserAgentForPrerender2(url);
+  }
+
+  ScopedJavaLocalRef<jobject> j_url =
+      url::GURLAndroid::FromNativeGURL(env, url);
+  int j_override_option =
+      Java_WebContentsDelegateAndroid_shouldOverrideUserAgentForPrerender2(
+          env, obj, j_url);
+  return static_cast<content::NavigationController::UserAgentOverrideOption>(
+      j_override_option);
+}
+
 }  // namespace web_contents_delegate_android
diff --git a/components/embedder_support/android/delegate/web_contents_delegate_android.h b/components/embedder_support/android/delegate/web_contents_delegate_android.h
index a13f342..fb21bd2c 100644
--- a/components/embedder_support/android/delegate/web_contents_delegate_android.h
+++ b/components/embedder_support/android/delegate/web_contents_delegate_android.h
@@ -145,6 +145,8 @@
   content::BackForwardTransitionAnimationManager::FallbackUXConfig
   GetBackForwardTransitionFallbackUXConfig() override;
   void ContentsZoomChange(bool zoom_in) override;
+  content::NavigationController::UserAgentOverrideOption
+  ShouldOverrideUserAgentForPrerender2(const GURL& url) override;
 
  protected:
   base::android::ScopedJavaLocalRef<jobject> GetJavaDelegate(JNIEnv* env) const;
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid.java
index 8a83ee9..79b23043 100644
--- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid.java
+++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/WebContentsDelegateAndroid.java
@@ -18,6 +18,7 @@
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.content_public.browser.navigation_controller.UserAgentOverrideOption;
 import org.chromium.content_public.common.ResourceRequestBody;
 import org.chromium.url.GURL;
 
@@ -271,6 +272,17 @@
     public void contentsZoomChange(boolean zoomIn) {}
 
     /**
+     * Returns whether to override user agent for prerendering navigation.
+     *
+     * @param url The target URL of the prerendering navigation.
+     */
+    @CalledByNative
+    public @UserAgentOverrideOption int shouldOverrideUserAgentForPrerender2(GURL url) {
+        // Inherit UA override of the last committed navigation regardless of URL as fallback.
+        return UserAgentOverrideOption.INHERIT;
+    }
+
+    /**
      * Capture current visible native view as a bitmap.
      *
      * @param callback Executed asynchronously with the captured screenshot if this returns true.
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc
index 42c2abf..e78e927 100644
--- a/components/feed/feed_feature_list.cc
+++ b/components/feed/feed_feature_list.cc
@@ -99,7 +99,7 @@
 
 BASE_FEATURE(kWebFeedKillSwitch,
              "WebFeedKillSwitch",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kFeedRecyclerBinderUnmountOnDetach,
              "FeedRecyclerBinderUnmountOnDetach",
@@ -111,7 +111,7 @@
 
 BASE_FEATURE(kFeedHeaderRemoval,
              "FeedHeaderRemoval",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kFeedAudioOverviews,
              "FeedAudioOverviews",
diff --git a/components/history_clusters/core/query_clusters_state_unittest.cc b/components/history_clusters/core/query_clusters_state_unittest.cc
index 7655f583..0ccd91a 100644
--- a/components/history_clusters/core/query_clusters_state_unittest.cc
+++ b/components/history_clusters/core/query_clusters_state_unittest.cc
@@ -23,7 +23,6 @@
 using ::testing::_;
 using ::testing::DoAll;
 using ::testing::ElementsAre;
-using ::testing::Invoke;
 using ::testing::SaveArg;
 
 namespace history_clusters {
diff --git a/components/history_embeddings/ml_answerer_unittest.cc b/components/history_embeddings/ml_answerer_unittest.cc
index 3ba6be2..ce0d9d80 100644
--- a/components/history_embeddings/ml_answerer_unittest.cc
+++ b/components/history_embeddings/ml_answerer_unittest.cc
@@ -101,9 +101,9 @@
   });
 
   ON_CALL(session_1_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   Answerer::Context context("1");
   context.url_passages_map.insert({"url_1", {"passage_11", "passage_12"}});
@@ -121,17 +121,17 @@
   });
 
   ON_CALL(session_1_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   ON_CALL(session_1_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(0.6); })));
+                  callback) { std::move(callback).Run(0.6); }));
 
   ON_CALL(session_1_, ExecuteModel(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::
                   OptimizationGuideModelExecutionResultStreamingCallback
                       callback) {
@@ -146,7 +146,7 @@
                                     OptimizationGuideModelExecutionError::
                                         ModelExecutionError::kGenericFailure)),
                         /*provided_by_on_device=*/true, nullptr)));
-          })));
+          }));
 
   Answerer::Context context("1");
   context.url_passages_map.insert({"url_1", {"passage_11", "passage_12"}});
@@ -164,17 +164,17 @@
   });
 
   ON_CALL(session_1_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   ON_CALL(session_1_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(0.6); })));
+                  callback) { std::move(callback).Run(0.6); }));
 
   ON_CALL(session_1_, ExecuteModel(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::
                   OptimizationGuideModelExecutionResultStreamingCallback
                       callback) {
@@ -184,7 +184,7 @@
                                OptimizationGuideModelStreamingExecutionResult(
                                    base::ok(MakeResponse("Answer_1")),
                                    /*provided_by_on_device=*/true, nullptr)));
-          })));
+          }));
 
   Answerer::Context context("1");
   context.url_passages_map.insert({"url_1", {"passage_11", "passage_12"}});
@@ -211,29 +211,29 @@
       });
 
   ON_CALL(session_1_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   ON_CALL(session_2_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   ON_CALL(session_1_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(0.6); })));
+                  callback) { std::move(callback).Run(0.6); }));
 
   ON_CALL(session_2_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
                   callback) {
             std::move(callback).Run(0.9);
-          })));  // Speculative decoding should continue with this session.
+          }));  // Speculative decoding should continue with this session.
 
   ON_CALL(session_2_, ExecuteModel(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::
                   OptimizationGuideModelExecutionResultStreamingCallback
                       callback) {
@@ -243,7 +243,7 @@
                                OptimizationGuideModelStreamingExecutionResult(
                                    base::ok(MakeResponse("Answer_2")),
                                    /*provided_by_on_device=*/true, nullptr)));
-          })));
+          }));
 
   Answerer::Context context("1");
   context.url_passages_map.insert({"url_1", {"passage_11", "passage_12"}});
@@ -271,15 +271,15 @@
   });
 
   ON_CALL(session_1_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   // Below the default 0.5 threshold.
   ON_CALL(session_1_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(0.3); })));
+                  callback) { std::move(callback).Run(0.3); }));
 
   Answerer::Context context("1");
   context.url_passages_map.insert({"url_1", {"passage_11", "passage_12"}});
@@ -296,15 +296,15 @@
   });
 
   ON_CALL(session_1_, GetSizeInTokens(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelSizeInTokenCallback
-                  callback) { std::move(callback).Run(100); })));
+                  callback) { std::move(callback).Run(100); }));
 
   // Null score
   ON_CALL(session_1_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(std::nullopt); })));
+                  callback) { std::move(callback).Run(std::nullopt); }));
 
   Answerer::Context context("1");
   context.url_passages_map.insert({"url_1", {"passage_11", "passage_12"}});
diff --git a/components/history_embeddings/ml_intent_classifier_unittest.cc b/components/history_embeddings/ml_intent_classifier_unittest.cc
index 238df2f..eb29f54 100644
--- a/components/history_embeddings/ml_intent_classifier_unittest.cc
+++ b/components/history_embeddings/ml_intent_classifier_unittest.cc
@@ -152,9 +152,9 @@
 
   // Above threshold.
   ON_CALL(session_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(0.6); })));
+                  callback) { std::move(callback).Run(0.6); }));
 
   MlIntentClassifier intent_classifier(&executor_);
   {
@@ -174,9 +174,9 @@
 
   // below threshold.
   ON_CALL(session_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(0.4); })));
+                  callback) { std::move(callback).Run(0.4); }));
 
   MlIntentClassifier intent_classifier(&executor_);
   {
@@ -196,9 +196,9 @@
 
   // Null score
   ON_CALL(session_, Score(_, _))
-      .WillByDefault(testing::WithArg<1>(testing::Invoke(
+      .WillByDefault(testing::WithArg<1>(
           [&](optimization_guide::OptimizationGuideModelScoreCallback
-                  callback) { std::move(callback).Run(std::nullopt); })));
+                  callback) { std::move(callback).Run(std::nullopt); }));
 
   MlIntentClassifier intent_classifier(&executor_);
   {
diff --git a/components/password_manager/core/browser/password_form_metrics_recorder.cc b/components/password_manager/core/browser/password_form_metrics_recorder.cc
index 490e4f0..a8c836d 100644
--- a/components/password_manager/core/browser/password_form_metrics_recorder.cc
+++ b/components/password_manager/core/browser/password_form_metrics_recorder.cc
@@ -1142,8 +1142,6 @@
       break;
 
     // Other reasons to show a bubble:
-    // TODO(crbug.com/40123456): Decide how to collect metrics for this new UI.
-    case metrics_util::AUTOMATIC_SAVE_UNSYNCED_CREDENTIALS_LOCALLY:
     case metrics_util::MANUAL_MANAGE_PASSWORDS:
     case metrics_util::AUTOMATIC_GENERATED_PASSWORD_CONFIRMATION:
     case metrics_util::MANUAL_GENERATED_PASSWORD_CONFIRMATION:
diff --git a/components/password_manager/core/browser/password_manager_metrics_util.h b/components/password_manager/core/browser/password_manager_metrics_util.h
index de44c47..95c37b56 100644
--- a/components/password_manager/core/browser/password_manager_metrics_util.h
+++ b/components/password_manager/core/browser/password_manager_metrics_util.h
@@ -40,7 +40,7 @@
   MANUAL_WITH_PASSWORD_PENDING_UPDATE = 7,
   AUTOMATIC_WITH_PASSWORD_PENDING_UPDATE = 8,
   MANUAL_GENERATED_PASSWORD_CONFIRMATION = 9,
-  AUTOMATIC_SAVE_UNSYNCED_CREDENTIALS_LOCALLY = 10,
+  // Deprecated: AUTOMATIC_SAVE_UNSYNCED_CREDENTIALS_LOCALLY = 10,
   AUTOMATIC_COMPROMISED_CREDENTIALS_REMINDER = 11,
   AUTOMATIC_MOVE_TO_ACCOUNT_STORE = 12,
   MANUAL_BIOMETRIC_AUTHENTICATION_FOR_FILLING = 13,
diff --git a/components/password_manager/core/browser/password_store/login_database_async_helper.cc b/components/password_manager/core/browser/password_store/login_database_async_helper.cc
index bf56515c0..d9b0bcb 100644
--- a/components/password_manager/core/browser/password_store/login_database_async_helper.cc
+++ b/components/password_manager/core/browser/password_store/login_database_async_helper.cc
@@ -33,14 +33,12 @@
 
 LoginDatabaseAsyncHelper::LoginDatabaseAsyncHelper(
     std::unique_ptr<LoginDatabase> login_db,
-    UnsyncedCredentialsDeletionNotifier notifier,
     scoped_refptr<base::SequencedTaskRunner> main_task_runner,
     syncer::WipeModelUponSyncDisabledBehavior
         wipe_model_upon_sync_disabled_behavior)
     : login_db_(std::move(login_db)),
       wipe_model_upon_sync_disabled_behavior_(
           wipe_model_upon_sync_disabled_behavior),
-      deletion_notifier_(std::move(notifier)),
       main_task_runner_(std::move(main_task_runner)) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
   DCHECK(login_db_);
@@ -388,16 +386,6 @@
   deletions_have_synced_callbacks_.clear();
 }
 
-void LoginDatabaseAsyncHelper::NotifyUnsyncedCredentialsWillBeDeleted(
-    std::vector<PasswordForm> unsynced_credentials) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  DCHECK(IsAccountStore());
-  // |deletion_notifier_| only gets set for desktop.
-  if (deletion_notifier_) {
-    deletion_notifier_.Run(std::move(unsynced_credentials));
-  }
-}
-
 bool LoginDatabaseAsyncHelper::BeginTransaction() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (login_db_) {
diff --git a/components/password_manager/core/browser/password_store/login_database_async_helper.h b/components/password_manager/core/browser/password_store/login_database_async_helper.h
index b3e774d..ff7d1f5 100644
--- a/components/password_manager/core/browser/password_store/login_database_async_helper.h
+++ b/components/password_manager/core/browser/password_store/login_database_async_helper.h
@@ -40,7 +40,6 @@
  public:
   LoginDatabaseAsyncHelper(
       std::unique_ptr<LoginDatabase> login_db,
-      UnsyncedCredentialsDeletionNotifier notifier,
       scoped_refptr<base::SequencedTaskRunner> main_task_runner,
       syncer::WipeModelUponSyncDisabledBehavior
           wipe_model_upon_sync_disabled_behavior);
@@ -110,8 +109,6 @@
   void AddDeletionsHaveSyncedCallback(
       base::OnceCallback<void(bool)> sync_completion);
   void NotifyDeletionsHaveSynced(bool success) override;
-  void NotifyUnsyncedCredentialsWillBeDeleted(
-      std::vector<PasswordForm> unsynced_credentials) override;
   bool BeginTransaction() override;
   void RollbackTransaction() override;
   bool CommitTransaction() override;
@@ -160,8 +157,6 @@
       remote_forms_changes_received_callback_
           GUARDED_BY_CONTEXT(sequence_checker_);
 
-  UnsyncedCredentialsDeletionNotifier deletion_notifier_;
-
   // A list of callbacks that should be run once all pending deletions have been
   // sent to the Sync server. Note that the vector itself lives on the
   // background thread, but the callbacks must be run on the main thread!
diff --git a/components/password_manager/core/browser/password_store/password_store.h b/components/password_manager/core/browser/password_store/password_store.h
index 7d77827..fe99684 100644
--- a/components/password_manager/core/browser/password_store/password_store.h
+++ b/components/password_manager/core/browser/password_store/password_store.h
@@ -45,10 +45,6 @@
 
 class PasswordStoreConsumer;
 
-// Used to notify that unsynced credentials are about to be deleted.
-using UnsyncedCredentialsDeletionNotifier =
-    base::RepeatingCallback<void(std::vector<PasswordForm>)>;
-
 // Partial, cross-platform implementation for storing form passwords.
 // The login request/manipulation API is not threadsafe and must be used
 // from the UI thread.
diff --git a/components/password_manager/core/browser/password_store/password_store_built_in_backend.cc b/components/password_manager/core/browser/password_store/password_store_built_in_backend.cc
index ca7de7ed..24c056b6 100644
--- a/components/password_manager/core/browser/password_store/password_store_built_in_backend.cc
+++ b/components/password_manager/core/browser/password_store/password_store_built_in_backend.cc
@@ -96,8 +96,7 @@
     syncer::WipeModelUponSyncDisabledBehavior
         wipe_model_upon_sync_disabled_behavior,
     PrefService* prefs,
-    os_crypt_async::OSCryptAsync* os_crypt_async,
-    UnsyncedCredentialsDeletionNotifier notifier)
+    os_crypt_async::OSCryptAsync* os_crypt_async)
     : pref_service_(prefs), os_crypt_async_(os_crypt_async) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
@@ -105,8 +104,7 @@
       {base::MayBlock(), base::TaskPriority::USER_VISIBLE});
   DCHECK(background_task_runner_);
   helper_ = std::make_unique<LoginDatabaseAsyncHelper>(
-      std::move(login_db), std::move(notifier),
-      base::SequencedTaskRunner::GetCurrentDefault(),
+      std::move(login_db), base::SequencedTaskRunner::GetCurrentDefault(),
       wipe_model_upon_sync_disabled_behavior);
 }
 
diff --git a/components/password_manager/core/browser/password_store/password_store_built_in_backend.h b/components/password_manager/core/browser/password_store/password_store_built_in_backend.h
index f7fcb3a..eb0e268 100644
--- a/components/password_manager/core/browser/password_store/password_store_built_in_backend.h
+++ b/components/password_manager/core/browser/password_store/password_store_built_in_backend.h
@@ -50,8 +50,7 @@
       syncer::WipeModelUponSyncDisabledBehavior
           wipe_model_upon_sync_disabled_behavior,
       PrefService* prefs,
-      os_crypt_async::OSCryptAsync* os_crypt_async = nullptr,
-      UnsyncedCredentialsDeletionNotifier notifier = {});
+      os_crypt_async::OSCryptAsync* os_crypt_async = nullptr);
 
   ~PasswordStoreBuiltInBackend() override;
 
diff --git a/components/password_manager/core/browser/sync/password_store_sync.h b/components/password_manager/core/browser/sync/password_store_sync.h
index 7e57b29..af29464 100644
--- a/components/password_manager/core/browser/sync/password_store_sync.h
+++ b/components/password_manager/core/browser/sync/password_store_sync.h
@@ -158,12 +158,6 @@
   // them (because Sync was turned off permanently).
   virtual void NotifyDeletionsHaveSynced(bool success) = 0;
 
-  // Notifies the UI that some unsynced credentials will be deleted on sign-out
-  // in order to offer the user the option of saving them in the profile store.
-  // Should only be called for the account store.
-  virtual void NotifyUnsyncedCredentialsWillBeDeleted(
-      std::vector<PasswordForm> unsynced_credentials) = 0;
-
   // The methods below adds transaction support to the password store that's
   // required by sync to guarantee atomic writes of data and sync metadata.
   // TODO(crbug.com/40601175): The introduction of the three functions below
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.cc b/components/password_manager/core/browser/sync/password_sync_bridge.cc
index bbcf0c6a..3dbe9a6 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge.cc
+++ b/components/password_manager/core/browser/sync/password_sync_bridge.cc
@@ -1040,32 +1040,21 @@
 
   // The data should be deleted too. So do the following:
   // 1. Collect the credentials that will be deleted.
-  // 2. Collect which credentials out of those to be deleted are unsynced.
-  // 3. Delete the metadata and the data.
-  // 4. Notify the store about deleted credentials, to notify store observers.
-  // 5. Notify the store about deleted unsynced credentials, to take care of
-  //    notifying the UI and offering the user to save those credentials in the
-  //    profile store.
+  // 2. Delete the metadata and the data.
+  // 3. Notify the store about deleted credentials, to notify store observers.
   base::AutoReset<bool> processing_changes(&is_processing_remote_sync_changes_,
                                            true);
 
   PasswordStoreChangeList password_store_changes;
-  std::vector<PasswordForm> unsynced_credentials_being_deleted;
   PrimaryKeyToPasswordSpecificsDataMap credentials;
   FormRetrievalResult result =
       password_store_sync_->ReadAllCredentials(&credentials);
   if (result == FormRetrievalResult::kSuccess) {
-    std::set<FormPrimaryKey> unsynced_passwords_storage_keys =
-        GetUnsyncedPasswordsStorageKeys();
     for (const auto& [primary_key, specifics] : credentials) {
       PasswordForm form = PasswordFromSpecifics(*specifics);
       form.primary_key = primary_key;
       form.in_store = password_manager::PasswordForm::Store::kAccountStore;
       password_store_changes.emplace_back(PasswordStoreChange::REMOVE, form);
-      if (unsynced_passwords_storage_keys.count(primary_key) != 0 &&
-          !form.blocked_by_user) {
-        unsynced_credentials_being_deleted.push_back(std::move(form));
-      }
     }
   }
   password_store_sync_->GetMetadataStore()->DeleteAllSyncMetadata(
@@ -1073,17 +1062,6 @@
   password_store_sync_->DeleteAndRecreateDatabaseFile();
   password_store_sync_->NotifyCredentialsChanged(password_store_changes);
 
-  if (password_store_sync_->IsAccountStore()) {
-    base::UmaHistogramCounts100(
-        "PasswordManager.AccountStorage.UnsyncedPasswordsFoundDuringSignOut",
-        unsynced_credentials_being_deleted.size());
-
-    if (!unsynced_credentials_being_deleted.empty()) {
-      password_store_sync_->NotifyUnsyncedCredentialsWillBeDeleted(
-          std::move(unsynced_credentials_being_deleted));
-    }
-  }
-
   sync_enabled_or_disabled_cb_.Run();
 }
 
@@ -1146,30 +1124,6 @@
   return false;
 }
 
-std::set<FormPrimaryKey> PasswordSyncBridge::GetUnsyncedPasswordsStorageKeys() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  CHECK(password_store_sync_);
-
-  std::set<FormPrimaryKey> storage_keys;
-  PasswordStoreSync::MetadataStore* metadata_store =
-      password_store_sync_->GetMetadataStore();
-  // The metadata store could be null if the login database initialization
-  // fails.
-  if (!metadata_store) {
-    return storage_keys;
-  }
-  std::unique_ptr<syncer::MetadataBatch> batch =
-      metadata_store->GetAllSyncMetadata(syncer::PASSWORDS);
-  for (const auto& [storage_key, metadata] : batch->GetAllMetadata()) {
-    // Ignore unsynced deletions.
-    if (!metadata->is_deleted() &&
-        change_processor()->IsEntityUnsynced(storage_key)) {
-      storage_keys.insert(ParsePrimaryKey(storage_key));
-    }
-  }
-  return storage_keys;
-}
-
 // static
 std::string PasswordSyncBridge::ComputeClientTagForTesting(
     const sync_pb::PasswordSpecificsData& password_data) {
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge.h b/components/password_manager/core/browser/sync/password_sync_bridge.h
index b79701d..d958ff69 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge.h
+++ b/components/password_manager/core/browser/sync/password_sync_bridge.h
@@ -94,9 +94,6 @@
   // store. This should be called during MergeFullSyncData().
   std::optional<syncer::ModelError> CleanupPasswordStore();
 
-  // Retrieves the storage keys of all unsynced passwords in the store.
-  std::set<FormPrimaryKey> GetUnsyncedPasswordsStorageKeys();
-
   // If available, returns cached possibly trimmed PasswordSpecificsData for
   // given |storage_key|. By default, empty PasswordSpecificsData is returned.
   const sync_pb::PasswordSpecificsData& GetPossiblyTrimmedPasswordSpecificsData(
diff --git a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
index 4e4aa14..ae23df34 100644
--- a/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
+++ b/components/password_manager/core/browser/sync/password_sync_bridge_unittest.cc
@@ -200,16 +200,6 @@
                                     /*issue_types=*/{});
 }
 
-PasswordForm MakeBlocklistedForm(const std::string& signon_realm,
-                                 int primary_key = 1) {
-  PasswordForm form;
-  form.primary_key = FormPrimaryKey(primary_key);
-  form.url = GURL("http://www.origin.com");
-  form.signon_realm = signon_realm;
-  form.blocked_by_user = true;
-  return form;
-}
-
 void AddDeletedMetadata(syncer::MetadataBatch* metadata_batch,
                         int64_t modification_time,
                         bool include_version) {
@@ -376,10 +366,6 @@
               (const PasswordStoreChangeList&),
               (override));
   MOCK_METHOD(void, NotifyDeletionsHaveSynced, (bool), (override));
-  MOCK_METHOD(void,
-              NotifyUnsyncedCredentialsWillBeDeleted,
-              (std::vector<PasswordForm>),
-              (override));
   MOCK_METHOD(bool, BeginTransaction, (), (override));
   MOCK_METHOD(bool, CommitTransaction, (), (override));
   MOCK_METHOD(void, RollbackTransaction, (), (override));
@@ -1569,112 +1555,6 @@
 }
 
 TEST_F(PasswordSyncBridgeAccountStoreTest,
-       ShouldNotifyUnsyncedCredentialsIfAccountStore) {
-  base::HistogramTester histogram_tester;
-
-  const std::string kPrimaryKeyUnsyncedCredentialStr = "1000";
-  const std::string kPrimaryKeySyncedCredentialStr = "1001";
-  const std::string kPrimaryKeyUnsyncedDeletionStr = "1002";
-  const std::string kPrimaryKeyUnsyncedBlocklistStr = "1003";
-  ON_CALL(mock_processor(), IsEntityUnsynced(kPrimaryKeyUnsyncedCredentialStr))
-      .WillByDefault(Return(true));
-  ON_CALL(mock_processor(), IsEntityUnsynced(kPrimaryKeySyncedCredentialStr))
-      .WillByDefault(Return(false));
-  ON_CALL(mock_processor(), IsEntityUnsynced(kPrimaryKeyUnsyncedDeletionStr))
-      .WillByDefault(Return(true));
-  ON_CALL(mock_processor(), IsEntityUnsynced(kPrimaryKeyUnsyncedBlocklistStr))
-      .WillByDefault(Return(true));
-
-  sync_pb::EntityMetadata is_deletion_metadata;
-  is_deletion_metadata.set_is_deleted(true);
-  sync_pb::EntityMetadata is_not_deletion_metadata;
-  is_not_deletion_metadata.set_is_deleted(false);
-  ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata)
-      .WillByDefault([&]() {
-        auto batch = std::make_unique<syncer::MetadataBatch>();
-        batch->AddMetadata(kPrimaryKeyUnsyncedCredentialStr,
-                           std::make_unique<sync_pb::EntityMetadata>(
-                               is_not_deletion_metadata));
-        batch->AddMetadata(kPrimaryKeySyncedCredentialStr,
-                           std::make_unique<sync_pb::EntityMetadata>(
-                               is_not_deletion_metadata));
-        batch->AddMetadata(
-            kPrimaryKeyUnsyncedDeletionStr,
-            std::make_unique<sync_pb::EntityMetadata>(is_deletion_metadata));
-        batch->AddMetadata(kPrimaryKeyUnsyncedBlocklistStr,
-                           std::make_unique<sync_pb::EntityMetadata>(
-                               is_not_deletion_metadata));
-        return batch;
-      });
-
-  // No form is added to the database for the unsynced deletion primary key,
-  // because the deletion is supposed to have already removed such form.
-  const int kPrimaryKeyUnsyncedCredential = 1000;
-  const int kPrimaryKeySyncedCredential = 1001;
-  const int kPrimaryKeyUnsyncedBlocklist = 1003;
-  PasswordForm unsynced_credential =
-      MakePasswordForm(kSignonRealm1, kPrimaryKeyUnsyncedCredential);
-  unsynced_credential.in_store = PasswordForm::Store::kAccountStore;
-  PasswordForm synced_credential =
-      MakePasswordForm(kSignonRealm2, kPrimaryKeySyncedCredential);
-  synced_credential.in_store = PasswordForm::Store::kAccountStore;
-  PasswordForm unsynced_blocklist =
-      MakeBlocklistedForm(kSignonRealm3, kPrimaryKeyUnsyncedBlocklist);
-  unsynced_blocklist.in_store = PasswordForm::Store::kAccountStore;
-  fake_db()->AddLoginWithPrimaryKey(unsynced_credential);
-  fake_db()->AddLoginWithPrimaryKey(synced_credential);
-  fake_db()->AddLoginWithPrimaryKey(unsynced_blocklist);
-
-  // The notification should only contain new credentials that are unsynced,
-  // ignoring both synced ones, deletion entries and blocklists.
-  EXPECT_CALL(*mock_password_store_sync(),
-              NotifyUnsyncedCredentialsWillBeDeleted(
-                  UnorderedElementsAre(unsynced_credential)));
-
-  // The content of the metadata change list does not matter in this case.
-  bridge()->ApplyDisableSyncChanges(bridge()->CreateMetadataChangeList());
-
-  histogram_tester.ExpectUniqueSample(
-      "PasswordManager.AccountStorage.UnsyncedPasswordsFoundDuringSignOut", 1,
-      1);
-}
-
-TEST_F(PasswordSyncBridgeTest,
-       ShouldNotNotifyUnsyncedCredentialsIfProfileStore) {
-  base::HistogramTester histogram_tester;
-
-  const int kPrimaryKeyUnsyncedCredential = 1000;
-  const std::string kPrimaryKeyUnsyncedCredentialStr = "1000";
-  ON_CALL(mock_processor(), IsEntityUnsynced(kPrimaryKeyUnsyncedCredentialStr))
-      .WillByDefault(Return(true));
-
-  sync_pb::EntityMetadata is_not_deletion_metadata;
-  is_not_deletion_metadata.set_is_deleted(false);
-  ON_CALL(*mock_sync_metadata_store_sync(), GetAllSyncMetadata)
-      .WillByDefault([&]() {
-        auto batch = std::make_unique<syncer::MetadataBatch>();
-        batch->AddMetadata(kPrimaryKeyUnsyncedCredentialStr,
-                           std::make_unique<sync_pb::EntityMetadata>(
-                               is_not_deletion_metadata));
-        return batch;
-      });
-
-  PasswordForm unsynced_deletion = MakePasswordForm(kSignonRealm3);
-  fake_db()->AddLoginWithPrimaryKey(
-      MakePasswordForm(kSignonRealm1, kPrimaryKeyUnsyncedCredential));
-
-  EXPECT_CALL(*mock_password_store_sync(),
-              NotifyUnsyncedCredentialsWillBeDeleted)
-      .Times(0);
-
-  // The content of the metadata change list does not matter in this case.
-  bridge()->ApplyDisableSyncChanges(bridge()->CreateMetadataChangeList());
-
-  histogram_tester.ExpectTotalCount(
-      "PasswordManager.AccountStorage.UnsyncedPasswordsFoundDuringSignOut", 0);
-}
-
-TEST_F(PasswordSyncBridgeAccountStoreTest,
        ShouldReportDownloadedPasswordsIfAccountStore) {
   ON_CALL(mock_processor(), IsTrackingMetadata()).WillByDefault(Return(true));
 
diff --git a/components/password_manager/core/common/password_manager_ui.h b/components/password_manager/core/common/password_manager_ui.h
index c890a53..c2d5c1e 100644
--- a/components/password_manager/core/common/password_manager_ui.h
+++ b/components/password_manager/core/common/password_manager_ui.h
@@ -37,10 +37,6 @@
   // Chrome needs to ask the user to confirm password updating.
   PENDING_PASSWORD_UPDATE_STATE,
 
-  // A user opted in to account storage is about to lose some unsynced
-  // passwords.
-  WILL_DELETE_UNSYNCED_ACCOUNT_PASSWORDS_STATE,
-
   // The user used a profile credential to log in successfully and should see a
   // prompt that allows them to move the credential to their account store.
   MOVE_CREDENTIAL_AFTER_LOG_IN_STATE,
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc
index 4d4eced..cf74ea2 100644
--- a/components/permissions/permission_uma_util.cc
+++ b/components/permissions/permission_uma_util.cc
@@ -2234,4 +2234,9 @@
   base::UmaHistogramBoolean("Permissions.AIv4.EmbedderMetadataValid", valid);
 }
 
+// static
+void PermissionUmaUtil::RecordPredictionServiceTimeout(bool timeout) {
+  base::UmaHistogramBoolean("Permissions.PredictionService.Timeout", timeout);
+}
+
 }  // namespace permissions
diff --git a/components/permissions/permission_uma_util.h b/components/permissions/permission_uma_util.h
index e2a3d2ff..afd159b7 100644
--- a/components/permissions/permission_uma_util.h
+++ b/components/permissions/permission_uma_util.h
@@ -920,6 +920,10 @@
   // workflow was initiated.
   static void RecordPassageEmbedderMetadataValid(bool valid);
 
+  // Records whether the UI selection logic of the
+  // PermissionBasedPredictionUiSelector ran into a timeout.
+  static void RecordPredictionServiceTimeout(bool timeout);
+
   // Records if the browser was active at the time the prompt started displaying
   static void RecordPromptShownInActiveBrowser(
       RequestTypeForUma request_type,
diff --git a/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.cc b/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.cc
index 1d775e0..23727f76 100644
--- a/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.cc
+++ b/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.cc
@@ -178,7 +178,7 @@
   }
 }
 
-void PlusAddressSubmissionLogger::OnBeforeFormSubmitted(
+void PlusAddressSubmissionLogger::OnAfterFormSubmitted(
     autofill::AutofillManager& manager,
     const autofill::FormData& form) {
   const CoreAccountInfo core_account_info =
diff --git a/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.h b/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.h
index d474c73..f2110094 100644
--- a/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.h
+++ b/components/plus_addresses/core/browser/metrics/plus_address_submission_logger.h
@@ -56,8 +56,8 @@
       autofill::AutofillManager& manager,
       autofill::AutofillManager::LifecycleState old_state,
       autofill::AutofillManager::LifecycleState new_state) override;
-  void OnBeforeFormSubmitted(autofill::AutofillManager& manager,
-                             const autofill::FormData& form) override;
+  void OnAfterFormSubmitted(autofill::AutofillManager& manager,
+                            const autofill::FormData& form) override;
 
   // Stops observing `manager` and removes all records for it.
   void RemoveManagerObservation(autofill::AutofillManager& manager);
diff --git a/components/regional_capabilities/BUILD.gn b/components/regional_capabilities/BUILD.gn
index e56bee2..ce1449e 100644
--- a/components/regional_capabilities/BUILD.gn
+++ b/components/regional_capabilities/BUILD.gn
@@ -84,6 +84,7 @@
 source_set("data") {
   visibility = [
     ":*",
+    "//chrome/browser/regional_capabilities:metrics_provider_impl",
     "//components/search_engines",
     "//components/search_engines:unit_tests",
     "//ios/chrome/browser/regional_capabilities/model",
diff --git a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
index 8d333ae..178c7e1 100644
--- a/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
+++ b/components/saved_tab_groups/internal/shared_tab_group_data_sync_bridge.cc
@@ -376,6 +376,8 @@
     if (proto.local_group_data().has_is_group_hidden()) {
       group.SetIsHidden(proto.local_group_data().is_group_hidden());
     }
+    stats::RecordSharedTabGroupDataLoadFromDiskResult(
+        stats::SharedTabGroupDataLoadFromDiskResult::kSuccess);
     groups.emplace_back(std::move(group));
 
     // There should not be duplicate group GUIDs because they are used as
@@ -407,6 +409,8 @@
           stats::SharedTabGroupDataLoadFromDiskResult::kMissingCollaborationId);
       continue;
     }
+    stats::RecordSharedTabGroupDataLoadFromDiskResult(
+        stats::SharedTabGroupDataLoadFromDiskResult::kSuccess);
 
     base::Time creation_time =
         ExtractCreationTimeFromMetadata(sync_metadata, storage_key);
diff --git a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc
index a799f8e..9ea7811 100644
--- a/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc
+++ b/components/segmentation_platform/embedder/home_modules/home_modules_card_registry.cc
@@ -251,8 +251,6 @@
          EnhancedSafeBrowsingEphemeralModule::IsModuleLabel(label) ||
          SavePasswordsEphemeralModule::IsModuleLabel(label) ||
          LensEphemeralModule::IsModuleLabel(label) ||
-         LensEphemeralModule::IsModuleLabel(label) ||
-         AppBundlePromoEphemeralModule::IsModuleLabel(label) ||
          DefaultBrowserPromoEphemeralModule::IsModuleLabel(label);
 #else
   return false;
diff --git a/components/signin/internal/identity_manager/oauth_consumer_registry.cc b/components/signin/internal/identity_manager/oauth_consumer_registry.cc
index 0ff528fe..4a89fa9 100644
--- a/components/signin/internal/identity_manager/oauth_consumer_registry.cc
+++ b/components/signin/internal/identity_manager/oauth_consumer_registry.cc
@@ -70,6 +70,12 @@
 constexpr char kPaymentsAccessTokenFetcherName[] =
     "payments_access_token_fetcher";
 constexpr char kSaveToDriveName[] = "save_to_drive";
+constexpr char kFastPairName[] = "fast_pair";
+constexpr char kEduCoexistenceLoginHandlerName[] =
+    "edu_coexistence_login_handler";
+constexpr char kEduAccountLoginHandlerName[] = "edu_account_login_handler";
+constexpr char kChromeosFamilyLinkUserMetricsProviderName[] =
+    "chromeos_family_link_user_metrics_provider";
 
 }  // namespace
 
@@ -78,7 +84,6 @@
 OAuthConsumer::OAuthConsumer(const std::string& name, const ScopeSet& scopes)
     : name_(name), scopes_(scopes) {
   CHECK(!name.empty());
-  CHECK(!scopes.empty());
 }
 
 OAuthConsumer::~OAuthConsumer() = default;
@@ -295,6 +300,26 @@
       return OAuthConsumer(
           /*name=*/kSaveToDriveName,
           /*scopes=*/{GaiaConstants::kDriveOAuth2Scope});
+    case OAuthConsumerId::kFastPair:
+      return OAuthConsumer(
+          /*name=*/kFastPairName,
+          /*scopes=*/{GaiaConstants::kNearbyDevicesOAuth2Scope});
+    case OAuthConsumerId::kEduCoexistenceLoginHandler:
+      return OAuthConsumer(
+          /*name=*/kEduCoexistenceLoginHandlerName,
+          /*scopes=*/{GaiaConstants::kKidsSupervisionSetupChildOAuth2Scope,
+                      GaiaConstants::kAccountsReauthOAuth2Scope,
+                      GaiaConstants::kAuditRecordingOAuth2Scope,
+                      GaiaConstants::kClearCutOAuth2Scope,
+                      GaiaConstants::kKidManagementPrivilegedOAuth2Scope});
+    case OAuthConsumerId::kEduAccountLoginHandler:
+      return OAuthConsumer(
+          /*name=*/kEduAccountLoginHandlerName,
+          /*scopes=*/{GaiaConstants::kAccountsReauthOAuth2Scope});
+    case OAuthConsumerId::kChromeosFamilyLinkUserMetricsProvider:
+      return OAuthConsumer(
+          /*name=*/kChromeosFamilyLinkUserMetricsProviderName,
+          /*scopes=*/{});
   }
   NOTREACHED();
 }
diff --git a/components/signin/public/identity_manager/oauth_consumer_ids.h b/components/signin/public/identity_manager/oauth_consumer_ids.h
index 7722c4b..1a920e5 100644
--- a/components/signin/public/identity_manager/oauth_consumer_ids.h
+++ b/components/signin/public/identity_manager/oauth_consumer_ids.h
@@ -59,7 +59,11 @@
   kAutofillPayments = 44,
   kPaymentsAccessTokenFetcher = 45,
   kSaveToDrive = 46,
-  kMaxValue = kSaveToDrive,
+  kFastPair = 47,
+  kEduCoexistenceLoginHandler = 48,
+  kEduAccountLoginHandler = 49,
+  kChromeosFamilyLinkUserMetricsProvider = 50,
+  kMaxValue = kChromeosFamilyLinkUserMetricsProvider,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/signin/enums.xml:OAuthConsumerId)
 
diff --git a/components/strike_database/BUILD.gn b/components/strike_database/BUILD.gn
index d69f1cc..6e7c1c5 100644
--- a/components/strike_database/BUILD.gn
+++ b/components/strike_database/BUILD.gn
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//third_party/libprotobuf-mutator/fuzzable_proto_library.gni")
+
 static_library("strike_database") {
   sources = [
     "history_clearable_strike_database.h",
@@ -24,14 +26,28 @@
   ]
 
   deps = [
-    # TODO(crbug.com/442352155): Move proto out of Autofill.
-    "//components/autofill/core/browser/proto",
-
-    # TODO(crbug.com/442352155): Remove dependency on test feature.
-    "//components/autofill/core/common:features",
+    ":features",
+    ":proto",
   ]
 }
 
+component("features") {
+  output_name = "strike_database_features"
+  defines = [ "IS_STRIKE_DATABASE_IMPL" ]
+  sources = [
+    "strike_database_features.cc",
+    "strike_database_features.h",
+  ]
+
+  public_deps = [ "//base" ]
+
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
+}
+
+fuzzable_proto_library("proto") {
+  sources = [ "strike_data.proto" ]
+}
+
 static_library("test_support") {
   testonly = true
   sources = [
@@ -41,7 +57,7 @@
 
   public_deps = [ ":strike_database" ]
 
-  deps = [ "//components/autofill/core/browser/proto" ]
+  deps = [ ":proto" ]
 }
 
 source_set("unit_tests") {
@@ -54,14 +70,10 @@
   ]
 
   deps = [
+    ":features",
+    ":proto",
     ":strike_database",
     "//base/test:test_support",
-
-    # TODO(crbug.com/442352155): Move proto out of Autofill.
-    "//components/autofill/core/browser/proto",
-
-    # TODO(crbug.com/442352155): Remove dependency on test feature.
-    "//components/autofill/core/common:features",
     "//testing/gtest",
   ]
 }
diff --git a/components/strike_database/DEPS b/components/strike_database/DEPS
index 7a45148..ba5ff834 100644
--- a/components/strike_database/DEPS
+++ b/components/strike_database/DEPS
@@ -4,7 +4,4 @@
   "+components/keyed_service/core",
   "+components/leveldb_proto",
   # go/keep-sorted end
-  # TODO(crbug.com/442352155): Remove.
-  "+components/autofill/core/browser/proto/strike_data.pb.h",
-  "+components/autofill/core/common/autofill_payments_features.h"
 ]
diff --git a/components/strike_database/simple_autofill_strike_database_unittest.cc b/components/strike_database/simple_autofill_strike_database_unittest.cc
index f5ae2789..e837732 100644
--- a/components/strike_database/simple_autofill_strike_database_unittest.cc
+++ b/components/strike_database/simple_autofill_strike_database_unittest.cc
@@ -10,8 +10,8 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/strings/to_string.h"
 #include "base/test/task_environment.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/strike_database/strike_data.pb.h"
 #include "components/strike_database/strike_database_integrator_test_strike_database.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/components/autofill/core/browser/proto/strike_data.proto b/components/strike_database/strike_data.proto
similarity index 100%
rename from components/autofill/core/browser/proto/strike_data.proto
rename to components/strike_database/strike_data.proto
diff --git a/components/strike_database/strike_database.cc b/components/strike_database/strike_database.cc
index 31effb99..2c39dd72b 100644
--- a/components/strike_database/strike_database.cc
+++ b/components/strike_database/strike_database.cc
@@ -14,8 +14,8 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/strike_database/strike_data.pb.h"
 
 namespace autofill {
 
diff --git a/components/strike_database/strike_database_features.cc b/components/strike_database/strike_database_features.cc
new file mode 100644
index 0000000..70bac51
--- /dev/null
+++ b/components/strike_database/strike_database_features.cc
@@ -0,0 +1,17 @@
+// Copyright 2025 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/strike_database/strike_database_features.h"
+
+#include "base/feature_list.h"
+
+namespace strike_database::features {
+
+// If enabled, the strike system will not block features. Intended for
+// debugging/testing use only and should never be launched to users.
+BASE_FEATURE(kDisableStrikeSystem,
+             "DisableAutofillStrikeSystem",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+}  // namespace strike_database::features
diff --git a/components/strike_database/strike_database_features.h b/components/strike_database/strike_database_features.h
new file mode 100644
index 0000000..08f1cfb1
--- /dev/null
+++ b/components/strike_database/strike_database_features.h
@@ -0,0 +1,17 @@
+// Copyright 2025 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_STRIKE_DATABASE_STRIKE_DATABASE_FEATURES_H_
+#define COMPONENTS_STRIKE_DATABASE_STRIKE_DATABASE_FEATURES_H_
+
+#include "base/component_export.h"
+#include "base/feature_list.h"
+
+namespace strike_database::features {
+
+COMPONENT_EXPORT(STRIKE_DATABASE) BASE_DECLARE_FEATURE(kDisableStrikeSystem);
+
+}  // namespace strike_database::features
+
+#endif  // COMPONENTS_STRIKE_DATABASE_STRIKE_DATABASE_FEATURES_H_
diff --git a/components/strike_database/strike_database_integrator_base.cc b/components/strike_database/strike_database_integrator_base.cc
index 99e5f6a..36a2b85e37 100644
--- a/components/strike_database/strike_database_integrator_base.cc
+++ b/components/strike_database/strike_database_integrator_base.cc
@@ -17,10 +17,10 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/strcat.h"
 #include "base/time/time.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
-#include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/strike_database/strike_data.pb.h"
 #include "components/strike_database/strike_database_base.h"
+#include "components/strike_database/strike_database_features.h"
 
 namespace autofill {
 
@@ -35,7 +35,8 @@
     std::string_view id) const {
   CheckIdUniqueness(id);
 
-  if (base::FeatureList::IsEnabled(features::kDisableAutofillStrikeSystem)) {
+  if (base::FeatureList::IsEnabled(
+          strike_database::features::kDisableStrikeSystem)) {
     // Debug/test user has disabled the strike database.
     return StrikeDatabaseDecision::kDoNotBlock;
   }
diff --git a/components/strike_database/strike_database_integrator_test_strike_database.cc b/components/strike_database/strike_database_integrator_test_strike_database.cc
index 14c40d5..498812fe 100644
--- a/components/strike_database/strike_database_integrator_test_strike_database.cc
+++ b/components/strike_database/strike_database_integrator_test_strike_database.cc
@@ -4,7 +4,7 @@
 
 #include "components/strike_database/strike_database_integrator_test_strike_database.h"
 
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
+#include "components/strike_database/strike_data.pb.h"
 
 namespace autofill {
 
diff --git a/components/strike_database/strike_database_integrator_test_strike_database_unittest.cc b/components/strike_database/strike_database_integrator_test_strike_database_unittest.cc
index 441b9af..7407cc4 100644
--- a/components/strike_database/strike_database_integrator_test_strike_database_unittest.cc
+++ b/components/strike_database/strike_database_integrator_test_strike_database_unittest.cc
@@ -14,10 +14,10 @@
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
-#include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/leveldb_proto/public/proto_database.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/strike_database/strike_data.pb.h"
+#include "components/strike_database/strike_database_features.h"
 #include "components/strike_database/strike_database_integrator_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -71,7 +71,7 @@
 class DisableStrikeDatabaseIntegratorTestStrikeDatabaseTest
     : public StrikeDatabaseIntegratorTestStrikeDatabaseTest {
   base::test::ScopedFeatureList feature_list_{
-      features::kDisableAutofillStrikeSystem};
+      strike_database::features::kDisableStrikeSystem};
 };
 
 TEST_F(DisableStrikeDatabaseIntegratorTestStrikeDatabaseTest,
diff --git a/components/strike_database/strike_database_unittest.cc b/components/strike_database/strike_database_unittest.cc
index b9db335..0e4fb35 100644
--- a/components/strike_database/strike_database_unittest.cc
+++ b/components/strike_database/strike_database_unittest.cc
@@ -13,9 +13,9 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
 #include "base/time/time.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
 #include "components/leveldb_proto/public/proto_database.h"
 #include "components/leveldb_proto/public/proto_database_provider.h"
+#include "components/strike_database/strike_data.pb.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace autofill {
diff --git a/components/strike_database/test_inmemory_strike_database.cc b/components/strike_database/test_inmemory_strike_database.cc
index 61f38f1..acbb105 100644
--- a/components/strike_database/test_inmemory_strike_database.cc
+++ b/components/strike_database/test_inmemory_strike_database.cc
@@ -11,7 +11,7 @@
 
 #include "base/metrics/histogram_functions.h"
 #include "base/time/time.h"
-#include "components/autofill/core/browser/proto/strike_data.pb.h"
+#include "components/strike_database/strike_data.pb.h"
 
 namespace autofill {
 
diff --git a/components/variations/seed_reader_writer.cc b/components/variations/seed_reader_writer.cc
index 1742861..b327ef6 100644
--- a/components/variations/seed_reader_writer.cc
+++ b/components/variations/seed_reader_writer.cc
@@ -64,9 +64,7 @@
     return false;
   }
   return channel == version_info::Channel::CANARY ||
-         channel == version_info::Channel::DEV ||
-         channel == version_info::Channel::BETA ||
-         channel == version_info::Channel::STABLE;
+         channel == version_info::Channel::DEV;
 }
 
 // Sets up the seed file experiment which only some clients are eligible for
@@ -277,6 +275,8 @@
     if (ShouldUseSeedFile()) {
       ReadSeedFile();
     }
+  } else if (ShouldMigrateToLocalState(channel)) {
+    MigrateToLocalState();
   }
 }
 
@@ -706,12 +706,36 @@
 }
 
 bool SeedReaderWriter::ShouldUseSeedFile() const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Use the plain FieldTrialList API here because the trial is registered
   // client-side in VariationsSeedStore SetUpSeedFileTrial().
   return seed_writer_ &&
          base::FieldTrialList::FindFullName(kSeedFileTrial) == kSeedFilesGroup;
 }
 
+bool SeedReaderWriter::ShouldMigrateToLocalState(
+    version_info::Channel channel) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (channel == version_info::Channel::UNKNOWN ||
+      channel == version_info::Channel::CANARY ||
+      channel == version_info::Channel::DEV) {
+    return false;
+  }
+  return seed_writer_ && base::PathExists(seed_writer_->path());
+}
+
+void SeedReaderWriter::MigrateToLocalState() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  std::string seed_file_data;
+  const bool success =
+      base::ReadFileToString(seed_writer_->path(), &seed_file_data);
+  if (success && !seed_file_data.empty()) {
+    std::string base64_seed_data = base::Base64Encode(seed_file_data);
+    local_state_->SetString(fields_prefs_->seed, base64_seed_data);
+  }
+  DeleteSeedFile();
+}
+
 void SeedReaderWriter::ProcessStoredSeedDataAndRunCallback(
     ReadSeedDataCallback done_callback,
     StoredSeed stored_seed) {
diff --git a/components/variations/seed_reader_writer.h b/components/variations/seed_reader_writer.h
index 5c8784c..f06f8ae 100644
--- a/components/variations/seed_reader_writer.h
+++ b/components/variations/seed_reader_writer.h
@@ -253,6 +253,14 @@
   // Returns true if a seed file should be used.
   bool ShouldUseSeedFile() const;
 
+  // Returns true if the client should migrate to local state from the seed
+  // file.
+  bool ShouldMigrateToLocalState(version_info::Channel channel) const;
+
+  // Reads the seed data from the seed file and stores it in local state. Also
+  // removes the seed file.
+  void MigrateToLocalState();
+
   // Calls `done_callback` with the result of the load, the seed data, and
   // signature. The seed data and signature should only be used if the result is
   // `LoadSeedResult::kSuccess`.
diff --git a/components/variations/seed_reader_writer_unittest.cc b/components/variations/seed_reader_writer_unittest.cc
index 549558a..6e162e28 100644
--- a/components/variations/seed_reader_writer_unittest.cc
+++ b/components/variations/seed_reader_writer_unittest.cc
@@ -124,14 +124,12 @@
 
 class ExpectedFieldTrialGroupAllChannelsTest
     : public ExpectedFieldTrialGroupChannelsTest {};
-class ExpectedFieldTrialGroupPreStableTest
+class ExpectedFieldTrialGroupCanaryDevTest
     : public ExpectedFieldTrialGroupChannelsTest {};
-class ExpectedFieldTrialGroupStableTest
-    : public SeedReaderWriterTestBase,
-      public TestWithParam<SeedFieldsPrefs> {};
-class ExpectedFieldTrialGroupUnknownTest
-    : public SeedReaderWriterTestBase,
-      public TestWithParam<SeedFieldsPrefs> {};
+class ExpectedFieldTrialGroupBetaStableUnknownTest
+    : public ExpectedFieldTrialGroupChannelsTest {};
+class ExpectedFieldTrialGroupBetaStableTest
+    : public ExpectedFieldTrialGroupChannelsTest {};
 
 INSTANTIATE_TEST_SUITE_P(
     All,
@@ -165,16 +163,15 @@
 
 INSTANTIATE_TEST_SUITE_P(
     All,
-    ExpectedFieldTrialGroupPreStableTest,
+    ExpectedFieldTrialGroupCanaryDevTest,
     ::testing::ConvertGenerator<ExpectedFieldTrialGroupTestParams::TupleT>(
         ::testing::Combine(::testing::Values(kRegularSeedFieldsPrefs,
                                              kSafeSeedFieldsPrefs),
                            ::testing::Values(version_info::Channel::CANARY,
-                                             version_info::Channel::DEV,
-                                             version_info::Channel::BETA))));
+                                             version_info::Channel::DEV))));
 
-// If channel is pre-stable, client is assigned a group.
-TEST_P(ExpectedFieldTrialGroupPreStableTest, PreStable) {
+// If channel is canary or dev, client is assigned a group.
+TEST_P(ExpectedFieldTrialGroupCanaryDevTest, AssignedGroup) {
   SeedReaderWriter seed_reader_writer(
       &local_state_, /*seed_file_dir=*/temp_dir_.GetPath(), kSeedFilename,
       GetParam().seed_fields_prefs, GetParam().channel,
@@ -183,32 +180,82 @@
               ::testing::AnyOf(kControlGroup, kSeedFilesGroup));
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ExpectedFieldTrialGroupStableTest,
-                         ::testing::Values(kRegularSeedFieldsPrefs,
-                                           kSafeSeedFieldsPrefs));
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    ExpectedFieldTrialGroupBetaStableUnknownTest,
+    ::testing::ConvertGenerator<ExpectedFieldTrialGroupTestParams::TupleT>(
+        ::testing::Combine(::testing::Values(kRegularSeedFieldsPrefs,
+                                             kSafeSeedFieldsPrefs),
+                           ::testing::Values(version_info::Channel::BETA,
+                                             version_info::Channel::STABLE,
+                                             version_info::Channel::UNKNOWN))));
 
-// If channel is stable, trial has been registered.
-TEST_P(ExpectedFieldTrialGroupStableTest, Stable) {
+// If channel is beta, stable, or unknown, client is not assigned a group.
+TEST_P(ExpectedFieldTrialGroupBetaStableUnknownTest, NotAssignedGroup) {
   SeedReaderWriter seed_reader_writer(
       &local_state_, /*seed_file_dir=*/temp_dir_.GetPath(), kSeedFilename,
-      GetParam(), version_info::Channel::STABLE, entropy_providers_.get(),
-      file_writer_thread_.task_runner());
-  EXPECT_TRUE(base::FieldTrialList::TrialExists(kSeedFileTrial));
+      GetParam().seed_fields_prefs, GetParam().channel,
+      entropy_providers_.get(), file_writer_thread_.task_runner());
+  EXPECT_THAT(base::FieldTrialList::FindFullName(kSeedFileTrial), IsEmpty());
 }
 
-INSTANTIATE_TEST_SUITE_P(All,
-                         ExpectedFieldTrialGroupUnknownTest,
-                         ::testing::Values(kRegularSeedFieldsPrefs,
-                                           kSafeSeedFieldsPrefs));
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    ExpectedFieldTrialGroupBetaStableTest,
+    ::testing::ConvertGenerator<ExpectedFieldTrialGroupTestParams::TupleT>(
+        ::testing::Combine(::testing::Values(kRegularSeedFieldsPrefs,
+                                             kSafeSeedFieldsPrefs),
+                           ::testing::Values(version_info::Channel::BETA,
+                                             version_info::Channel::STABLE))));
 
-// If channel is unknown, client is not assigned a group.
-TEST_P(ExpectedFieldTrialGroupUnknownTest, Unknown) {
+TEST_P(ExpectedFieldTrialGroupBetaStableTest, MigrateFromSeedFileToLocalState) {
+  // Assign client to SeedFiles group.
+  SetUpSeedFileTrial(std::string(kSeedFilesGroup));
+  // Write seed to seed file.
+  const std::string compressed_seed = CreateCompressedVariationsSeed();
+  ASSERT_TRUE(base::WriteFile(temp_seed_file_path_, compressed_seed));
+
+  // Initialize seed_reader_writer with test thread and timer.
   SeedReaderWriter seed_reader_writer(
       &local_state_, /*seed_file_dir=*/temp_dir_.GetPath(), kSeedFilename,
-      GetParam(), version_info::Channel::UNKNOWN, entropy_providers_.get(),
-      file_writer_thread_.task_runner());
-  EXPECT_THAT(base::FieldTrialList::FindFullName(kSeedFileTrial), IsEmpty());
+      GetParam().seed_fields_prefs, GetParam().channel,
+      entropy_providers_.get(), file_writer_thread_.task_runner());
+  file_writer_thread_.FlushForTesting();
+
+  // Verify that the seed was written into local state.
+  std::string encoded_seed = base::Base64Encode(compressed_seed);
+  EXPECT_EQ(local_state_.GetString(GetParam().seed_fields_prefs.seed),
+            encoded_seed);
+
+  // Verify that the seed file was deleted.
+  EXPECT_FALSE(base::PathExists(temp_seed_file_path_));
+}
+
+// If no seed file exists, the seed in local state should not be overwritten.
+TEST_P(ExpectedFieldTrialGroupBetaStableTest, NoSeedFile) {
+  // Assign client to SeedFiles group.
+  SetUpSeedFileTrial(std::string(kSeedFilesGroup));
+  // No seed file.
+  ASSERT_FALSE(base::PathExists(temp_seed_file_path_));
+  // Seed in local state that shouldn't be overwritten.
+  const std::string encoded_seed =
+      base::Base64Encode(CreateCompressedVariationsSeed());
+  local_state_.SetString(GetParam().seed_fields_prefs.seed, encoded_seed);
+  ASSERT_EQ(local_state_.GetString(GetParam().seed_fields_prefs.seed),
+            encoded_seed);
+
+  // Initialize seed_reader_writer with test thread and timer.
+  SeedReaderWriter seed_reader_writer(
+      &local_state_, /*seed_file_dir=*/temp_dir_.GetPath(), kSeedFilename,
+      GetParam().seed_fields_prefs, GetParam().channel,
+      entropy_providers_.get(), file_writer_thread_.task_runner());
+  file_writer_thread_.FlushForTesting();
+
+  // Verify that the seed was not overwritten.
+  EXPECT_EQ(local_state_.GetString(GetParam().seed_fields_prefs.seed),
+            encoded_seed);
+  // Verify that the seed file was not created.
+  EXPECT_FALSE(base::PathExists(temp_seed_file_path_));
 }
 
 class SeedReaderWriterGroupTest
@@ -708,8 +755,7 @@
                                              kSafeSeedFieldsPrefs),
                            ::testing::Values(kSeedFilesGroup),
                            ::testing::Values(version_info::Channel::CANARY,
-                                             version_info::Channel::DEV,
-                                             version_info::Channel::BETA))));
+                                             version_info::Channel::DEV))));
 
 // Verifies clients using local state to store seeds write seeds to Local State.
 TEST_P(SeedReaderWriterLocalStateGroupsTest, WriteSeed) {
@@ -1126,7 +1172,9 @@
         ::testing::Combine(::testing::Values(kRegularSeedFieldsPrefs,
                                              kSafeSeedFieldsPrefs),
                            ::testing::Values(kNoGroup),
-                           ::testing::Values(version_info::Channel::UNKNOWN))));
+                           ::testing::Values(version_info::Channel::UNKNOWN,
+                                             version_info::Channel::STABLE,
+                                             version_info::Channel::BETA))));
 
 INSTANTIATE_TEST_SUITE_P(
     ControlAndDefaultGroup,
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index c92c711..1f91db0 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -136,6 +136,7 @@
     "//components/payments/content/icon",
     "//components/payments/mojom",
     "//components/performance_manager/scenario_api",
+    "//components/persistent_cache",
     "//components/power_monitor",
     "//components/services/filesystem:lib",
     "//components/services/quarantine",
diff --git a/content/browser/DEPS b/content/browser/DEPS
index a598e3ef..5abe472 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -34,6 +34,7 @@
   "+components/offline_pages/core/request_header",
   "+components/payments/content/icon",
   "+components/payments/mojom",
+  "+components/persistent_cache",
   "+components/services/heap_profiling/public",
   "+components/services/quarantine/public/mojom/quarantine.mojom.h",
   "+components/system_media_controls",
diff --git a/content/browser/browsing_data/storage_partition_code_cache_data_remover.cc b/content/browser/browsing_data/storage_partition_code_cache_data_remover.cc
index 6dfbfae..604fe84b 100644
--- a/content/browser/browsing_data/storage_partition_code_cache_data_remover.cc
+++ b/content/browser/browsing_data/storage_partition_code_cache_data_remover.cc
@@ -102,11 +102,14 @@
 }
 
 void StoragePartitionCodeCacheDataRemover::ClearJSCodeCache() {
+  if (generated_code_cache_context_) {
+    generated_code_cache_context_->ClearAndDeletePersistentCacheCollection();
+  }
+
   if (generated_code_cache_context_ &&
       generated_code_cache_context_->generated_js_code_cache()) {
     generated_code_cache_context_->generated_js_code_cache()
         ->ClearInMemoryCache();
-
     net::CompletionOnceCallback callback = base::BindOnce(
         &StoragePartitionCodeCacheDataRemover::ClearWASMCodeCache,
         base::Unretained(this));
diff --git a/content/browser/code_cache/generated_code_cache.cc b/content/browser/code_cache/generated_code_cache.cc
index 1673dd4..b798ae06 100644
--- a/content/browser/code_cache/generated_code_cache.cc
+++ b/content/browser/code_cache/generated_code_cache.cc
@@ -41,16 +41,16 @@
 constexpr char kPrefix[] = "_key";
 constexpr char kSeparator[] = " \n";
 
-// We always expect to receive valid URLs that can be used as keys to the code
-// cache. The relevant checks (for ex: resource_url is valid, origin_lock is
-// not opque etc.,) must be done prior to requesting the code cache.
+// In this and `CheckValidContext` it's expected to receive valid URLs that can
+// be used as keys to the code cache. The relevant checks (for ex: resource_url
+// is valid, origin_lock is not opaque etc.,) must be done prior to requesting
+// the code cache.
 //
-// This function doesn't enforce anything in the production code. It is here
+// These functions don't enforce anything in the production code. They are here
 // to make the assumptions explicit and to catch any errors when DCHECKs are
 // enabled.
-void CheckValidKeys(const GURL& resource_url,
-                    const GURL& origin_lock,
-                    GeneratedCodeCache::CodeCacheType cache_type) {
+void CheckValidResource(const GURL& resource_url,
+                        GeneratedCodeCache::CodeCacheType cache_type) {
   // If the resource url is invalid don't cache the code.
   DCHECK(resource_url.is_valid());
   bool resource_url_is_chrome_or_chrome_untrusted =
@@ -60,6 +60,14 @@
          resource_url_is_chrome_or_chrome_untrusted ||
          blink::CommonSchemeRegistry::IsExtensionScheme(resource_url.scheme()));
 
+  // The chrome and chrome-untrusted schemes are only used with the WebUI
+  // code cache type.
+  DCHECK_EQ(resource_url_is_chrome_or_chrome_untrusted,
+            cache_type == GeneratedCodeCache::kWebUIJavaScript);
+}
+
+void CheckValidContext(const GURL& origin_lock,
+                       GeneratedCodeCache::CodeCacheType cache_type) {
   // |origin_lock| should be either empty or should have
   // Http/Https/chrome/chrome-untrusted schemes and it should not be a URL with
   // opaque origin. Empty origin_locks are allowed when the renderer is not
@@ -78,8 +86,6 @@
   // code cache type.
   DCHECK_EQ(origin_lock_is_chrome_or_chrome_untrusted,
             cache_type == GeneratedCodeCache::kWebUIJavaScript);
-  DCHECK_EQ(resource_url_is_chrome_or_chrome_untrusted,
-            cache_type == GeneratedCodeCache::kWebUIJavaScript);
 }
 
 // Generates the cache key for the given |resource_url|, |origin_lock| and
@@ -103,33 +109,16 @@
                         const GURL& origin_lock,
                         const net::NetworkIsolationKey& nik,
                         GeneratedCodeCache::CodeCacheType cache_type) {
-  CheckValidKeys(resource_url, origin_lock, cache_type);
+  return base::StrCat(
+      {GeneratedCodeCache::GetResourceKey(resource_url, cache_type),
 
-  // Add a prefix _ so it can't be parsed as a valid URL.
-  std::string key(kPrefix);
-  // Remove reference, username and password sections of the URL.
-  key.append(net::SimplifyUrlForRequest(resource_url).spec());
-  // Add a separator between URL and origin to avoid any possibility of
-  // attacks by crafting the URL. URLs do not contain any control ASCII
-  // characters, and also space is encoded. So use ' \n' as a seperator.
-  key.append(kSeparator);
+       // Add a separator between URL and origin to avoid any possibility of
+       // attacks by crafting the URL. URLs do not contain any control ASCII
+       // characters, and also space is encoded. So use ' \n' as a
+       // separator.
+       kSeparator,
 
-  if (origin_lock.is_valid())
-    key.append(net::SimplifyUrlForRequest(origin_lock).spec());
-
-  if (net::HttpCache::IsSplitCacheEnabled() &&
-      base::FeatureList::IsEnabled(
-          net::features::kSplitCodeCacheByNetworkIsolationKey)) {
-    // TODO(crbug.com/40232395):  Transient NIKs return nullopt when
-    // their ToCacheKeyString() method is invoked, as they generally shouldn't
-    // be written to disk. This code is currently reached for transient NIKs,
-    // which needs to be fixed.
-    if (!nik.IsTransient()) {
-      key.append(kSeparator);
-      key.append(*nik.ToCacheKeyString());
-    }
-  }
-  return key;
+       GeneratedCodeCache::GetContextKey(origin_lock, nik, cache_type)});
 }
 
 constexpr size_t kResponseTimeSizeInBytes = sizeof(int64_t);
@@ -224,6 +213,48 @@
 
 }  // namespace
 
+// static
+std::string GeneratedCodeCache::GetResourceKey(
+    const GURL& resource_url,
+    GeneratedCodeCache::CodeCacheType cache_type) {
+  CheckValidResource(resource_url, cache_type);
+
+  return base::StrCat(
+      {// Add a prefix _ so it can't be parsed as a valid URL.
+       kPrefix,
+       // Remove reference, username and password sections of the URL.
+       net::SimplifyUrlForRequest(resource_url).spec()});
+}
+
+// static
+std::string GeneratedCodeCache::GetContextKey(
+    const GURL& origin_lock,
+    const net::NetworkIsolationKey& nik,
+    GeneratedCodeCache::CodeCacheType cache_type) {
+  CheckValidContext(origin_lock, cache_type);
+
+  std::string key;
+
+  if (origin_lock.is_valid()) {
+    key.append(net::SimplifyUrlForRequest(origin_lock).spec());
+  }
+
+  if (net::HttpCache::IsSplitCacheEnabled() &&
+      base::FeatureList::IsEnabled(
+          net::features::kSplitCodeCacheByNetworkIsolationKey)) {
+    // TODO(crbug.com/40232395):  Transient NIKs return nullopt when
+    // their ToCacheKeyString() method is invoked, as they generally shouldn't
+    // be written to disk. This code is currently reached for transient NIKs,
+    // which needs to be fixed.
+    if (!nik.IsTransient()) {
+      key.append(kSeparator);
+      key.append(*nik.ToCacheKeyString());
+    }
+  }
+
+  return key;
+}
+
 bool GeneratedCodeCache::IsValidHeader(
     scoped_refptr<net::IOBufferWithSize> small_buffer) const {
   size_t buffer_size = small_buffer->size();
diff --git a/content/browser/code_cache/generated_code_cache.h b/content/browser/code_cache/generated_code_cache.h
index 94602e2..a01f0d9 100644
--- a/content/browser/code_cache/generated_code_cache.h
+++ b/content/browser/code_cache/generated_code_cache.h
@@ -36,8 +36,8 @@
 // renderer is not locked to an origin (ex:SitePerProcess is disabled) and it
 // is safe to use only |resource_url| as the key in such cases.
 //
-// This uses a simple disk_cache backend. It just stores one data stream and
-// stores response_time + generated code as one data blob.
+// This stores response_time and generated code using either a simple disk_cache
+// backend or PersistentCache depending on experiment status.
 //
 // There exists one cache per storage partition and is owned by the storage
 // partition. This cache is created, accessed and destroyed on the I/O
@@ -97,6 +97,21 @@
 
   ~GeneratedCodeCache();
 
+  // Generates the cache key for the given `resource_url`.
+  // `resource_url` is the url corresponding to the requested resource.
+  static std::string GetResourceKey(
+      const GURL& resource_url,
+      GeneratedCodeCache::CodeCacheType cache_type);
+
+  // Generates the cache key for the given `origin_lock` and `nik`.
+  // `origin_lock` is the origin that the renderer which requested this
+  // resource is locked to. `nik` is the network isolation key that consists
+  // of top-level-site that initiated the request.
+  static std::string GetContextKey(
+      const GURL& origin_lock,
+      const net::NetworkIsolationKey& nik,
+      GeneratedCodeCache::CodeCacheType cache_type);
+
   // Runs the callback with a raw pointer to the backend. If we could not create
   // the backend then it will return a null. This runs the callback
   // synchronously if the backend is already open or asynchronously on the
diff --git a/content/browser/code_cache/generated_code_cache_context.cc b/content/browser/code_cache/generated_code_cache_context.cc
index 6140c99..6194d40 100644
--- a/content/browser/code_cache/generated_code_cache_context.cc
+++ b/content/browser/code_cache/generated_code_cache_context.cc
@@ -8,12 +8,20 @@
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/system/sys_info.h"
 #include "base/task/sequenced_task_runner.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
+#include "components/persistent_cache/entry.h"
+#include "components/persistent_cache/persistent_cache_collection.h"
 #include "content/browser/code_cache/generated_code_cache.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_features.h"
+#include "net/disk_cache/cache_util.h"
+#include "net/http/http_cache.h"
+#include "third_party/blink/public/common/features_generated.h"
 
 namespace content {
 
@@ -42,8 +50,21 @@
 GeneratedCodeCacheContext::GeneratedCodeCacheContext() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DETACH_FROM_SEQUENCE(sequence_checker_);
-  task_runner_ = base::ThreadPool::CreateSingleThreadTaskRunner(
-      {base::TaskPriority::USER_BLOCKING});
+
+  if (base::FeatureList::IsEnabled(
+          blink::features::kUsePersistentCacheForCodeCache)) {
+    // MayBlock() because disk operations are happening on-thread under the
+    // experiment for now.
+    // Dedicated because there doesn't seem to be a reason to not be
+    // dedicated and it should provide some isolation which is especially
+    // important if there is blocking involved.
+    task_runner_ = base::ThreadPool::CreateSingleThreadTaskRunner(
+        {base::TaskPriority::USER_BLOCKING, base::MayBlock()},
+        base::SingleThreadTaskRunnerThreadMode::DEDICATED);
+  } else {
+    task_runner_ = base::ThreadPool::CreateSingleThreadTaskRunner(
+        {base::TaskPriority::USER_BLOCKING});
+  }
 }
 
 void GeneratedCodeCacheContext::Initialize(const base::FilePath& path,
@@ -101,6 +122,23 @@
       new GeneratedCodeCache(path.AppendASCII("wasm"), max_bytes,
                              GeneratedCodeCache::CodeCacheType::kWebAssembly),
       base::OnTaskRunnerDeleter(task_runner_)};
+
+  if (base::FeatureList::IsEnabled(
+          blink::features::kUsePersistentCacheForCodeCache)) {
+    // Target the same amount of disk space used for persistent_cache as is used
+    // for disk_cache.
+    int64_t disk_cache_max_size = disk_cache::PreferredCacheSize(
+        base::SysInfo::AmountOfFreeDiskSpace(path),
+        net::GENERATED_BYTE_CODE_CACHE);
+
+    persistent_cache_collection_ = {
+        new persistent_cache::PersistentCacheCollection(
+            std::make_unique<persistent_cache::BackendParamsManager>(
+                path.AppendASCII("pc")),  // Name as short as possible to avoid
+                                          // maximum path problems.
+            disk_cache_max_size),
+        base::OnTaskRunnerDeleter(task_runner_)};
+  }
 }
 
 void GeneratedCodeCacheContext::Shutdown() {
@@ -110,6 +148,34 @@
       base::BindOnce(&GeneratedCodeCacheContext::ShutdownOnThread, this));
 }
 
+void GeneratedCodeCacheContext::ClearAndDeletePersistentCacheCollection() {
+  if (persistent_cache_collection_) {
+    persistent_cache_collection_->DeleteAllFiles();
+  }
+}
+
+void GeneratedCodeCacheContext::InsertIntoPersistentCacheCollection(
+    const std::string& context_key,
+    std::string_view url,
+    base::span<const uint8_t> content,
+    persistent_cache::EntryMetadata metadata) {
+  // Since `content` is coming in through mojo it's important to make sure that
+  // it's copied so it cannot be modified racily. This happens implicitly
+  // because of the way the SQLite backend (the only backend available
+  // currently) of PersistentCache stores data through the BLOB type.
+  //
+  // TODO(crbug.com/377475540): Make an explicit copy here once PersistentCache
+  // handles taking ownership of the memory passed in.
+  persistent_cache_collection_->Insert(context_key, url, content, metadata);
+}
+
+std::unique_ptr<persistent_cache::Entry>
+GeneratedCodeCacheContext::FindInPersistentCacheCollection(
+    const std::string& context_key,
+    std::string_view url) {
+  return persistent_cache_collection_->Find(context_key, url);
+}
+
 void GeneratedCodeCacheContext::ShutdownOnThread() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   generated_js_code_cache_.reset();
diff --git a/content/browser/code_cache/generated_code_cache_context.h b/content/browser/code_cache/generated_code_cache_context.h
index eb4b87e7..10c3eda 100644
--- a/content/browser/code_cache/generated_code_cache_context.h
+++ b/content/browser/code_cache/generated_code_cache_context.h
@@ -9,6 +9,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/thread_annotations.h"
+#include "components/persistent_cache/persistent_cache_collection.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_thread.h"
 
@@ -53,6 +54,25 @@
   GeneratedCodeCache* generated_wasm_code_cache() const;
   GeneratedCodeCache* generated_webui_js_code_cache() const;
 
+  // Use to get rid of code cached in the PersistentCache collection both in
+  // memory and persisted.
+  void ClearAndDeletePersistentCacheCollection();
+
+  // Using a persistent cache collection with `context_key` as the cache_id
+  // makes sure that there are seperate files for separate process locks. This
+  // will eventually allow the sharing of the files with the renderers.
+  void InsertIntoPersistentCacheCollection(
+      const std::string& context_key,
+      std::string_view url,
+      base::span<const uint8_t> content,
+      persistent_cache::EntryMetadata metadata);
+
+  // TODO(crbug.com/377475540): Use types that are not interchangeable for
+  // `context_key` and `url` so that they cannot be mixed up by mistake.
+  std::unique_ptr<persistent_cache::Entry> FindInPersistentCacheCollection(
+      const std::string& context_key,
+      std::string_view url);
+
  private:
   friend class base::RefCountedThreadSafe<GeneratedCodeCacheContext>;
   ~GeneratedCodeCacheContext();
@@ -72,6 +92,16 @@
           nullptr, base::OnTaskRunnerDeleter(nullptr)};
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 
+  // When used instead of `generated_js_code_cache_` this stores the code
+  // following the same isolation principles but using two keys instead of one.
+  // The first key is used to get a `PersistentCache` associated with an
+  // isolation context from the collection. This insures that each isolation
+  // context uses a seperate database file. The second key is the resource
+  // url used on that cache.
+  std::unique_ptr<persistent_cache::PersistentCacheCollection,
+                  base::OnTaskRunnerDeleter>
+      persistent_cache_collection_{nullptr, base::OnTaskRunnerDeleter(nullptr)};
+
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.cc b/content/browser/direct_sockets/direct_sockets_service_impl.cc
index 86290d6..14d0f366 100644
--- a/content/browser/direct_sockets/direct_sockets_service_impl.cc
+++ b/content/browser/direct_sockets/direct_sockets_service_impl.cc
@@ -44,7 +44,6 @@
 #include "services/network/public/mojom/udp_socket.mojom.h"
 #include "third_party/abseil-cpp/absl/functional/overload.h"
 #include "third_party/blink/public/common/features_generated.h"
-#include "third_party/blink/public/common/runtime_feature_state/runtime_feature_state_read_context.h"
 #include "third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom.h"
 
 #if BUILDFLAG(IS_WIN)
@@ -157,30 +156,6 @@
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-bool IsMulticastAllowed(const Context& context) {
-  if (!base::FeatureList::IsEnabled(
-          blink::features::kMulticastInDirectSockets)) {
-    return false;
-  }
-
-  return std::visit(
-      absl::Overload{[&](content::RenderFrameHost* rfh) {
-                       // TODO(crbug.com/398934282): check the necessary
-                       // permission policy
-                       return true;
-                     },
-                     [&](base::WeakPtr<SharedWorkerHost> shared_worker) {
-                       // TODO(crbug.com/398934282): add shared worker support.
-                       return false;
-                     },
-                     [&](base::WeakPtr<ServiceWorkerVersion> service_worker) {
-                       // TODO(crbug.com/398934282): add dedicated worker
-                       // support.
-                       return false;
-                     }},
-      context);
-}
-
 bool RequiresPrivateNetworkAccess(const net::AddressList& addresses) {
   return std::ranges::any_of(
       addresses.endpoints(), [](const net::IPEndPoint& ip_endpoint) {
@@ -591,18 +566,6 @@
   if (options->receive_buffer_size.has_value()) {
     socket_options->receive_buffer_size = *options->receive_buffer_size;
   }
-  if (IsMulticastAllowed(context_)) {
-    if (options->multicast_allow_address_sharing.has_value()) {
-      socket_options->allow_address_sharing_for_multicast =
-          *options->multicast_allow_address_sharing;
-    }
-    if (options->multicast_time_to_live.has_value()) {
-      socket_options->multicast_time_to_live = *options->multicast_time_to_live;
-    }
-    if (options->multicast_loopback.has_value()) {
-      socket_options->multicast_loopback_mode = *options->multicast_loopback;
-    }
-  }
 
   auto params = network::mojom::RestrictedUDPSocketParams::New();
   params->socket_options = std::move(socket_options);
@@ -811,15 +774,6 @@
     socket_options->receive_buffer_size = *options->receive_buffer_size;
   }
 
-  if (IsMulticastAllowed(context_)) {
-    if (options->multicast_time_to_live.has_value()) {
-      socket_options->multicast_time_to_live = *options->multicast_time_to_live;
-    }
-    if (options->multicast_loopback.has_value()) {
-      socket_options->multicast_loopback_mode = *options->multicast_loopback;
-    }
-  }
-
   auto params = network::mojom::RestrictedUDPSocketParams::New();
   params->socket_options = std::move(socket_options);
 
diff --git a/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc b/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc
index ad3e878..130c773a 100644
--- a/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc
+++ b/content/browser/direct_sockets/direct_sockets_udp_browsertest.cc
@@ -125,8 +125,6 @@
 
   std::unique_ptr<test::IsolatedWebAppContentBrowserClient> client_;
   std::unique_ptr<content::test::AsyncJsRunner> runner_;
-  base::test::ScopedFeatureList scoped_feature_list_{
-      blink::features::kMulticastInDirectSockets};
 };
 
 IN_PROC_BROWSER_TEST_F(DirectSocketsUdpBrowserTest, CloseUdp) {
@@ -136,31 +134,6 @@
   EXPECT_EQ("closeUdp succeeded", EvalJs(shell(), script));
 }
 
-IN_PROC_BROWSER_TEST_F(DirectSocketsUdpBrowserTest, MulticastTimeToLiveParam) {
-  EXPECT_EQ(
-      "closeUdp succeeded",
-      EvalJs(
-          shell(),
-          "closeUdp({ localAddress: '127.0.0.1', multicastTimeToLive: 0 })"));
-  EXPECT_EQ(
-      "closeUdp succeeded",
-      EvalJs(
-          shell(),
-          "closeUdp({ localAddress: '127.0.0.1', multicastTimeToLive: 255 })"));
-
-  EXPECT_THAT(
-      EvalJs(shell(),
-             "closeUdp({ localAddress: '127.0.0.1', multicastTimeToLive: -1 })")
-          .ExtractString(),
-      ::testing::StartsWith("closeUdp failed"));
-  EXPECT_THAT(
-      EvalJs(
-          shell(),
-          "closeUdp({ localAddress: '127.0.0.1', multicastTimeToLive: 256 })")
-          .ExtractString(),
-      ::testing::StartsWith("closeUdp failed"));
-}
-
 IN_PROC_BROWSER_TEST_F(DirectSocketsUdpBrowserTest, SendUdpAfterClose) {
   const int32_t kRequiredBytes = 1;
   const std::string script =
diff --git a/content/browser/indexed_db/instance/backing_store.h b/content/browser/indexed_db/instance/backing_store.h
index 4f5de4f..f08c895 100644
--- a/content/browser/indexed_db/instance/backing_store.h
+++ b/content/browser/indexed_db/instance/backing_store.h
@@ -97,12 +97,21 @@
    public:
     virtual ~Transaction() = default;
 
-    // For now, refer to comments in level_db::BackingStore::Transaction for
-    // documentation.
-    virtual void Begin(std::vector<PartitionedLock> locks) = 0;
+    virtual Status Begin(std::vector<PartitionedLock> locks) = 0;
+    // CommitPhaseOne determines what blobs (if any) need to be written to disk
+    // and updates the primary blob journal, and kicks off the async writing
+    // of the blob files. In case of crash/rollback, the journal indicates what
+    // files should be cleaned up.
+    // The blob write callback will be called eventually on success or failure,
+    // or immediately if phase one is complete due to lack of any blobs to
+    // write.
     virtual Status CommitPhaseOne(
         BlobWriteCallback blob_write_callback,
         SerializeFsaCallback serialize_fsa_handle) = 0;
+    // CommitPhaseTwo is called once the blob files (if any) have been written
+    // to disk, and commits the actual transaction to the backing store,
+    // including blob journal updates, then deletes any blob files deleted
+    // by the transaction and not referenced by running scripts.
     virtual Status CommitPhaseTwo() = 0;
     virtual void Rollback() = 0;
 
diff --git a/content/browser/indexed_db/instance/fake_transaction.cc b/content/browser/indexed_db/instance/fake_transaction.cc
index 92e9bdc..96afeff2 100644
--- a/content/browser/indexed_db/instance/fake_transaction.cc
+++ b/content/browser/indexed_db/instance/fake_transaction.cc
@@ -38,8 +38,8 @@
 
 void FakeTransaction::Rollback() {}
 
-void FakeTransaction::Begin(std::vector<PartitionedLock> locks) {
-  wrapped_transaction_->Begin(std::move(locks));
+Status FakeTransaction::Begin(std::vector<PartitionedLock> locks) {
+  return wrapped_transaction_->Begin(std::move(locks));
 }
 
 Status FakeTransaction::SetDatabaseVersion(int64_t version) {
diff --git a/content/browser/indexed_db/instance/fake_transaction.h b/content/browser/indexed_db/instance/fake_transaction.h
index a6fa7dac..2da0228 100644
--- a/content/browser/indexed_db/instance/fake_transaction.h
+++ b/content/browser/indexed_db/instance/fake_transaction.h
@@ -22,10 +22,10 @@
   FakeTransaction(const FakeTransaction&) = delete;
   FakeTransaction& operator=(const FakeTransaction&) = delete;
 
+  Status Begin(std::vector<PartitionedLock> locks) override;
   Status CommitPhaseOne(BlobWriteCallback, SerializeFsaCallback) override;
   Status CommitPhaseTwo() override;
   void Rollback() override;
-  void Begin(std::vector<PartitionedLock> locks) override;
   Status SetDatabaseVersion(int64_t version) override;
   Status CreateObjectStore(int64_t object_store_id,
                            const std::u16string& name,
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.cc b/content/browser/indexed_db/instance/leveldb/backing_store.cc
index ccb5e9b..a545723 100644
--- a/content/browser/indexed_db/instance/leveldb/backing_store.cc
+++ b/content/browser/indexed_db/instance/leveldb/backing_store.cc
@@ -4037,7 +4037,7 @@
   backing_store_->OnTransactionComplete(tombstone_threshold_exceeded_);
 }
 
-void BackingStore::Transaction::Begin(std::vector<PartitionedLock> locks) {
+Status BackingStore::Transaction::Begin(std::vector<PartitionedLock> locks) {
   DCHECK(backing_store_);
   DCHECK(!transaction_.get());
   TRACE_EVENT0("IndexedDB", "BackingStore::Transaction::Begin");
@@ -4060,6 +4060,8 @@
   for (const auto& iter : backing_store_->in_memory_external_object_map_) {
     in_memory_external_object_map_[iter.first] = iter.second->Clone();
   }
+
+  return Status::OK();
 }
 
 Status BackingStore::MigrateToV4(LevelDBWriteBatch* write_batch) {
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.h b/content/browser/indexed_db/instance/leveldb/backing_store.h
index e757522..79a945d9 100644
--- a/content/browser/indexed_db/instance/leveldb/backing_store.h
+++ b/content/browser/indexed_db/instance/leveldb/backing_store.h
@@ -135,21 +135,10 @@
 
     ~Transaction() override;
 
-    // indexed_db::BackingStore::Transaction:
-    void Begin(std::vector<PartitionedLock> locks) override;
-    // CommitPhaseOne determines what blobs (if any) need to be written to disk
-    // and updates the primary blob journal, and kicks off the async writing
-    // of the blob files. In case of crash/rollback, the journal indicates what
-    // files should be cleaned up.
-    // The blob write callback will be called eventually on success or failure,
-    // or immediately if phase one is complete due to lack of any blobs to
-    // write. The `serialize_fsa_handle` callback is not used.
+    Status Begin(std::vector<PartitionedLock> locks) override;
+    // The `serialize_fsa_handle` callback is not used.
     Status CommitPhaseOne(BlobWriteCallback callback,
                           SerializeFsaCallback serialize_fsa_handle) override;
-    // CommitPhaseTwo is called once the blob files (if any) have been written
-    // to disk, and commits the actual transaction to the backing store,
-    // including blob journal updates, then deletes any blob files deleted
-    // by the transaction and not referenced by running scripts.
     Status CommitPhaseTwo() override;
     void Rollback() override;
     Status SetDatabaseVersion(int64_t version) override;
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
index 6a418ffb..368f1b25 100644
--- a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
+++ b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
@@ -25,9 +25,9 @@
   }
 }
 
-void BackingStoreTransactionImpl::Begin(std::vector<PartitionedLock> locks) {
+Status BackingStoreTransactionImpl::Begin(std::vector<PartitionedLock> locks) {
   locks_ = std::move(locks);
-  db_->BeginTransaction(PassKey(), *this);
+  return db_->BeginTransaction(PassKey(), *this);
 }
 
 Status BackingStoreTransactionImpl::CommitPhaseOne(
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h
index 1af2d3b..3f35675 100644
--- a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h
+++ b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h
@@ -35,7 +35,7 @@
   blink::mojom::IDBTransactionMode mode() const { return mode_; }
 
   // BackingStore::Transaction:
-  void Begin(std::vector<PartitionedLock> locks) override;
+  Status Begin(std::vector<PartitionedLock> locks) override;
   Status CommitPhaseOne(BlobWriteCallback callback,
                         SerializeFsaCallback serialize_fsa) override;
   Status CommitPhaseTwo() override;
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.cc b/content/browser/indexed_db/instance/sqlite/database_connection.cc
index ef1f4c5a..d9c5131 100644
--- a/content/browser/indexed_db/instance/sqlite/database_connection.cc
+++ b/content/browser/indexed_db/instance/sqlite/database_connection.cc
@@ -61,11 +61,10 @@
     return base::unexpected(Status(*db_));       \
   }
 
-// Runs the statement and returns if there was an error. For use with functions
-// that return Status.
-#define RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement) \
-  if (!statement.Run()) {                               \
-    return Status(*db_);                                \
+// Returns a `Status` if the passed expression evaluates to false.
+#define RETURN_STATUS_ON_ERROR(expr) \
+  if (!expr) {                       \
+    return Status(*db_);             \
   }
 
 // Executes the given SQL on `db` and returns a Status if there was an error.
@@ -856,33 +855,25 @@
       path_.empty() ? kSqlTagInMemory : kSqlTag);
 
   if (path_.empty()) {
-    if (!db_->OpenInMemory()) {
-      return Status(*db_);
-    }
-  } else if (!db_->Open(path_)) {
-    return Status(*db_);
+    RETURN_STATUS_ON_ERROR(db_->OpenInMemory());
+  } else {
+    RETURN_STATUS_ON_ERROR(db_->Open(path_));
   }
 
   // What SQLite calls "recursive" triggers are required for SQLite to execute
   // a DELETE ON trigger after `INSERT OR REPLACE` replaces a row.
-  if (!db_->Execute("PRAGMA recursive_triggers=ON")) {
-    return Status(*db_);
-  }
+  RETURN_STATUS_ON_ERROR(db_->Execute("PRAGMA recursive_triggers=ON"));
 
   sql::Transaction transaction(db_.get());
-  if (!transaction.Begin()) {
-    return Status(*db_);
-  }
+  RETURN_STATUS_ON_ERROR(transaction.Begin());
 
   if (!sql::MetaTable::DoesTableExist(db_.get())) {
     IDB_RETURN_IF_ERROR(CreateSchema(db_.get(), *name));
   }
 
   meta_table_ = std::make_unique<sql::MetaTable>();
-  if (!meta_table_->Init(db_.get(), kCurrentSchemaVersion,
-                         kCompatibleSchemaVersion)) {
-    return Status(*db_);
-  }
+  RETURN_STATUS_ON_ERROR(meta_table_->Init(db_.get(), kCurrentSchemaVersion,
+                                           kCompatibleSchemaVersion));
 
   if (meta_table_->GetCompatibleVersionNumber() > kCurrentSchemaVersion) {
     // TODO(crbug.com/419272070): handle this and other cases where the DB needs
@@ -921,12 +912,9 @@
   sql::Statement statement(db_->GetCachedStatement(
       SQL_FROM_HERE,
       "DELETE FROM blob_references WHERE record_row_id IS NULL"));
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
 
-  if (!transaction.Commit()) {
-    return Status(*db_);
-  }
-
+  RETURN_STATUS_ON_ERROR(transaction.Commit());
   inited_ = true;
   return Status::OK();
 }
@@ -974,7 +962,7 @@
                                                        mode);
 }
 
-void DatabaseConnection::BeginTransaction(
+Status DatabaseConnection::BeginTransaction(
     base::PassKey<BackingStoreTransactionImpl>,
     const BackingStoreTransactionImpl& transaction) {
   // No other transaction can begin while a version change transaction is
@@ -982,23 +970,23 @@
   CHECK(!HasActiveVersionChangeTransaction());
   if (transaction.mode() == blink::mojom::IDBTransactionMode::ReadOnly) {
     // Nothing to do.
-    return;
+    return Status::OK();
   }
   CHECK(!active_rw_transaction_);
   active_rw_transaction_ = std::make_unique<sql::Transaction>(db_.get());
   if (transaction.durability() ==
       blink::mojom::IDBTransactionDurability::Strict) {
-    TRANSIENT_CHECK(db_->Execute("PRAGMA synchronous=FULL"));
+    RETURN_STATUS_ON_ERROR(db_->Execute("PRAGMA synchronous=FULL"));
   } else {
     // WAL mode is guaranteed to be consistent only with synchronous=NORMAL or
     // higher: https://www.sqlite.org/pragma.html#pragma_synchronous.
-    TRANSIENT_CHECK(db_->Execute("PRAGMA synchronous=NORMAL"));
+    RETURN_STATUS_ON_ERROR(db_->Execute("PRAGMA synchronous=NORMAL"));
   }
-  // TODO(crbug.com/40253999): How do we surface the error if this call fails?
-  TRANSIENT_CHECK(active_rw_transaction_->Begin());
+  RETURN_STATUS_ON_ERROR(active_rw_transaction_->Begin());
   if (transaction.mode() == blink::mojom::IDBTransactionMode::VersionChange) {
     metadata_snapshot_.emplace(metadata_);
   }
+  return Status::OK();
 }
 
 Status DatabaseConnection::CommitTransactionPhaseOne(
@@ -1033,12 +1021,13 @@
     std::optional<sql::StreamingBlobHandle> blob_for_writing =
         db_->GetStreamingBlob("blobs", "bytes", blob_row_id,
                               /*readonly=*/false);
-    TRANSIENT_CHECK(blob_for_writing);
-    std::unique_ptr<BlobWriter> writer = BlobWriter::WriteBlobIntoDatabase(
-        external_object, *std::move(blob_for_writing),
-        base::BindOnce(&DatabaseConnection::OnBlobWriteComplete,
-                       blob_writers_weak_factory_.GetWeakPtr(), blob_row_id));
-
+    std::unique_ptr<BlobWriter> writer;
+    if (blob_for_writing) {
+      writer = BlobWriter::WriteBlobIntoDatabase(
+          external_object, *std::move(blob_for_writing),
+          base::BindOnce(&DatabaseConnection::OnBlobWriteComplete,
+                         blob_writers_weak_factory_.GetWeakPtr(), blob_row_id));
+    }
     if (!writer) {
       CancelBlobWriting();
       // This is currently ignored as the error is already surfaced through
@@ -1104,7 +1093,7 @@
   }
   // No need to sync active blobs when the transaction successfully commits.
   sync_active_blobs_after_transaction_ = false;
-  TRANSIENT_CHECK(active_rw_transaction_->Commit());
+  RETURN_STATUS_ON_ERROR(active_rw_transaction_->Commit());
   if (transaction.mode() == blink::mojom::IDBTransactionMode::VersionChange) {
     CHECK(metadata_snapshot_.has_value());
     metadata_snapshot_.reset();
@@ -1187,7 +1176,7 @@
   sql::Statement statement(
       db_->GetUniqueStatement("UPDATE indexed_db_metadata SET version = ?"));
   statement.BindInt64(0, version);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   metadata_.version = version;
   return Status::OK();
 }
@@ -1216,7 +1205,7 @@
   BindKeyPath(statement, 2, metadata.key_path);
   statement.BindBool(3, metadata.auto_increment);
   statement.BindInt64(4, ObjectStoreMetaDataKey::kKeyGeneratorInitialNumber);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
 
   metadata_.object_stores[object_store_id] = std::move(metadata);
   metadata_.max_object_store_id = object_store_id;
@@ -1235,25 +1224,25 @@
         SQL_FROM_HERE,
         "DELETE FROM index_references WHERE object_store_id = ?"));
     statement.BindInt64(0, object_store_id);
-    RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+    RETURN_STATUS_ON_ERROR(statement.Run());
   }
   {
     sql::Statement statement(db_->GetCachedStatement(
         SQL_FROM_HERE, "DELETE FROM indexes WHERE object_store_id = ?"));
     statement.BindInt64(0, object_store_id);
-    RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+    RETURN_STATUS_ON_ERROR(statement.Run());
   }
   {
     sql::Statement statement(db_->GetCachedStatement(
         SQL_FROM_HERE, "DELETE FROM records WHERE object_store_id = ?"));
     statement.BindInt64(0, object_store_id);
-    RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+    RETURN_STATUS_ON_ERROR(statement.Run());
   }
   {
     sql::Statement statement(db_->GetCachedStatement(
         SQL_FROM_HERE, "DELETE FROM object_stores WHERE id = ?"));
     statement.BindInt64(0, object_store_id);
-    RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+    RETURN_STATUS_ON_ERROR(statement.Run());
   }
   CHECK(metadata_.object_stores.erase(object_store_id) == 1);
   return Status::OK();
@@ -1271,7 +1260,7 @@
       SQL_FROM_HERE, "UPDATE object_stores SET name = ? WHERE id = ?"));
   statement.BindBlob(0, new_name);
   statement.BindInt64(1, object_store_id);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   metadata_.object_stores.at(object_store_id).name = new_name;
   return Status::OK();
 }
@@ -1303,7 +1292,7 @@
   BindKeyPath(statement, 3, index.key_path);
   statement.BindBool(4, index.unique);
   statement.BindBool(5, index.multi_entry);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
 
   object_store.indexes[index_id] = std::move(index);
   object_store.max_index_id = index_id;
@@ -1328,7 +1317,7 @@
                                 "WHERE object_store_id = ? AND index_id = ?"));
     statement.BindInt64(0, object_store_id);
     statement.BindInt64(1, index_id);
-    RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+    RETURN_STATUS_ON_ERROR(statement.Run());
   }
   {
     sql::Statement statement(db_->GetCachedStatement(
@@ -1336,7 +1325,7 @@
         "DELETE FROM indexes WHERE object_store_id = ? AND id = ?"));
     statement.BindInt64(0, object_store_id);
     statement.BindInt64(1, index_id);
-    RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+    RETURN_STATUS_ON_ERROR(statement.Run());
   }
   CHECK(metadata_.object_stores.at(object_store_id).indexes.erase(index_id) ==
         1);
@@ -1361,7 +1350,7 @@
   statement.BindBlob(0, new_name);
   statement.BindInt64(1, object_store_id);
   statement.BindInt64(2, index_id);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   metadata_.object_stores.at(object_store_id).indexes.at(index_id).name =
       new_name;
   return Status::OK();
@@ -1391,7 +1380,7 @@
   statement.BindInt64(0, new_number);
   statement.BindInt64(1, object_store_id);
   statement.BindInt64(2, new_number);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   return Status::OK();
 }
 
@@ -1616,7 +1605,7 @@
       StartRecordRangeQuery("DELETE", key_range);
   sql::Statement statement(db_->GetUniqueStatement(base::StrCat(query_pieces)));
   BindRecordRangeQueryParams(statement, object_store_id, key_range);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   return Status::OK();
 }
 
@@ -1626,7 +1615,7 @@
   sql::Statement statement(db_->GetCachedStatement(
       SQL_FROM_HERE, "DELETE FROM records WHERE object_store_id = ?"));
   statement.BindInt64(0, object_store_id);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   return Status::OK();
 }
 
@@ -1667,7 +1656,7 @@
   statement.BindBlob(2, EncodeSortableIDBKey(key));
   statement.BindInt64(3, object_store_id);
   statement.BindBlob(4, record.data);
-  RUN_STATEMENT_RETURN_STATUS_ON_ERROR(statement);
+  RETURN_STATUS_ON_ERROR(statement.Run());
   return Status::OK();
 }
 
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.h b/content/browser/indexed_db/instance/sqlite/database_connection.h
index e0dcb77..7689e502 100644
--- a/content/browser/indexed_db/instance/sqlite/database_connection.h
+++ b/content/browser/indexed_db/instance/sqlite/database_connection.h
@@ -93,8 +93,8 @@
       blink::mojom::IDBTransactionDurability durability,
       blink::mojom::IDBTransactionMode mode);
 
-  void BeginTransaction(base::PassKey<BackingStoreTransactionImpl>,
-                        const BackingStoreTransactionImpl& transaction);
+  Status BeginTransaction(base::PassKey<BackingStoreTransactionImpl>,
+                          const BackingStoreTransactionImpl& transaction);
   // In this phase, blobs, if any, are asynchronously written.
   Status CommitTransactionPhaseOne(
       base::PassKey<BackingStoreTransactionImpl>,
diff --git a/content/browser/indexed_db/instance/transaction.cc b/content/browser/indexed_db/instance/transaction.cc
index 856f019a..fe64149f 100644
--- a/content/browser/indexed_db/instance/transaction.cc
+++ b/content/browser/indexed_db/instance/transaction.cc
@@ -1006,13 +1006,17 @@
     return RunTasksResult::kNotFinished;
   }
 
-  processing_event_queue_ = true;
-
   if (!backing_store_transaction_begun_) {
-    backing_store_transaction_->Begin(std::move(locks_receiver_.locks));
+    Status s =
+        backing_store_transaction_->Begin(std::move(locks_receiver_.locks));
+    if (!s.ok()) {
+      return base::unexpected(s);
+    }
     backing_store_transaction_begun_ = true;
   }
 
+  processing_event_queue_ = true;
+
   bool run_preemptive_queue =
       !preemptive_task_queue_.empty() || pending_preemptive_events_ != 0;
   TaskQueue* task_queue =
diff --git a/content/browser/preloading/prerender/prerender_host.cc b/content/browser/preloading/prerender/prerender_host.cc
index 15f2f9c..bbf85476 100644
--- a/content/browser/preloading/prerender/prerender_host.cc
+++ b/content/browser/preloading/prerender/prerender_host.cc
@@ -545,7 +545,8 @@
   load_url_params.referrer = attributes_.referrer;
 
   load_url_params.override_user_agent =
-      web_contents_->GetDelegate()->ShouldOverrideUserAgentForPrerender2();
+      web_contents_->GetDelegate()->ShouldOverrideUserAgentForPrerender2(
+          attributes_.prerendering_url);
 
   // TODO(https://crbug.com/1406149, https://crbug.com/1378921): Set
   // `override_user_agent` for Android. This field is determined on the Java
diff --git a/content/browser/renderer_host/code_cache_host_impl.cc b/content/browser/renderer_host/code_cache_host_impl.cc
index 404ff1e4..408337dea 100644
--- a/content/browser/renderer_host/code_cache_host_impl.cc
+++ b/content/browser/renderer_host/code_cache_host_impl.cc
@@ -4,14 +4,17 @@
 
 #include "content/browser/renderer_host/code_cache_host_impl.h"
 
+#include <string_view>
 #include <utility>
 
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
+#include "components/persistent_cache/entry.h"
 #include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "components/services/storage/public/mojom/cache_storage_control.mojom.h"
 #include "content/browser/child_process_security_policy_impl.h"
@@ -23,10 +26,14 @@
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/url_constants.h"
+#include "mojo/public/cpp/base/big_buffer.h"
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "net/base/io_buffer.h"
+#include "net/http/http_cache.h"
 #include "third_party/blink/public/common/cache_storage/cache_storage_utils.h"
+#include "third_party/blink/public/common/features_generated.h"
 #include "third_party/blink/public/common/scheme_registry.h"
+#include "third_party/blink/public/mojom/loader/code_cache.mojom-data-view.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -36,6 +43,18 @@
 
 namespace {
 
+GeneratedCodeCache::CodeCacheType MojoCacheTypeToCodeCacheType(
+    blink::mojom::CodeCacheType type) {
+  switch (type) {
+    case blink::mojom::CodeCacheType::kJavascript:
+      return GeneratedCodeCache::CodeCacheType::kJavaScript;
+    case blink::mojom::CodeCacheType::kWebAssembly:
+      return GeneratedCodeCache::CodeCacheType::kWebAssembly;
+    default:
+      NOTREACHED();
+  }
+}
+
 bool CheckSecurityForAccessingCodeCacheData(
     const GURL& resource_url,
     int render_process_id,
@@ -240,6 +259,25 @@
   cache_storage_control_for_testing_ = cache_storage_control;
 }
 
+bool CodeCacheHostImpl::IsPersistentCacheForCodeCacheEnabled() {
+  ProcessLock process_lock =
+      ChildProcessSecurityPolicyImpl::GetInstance()->GetProcessLock(
+          render_process_id_);
+
+  // Serve ChromeUI from existing cache implementation.
+  // TODO(crbug.com/377475540): Use another PersistentCacheCollection for
+  // ChromeUI.
+  if (process_lock.MatchesScheme(content::kChromeUIScheme) ||
+      process_lock.MatchesScheme(content::kChromeUIUntrustedScheme)) {
+    return false;
+  }
+
+  // The feature is only compatible with split caches.
+  return base::FeatureList::IsEnabled(
+             blink::features::kUsePersistentCacheForCodeCache) &&
+         net::HttpCache::IsSplitCacheEnabled();
+}
+
 void CodeCacheHostImpl::DidGenerateCacheableMetadata(
     blink::mojom::CodeCacheType cache_type,
     const GURL& url,
@@ -247,29 +285,44 @@
     mojo_base::BigBuffer data) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  GeneratedCodeCache* code_cache = GetCodeCache(cache_type);
-  if (!code_cache)
-    return;
-
   std::optional<GURL> secondary_key =
       GetSecondaryKeyForCodeCache(url, render_process_id_, Operation::kWrite);
   if (!secondary_key) {
     return;
   }
 
-  code_cache->WriteEntry(url, *secondary_key, network_isolation_key_,
-                         expected_response_time, std::move(data));
+  if (IsPersistentCacheForCodeCacheEnabled()) {
+    std::string resource_key = GeneratedCodeCache::GetResourceKey(
+        url, MojoCacheTypeToCodeCacheType(cache_type));
+    std::string context_key = GeneratedCodeCache::GetContextKey(
+        secondary_key.value(), network_isolation_key_,
+        MojoCacheTypeToCodeCacheType(cache_type));
+
+    // No context key means no way to isolate per context which is not supported
+    // under PersistentCacheForCodeCache.
+    if (!context_key.empty()) {
+      generated_code_cache_context_->InsertIntoPersistentCacheCollection(
+          context_key, resource_key, std::move(data),
+          persistent_cache::EntryMetadata{
+              .input_signature =
+                  expected_response_time.ToDeltaSinceWindowsEpoch()
+                      .InMicroseconds()});
+    }
+  } else {
+    GeneratedCodeCache* code_cache = GetCodeCache(cache_type);
+    if (!code_cache) {
+      return;
+    }
+
+    code_cache->WriteEntry(url, *secondary_key, network_isolation_key_,
+                           expected_response_time, std::move(data));
+  }
 }
 
 void CodeCacheHostImpl::FetchCachedCode(blink::mojom::CodeCacheType cache_type,
                                         const GURL& url,
                                         FetchCachedCodeCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  GeneratedCodeCache* code_cache = GetCodeCache(cache_type);
-  if (!code_cache) {
-    std::move(callback).Run(base::Time(), {});
-    return;
-  }
 
   std::optional<GURL> secondary_key =
       GetSecondaryKeyForCodeCache(url, render_process_id_, Operation::kRead);
@@ -278,11 +331,46 @@
     return;
   }
 
-  auto read_callback = base::BindOnce(
-      &CodeCacheHostImpl::OnReceiveCachedCode, weak_ptr_factory_.GetWeakPtr(),
-      cache_type, base::TimeTicks::Now(), std::move(callback));
-  code_cache->FetchEntry(url, *secondary_key, network_isolation_key_,
-                         std::move(read_callback));
+  if (IsPersistentCacheForCodeCacheEnabled()) {
+    std::string resource_key = GeneratedCodeCache::GetResourceKey(
+        url, MojoCacheTypeToCodeCacheType(cache_type));
+    std::string context_key = GeneratedCodeCache::GetContextKey(
+        secondary_key.value(), network_isolation_key_,
+        MojoCacheTypeToCodeCacheType(cache_type));
+
+    // No context key means no way to isolate per context which is not supported
+    // under PersistentCacheForCodeCache.
+    if (context_key.empty()) {
+      std::move(callback).Run(base::Time(), mojo_base::BigBuffer());
+      return;
+    }
+
+    std::unique_ptr<persistent_cache::Entry> entry =
+        generated_code_cache_context_->FindInPersistentCacheCollection(
+            context_key, resource_key);
+
+    if (entry && entry->GetContentSize() > 0) {
+      std::move(callback).Run(
+          base::Time::FromDeltaSinceWindowsEpoch(
+              base::Microseconds(entry->GetMetadata().input_signature)),
+          mojo_base::BigBuffer(entry->GetContentSpan()));
+    } else {
+      std::move(callback).Run(base::Time(), mojo_base::BigBuffer());
+    }
+
+  } else {
+    GeneratedCodeCache* code_cache = GetCodeCache(cache_type);
+    if (!code_cache) {
+      std::move(callback).Run(base::Time(), {});
+      return;
+    }
+
+    auto read_callback = base::BindOnce(
+        &CodeCacheHostImpl::OnReceiveCachedCode, weak_ptr_factory_.GetWeakPtr(),
+        cache_type, base::TimeTicks::Now(), std::move(callback));
+    code_cache->FetchEntry(url, *secondary_key, network_isolation_key_,
+                           std::move(read_callback));
+  }
 }
 
 void CodeCacheHostImpl::ClearCodeCacheEntry(
diff --git a/content/browser/renderer_host/code_cache_host_impl.h b/content/browser/renderer_host/code_cache_host_impl.h
index e4069b98..faa0da26 100644
--- a/content/browser/renderer_host/code_cache_host_impl.h
+++ b/content/browser/renderer_host/code_cache_host_impl.h
@@ -106,6 +106,10 @@
   };
 
  private:
+  FRIEND_TEST_ALL_PREFIXES(CodeCacheHostImplTest, PersistentCacheWriteAndRead);
+
+  bool IsPersistentCacheForCodeCacheEnabled();
+
   // blink::mojom::CodeCacheHost implementation.
   void DidGenerateCacheableMetadata(blink::mojom::CodeCacheType cache_type,
                                     const GURL& url,
diff --git a/content/browser/renderer_host/code_cache_host_impl_unittest.cc b/content/browser/renderer_host/code_cache_host_impl_unittest.cc
new file mode 100644
index 0000000..97270c53
--- /dev/null
+++ b/content/browser/renderer_host/code_cache_host_impl_unittest.cc
@@ -0,0 +1,158 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/renderer_host/code_cache_host_impl.h"
+
+#include "base/containers/span.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
+#include "base/run_loop.h"
+#include "base/task/sequenced_task_runner.h"
+#include "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "content/browser/child_process_security_policy_impl.h"
+#include "content/browser/code_cache/generated_code_cache_context.h"
+#include "content/browser/process_lock.h"
+#include "content/browser/site_instance_impl.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_browser_context.h"
+#include "mojo/public/cpp/base/big_buffer.h"
+#include "net/base/features.h"
+#include "net/http/http_cache.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features.h"
+
+namespace content {
+
+class CodeCacheHostImplTest : public testing::Test {
+ public:
+  CodeCacheHostImplTest() {
+    feature_list_.InitWithFeatures(
+        {blink::features::kUsePersistentCacheForCodeCache,
+         net::features::kSplitCacheByNetworkIsolationKey},
+        {});
+    CHECK(temp_dir_.CreateUniqueTempDir());
+    generated_code_cache_context_ =
+        base::MakeRefCounted<GeneratedCodeCacheContext>();
+    generated_code_cache_context_->Initialize(temp_dir_.GetPath(), 0);
+  }
+
+  ~CodeCacheHostImplTest() override {
+    generated_code_cache_context_->Shutdown();
+  }
+
+  void SetupRendererWithLock(int process_id, const GURL& url) {
+    ChildProcessSecurityPolicyImpl* p =
+        ChildProcessSecurityPolicyImpl::GetInstance();
+    p->AddForTesting(process_id, &browser_context_);
+
+    scoped_refptr<SiteInstanceImpl> site_instance =
+        SiteInstanceImpl::CreateForTesting(&browser_context_, url);
+    ChildProcessSecurityPolicyImpl::GetInstance()->LockProcess(
+        site_instance->GetIsolationContext(), process_id, false,
+        ProcessLock::FromSiteInfo(site_instance->GetSiteInfo()));
+  }
+
+ protected:
+  BrowserTaskEnvironment task_environment_;
+  TestBrowserContext browser_context_;
+  base::test::ScopedFeatureList feature_list_;
+  base::ScopedTempDir temp_dir_;
+  scoped_refptr<GeneratedCodeCacheContext> generated_code_cache_context_;
+};
+
+#if !BUILDFLAG(IS_FUCHSIA)
+TEST_F(CodeCacheHostImplTest, PersistentCacheWriteAndRead) {
+#else
+// PersistentCache is not supported on Fuchsia.
+TEST_F(CodeCacheHostImplTest, DISABLED_PersistentCacheWriteAndRead) {
+#endif
+  const base::Time response_time = base::Time::Now();
+  const std::string data_str = "some data";
+  const mojo_base::BigBuffer data(base::as_byte_span(data_str));
+  const GURL original_resource_url("http://example.com/script.js");
+
+  // Storing and retrieving for from the same isolation context works.
+  {
+    base::RunLoop runloop;
+    auto quit_closure = runloop.QuitClosure();
+
+    GURL url = original_resource_url;
+    GURL origin_lock("http://example.com");
+    net::NetworkIsolationKey nik(net::SchemefulSite{url},
+                                 net::SchemefulSite{url});
+
+    const int process_id = 12;
+    SetupRendererWithLock(process_id, url);
+
+    GeneratedCodeCacheContext::RunOrPostTask(
+        generated_code_cache_context_.get(), FROM_HERE,
+        base::BindLambdaForTesting([&]() {
+          CodeCacheHostImpl host(process_id, generated_code_cache_context_, nik,
+                                 blink::StorageKey::CreateFirstParty(
+                                     url::Origin::Create(origin_lock)));
+
+          host.DidGenerateCacheableMetadata(
+              blink::mojom::CodeCacheType::kJavascript, url, response_time,
+              data.Clone());
+
+          host.FetchCachedCode(
+              blink::mojom::CodeCacheType::kJavascript, url,
+
+              base::BindOnce(
+                  [&](base::Time expected_response_time,
+                      const std::string& expected_data,
+                      base::OnceClosure quit_closure, base::Time response_time,
+                      mojo_base::BigBuffer data) {
+                    EXPECT_EQ(expected_response_time, response_time);
+                    EXPECT_EQ(
+                        expected_data,
+                        std::string(reinterpret_cast<const char*>(data.data()),
+                                    data.size()));
+                    std::move(quit_closure).Run();
+                  },
+                  response_time, data_str, quit_closure));
+        }));
+    runloop.Run();
+  }
+
+  // Attempting to retrieve code for `original_resource_url` from a different
+  // isolation context does not work and instead returns default values.
+  {
+    base::RunLoop runloop;
+    auto quit_closure = runloop.QuitClosure();
+
+    GURL url("http://other.com/script.js");
+    GURL origin_lock("http://other.com");
+    net::NetworkIsolationKey nik(net::SchemefulSite{url},
+                                 net::SchemefulSite{url});
+
+    const int process_id = 24;
+    SetupRendererWithLock(process_id, url);
+
+    GeneratedCodeCacheContext::RunOrPostTask(
+        generated_code_cache_context_.get(), FROM_HERE,
+        base::BindLambdaForTesting([&]() {
+          CodeCacheHostImpl host(process_id, generated_code_cache_context_, nik,
+                                 blink::StorageKey::CreateFirstParty(
+                                     url::Origin::Create(origin_lock)));
+          host.FetchCachedCode(
+              blink::mojom::CodeCacheType::kJavascript, original_resource_url,
+
+              base::BindOnce(
+                  [&](base::OnceClosure quit_closure, base::Time response_time,
+                      mojo_base::BigBuffer data) {
+                    EXPECT_EQ(response_time, base::Time());
+                    EXPECT_EQ(data.byte_span(),
+                              mojo_base::BigBuffer().byte_span());
+                    std::move(quit_closure).Run();
+                  },
+                  quit_closure));
+        }));
+    runloop.Run();
+  }
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/navigation_controller_android.cc b/content/browser/renderer_host/navigation_controller_android.cc
index c47592b..ceafb11e 100644
--- a/content/browser/renderer_host/navigation_controller_android.cc
+++ b/content/browser/renderer_host/navigation_controller_android.cc
@@ -261,15 +261,12 @@
 
     // If the attribution src token exists, then an impression exists with this
     // navigation.
-    if (GetAttributionSrcTokenFromJavaAdditionalNavigationParams(
-            env, j_additional_navigation_params)
-            .has_value()) {
-      blink::Impression impression;
-      impression.attribution_src_token =
-          GetAttributionSrcTokenFromJavaAdditionalNavigationParams(
-              env, j_additional_navigation_params)
-              .value();
-      params.impression = impression;
+    if (std::optional<blink::AttributionSrcToken> attribution_src_token =
+            GetAttributionSrcTokenFromJavaAdditionalNavigationParams(
+                env, j_additional_navigation_params)) {
+      params.impression = blink::Impression{
+          .attribution_src_token = *attribution_src_token,
+      };
     }
   }
 
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 3677a957..0dc4e01 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3015,6 +3015,10 @@
   return delta <= kMaxInterval;
 }
 
+base::TimeTicks WebContentsImpl::GetLastInteractionTimeTicks() {
+  return last_interaction_time_;
+}
+
 WebContents::ScopedIgnoreInputEvents WebContentsImpl::IgnoreInputEvents(
     std::optional<WebInputEventAuditCallback> audit_callback) {
   OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::IgnoreInputEvents");
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 8bad6ba..3850e89 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -636,6 +636,7 @@
       std::unique_ptr<SelectionPopupDelegate> delegate) override;
 #endif
   bool HasRecentInteraction() override;
+  base::TimeTicks GetLastInteractionTimeTicks() override;
   [[nodiscard]] ScopedIgnoreInputEvents IgnoreInputEvents(
       std::optional<WebInputEventAuditCallback> audit_callback) override;
   bool ShouldIgnoreInputEventsForTesting() override;
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index 37c2351..d970f36 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -1538,6 +1538,9 @@
   // user activation work: crbug.com/848778
   virtual bool HasRecentInteraction() = 0;
 
+  // Returns the time ticks of the last user interaction.
+  virtual base::TimeTicks GetLastInteractionTimeTicks() = 0;
+
   // Causes the WebContents to ignore input events for at least as long as the
   // token exists. In the event of multiple calls, input events will be ignored
   // until all tokens have been destroyed.
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index a8c0f1c..47ab12b 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -28,6 +28,7 @@
 #include "ui/base/mojom/window_show_state.mojom.h"
 #include "ui/base/ui_base_types.h"
 #include "ui/gfx/geometry/rect.h"
+#include "url/gurl.h"
 
 namespace content {
 
@@ -412,7 +413,7 @@
 }
 
 NavigationController::UserAgentOverrideOption
-WebContentsDelegate::ShouldOverrideUserAgentForPrerender2() {
+WebContentsDelegate::ShouldOverrideUserAgentForPrerender2(const GURL& url) {
   return NavigationController::UA_OVERRIDE_INHERIT;
 }
 
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 1af915f..2bae2901 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -769,9 +769,11 @@
   // WebContents::StartPrerendering().
   virtual int AllowedPrerenderingCount(WebContents& web_contents);
 
-  // Returns whether to override user agent for prerendering navigation.
+  // Returns whether to override user agent for prerendering navigation. `url`
+  // is the target URL of the request. This function can be called repeatedly
+  // for each URL in the redirect chain.
   virtual NavigationController::UserAgentOverrideOption
-  ShouldOverrideUserAgentForPrerender2();
+  ShouldOverrideUserAgentForPrerender2(const GURL& url);
 
   // Returns true if the embedder allows initiator and transition type mismatch
   // for prerender activation navigations that are embedder-initiated and have
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index f087a28..59916ef4 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -640,6 +640,10 @@
 // If explicitly disabled, prefetch proxy is not used.
 BASE_FEATURE(PrefetchProxy, base::FEATURE_ENABLED_BY_DEFAULT);
 
+// Killswitch for UA override issue fix (crbug.com/441612842) in preloading.
+BASE_FEATURE(PreloadingRespectUserAgentOverride,
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // If enabled, the feature allows the prerender host to be reused for the
 // future same-site page prerender if marked as reusable.
 BASE_FEATURE(Prerender2ReuseHost, base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index a7fd005..f731b1a 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -195,6 +195,7 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPeriodicBackgroundSync);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchPrerenderIntegration);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrefetchProxy);
+CONTENT_EXPORT BASE_DECLARE_FEATURE(kPreloadingRespectUserAgentOverride);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kPrerender2ReuseHost);
 CONTENT_EXPORT BASE_DECLARE_FEATURE_PARAM(bool,
                                           kPrerender2ReuseSearchResultHost);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 8e939c6..83aedf8 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2783,6 +2783,7 @@
     "../browser/renderer_host/back_forward_cache_subframe_navigation_throttle_unittest.cc",
     "../browser/renderer_host/browsing_context_group_swap_unittest.cc",
     "../browser/renderer_host/clipboard_host_impl_unittest.cc",
+    "../browser/renderer_host/code_cache_host_impl_unittest.cc",
     "../browser/renderer_host/commit_deferring_condition_runner_unittest.cc",
     "../browser/renderer_host/cursor_manager_unittest.cc",
     "../browser/renderer_host/debug_urls_unittest.cc",
@@ -3072,15 +3073,10 @@
     ]
   }
 
-  if (is_ios) {
-    sources += [
-      "../browser/renderer_host/render_widget_host_view_ios_uiview_unittest.mm",
-    ]
-  }
-
   if (is_ios && target_platform == "iphoneos") {
     sources += [
       "../browser/date_time_chooser/ios/date_time_chooser_util_unittest.mm",
+      "../browser/renderer_host/render_widget_host_view_ios_uiview_unittest.mm",
     ]
   }
 
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index 8055da2..3c1c0f7 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -95,8 +95,6 @@
 
     if (is_mac) {
       sources += [
-        "apple/keychain_seckeychain.cc",
-        "apple/keychain_seckeychain.h",
         "apple/scoped_lacontext.h",
         "apple/scoped_lacontext.mm",
         "apple/security_framework_lock.cc",
diff --git a/crypto/apple/keychain.cc b/crypto/apple/keychain.cc
index a4f52e7..b4c6b43 100644
--- a/crypto/apple/keychain.cc
+++ b/crypto/apple/keychain.cc
@@ -11,29 +11,11 @@
 #include "crypto/apple/keychain_secitem.h"
 #include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 
-#if BUILDFLAG(IS_MAC)
-#include "crypto/apple/keychain_seckeychain.h"
-#endif
-
 namespace crypto::apple {
 
-#if BUILDFLAG(IS_MAC)
-BASE_FEATURE(kAppleKeychainUseSecItem,
-             "AppleKeychainUseSecItem",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-#endif
-
 // static
 std::unique_ptr<Keychain> Keychain::DefaultKeychain() {
-#if BUILDFLAG(IS_MAC)
-  if (base::FeatureList::IsEnabled(kAppleKeychainUseSecItem)) {
-    return std::make_unique<KeychainSecItem>();
-  }
-
-  return std::make_unique<KeychainSecKeychain>();
-#else
   return std::make_unique<KeychainSecItem>();
-#endif
 }
 
 Keychain::Keychain() = default;
@@ -43,14 +25,10 @@
 
 // ---------- ScopedKeychainUserInteractionAllowed ----------
 
-// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
-// Removal of its use is tracked in https://crbug.com/40233280 but deprecation
-// warnings are disabled in the meanwhile.
-//
-// This specific usage is unfortunate. While the new SecItem keychain API has
-// ways to suppress user interaction, none of those ways work when using the new
-// API to access file-based keychains. This was filed as FB16959400, but until
-// that is addressed, this usage of deprecated API cannot be removed.
+// On the Mac, the SecItem keychain API has ways to suppress user interaction,
+// but none of those ways work when using it to access file-based keychains.
+// This was filed as FB16959400, but until that is addressed, this usage of
+// deprecated API cannot be removed.
 
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
diff --git a/crypto/apple/keychain.h b/crypto/apple/keychain.h
index 2438c39..b5e604c 100644
--- a/crypto/apple/keychain.h
+++ b/crypto/apple/keychain.h
@@ -18,7 +18,6 @@
 
 namespace crypto::apple {
 
-// DEPRECATED: use `KeychainV2` instead.
 // Wraps the KeychainServices API in a very thin layer, to allow it to be
 // mocked out for testing.
 
@@ -26,7 +25,7 @@
 // through directly to their Keychain Services equivalents (Foo ->
 // SecKeychainFoo).
 //
-// New code should use KeychainV2.
+// TODO(https://crbug.com/441317288): Unify with KeychainV2.
 class CRYPTO_EXPORT Keychain {
  public:
   // Returns an object suitable for accessing the platform's default type of
diff --git a/crypto/apple/keychain_seckeychain.cc b/crypto/apple/keychain_seckeychain.cc
deleted file mode 100644
index a737276c..0000000
--- a/crypto/apple/keychain_seckeychain.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "crypto/apple/keychain_seckeychain.h"
-
-#include "base/containers/span.h"
-#include "base/containers/to_vector.h"
-#include "base/memory/raw_ptr.h"
-#include "base/synchronization/lock.h"
-#include "base/types/expected.h"
-#include "crypto/apple/security_framework_lock.h"
-
-// Much of the Keychain API was marked deprecated as of the macOS 13 SDK.
-// Removal of its use is tracked in https://crbug.com/40233280 but deprecation
-// warnings are disabled in the meanwhile.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-
-namespace crypto::apple {
-
-KeychainSecKeychain::KeychainSecKeychain() = default;
-
-KeychainSecKeychain::~KeychainSecKeychain() = default;
-
-base::expected<std::vector<uint8_t>, OSStatus>
-KeychainSecKeychain::FindGenericPassword(std::string_view service_name,
-                                         std::string_view account_name) const {
-  base::AutoLock lock(GetSecurityFrameworkLock());
-  uint32_t password_length = 0;
-  void* password_data = nullptr;
-  OSStatus status = SecKeychainFindGenericPassword(
-      nullptr, service_name.length(), service_name.data(),
-      account_name.length(), account_name.data(), &password_length,
-      &password_data, nullptr);
-  if (status != noErr) {
-    return base::unexpected(status);
-  }
-
-  // SAFETY: SecKeychainFindGenericPassword returns an allocation of
-  // `password_length` bytes in size.
-  UNSAFE_BUFFERS(base::span password_span(
-      static_cast<const uint8_t*>(password_data), password_length));
-  auto result = base::ToVector(password_span);
-  SecKeychainItemFreeContent(nullptr, password_data);
-  return result;
-}
-
-OSStatus KeychainSecKeychain::AddGenericPassword(
-    std::string_view service_name,
-    std::string_view account_name,
-    base::span<const uint8_t> password) const {
-  base::AutoLock lock(GetSecurityFrameworkLock());
-  return SecKeychainAddGenericPassword(
-      nullptr, base::checked_cast<uint32_t>(service_name.length()),
-      service_name.data(), base::checked_cast<uint32_t>(account_name.length()),
-      account_name.data(), base::checked_cast<uint32_t>(password.size()),
-      password.data(), nullptr);
-}
-
-#pragma clang diagnostic pop
-
-}  // namespace crypto::apple
diff --git a/crypto/apple/keychain_seckeychain.h b/crypto/apple/keychain_seckeychain.h
deleted file mode 100644
index 991b2c8..0000000
--- a/crypto/apple/keychain_seckeychain.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CRYPTO_APPLE_KEYCHAIN_SECKEYCHAIN_H_
-#define CRYPTO_APPLE_KEYCHAIN_SECKEYCHAIN_H_
-
-#include "crypto/apple/keychain.h"
-
-namespace crypto::apple {
-
-// An implementation of Keychain on top of the deprecated SecKeychain API.
-//
-// The underlying API was deprecated as of the macOS 13 SDK.
-// Removal of its use is tracked in https://crbug.com/1348251
-class CRYPTO_EXPORT KeychainSecKeychain : public Keychain {
- public:
-  KeychainSecKeychain();
-  ~KeychainSecKeychain() override;
-
-  base::expected<std::vector<uint8_t>, OSStatus> FindGenericPassword(
-      std::string_view service_name,
-      std::string_view account_name) const override;
-
-  OSStatus AddGenericPassword(
-      std::string_view service_name,
-      std::string_view account_name,
-      base::span<const uint8_t> password) const override;
-};
-
-}  // namespace crypto::apple
-
-#endif  // CRYPTO_APPLE_KEYCHAIN_SECKEYCHAIN_H_
diff --git a/crypto/apple/keychain_v2.h b/crypto/apple/keychain_v2.h
index 27d701f..d158126 100644
--- a/crypto/apple/keychain_v2.h
+++ b/crypto/apple/keychain_v2.h
@@ -22,6 +22,8 @@
 // KeychainV2 wraps iOS-style operations from the macOS Security framework
 // to work with keys and keychain items. These functions are grouped here so
 // they can be mocked out in testing.
+//
+// TODO(https://crbug.com/441317288): Unify with Keychain.
 class CRYPTO_EXPORT KeychainV2 {
  public:
   static KeychainV2& GetInstance();
diff --git a/crypto/apple/mock_keychain.h b/crypto/apple/mock_keychain.h
index 40fb4e1f..680efe03 100644
--- a/crypto/apple/mock_keychain.h
+++ b/crypto/apple/mock_keychain.h
@@ -19,8 +19,7 @@
 
 namespace crypto::apple {
 
-// Mock Keychain wrapper for testing code that interacts with the OS X
-// Keychain.
+// Mock Keychain wrapper for testing code that interacts with the Keychain.
 //
 // Note that "const" is pretty much meaningless for this class; the const-ness
 // of Keychain doesn't apply to the actual keychain data, so all of the Mock
diff --git a/device/fido/features.cc b/device/fido/features.cc
index 23cf052..9a1dd88 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -73,12 +73,6 @@
              "WebAuthenticationICloudKeychainForInactiveWithoutDrive",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Default enabled in M135. Remove in or after M138.
-COMPONENT_EXPORT(DEVICE_FIDO)
-BASE_FEATURE(kWebAuthnRetryU2FErrors,
-             "WebAuthenticationRetryU2FErrors",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Development flag. Must not be enabled by default once
 // kWebAuthnEnclaveAuthenticator is enabled.
 BASE_FEATURE(kWebAuthnUseInsecureSoftwareUnexportableKeys,
diff --git a/device/fido/features.h b/device/fido/features.h
index 279b19d..ef2e345 100644
--- a/device/fido/features.h
+++ b/device/fido/features.h
@@ -40,10 +40,6 @@
 COMPONENT_EXPORT(DEVICE_FIDO)
 BASE_DECLARE_FEATURE(kWebAuthnICloudKeychainForInactiveWithoutDrive);
 
-// Retry requests to U2F keys after a delay if a low-level error happens.
-COMPONENT_EXPORT(DEVICE_FIDO)
-BASE_DECLARE_FEATURE(kWebAuthnRetryU2FErrors);
-
 // Use insecure software unexportable keys to authenticate to the enclave.
 // For development purposes only.
 COMPONENT_EXPORT(DEVICE_FIDO)
diff --git a/device/fido/u2f_sign_operation.cc b/device/fido/u2f_sign_operation.cc
index eacf599..9d36eda 100644
--- a/device/fido/u2f_sign_operation.cc
+++ b/device/fido/u2f_sign_operation.cc
@@ -91,15 +91,13 @@
     }
   } else {
     FIDO_LOG(ERROR) << "U2F device responded with empty response";
-    if (base::FeatureList::IsEnabled(device::kWebAuthnRetryU2FErrors)) {
-      failed_and_retried_ = true;
-      base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
-          FROM_HERE,
-          base::BindOnce(&U2fSignOperation::WinkAndTrySign,
-                         weak_factory_.GetWeakPtr()),
-          kU2fRetryDelay);
-      return;
-    }
+    failed_and_retried_ = true;
+    base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(&U2fSignOperation::WinkAndTrySign,
+                       weak_factory_.GetWeakPtr()),
+        kU2fRetryDelay);
+    return;
   }
 
   // Older U2F devices may respond with the length of the input as an error
diff --git a/gpu/command_buffer/build_cmd_buffer_lib.py b/gpu/command_buffer/build_cmd_buffer_lib.py
index bf8c5d5e..493891c8 100644
--- a/gpu/command_buffer/build_cmd_buffer_lib.py
+++ b/gpu/command_buffer/build_cmd_buffer_lib.py
@@ -2171,11 +2171,6 @@
     %(name)sHelper(%(args)s);
     helper_->%(name)sImmediate(%(args)s);
     """
-    if not not_shared:
-      code += """\
-      if (share_group_->bind_generates_resource())
-      helper_->CommandBufferHelper::Flush();
-      """
     code += """\
     %(log_code)s
     CheckGLError();
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 9389596..589a129 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -200,7 +200,6 @@
     GLES2CmdHelper* helper,
     scoped_refptr<ShareGroup> share_group,
     TransferBufferInterface* transfer_buffer,
-    bool bind_generates_resource,
     bool lose_context_when_out_of_memory,
     GpuControl* gpu_control)
     : ImplementationBase(helper, transfer_buffer, gpu_control),
@@ -251,10 +250,8 @@
 
   share_group_ =
       (share_group ? std::move(share_group)
-                   : new ShareGroup(
-                         bind_generates_resource,
+                   : base::MakeRefCounted<ShareGroup>(
                          gpu_control_->GetCommandBufferID().GetUnsafeValue()));
-  DCHECK(share_group_->bind_generates_resource() == bind_generates_resource);
 }
 
 gpu::ContextResult GLES2Implementation::Initialize(
@@ -298,17 +295,6 @@
   vertex_array_object_manager_ = std::make_unique<VertexArrayObjectManager>(
       gl_capabilities_.max_vertex_attribs);
 
-  // GL_BIND_GENERATES_RESOURCE_CHROMIUM state must be the same
-  // on Client & Service.
-  if (gl_capabilities_.bind_generates_resource_chromium !=
-      (share_group_->bind_generates_resource() ? 1 : 0)) {
-    SetGLError(GL_INVALID_OPERATION, "Initialize",
-               "Service bind_generates_resource mismatch.");
-    LOG(ERROR) << "ContextResult::kFatalFailure: "
-               << "bind_generates_resource mismatch";
-    return gpu::ContextResult::kFatalFailure;
-  }
-
   return gpu::ContextResult::kSuccess;
 }
 
@@ -5113,8 +5099,6 @@
 
 void GLES2Implementation::BindBufferStub(GLenum target, GLuint buffer) {
   helper_->BindBuffer(target, buffer);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::OrderingBarrier();
 }
 
 bool GLES2Implementation::UpdateIndexedBufferState(GLenum target,
@@ -5178,8 +5162,6 @@
                                              GLuint index,
                                              GLuint buffer) {
   helper_->BindBufferBase(target, index, buffer);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::Flush();
 }
 
 void GLES2Implementation::BindBufferRangeHelper(GLenum target,
@@ -5202,8 +5184,6 @@
                                               GLintptr offset,
                                               GLsizeiptr size) {
   helper_->BindBufferRange(target, index, buffer, offset, size);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::Flush();
 }
 
 void GLES2Implementation::BindFramebufferHelper(GLenum target,
@@ -5277,8 +5257,6 @@
 void GLES2Implementation::BindRenderbufferStub(GLenum target,
                                                GLuint renderbuffer) {
   helper_->BindRenderbuffer(target, renderbuffer);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::OrderingBarrier();
 }
 
 void GLES2Implementation::BindSamplerHelper(GLuint unit, GLuint sampler) {
@@ -5328,8 +5306,6 @@
 
 void GLES2Implementation::BindTextureStub(GLenum target, GLuint texture) {
   helper_->BindTexture(target, texture);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::OrderingBarrier();
 }
 
 void GLES2Implementation::BindTransformFeedbackHelper(
@@ -6741,8 +6717,6 @@
   GetIdHandler(SharedIdNamespaces::kTextures)->MakeIds(this, 0, 1, &client_id);
   helper_->CreateAndTexStorage2DSharedImageINTERNALImmediate(client_id,
                                                              mailbox_data);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::OrderingBarrier();
   CheckGLError();
   return client_id;
 }
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index a4519822..70383dc 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -105,7 +105,6 @@
   GLES2Implementation(GLES2CmdHelper* helper,
                       scoped_refptr<ShareGroup> share_group,
                       TransferBufferInterface* transfer_buffer,
-                      bool bind_generates_resource,
                       bool lose_context_when_out_of_memory,
                       GpuControl* gpu_control);
 
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
index a92c062..c56d58d 100644
--- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -748,8 +748,6 @@
   GetIdHandler(SharedIdNamespaces::kBuffers)->MakeIds(this, 0, n, buffers);
   GenBuffersHelper(n, buffers);
   helper_->GenBuffersImmediate(n, buffers);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::Flush();
   GPU_CLIENT_LOG_CODE_BLOCK({
     for (GLsizei i = 0; i < n; ++i) {
       GPU_CLIENT_LOG("  " << i << ": " << buffers[i]);
@@ -799,8 +797,6 @@
       ->MakeIds(this, 0, n, renderbuffers);
   GenRenderbuffersHelper(n, renderbuffers);
   helper_->GenRenderbuffersImmediate(n, renderbuffers);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::Flush();
   GPU_CLIENT_LOG_CODE_BLOCK({
     for (GLsizei i = 0; i < n; ++i) {
       GPU_CLIENT_LOG("  " << i << ": " << renderbuffers[i]);
@@ -820,8 +816,6 @@
   GetIdHandler(SharedIdNamespaces::kSamplers)->MakeIds(this, 0, n, samplers);
   GenSamplersHelper(n, samplers);
   helper_->GenSamplersImmediate(n, samplers);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::Flush();
   GPU_CLIENT_LOG_CODE_BLOCK({
     for (GLsizei i = 0; i < n; ++i) {
       GPU_CLIENT_LOG("  " << i << ": " << samplers[i]);
@@ -841,8 +835,6 @@
   GetIdHandler(SharedIdNamespaces::kTextures)->MakeIds(this, 0, n, textures);
   GenTexturesHelper(n, textures);
   helper_->GenTexturesImmediate(n, textures);
-  if (share_group_->bind_generates_resource())
-    helper_->CommandBufferHelper::Flush();
   GPU_CLIENT_LOG_CODE_BLOCK({
     for (GLsizei i = 0; i < n; ++i) {
       GPU_CLIENT_LOG("  " << i << ": " << textures[i]);
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index ff3491d..16f911d 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -190,8 +190,6 @@
     TestContext() : commands_(nullptr), token_(0) {}
 
     bool Initialize(ShareGroup* share_group,
-                    bool bind_generates_resource_client,
-                    bool bind_generates_resource_service,
                     bool lose_context_when_out_of_memory,
                     bool transfer_buffer_initialize_fail,
                     bool sync_query,
@@ -242,8 +240,6 @@
       gl_capabilities_.max_transform_feedback_separate_attribs =
           kMaxTransformFeedbackSeparateAttribs;
       gl_capabilities_.max_uniform_buffer_bindings = kMaxUniformBufferBindings;
-      gl_capabilities_.bind_generates_resource_chromium =
-          bind_generates_resource_service ? 1 : 0;
       capabilities_.sync_query = sync_query;
       gl_capabilities_.sync_query = sync_query;
       gl_capabilities_.occlusion_query_boolean = occlusion_query_boolean;
@@ -258,12 +254,9 @@
       {
         InSequence sequence;
 
-        gl_.reset(new GLES2Implementation(helper_.get(),
-                                          share_group,
-                                          transfer_buffer_.get(),
-                                          bind_generates_resource_client,
-                                          lose_context_when_out_of_memory,
-                                          gpu_control_.get()));
+        gl_ = std::make_unique<GLES2Implementation>(
+            helper_.get(), share_group, transfer_buffer_.get(),
+            lose_context_when_out_of_memory, gpu_control_.get());
       }
 
       // The client should be set to something non-null.
@@ -339,43 +332,25 @@
     return gl_->query_tracker_->GetQuery(id);
   }
 
-  QueryTracker* GetQueryTracker() {
-    return gl_->query_tracker_.get();
-  }
+  QueryTracker* GetQueryTracker() { return gl_->query_tracker_.get(); }
 
   struct ContextInitOptions {
-    ContextInitOptions()
-        : bind_generates_resource_client(true),
-          bind_generates_resource_service(true),
-          lose_context_when_out_of_memory(false),
-          transfer_buffer_initialize_fail(false),
-          sync_query(true),
-          occlusion_query_boolean(true),
-          timer_queries(true),
-          major_version(2),
-          minor_version(0) {}
-
-    bool bind_generates_resource_client;
-    bool bind_generates_resource_service;
-    bool lose_context_when_out_of_memory;
-    bool transfer_buffer_initialize_fail;
-    bool sync_query;
-    bool occlusion_query_boolean;
-    bool timer_queries;
-    int major_version;
-    int minor_version;
+    bool lose_context_when_out_of_memory = false;
+    bool transfer_buffer_initialize_fail = false;
+    bool sync_query = true;
+    bool occlusion_query_boolean = true;
+    bool timer_queries = true;
+    int major_version = 2;
+    int minor_version = 0;
   };
 
   bool Initialize(const ContextInitOptions& init_options) {
     bool success = true;
-    share_group_ = new ShareGroup(init_options.bind_generates_resource_client,
-                                  0 /* tracing_id */);
+    share_group_ = base::MakeRefCounted<ShareGroup>(/*tracing_id=*/0);
 
     for (int i = 0; i < kNumTestContexts; i++) {
       if (!test_contexts_[i].Initialize(
               share_group_.get(),
-              init_options.bind_generates_resource_client,
-              init_options.bind_generates_resource_service,
               init_options.lose_context_when_out_of_memory,
               init_options.transfer_buffer_initialize_fail,
               init_options.sync_query,
@@ -617,8 +592,6 @@
 
 void GLES2ImplementationStrictSharedTest::SetUp() {
   ContextInitOptions init_options;
-  init_options.bind_generates_resource_client = false;
-  init_options.bind_generates_resource_service = false;
   ASSERT_TRUE(Initialize(init_options));
 }
 
@@ -3691,15 +3664,16 @@
       .WillOnce(SetMemory(result.ptr, uint32_t(1)))
       .RetiresOnSaturation();
 
-  const GLuint kBufferId = 123;
-  gl_->BindBuffer(GL_ARRAY_BUFFER, kBufferId);
+  GLuint buffer_id = 0;
+  gl_->GenBuffers(1, &buffer_id);
+  gl_->BindBuffer(GL_ARRAY_BUFFER, buffer_id);
 
   void* mem = gl_->MapBufferRange(GL_ARRAY_BUFFER, 10, 64, GL_MAP_WRITE_BIT);
   EXPECT_TRUE(mem != nullptr);
 
   std::vector<uint8_t> data(16);
   // DeleteBuffers unmaps the data store.
-  gl_->DeleteBuffers(1, &kBufferId);
+  gl_->DeleteBuffers(1, &buffer_id);
 
   EXPECT_FALSE(gl_->UnmapBuffer(GL_ARRAY_BUFFER));
   EXPECT_EQ(GL_INVALID_OPERATION, CheckError());
@@ -3833,65 +3807,12 @@
   EXPECT_EQ(0, lost_count);
 }
 
-TEST_F(GLES2ImplementationManualInitTest, FailInitOnBGRMismatch1) {
-  ContextInitOptions init_options;
-  init_options.bind_generates_resource_client = false;
-  init_options.bind_generates_resource_service = true;
-  EXPECT_FALSE(Initialize(init_options));
-}
-
-TEST_F(GLES2ImplementationManualInitTest, FailInitOnBGRMismatch2) {
-  ContextInitOptions init_options;
-  init_options.bind_generates_resource_client = true;
-  init_options.bind_generates_resource_service = false;
-  EXPECT_FALSE(Initialize(init_options));
-}
-
 TEST_F(GLES2ImplementationManualInitTest, FailInitOnTransferBufferFail) {
   ContextInitOptions init_options;
   init_options.transfer_buffer_initialize_fail = true;
   EXPECT_FALSE(Initialize(init_options));
 }
 
-TEST_F(GLES2ImplementationTest, DiscardableMemoryDelete) {
-  const GLuint texture_id = 1;
-  EXPECT_FALSE(
-      share_group_->discardable_texture_manager()->TextureIsValid(texture_id));
-  gl_->InitializeDiscardableTextureCHROMIUM(texture_id);
-  EXPECT_TRUE(
-      share_group_->discardable_texture_manager()->TextureIsValid(texture_id));
-
-  // Deleting a texture should clear its discardable entry.
-  gl_->DeleteTextures(1, &texture_id);
-  EXPECT_FALSE(
-      share_group_->discardable_texture_manager()->TextureIsValid(texture_id));
-}
-
-TEST_F(GLES2ImplementationTest, DiscardableTextureLockFail) {
-  const GLuint texture_id = 1;
-  gl_->InitializeDiscardableTextureCHROMIUM(texture_id);
-  EXPECT_TRUE(
-      share_group_->discardable_texture_manager()->TextureIsValid(texture_id));
-
-  // Unlock the handle on the client side.
-  gl_->UnlockDiscardableTextureCHROMIUM(texture_id);
-
-  // Unlock and delete the handle on the service side.
-  ClientDiscardableHandle client_handle =
-      share_group_->discardable_texture_manager()->GetHandleForTesting(
-          texture_id);
-  ServiceDiscardableHandle service_handle(client_handle.BufferForTesting(),
-                                          client_handle.byte_offset(),
-                                          client_handle.shm_id());
-  service_handle.Unlock();
-  EXPECT_TRUE(service_handle.Delete());
-
-  // Trying to re-lock the texture via GL should fail and delete the entry.
-  EXPECT_FALSE(gl_->LockDiscardableTextureCHROMIUM(texture_id));
-  EXPECT_FALSE(
-      share_group_->discardable_texture_manager()->TextureIsValid(texture_id));
-}
-
 TEST_F(GLES2ImplementationTest, DiscardableTextureDoubleInitError) {
   const GLuint texture_id = 1;
   gl_->InitializeDiscardableTextureCHROMIUM(texture_id);
diff --git a/gpu/command_buffer/client/share_group.cc b/gpu/command_buffer/client/share_group.cc
index 1a738029..73de754 100644
--- a/gpu/command_buffer/client/share_group.cc
+++ b/gpu/command_buffer/client/share_group.cc
@@ -32,88 +32,6 @@
 static_assert(gpu::kInvalidResource == 0,
               "GL expects kInvalidResource to be 0");
 
-// The standard id handler.
-class IdHandler : public IdHandlerInterface {
- public:
-  IdHandler() = default;
-  ~IdHandler() override = default;
-
-  // Overridden from IdHandlerInterface.
-  void MakeIds(GLES2Implementation* /* gl_impl */,
-               GLuint id_offset,
-               GLsizei n,
-               GLuint* ids) override {
-    base::AutoLock auto_lock(lock_);
-    if (id_offset == 0) {
-      for (GLsizei ii = 0; ii < n; ++ii) {
-        ids[ii] = id_allocator_.AllocateID();
-      }
-    } else {
-      for (GLsizei ii = 0; ii < n; ++ii) {
-        ids[ii] = id_allocator_.AllocateIDAtOrAbove(id_offset);
-        id_offset = ids[ii] + 1;
-      }
-    }
-  }
-
-  // Overridden from IdHandlerInterface.
-  bool FreeIds(GLES2Implementation* gl_impl,
-               GLsizei n,
-               const GLuint* ids,
-               DeleteFn delete_fn) override {
-    base::AutoLock auto_lock(lock_);
-
-    for (GLsizei ii = 0; ii < n; ++ii) {
-      id_allocator_.FreeID(ids[ii]);
-    }
-
-    (gl_impl->*delete_fn)(n, ids);
-    // We need to ensure that the delete call is evaluated on the service side
-    // before any other contexts issue commands using these client ids.
-    gl_impl->helper()->CommandBufferHelper::OrderingBarrier();
-    return true;
-  }
-
-  // Overridden from IdHandlerInterface.
-  bool MarkAsUsedForBind(GLES2Implementation* gl_impl,
-                         GLenum target,
-                         GLuint id,
-                         BindFn bind_fn) override {
-    base::AutoLock auto_lock(lock_);
-    bool result = id ? id_allocator_.MarkAsUsed(id) : true;
-    (gl_impl->*bind_fn)(target, id);
-    return result;
-  }
-  bool MarkAsUsedForBind(GLES2Implementation* gl_impl,
-                         GLenum target,
-                         GLuint index,
-                         GLuint id,
-                         BindIndexedFn bind_fn) override {
-    base::AutoLock auto_lock(lock_);
-    bool result = id ? id_allocator_.MarkAsUsed(id) : true;
-    (gl_impl->*bind_fn)(target, index, id);
-    return result;
-  }
-  bool MarkAsUsedForBind(GLES2Implementation* gl_impl,
-                         GLenum target,
-                         GLuint index,
-                         GLuint id,
-                         GLintptr offset,
-                         GLsizeiptr size,
-                         BindIndexedRangeFn bind_fn) override {
-    base::AutoLock auto_lock(lock_);
-    bool result = id ? id_allocator_.MarkAsUsed(id) : true;
-    (gl_impl->*bind_fn)(target, index, id, offset, size);
-    return result;
-  }
-
-  void FreeContext(GLES2Implementation* gl_impl) override {}
-
- private:
-  base::Lock lock_;
-  IdAllocator id_allocator_ GUARDED_BY(lock_);
-};
-
 // An id handler that requires Gen before Bind.
 class StrictIdHandler : public IdHandlerInterface {
  public:
@@ -198,9 +116,6 @@
                          BindFn bind_fn) override {
     DCHECK(IdValidForBind(id));
 
-    // StrictIdHandler is used if |bind_generates_resource| is false. In that
-    // case, |bind_fn| will not use Flush() after helper->Bind*(), so it is OK
-    // to call |bind_fn| without holding the lock.
     (gl_impl->*bind_fn)(target, id);
     return true;
   }
@@ -211,9 +126,6 @@
                          BindIndexedFn bind_fn) override {
     DCHECK(IdValidForBind(id));
 
-    // StrictIdHandler is used if |bind_generates_resource| is false. In that
-    // case, |bind_fn| will not use Flush() after helper->Bind*(), so it is OK
-    // to call |bind_fn| without holding the lock.
     (gl_impl->*bind_fn)(target, index, id);
     return true;
   }
@@ -226,9 +138,6 @@
                          BindIndexedRangeFn bind_fn) override {
     DCHECK(IdValidForBind(id));
 
-    // StrictIdHandler is used if |bind_generates_resource| is false. In that
-    // case, |bind_fn| will not use Flush() after helper->Bind*(), so it is OK
-    // to call |bind_fn| without holding the lock.
     (gl_impl->*bind_fn)(target, index, id, offset, size);
     return true;
   }
@@ -242,7 +151,7 @@
  private:
   enum IdState { kIdFree, kIdPendingFree, kIdInUse };
 
-  bool IdValidForBind(GLuint id) {
+  bool IdValidForBind(GLuint id) LOCKS_EXCLUDED(lock_) {
     if (id == 0) {
       return true;
     }
@@ -365,30 +274,16 @@
   IdAllocator id_allocator_ GUARDED_BY(lock_);
 };
 
-ShareGroup::ShareGroup(bool bind_generates_resource, uint64_t tracing_guid)
-    : bind_generates_resource_(bind_generates_resource),
-      tracing_guid_(tracing_guid) {
-  if (bind_generates_resource) {
-    for (int i = 0;
-         i < static_cast<int>(SharedIdNamespaces::kNumSharedIdNamespaces);
-         ++i) {
-      if (i == static_cast<int>(SharedIdNamespaces::kProgramsAndShaders)) {
-        id_handlers_[i] = std::make_unique<NonReusedIdHandler>();
-      } else {
-        id_handlers_[i] = std::make_unique<IdHandler>();
-      }
-    }
-  } else {
-    for (int i = 0;
-         i < static_cast<int>(SharedIdNamespaces::kNumSharedIdNamespaces);
-         ++i) {
-      if (i == static_cast<int>(SharedIdNamespaces::kProgramsAndShaders)) {
-        id_handlers_[i] = std::make_unique<NonReusedIdHandler>();
-      } else {
-        id_handlers_[i] = std::make_unique<StrictIdHandler>(i);
-      }
+ShareGroup::ShareGroup(uint64_t tracing_guid) : tracing_guid_(tracing_guid) {
+  for (int i = 0;
+       i < static_cast<int>(SharedIdNamespaces::kNumSharedIdNamespaces); ++i) {
+    if (i == static_cast<int>(SharedIdNamespaces::kProgramsAndShaders)) {
+      id_handlers_[i] = std::make_unique<NonReusedIdHandler>();
+    } else {
+      id_handlers_[i] = std::make_unique<StrictIdHandler>(i);
     }
   }
+
   program_info_manager_ = std::make_unique<ProgramInfoManager>();
   for (auto& range_id_handler : range_id_handlers_) {
     range_id_handler = std::make_unique<RangeIdHandler>();
diff --git a/gpu/command_buffer/client/share_group.h b/gpu/command_buffer/client/share_group.h
index eadf5b19..31f16f3 100644
--- a/gpu/command_buffer/client/share_group.h
+++ b/gpu/command_buffer/client/share_group.h
@@ -129,15 +129,11 @@
 class GLES2_IMPL_EXPORT ShareGroup
     : public gpu::RefCountedThreadSafe<ShareGroup> {
  public:
-  ShareGroup(bool bind_generates_resource, uint64_t tracing_guid);
+  explicit ShareGroup(uint64_t tracing_guid);
 
   ShareGroup(const ShareGroup&) = delete;
   ShareGroup& operator=(const ShareGroup&) = delete;
 
-  bool bind_generates_resource() const {
-    return bind_generates_resource_;
-  }
-
   IdHandlerInterface* GetIdHandler(SharedIdNamespaces namespace_id) const {
     return id_handlers_[static_cast<int>(namespace_id)].get();
   }
@@ -191,7 +187,6 @@
   std::unique_ptr<ProgramInfoManager> program_info_manager_;
   ClientDiscardableTextureManager discardable_texture_manager_;
 
-  bool bind_generates_resource_;
   uint64_t tracing_guid_;
 
   mutable base::Lock lost_lock_;
diff --git a/gpu/command_buffer/service/drm_modifiers_filter_dawn.cc b/gpu/command_buffer/service/drm_modifiers_filter_dawn.cc
index 92bd35ee..cf24824 100644
--- a/gpu/command_buffer/service/drm_modifiers_filter_dawn.cc
+++ b/gpu/command_buffer/service/drm_modifiers_filter_dawn.cc
@@ -31,16 +31,16 @@
     I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC,
 });
 
-base::flat_map<gfx::BufferFormat, std::vector<uint64_t>> GetDawnModifierMap(
-    wgpu::Adapter adapter) {
-  base::flat_map<gfx::BufferFormat, std::vector<uint64_t>> modifier_map;
+base::flat_map<viz::SharedImageFormat, std::vector<uint64_t>>
+GetDawnModifierMap(wgpu::Adapter adapter) {
+  base::flat_map<viz::SharedImageFormat, std::vector<uint64_t>> modifier_map;
 
   for (int i = 0; i <= static_cast<int>(gfx::BufferFormat::LAST); i++) {
     gfx::BufferFormat buffer_format = static_cast<gfx::BufferFormat>(i);
     auto si_format = viz::GetSharedImageFormat(buffer_format);
     auto wgpu_format = ToDawnFormat(si_format);
     if (wgpu_format == wgpu::TextureFormat::Undefined) {
-      modifier_map.emplace(buffer_format, std::vector<uint64_t>());
+      modifier_map.emplace(si_format, std::vector<uint64_t>());
       continue;
     }
 
@@ -50,7 +50,7 @@
     adapter.GetFormatCapabilities(wgpu_format, &formatCapabilities);
 
     if (!drmCapabilities.properties || !drmCapabilities.propertiesCount) {
-      modifier_map.emplace(buffer_format, std::vector<uint64_t>());
+      modifier_map.emplace(si_format, std::vector<uint64_t>());
       continue;
     }
 
@@ -62,7 +62,7 @@
         modifiers.push_back(drmCapabilities.properties[j].modifier);
       }
     }
-    modifier_map.emplace(buffer_format, std::move(modifiers));
+    modifier_map.emplace(si_format, std::move(modifiers));
   }
 
   return modifier_map;
@@ -75,7 +75,7 @@
     base::flat_map<uint32_t, std::vector<uint64_t>>& fourcc_modifier_map) {
   auto buffer_format_map = GetDawnModifierMap(adapter);
   for (auto& entry : buffer_format_map) {
-    int fourcc_format = ui::GetFourCCFormatFromBufferFormat(entry.first);
+    int fourcc_format = ui::GetFourCCFormatFromSharedImageFormat(entry.first);
     if (fourcc_format == DRM_FORMAT_INVALID) {
       continue;
     }
@@ -90,8 +90,9 @@
 DrmModifiersFilterDawn::~DrmModifiersFilterDawn() = default;
 
 std::vector<uint64_t> DrmModifiersFilterDawn::Filter(
-    gfx::BufferFormat format,
+    viz::SharedImageFormat format,
     const std::vector<uint64_t>& modifiers) {
+  CHECK(viz::HasEquivalentBufferFormat(format));
   const auto& modifier_set = modifier_map_.at(format);
 
   std::vector<uint64_t> intersection;
diff --git a/gpu/command_buffer/service/drm_modifiers_filter_dawn.h b/gpu/command_buffer/service/drm_modifiers_filter_dawn.h
index be8aa09..c56dc0e 100644
--- a/gpu/command_buffer/service/drm_modifiers_filter_dawn.h
+++ b/gpu/command_buffer/service/drm_modifiers_filter_dawn.h
@@ -6,8 +6,8 @@
 #define GPU_COMMAND_BUFFER_SERVICE_DRM_MODIFIERS_FILTER_DAWN_H_
 
 #include "base/containers/flat_map.h"
+#include "components/viz/common/resources/shared_image_format.h"
 #include "gpu/gpu_gles2_export.h"
-#include "ui/gfx/buffer_types.h"
 #include "ui/ozone/public/drm_modifiers_filter.h"
 
 namespace wgpu {
@@ -34,12 +34,12 @@
 
   ~DrmModifiersFilterDawn() override;
 
-  std::vector<uint64_t> Filter(gfx::BufferFormat format,
+  std::vector<uint64_t> Filter(viz::SharedImageFormat format,
                                const std::vector<uint64_t>& modifiers) override;
 
  private:
   // Map from all BufferFormats to a set of modifiers supported by that format.
-  base::flat_map<gfx::BufferFormat, std::vector<uint64_t>> modifier_map_;
+  base::flat_map<viz::SharedImageFormat, std::vector<uint64_t>> modifier_map_;
 };
 
 }  //  namespace gpu
diff --git a/gpu/command_buffer/service/drm_modifiers_filter_vulkan.cc b/gpu/command_buffer/service/drm_modifiers_filter_vulkan.cc
index ee6a711..ce5b351 100644
--- a/gpu/command_buffer/service/drm_modifiers_filter_vulkan.cc
+++ b/gpu/command_buffer/service/drm_modifiers_filter_vulkan.cc
@@ -7,6 +7,8 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/containers/flat_set.h"
+#include "components/viz/common/resources/shared_image_format_utils.h"
+#include "gpu/command_buffer/service/shared_image/shared_image_format_service_utils.h"
 #include "gpu/vulkan/vulkan_instance.h"
 #include "gpu/vulkan/vulkan_util.h"
 #include "ui/gfx/buffer_format_util.h"
@@ -20,9 +22,17 @@
 DrmModifiersFilterVulkan::~DrmModifiersFilterVulkan() = default;
 
 std::vector<uint64_t> DrmModifiersFilterVulkan::Filter(
-    gfx::BufferFormat format,
+    viz::SharedImageFormat format,
     const std::vector<uint64_t>& modifiers) {
-  VkFormat vulkan_format = ToVkFormat(format);
+  CHECK(viz::HasEquivalentBufferFormat(format));
+  VkFormat vulkan_format;
+  if (format.is_single_plane()) {
+    vulkan_format = gpu::ToVkFormatSinglePlanar(format);
+  } else {
+    // Format prefers external sampler.
+    format.SetPrefersExternalSampler();
+    vulkan_format = gpu::ToVkFormatExternalSampler(format);
+  }
   gpu::VulkanInstance* instance = vulkan_implementation_->GetVulkanInstance();
   CHECK(instance->vulkan_info().physical_devices.size() > 0);
   VkPhysicalDevice phys_dev =
diff --git a/gpu/command_buffer/service/drm_modifiers_filter_vulkan.h b/gpu/command_buffer/service/drm_modifiers_filter_vulkan.h
index f9b67f8..ab19166 100644
--- a/gpu/command_buffer/service/drm_modifiers_filter_vulkan.h
+++ b/gpu/command_buffer/service/drm_modifiers_filter_vulkan.h
@@ -8,9 +8,9 @@
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
+#include "components/viz/common/resources/shared_image_format.h"
 #include "gpu/gpu_gles2_export.h"
 #include "gpu/vulkan/vulkan_implementation.h"
-#include "ui/gfx/buffer_types.h"
 #include "ui/ozone/public/drm_modifiers_filter.h"
 
 namespace gpu {
@@ -28,7 +28,7 @@
 
   ~DrmModifiersFilterVulkan() override;
 
-  std::vector<uint64_t> Filter(gfx::BufferFormat format,
+  std::vector<uint64_t> Filter(viz::SharedImageFormat format,
                                const std::vector<uint64_t>& modifiers) override;
 
  private:
diff --git a/gpu/command_buffer/service/drm_modifiers_filter_vulkan_unittest.cc b/gpu/command_buffer/service/drm_modifiers_filter_vulkan_unittest.cc
index b1c9c3ee..46f5e711 100644
--- a/gpu/command_buffer/service/drm_modifiers_filter_vulkan_unittest.cc
+++ b/gpu/command_buffer/service/drm_modifiers_filter_vulkan_unittest.cc
@@ -13,7 +13,6 @@
 #include "gpu/vulkan/vulkan_function_pointers.h"
 #include "gpu/vulkan/vulkan_implementation.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/buffer_types.h"
 
 namespace gpu {
 
@@ -97,7 +96,7 @@
                                          kUnsupportedModifier};
 
   std::vector<uint64_t> filtered_modifiers =
-      filter_->Filter(gfx::BufferFormat::BGRX_8888, all_modifiers);
+      filter_->Filter(viz::SinglePlaneFormat::kBGRX_8888, all_modifiers);
 
   EXPECT_EQ(1u, filtered_modifiers.size());
   EXPECT_EQ(kSupportedModifier1, filtered_modifiers[0]);
diff --git a/gpu/command_buffer/tests/decoder_perftest.cc b/gpu/command_buffer/tests/decoder_perftest.cc
index 90347309..09fcac2d 100644
--- a/gpu/command_buffer/tests/decoder_perftest.cc
+++ b/gpu/command_buffer/tests/decoder_perftest.cc
@@ -219,7 +219,7 @@
     const bool lose_context_when_out_of_memory = false;
     gles2_implementation_ = std::make_unique<gles2::GLES2Implementation>(
         gles2_helper_.get(), nullptr, transfer_buffer_.get(),
-        bind_generates_resource, lose_context_when_out_of_memory, this);
+        lose_context_when_out_of_memory, this);
 
     result = gles2_implementation_->Initialize(limits);
     DCHECK_EQ(result, ContextResult::kSuccess);
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index 4c299f07..65882b4 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -258,8 +258,7 @@
   // Create the object exposing the OpenGL API.
   gles2_implementation_.reset(new gles2::GLES2Implementation(
       gles2_helper_.get(), std::move(client_share_group),
-      transfer_buffer_.get(), bind_generates_resource,
-      options.lose_context_when_out_of_memory, this));
+      transfer_buffer_.get(), options.lose_context_when_out_of_memory, this));
 
   ASSERT_EQ(gles2_implementation_->Initialize(limits),
             gpu::ContextResult::kSuccess)
diff --git a/gpu/ipc/gl_in_process_context.cc b/gpu/ipc/gl_in_process_context.cc
index bb5b87b..a3f74672 100644
--- a/gpu/ipc/gl_in_process_context.cc
+++ b/gpu/ipc/gl_in_process_context.cc
@@ -83,14 +83,11 @@
   // Create a transfer buffer.
   transfer_buffer_ = std::make_unique<TransferBuffer>(gles2_helper_.get());
 
-  const bool bind_generates_resource = false;
-
   // Create the object exposing the OpenGL API.
   gles2_implementation_ =
       std::make_unique<skia_bindings::GLES2ImplementationWithGrContextSupport>(
           gles2_helper_.get(), /*share_group=*/nullptr, transfer_buffer_.get(),
-          bind_generates_resource, attribs.lose_context_when_out_of_memory,
-          command_buffer_.get());
+          attribs.lose_context_when_out_of_memory, command_buffer_.get());
 
   result = gles2_implementation_->Initialize(mem_limits);
   return result;
diff --git a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc
index 086fdf65..a1ba0e67c 100644
--- a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc
+++ b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.cc
@@ -17,13 +17,11 @@
         gpu::gles2::GLES2CmdHelper* helper,
         scoped_refptr<gpu::gles2::ShareGroup> share_group,
         gpu::TransferBufferInterface* transfer_buffer,
-        bool bind_generates_resource,
         bool lose_context_when_out_of_memory,
         gpu::GpuControl* gpu_control)
     : GLES2Implementation(helper,
                           std::move(share_group),
                           transfer_buffer,
-                          bind_generates_resource,
                           lose_context_when_out_of_memory,
                           gpu_control) {}
 
diff --git a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h
index ac7c9295..ee1fdea3 100644
--- a/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h
+++ b/gpu/skia_bindings/gles2_implementation_with_grcontext_support.h
@@ -19,7 +19,6 @@
       gpu::gles2::GLES2CmdHelper* helper,
       scoped_refptr<gpu::gles2::ShareGroup> share_group,
       gpu::TransferBufferInterface* transfer_buffer,
-      bool bind_generates_resource,
       bool lose_context_when_out_of_memory,
       gpu::GpuControl* gpu_control);
 
diff --git a/infra/config/generated/builder-owners/clank-engprod@google.com.txt b/infra/config/generated/builder-owners/clank-engprod@google.com.txt
index 22781ac..9c422d5e 100644
--- a/infra/config/generated/builder-owners/clank-engprod@google.com.txt
+++ b/infra/config/generated/builder-owners/clank-engprod@google.com.txt
@@ -36,14 +36,12 @@
 ci/android-binary-size-generator
 ci/android-desktop-15-x64-fyi-rel
 ci/android-desktop-arm64-archive-rel
-ci/android-desktop-arm64-binary-size-generator
 ci/android-desktop-arm64-compile-dbg
 ci/android-desktop-arm64-compile-rel
 ci/android-desktop-arm64-deterministic-dbg
 ci/android-desktop-arm64-deterministic-rel
 ci/android-desktop-arm64-official
 ci/android-desktop-x64-archive-rel
-ci/android-desktop-x64-binary-size-generator
 ci/android-desktop-x64-compile-dbg
 ci/android-desktop-x64-compile-rel
 ci/android-desktop-x64-deterministic-dbg
@@ -78,14 +76,12 @@
 try/android-arm64-compile-dbg
 try/android-clobber-rel
 try/android-desktop-15-x64-fyi-rel
-try/android-desktop-arm64-binary-size
 try/android-desktop-arm64-clobber-rel
 try/android-desktop-arm64-compile-dbg
 try/android-desktop-arm64-compile-rel
 try/android-desktop-arm64-deterministic-dbg
 try/android-desktop-arm64-deterministic-rel
 try/android-desktop-arm64-official
-try/android-desktop-x64-binary-size
 try/android-desktop-x64-clobber-rel
 try/android-desktop-x64-compile-dbg
 try/android-desktop-x64-deterministic-dbg
diff --git a/infra/config/generated/builders/ci/android-desktop-arm64-binary-size-generator/gn-args.json b/infra/config/generated/builders/ci/android-desktop-arm64-binary-size-generator/gn-args.json
deleted file mode 100644
index de5c8b9..0000000
--- a/infra/config/generated/builders/ci/android-desktop-arm64-binary-size-generator/gn-args.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "gn_args": {
-    "android_channel": "stable",
-    "debuggable_apks": false,
-    "ffmpeg_branding": "Chrome",
-    "is_desktop_android": true,
-    "is_official_build": true,
-    "proprietary_codecs": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "v8_is_on_release_branch": true
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-desktop-x64-binary-size-generator/gn-args.json b/infra/config/generated/builders/ci/android-desktop-x64-binary-size-generator/gn-args.json
deleted file mode 100644
index 366e138..0000000
--- a/infra/config/generated/builders/ci/android-desktop-x64-binary-size-generator/gn-args.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "gn_args": {
-    "android_channel": "stable",
-    "debuggable_apks": false,
-    "ffmpeg_branding": "Chrome",
-    "is_desktop_android": true,
-    "is_official_build": true,
-    "proprietary_codecs": true,
-    "symbol_level": 1,
-    "target_cpu": "x64",
-    "target_os": "android",
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "v8_is_on_release_branch": true
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json b/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json
index e0e6f758..0405da56 100644
--- a/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json
+++ b/infra/config/generated/builders/ci/ios-blink-rel-fyi/properties.json
@@ -70,5 +70,5 @@
   },
   "builder_group": "chromium.fyi",
   "recipe": "chromium",
-  "xcode_build_version": "17a5305f"
+  "xcode_build_version": "17a5305k"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json
index b82995f..6bb4055 100644
--- a/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/ios-blink-rel-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -44,7 +44,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -63,7 +63,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -94,7 +94,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -116,7 +116,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -147,7 +147,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -166,7 +166,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -197,7 +197,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -216,7 +216,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -247,7 +247,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -266,7 +266,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -297,7 +297,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -319,7 +319,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -355,7 +355,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -374,7 +374,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -405,7 +405,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -424,7 +424,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -455,7 +455,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -474,7 +474,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -505,7 +505,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -524,7 +524,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -555,7 +555,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -577,7 +577,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -608,7 +608,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -629,7 +629,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -660,7 +660,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -681,7 +681,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -712,7 +712,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -733,7 +733,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -764,7 +764,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -785,7 +785,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -816,7 +816,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -838,7 +838,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -869,7 +869,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -888,7 +888,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -919,7 +919,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -938,7 +938,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -969,7 +969,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -988,7 +988,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1019,7 +1019,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1038,7 +1038,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1069,7 +1069,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1088,7 +1088,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1119,7 +1119,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1138,7 +1138,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1169,7 +1169,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1188,7 +1188,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1219,7 +1219,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1240,7 +1240,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1271,7 +1271,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1290,7 +1290,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1321,7 +1321,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1340,7 +1340,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1371,7 +1371,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1390,7 +1390,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1421,7 +1421,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1442,7 +1442,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1473,7 +1473,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1492,7 +1492,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1523,7 +1523,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1542,7 +1542,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1573,7 +1573,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1592,7 +1592,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1623,7 +1623,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1642,7 +1642,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1673,7 +1673,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1692,7 +1692,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1723,7 +1723,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1744,7 +1744,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1775,7 +1775,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1800,7 +1800,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1831,7 +1831,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1856,7 +1856,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1887,7 +1887,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1906,7 +1906,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1937,7 +1937,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1958,7 +1958,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1989,7 +1989,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2008,7 +2008,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2039,7 +2039,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2058,7 +2058,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2089,7 +2089,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2108,7 +2108,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2139,7 +2139,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2158,7 +2158,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2189,7 +2189,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2208,7 +2208,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2239,7 +2239,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2259,7 +2259,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2290,7 +2290,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2309,7 +2309,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2340,7 +2340,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2359,7 +2359,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2390,7 +2390,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2409,7 +2409,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2440,7 +2440,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2459,7 +2459,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2490,7 +2490,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2510,7 +2510,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2541,7 +2541,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2560,7 +2560,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2591,7 +2591,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2610,7 +2610,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2641,7 +2641,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2660,7 +2660,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2691,7 +2691,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2713,7 +2713,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2744,7 +2744,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2763,7 +2763,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2794,7 +2794,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2813,7 +2813,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2844,7 +2844,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json b/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json
index b95a37e..6cc55e1b 100644
--- a/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json
+++ b/infra/config/generated/builders/ci/ios-simulator-full-configs/targets/chromium.mac.json
@@ -1291,112 +1291,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_bookmarks_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_bookmarks_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -1440,6 +1334,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
         },
@@ -1505,61 +1404,6 @@
           "--clones",
           "2",
           "--platform",
-          "iPad Pro (12.9-inch) (6th generation)",
-          "--version",
-          "17.5",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_integration_eg2tests_module iPad Pro (12.9-inch) (6th generation) 17.5",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_17_5",
-              "path": "Runtime-ios-17.5"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 9
-        },
-        "test": "ios_chrome_integration_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/",
-        "variant_id": "iPad Pro (12.9-inch) (6th generation) 17.5"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.2",
@@ -1603,6 +1447,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 9
         },
@@ -1713,6 +1562,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 9
         },
@@ -1768,6 +1622,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 9
         },
@@ -1835,116 +1694,6 @@
           "--clones",
           "2",
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "ios_chrome_settings_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "ios_chrome_settings_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -1988,6 +1737,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 4
         },
@@ -2053,112 +1807,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "ios_chrome_signin_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "ios_chrome_signin_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -2202,6 +1850,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 6
         },
@@ -2265,110 +1918,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ios_chrome_smoke_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ios_chrome_smoke_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -2412,6 +1961,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_chrome_smoke_eg2tests_module",
@@ -2475,116 +2029,6 @@
           "--clones",
           "2",
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "ios_chrome_ui_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "ios_chrome_ui_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -2628,6 +2072,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 12
         },
@@ -2907,112 +2356,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_web_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_web_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -3056,6 +2399,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
         },
@@ -3656,58 +3004,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro (12.9-inch) (6th generation)",
-          "--version",
-          "17.5",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/web/shell/test:ios_web_shell_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_web_shell_eg2tests_module iPad Pro (12.9-inch) (6th generation) 17.5",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_17_5",
-              "path": "Runtime-ios-17.5"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ios_web_shell_eg2tests_module",
-        "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/",
-        "variant_id": "iPad Pro (12.9-inch) (6th generation) 17.5"
-      },
-      {
-        "args": [
-          "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.2",
@@ -3751,6 +3047,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_web_shell_eg2tests_module",
@@ -3855,6 +3156,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_web_shell_eg2tests_module",
@@ -3907,6 +3213,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_web_shell_eg2tests_module",
diff --git a/infra/config/generated/builders/ci/ios18-sdk-simulator/properties.json b/infra/config/generated/builders/ci/ios18-sdk-simulator/properties.json
index 1906805..85482e8 100644
--- a/infra/config/generated/builders/ci/ios18-sdk-simulator/properties.json
+++ b/infra/config/generated/builders/ci/ios18-sdk-simulator/properties.json
@@ -69,5 +69,5 @@
   },
   "builder_group": "chromium.fyi",
   "recipe": "chromium",
-  "xcode_build_version": "17a5305f"
+  "xcode_build_version": "17a5305k"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios18-sdk-simulator/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios18-sdk-simulator/targets/chromium.fyi.json
index 8d48f7d..8217ca0 100644
--- a/infra/config/generated/builders/ci/ios18-sdk-simulator/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/ios18-sdk-simulator/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -44,7 +44,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -63,7 +63,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -94,7 +94,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -113,7 +113,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -144,7 +144,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -163,7 +163,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -194,7 +194,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -213,7 +213,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -244,7 +244,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -263,7 +263,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -294,7 +294,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -313,7 +313,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -344,7 +344,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -363,7 +363,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -394,7 +394,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -413,7 +413,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -444,7 +444,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -463,7 +463,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -494,7 +494,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -513,7 +513,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -544,7 +544,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -563,7 +563,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -594,7 +594,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -613,7 +613,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -644,7 +644,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -663,7 +663,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -694,7 +694,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -713,7 +713,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -744,7 +744,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -763,7 +763,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -794,7 +794,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -813,7 +813,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -844,7 +844,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -863,7 +863,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -894,7 +894,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -913,7 +913,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -944,7 +944,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -963,7 +963,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -994,7 +994,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1013,7 +1013,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1044,7 +1044,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1066,7 +1066,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1097,7 +1097,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1120,7 +1120,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1151,7 +1151,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1176,7 +1176,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1207,7 +1207,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1232,7 +1232,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1263,7 +1263,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1286,7 +1286,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1317,7 +1317,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1340,7 +1340,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1371,7 +1371,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1394,7 +1394,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1425,7 +1425,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1447,7 +1447,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1478,7 +1478,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1497,7 +1497,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1528,7 +1528,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1547,7 +1547,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1578,7 +1578,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1597,7 +1597,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1628,7 +1628,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1650,7 +1650,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1681,7 +1681,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1704,7 +1704,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1735,7 +1735,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1755,7 +1755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1786,7 +1786,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1805,7 +1805,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1836,7 +1836,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1856,7 +1856,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1887,7 +1887,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1907,7 +1907,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1938,7 +1938,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1957,7 +1957,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1988,7 +1988,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2008,7 +2008,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2039,7 +2039,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2059,7 +2059,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2090,7 +2090,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2109,7 +2109,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2140,7 +2140,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2160,7 +2160,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2191,7 +2191,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2211,7 +2211,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2242,7 +2242,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2261,7 +2261,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2292,7 +2292,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2311,7 +2311,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2342,7 +2342,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2361,7 +2361,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2392,7 +2392,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2411,7 +2411,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2442,7 +2442,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2461,7 +2461,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2492,7 +2492,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2511,7 +2511,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2542,7 +2542,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2561,7 +2561,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2592,7 +2592,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2611,7 +2611,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2642,7 +2642,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2661,7 +2661,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2692,7 +2692,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2711,7 +2711,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2742,7 +2742,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2761,7 +2761,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2792,7 +2792,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2811,7 +2811,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2842,7 +2842,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2861,7 +2861,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2892,7 +2892,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2911,7 +2911,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2942,7 +2942,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2961,7 +2961,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2992,7 +2992,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3011,7 +3011,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3042,7 +3042,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3061,7 +3061,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3092,7 +3092,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3111,7 +3111,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3142,7 +3142,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3161,7 +3161,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3192,7 +3192,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3211,7 +3211,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3242,7 +3242,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3261,7 +3261,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3292,7 +3292,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3311,7 +3311,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3342,7 +3342,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3361,7 +3361,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3392,7 +3392,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/ci/ios26-beta-simulator/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios26-beta-simulator/targets/chromium.fyi.json
index d3ea13a2..8adfdd8 100644
--- a/infra/config/generated/builders/ci/ios26-beta-simulator/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/ios26-beta-simulator/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -44,7 +44,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -63,7 +63,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -94,7 +94,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -113,7 +113,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -144,7 +144,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -163,7 +163,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -194,7 +194,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -213,7 +213,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -244,7 +244,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -263,7 +263,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -294,7 +294,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -313,7 +313,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -344,7 +344,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -363,7 +363,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -394,7 +394,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -413,7 +413,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -444,7 +444,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -463,7 +463,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -494,7 +494,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -513,7 +513,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -544,7 +544,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -563,7 +563,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -594,7 +594,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -613,7 +613,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -644,7 +644,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -663,7 +663,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -694,7 +694,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -713,7 +713,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -744,7 +744,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -763,7 +763,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -794,7 +794,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -813,7 +813,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -844,7 +844,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -863,7 +863,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -894,7 +894,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -913,7 +913,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -944,7 +944,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -963,7 +963,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -994,7 +994,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1013,7 +1013,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1044,7 +1044,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1066,7 +1066,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1097,7 +1097,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1120,7 +1120,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1151,7 +1151,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1176,7 +1176,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1207,7 +1207,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1232,7 +1232,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1263,7 +1263,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1288,7 +1288,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1319,7 +1319,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1344,7 +1344,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1375,7 +1375,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1398,7 +1398,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1429,7 +1429,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1452,7 +1452,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1483,7 +1483,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1506,7 +1506,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1537,7 +1537,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1559,7 +1559,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1590,7 +1590,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1614,7 +1614,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1645,7 +1645,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1670,7 +1670,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1701,7 +1701,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1721,7 +1721,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1752,7 +1752,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1771,7 +1771,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1802,7 +1802,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1821,7 +1821,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1852,7 +1852,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1874,7 +1874,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1905,7 +1905,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1928,7 +1928,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1959,7 +1959,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1979,7 +1979,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2010,7 +2010,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2029,7 +2029,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2060,7 +2060,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2080,7 +2080,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2111,7 +2111,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2131,7 +2131,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2162,7 +2162,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2181,7 +2181,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2212,7 +2212,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2232,7 +2232,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2263,7 +2263,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2283,7 +2283,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2314,7 +2314,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2333,7 +2333,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2364,7 +2364,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2383,7 +2383,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2414,7 +2414,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2433,7 +2433,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2464,7 +2464,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2483,7 +2483,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2514,7 +2514,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2536,7 +2536,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2567,7 +2567,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2589,7 +2589,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2620,7 +2620,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2639,7 +2639,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2670,7 +2670,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2689,7 +2689,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2720,7 +2720,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2739,7 +2739,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2770,7 +2770,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2789,7 +2789,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2820,7 +2820,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2839,7 +2839,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2870,7 +2870,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2889,7 +2889,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2920,7 +2920,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2939,7 +2939,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2970,7 +2970,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2989,7 +2989,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3020,7 +3020,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3039,7 +3039,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3070,7 +3070,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3089,7 +3089,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3120,7 +3120,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3139,7 +3139,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3170,7 +3170,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3189,7 +3189,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3220,7 +3220,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3239,7 +3239,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3270,7 +3270,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3289,7 +3289,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3320,7 +3320,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3339,7 +3339,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3370,7 +3370,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3389,7 +3389,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3420,7 +3420,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3439,7 +3439,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3470,7 +3470,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3489,7 +3489,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3520,7 +3520,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3539,7 +3539,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3570,7 +3570,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3589,7 +3589,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3620,7 +3620,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3639,7 +3639,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3670,7 +3670,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3689,7 +3689,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3720,7 +3720,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3739,7 +3739,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3770,7 +3770,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/ci/ios26-sdk-simulator/properties.json b/infra/config/generated/builders/ci/ios26-sdk-simulator/properties.json
index 00b92a8..f410cdd 100644
--- a/infra/config/generated/builders/ci/ios26-sdk-simulator/properties.json
+++ b/infra/config/generated/builders/ci/ios26-sdk-simulator/properties.json
@@ -69,5 +69,5 @@
   },
   "builder_group": "chromium.fyi",
   "recipe": "chromium",
-  "xcode_build_version": "17a5305f"
+  "xcode_build_version": "17a5305k"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ios26-sdk-simulator/targets/chromium.fyi.json b/infra/config/generated/builders/ci/ios26-sdk-simulator/targets/chromium.fyi.json
index 33667e9..afa1355 100644
--- a/infra/config/generated/builders/ci/ios26-sdk-simulator/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/ci/ios26-sdk-simulator/targets/chromium.fyi.json
@@ -16,7 +16,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -47,7 +47,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -70,7 +70,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -101,7 +101,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -124,7 +124,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -155,7 +155,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -178,7 +178,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -209,7 +209,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -229,7 +229,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -260,7 +260,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -279,7 +279,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -310,7 +310,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -329,7 +329,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -360,7 +360,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/gn_args_locations.json b/infra/config/generated/builders/gn_args_locations.json
index 36f62a1..64ffec8 100644
--- a/infra/config/generated/builders/gn_args_locations.json
+++ b/infra/config/generated/builders/gn_args_locations.json
@@ -68,12 +68,10 @@
     "android-x86-rel": "ci/android-x86-rel/gn-args.json"
   },
   "chromium.android.desktop": {
-    "android-desktop-arm64-binary-size-generator": "ci/android-desktop-arm64-binary-size-generator/gn-args.json",
     "android-desktop-arm64-compile-dbg": "ci/android-desktop-arm64-compile-dbg/gn-args.json",
     "android-desktop-arm64-compile-rel": "ci/android-desktop-arm64-compile-rel/gn-args.json",
     "android-desktop-arm64-deterministic-dbg": "ci/android-desktop-arm64-deterministic-dbg/gn-args.json",
     "android-desktop-arm64-deterministic-rel": "ci/android-desktop-arm64-deterministic-rel/gn-args.json",
-    "android-desktop-x64-binary-size-generator": "ci/android-desktop-x64-binary-size-generator/gn-args.json",
     "android-desktop-x64-compile-dbg": "ci/android-desktop-x64-compile-dbg/gn-args.json",
     "android-desktop-x64-compile-rel": "ci/android-desktop-x64-compile-rel/gn-args.json",
     "android-desktop-x64-deterministic-dbg": "ci/android-desktop-x64-deterministic-dbg/gn-args.json",
@@ -612,13 +610,11 @@
     "android-cronet-x86-dbg-pie-tests": "try/android-cronet-x86-dbg-pie-tests/gn-args.json",
     "android-cronet-x86-rel": "try/android-cronet-x86-rel/gn-args.json",
     "android-desktop-15-x64-fyi-rel": "try/android-desktop-15-x64-fyi-rel/gn-args.json",
-    "android-desktop-arm64-binary-size": "try/android-desktop-arm64-binary-size/gn-args.json",
     "android-desktop-arm64-clobber-rel": "try/android-desktop-arm64-clobber-rel/gn-args.json",
     "android-desktop-arm64-compile-dbg": "try/android-desktop-arm64-compile-dbg/gn-args.json",
     "android-desktop-arm64-compile-rel": "try/android-desktop-arm64-compile-rel/gn-args.json",
     "android-desktop-arm64-deterministic-dbg": "try/android-desktop-arm64-deterministic-dbg/gn-args.json",
     "android-desktop-arm64-deterministic-rel": "try/android-desktop-arm64-deterministic-rel/gn-args.json",
-    "android-desktop-x64-binary-size": "try/android-desktop-x64-binary-size/gn-args.json",
     "android-desktop-x64-clobber-rel": "try/android-desktop-x64-clobber-rel/gn-args.json",
     "android-desktop-x64-compile-dbg": "try/android-desktop-x64-compile-dbg/gn-args.json",
     "android-desktop-x64-deterministic-dbg": "try/android-desktop-x64-deterministic-dbg/gn-args.json",
diff --git a/infra/config/generated/builders/try/android-desktop-arm64-binary-size/gn-args.json b/infra/config/generated/builders/try/android-desktop-arm64-binary-size/gn-args.json
deleted file mode 100644
index de5c8b9..0000000
--- a/infra/config/generated/builders/try/android-desktop-arm64-binary-size/gn-args.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "gn_args": {
-    "android_channel": "stable",
-    "debuggable_apks": false,
-    "ffmpeg_branding": "Chrome",
-    "is_desktop_android": true,
-    "is_official_build": true,
-    "proprietary_codecs": true,
-    "symbol_level": 1,
-    "target_cpu": "arm64",
-    "target_os": "android",
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "v8_is_on_release_branch": true
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-desktop-x64-binary-size/gn-args.json b/infra/config/generated/builders/try/android-desktop-x64-binary-size/gn-args.json
deleted file mode 100644
index 366e138..0000000
--- a/infra/config/generated/builders/try/android-desktop-x64-binary-size/gn-args.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "gn_args": {
-    "android_channel": "stable",
-    "debuggable_apks": false,
-    "ffmpeg_branding": "Chrome",
-    "is_desktop_android": true,
-    "is_official_build": true,
-    "proprietary_codecs": true,
-    "symbol_level": 1,
-    "target_cpu": "x64",
-    "target_os": "android",
-    "use_reclient": false,
-    "use_remoteexec": true,
-    "use_siso": true,
-    "v8_is_on_release_branch": true
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-blink-rel-fyi/properties.json b/infra/config/generated/builders/try/ios-blink-rel-fyi/properties.json
index 77ff6e98..aba5100 100644
--- a/infra/config/generated/builders/try/ios-blink-rel-fyi/properties.json
+++ b/infra/config/generated/builders/try/ios-blink-rel-fyi/properties.json
@@ -63,5 +63,5 @@
   },
   "builder_group": "tryserver.chromium.mac",
   "recipe": "chromium_trybot",
-  "xcode_build_version": "17a5305f"
+  "xcode_build_version": "17a5305k"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json
index b82995f..6bb4055 100644
--- a/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/ios-blink-rel-fyi/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -44,7 +44,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -63,7 +63,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -94,7 +94,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -116,7 +116,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -147,7 +147,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -166,7 +166,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -197,7 +197,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -216,7 +216,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -247,7 +247,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -266,7 +266,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -297,7 +297,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -319,7 +319,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -355,7 +355,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -374,7 +374,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -405,7 +405,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -424,7 +424,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -455,7 +455,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -474,7 +474,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -505,7 +505,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -524,7 +524,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -555,7 +555,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -577,7 +577,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -608,7 +608,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -629,7 +629,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -660,7 +660,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -681,7 +681,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -712,7 +712,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -733,7 +733,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -764,7 +764,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -785,7 +785,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -816,7 +816,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -838,7 +838,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -869,7 +869,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -888,7 +888,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -919,7 +919,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -938,7 +938,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -969,7 +969,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -988,7 +988,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1019,7 +1019,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1038,7 +1038,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1069,7 +1069,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1088,7 +1088,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1119,7 +1119,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1138,7 +1138,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1169,7 +1169,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1188,7 +1188,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1219,7 +1219,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1240,7 +1240,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1271,7 +1271,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1290,7 +1290,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1321,7 +1321,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1340,7 +1340,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1371,7 +1371,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1390,7 +1390,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1421,7 +1421,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1442,7 +1442,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1473,7 +1473,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1492,7 +1492,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1523,7 +1523,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1542,7 +1542,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1573,7 +1573,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1592,7 +1592,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1623,7 +1623,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1642,7 +1642,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1673,7 +1673,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1692,7 +1692,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1723,7 +1723,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1744,7 +1744,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1775,7 +1775,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1800,7 +1800,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1831,7 +1831,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1856,7 +1856,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1887,7 +1887,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1906,7 +1906,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1937,7 +1937,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1958,7 +1958,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1989,7 +1989,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2008,7 +2008,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2039,7 +2039,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2058,7 +2058,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2089,7 +2089,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2108,7 +2108,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2139,7 +2139,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2158,7 +2158,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2189,7 +2189,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2208,7 +2208,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2239,7 +2239,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2259,7 +2259,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2290,7 +2290,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2309,7 +2309,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2340,7 +2340,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2359,7 +2359,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2390,7 +2390,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2409,7 +2409,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2440,7 +2440,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2459,7 +2459,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2490,7 +2490,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2510,7 +2510,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2541,7 +2541,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2560,7 +2560,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2591,7 +2591,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2610,7 +2610,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2641,7 +2641,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2660,7 +2660,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2691,7 +2691,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2713,7 +2713,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2744,7 +2744,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2763,7 +2763,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2794,7 +2794,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2813,7 +2813,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2844,7 +2844,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json b/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json
index b95a37e..6cc55e1b 100644
--- a/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json
+++ b/infra/config/generated/builders/try/ios-simulator-full-configs/targets/chromium.mac.json
@@ -1291,112 +1291,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_bookmarks_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_bookmarks_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_bookmarks_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_bookmarks_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -1440,6 +1334,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
         },
@@ -1505,61 +1404,6 @@
           "--clones",
           "2",
           "--platform",
-          "iPad Pro (12.9-inch) (6th generation)",
-          "--version",
-          "17.5",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_integration_eg2tests_module iPad Pro (12.9-inch) (6th generation) 17.5",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_17_5",
-              "path": "Runtime-ios-17.5"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 9
-        },
-        "test": "ios_chrome_integration_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/",
-        "variant_id": "iPad Pro (12.9-inch) (6th generation) 17.5"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.2",
@@ -1603,6 +1447,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 9
         },
@@ -1713,6 +1562,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 9
         },
@@ -1768,6 +1622,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 9
         },
@@ -1835,116 +1694,6 @@
           "--clones",
           "2",
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "ios_chrome_settings_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_settings_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "ios_chrome_settings_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_settings_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -1988,6 +1737,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 4
         },
@@ -2053,112 +1807,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "ios_chrome_signin_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_signin_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "ios_chrome_signin_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -2202,6 +1850,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 6
         },
@@ -2265,110 +1918,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ios_chrome_smoke_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_smoke_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ios_chrome_smoke_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_smoke_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -2412,6 +1961,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_chrome_smoke_eg2tests_module",
@@ -2475,116 +2029,6 @@
           "--clones",
           "2",
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "ios_chrome_ui_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_ui_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "ios_chrome_ui_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--clones",
-          "2",
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -2628,6 +2072,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 12
         },
@@ -2907,112 +2356,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "18.2",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 18.2",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_18_2",
-              "path": "Runtime-ios-18.2"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_web_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 18.2"
-      },
-      {
-        "args": [
-          "--platform",
-          "iPad Pro 13-inch (M4)",
-          "--version",
-          "26.0",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_chrome_web_eg2tests_module iPad Pro 13-inch (M4) 26.0",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_26_0",
-              "path": "Runtime-ios-26.0"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "ios_chrome_web_eg2tests_module",
-        "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_web_eg2tests_module/",
-        "variant_id": "iPad Pro 13-inch (M4) 26.0"
-      },
-      {
-        "args": [
-          "--platform",
           "iPhone 15",
           "--version",
           "18.2",
@@ -3056,6 +2399,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 2
         },
@@ -3656,58 +3004,6 @@
       {
         "args": [
           "--platform",
-          "iPad Pro (12.9-inch) (6th generation)",
-          "--version",
-          "17.5",
-          "--xcodebuild-sim-runner",
-          "--out-dir",
-          "${ISOLATED_OUTDIR}",
-          "--xcode-build-version",
-          "17a5305f",
-          "--xctest"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "module_name": "//ios/web/shell/test:ios_web_shell_eg2tests_module/",
-        "module_scheme": "xctest",
-        "name": "ios_web_shell_eg2tests_module iPad Pro (12.9-inch) (6th generation) 17.5",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "infra/tools/mac_toolchain/${platform}",
-              "location": ".",
-              "revision": "git_revision:4c7290150d1c360cecc6a93c0214dc531585c3ab"
-            }
-          ],
-          "dimensions": {
-            "cpu": "arm64",
-            "os": "Mac-15"
-          },
-          "named_caches": [
-            {
-              "name": "runtime_ios_17_5",
-              "path": "Runtime-ios-17.5"
-            },
-            {
-              "name": "xcode_ios_17a5305f",
-              "path": "Xcode.app"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ios_web_shell_eg2tests_module",
-        "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/",
-        "variant_id": "iPad Pro (12.9-inch) (6th generation) 17.5"
-      },
-      {
-        "args": [
-          "--platform",
           "iPad Pro 13-inch (M4)",
           "--version",
           "18.2",
@@ -3751,6 +3047,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_web_shell_eg2tests_module",
@@ -3855,6 +3156,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_web_shell_eg2tests_module",
@@ -3907,6 +3213,11 @@
               "path": "Xcode.app"
             }
           ],
+          "optional_dimensions": {
+            "30": {
+              "cpu": "Apple_(Virtual)"
+            }
+          },
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "ios_web_shell_eg2tests_module",
diff --git a/infra/config/generated/builders/try/ios-simulator/properties.json b/infra/config/generated/builders/try/ios-simulator/properties.json
index 3350b72..b0c6b26 100644
--- a/infra/config/generated/builders/try/ios-simulator/properties.json
+++ b/infra/config/generated/builders/try/ios-simulator/properties.json
@@ -57,10 +57,6 @@
     ],
     "use_clang_coverage": true
   },
-  "$build/flakiness": {
-    "check_for_flakiness": true,
-    "check_for_flakiness_with_resultdb": true
-  },
   "$build/siso": {
     "configs": [
       "builder"
@@ -81,7 +77,6 @@
     ]
   },
   "builder_group": "tryserver.chromium.mac",
-  "cq": "required",
   "recipe": "chromium/orchestrator",
   "xcode_build_version": "17a5305f"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios18-sdk-simulator/properties.json b/infra/config/generated/builders/try/ios18-sdk-simulator/properties.json
index 43d9af6..6d3b36f 100644
--- a/infra/config/generated/builders/try/ios18-sdk-simulator/properties.json
+++ b/infra/config/generated/builders/try/ios18-sdk-simulator/properties.json
@@ -62,5 +62,5 @@
   },
   "builder_group": "tryserver.chromium.mac",
   "recipe": "chromium_trybot",
-  "xcode_build_version": "17a5305f"
+  "xcode_build_version": "17a5305k"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios18-sdk-simulator/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios18-sdk-simulator/targets/chromium.fyi.json
index 8d48f7d..8217ca0 100644
--- a/infra/config/generated/builders/try/ios18-sdk-simulator/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/ios18-sdk-simulator/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -44,7 +44,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -63,7 +63,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -94,7 +94,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -113,7 +113,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -144,7 +144,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -163,7 +163,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -194,7 +194,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -213,7 +213,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -244,7 +244,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -263,7 +263,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -294,7 +294,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -313,7 +313,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -344,7 +344,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -363,7 +363,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -394,7 +394,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -413,7 +413,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -444,7 +444,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -463,7 +463,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -494,7 +494,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -513,7 +513,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -544,7 +544,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -563,7 +563,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -594,7 +594,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -613,7 +613,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -644,7 +644,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -663,7 +663,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -694,7 +694,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -713,7 +713,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -744,7 +744,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -763,7 +763,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -794,7 +794,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -813,7 +813,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -844,7 +844,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -863,7 +863,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -894,7 +894,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -913,7 +913,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -944,7 +944,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -963,7 +963,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -994,7 +994,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1013,7 +1013,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1044,7 +1044,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1066,7 +1066,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1097,7 +1097,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1120,7 +1120,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1151,7 +1151,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1176,7 +1176,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1207,7 +1207,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1232,7 +1232,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1263,7 +1263,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1286,7 +1286,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1317,7 +1317,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1340,7 +1340,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1371,7 +1371,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1394,7 +1394,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1425,7 +1425,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1447,7 +1447,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1478,7 +1478,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1497,7 +1497,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1528,7 +1528,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1547,7 +1547,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1578,7 +1578,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1597,7 +1597,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1628,7 +1628,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1650,7 +1650,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1681,7 +1681,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1704,7 +1704,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1735,7 +1735,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1755,7 +1755,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1786,7 +1786,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1805,7 +1805,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1836,7 +1836,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1856,7 +1856,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1887,7 +1887,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1907,7 +1907,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1938,7 +1938,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1957,7 +1957,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1988,7 +1988,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2008,7 +2008,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2039,7 +2039,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2059,7 +2059,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2090,7 +2090,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2109,7 +2109,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2140,7 +2140,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2160,7 +2160,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2191,7 +2191,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2211,7 +2211,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2242,7 +2242,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2261,7 +2261,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2292,7 +2292,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2311,7 +2311,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2342,7 +2342,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2361,7 +2361,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2392,7 +2392,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2411,7 +2411,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2442,7 +2442,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2461,7 +2461,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2492,7 +2492,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2511,7 +2511,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2542,7 +2542,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2561,7 +2561,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2592,7 +2592,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2611,7 +2611,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2642,7 +2642,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2661,7 +2661,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2692,7 +2692,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2711,7 +2711,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2742,7 +2742,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2761,7 +2761,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2792,7 +2792,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2811,7 +2811,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2842,7 +2842,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2861,7 +2861,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2892,7 +2892,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2911,7 +2911,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2942,7 +2942,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2961,7 +2961,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2992,7 +2992,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3011,7 +3011,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3042,7 +3042,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3061,7 +3061,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3092,7 +3092,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3111,7 +3111,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3142,7 +3142,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3161,7 +3161,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3192,7 +3192,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3211,7 +3211,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3242,7 +3242,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3261,7 +3261,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3292,7 +3292,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3311,7 +3311,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3342,7 +3342,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3361,7 +3361,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3392,7 +3392,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/try/ios26-beta-simulator/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios26-beta-simulator/targets/chromium.fyi.json
index d3ea13a2..8adfdd8 100644
--- a/infra/config/generated/builders/try/ios26-beta-simulator/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/ios26-beta-simulator/targets/chromium.fyi.json
@@ -13,7 +13,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -44,7 +44,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -63,7 +63,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -94,7 +94,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -113,7 +113,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -144,7 +144,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -163,7 +163,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -194,7 +194,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -213,7 +213,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -244,7 +244,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -263,7 +263,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -294,7 +294,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -313,7 +313,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -344,7 +344,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -363,7 +363,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -394,7 +394,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -413,7 +413,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -444,7 +444,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -463,7 +463,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -494,7 +494,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -513,7 +513,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -544,7 +544,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -563,7 +563,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -594,7 +594,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -613,7 +613,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -644,7 +644,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -663,7 +663,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -694,7 +694,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -713,7 +713,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -744,7 +744,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -763,7 +763,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -794,7 +794,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -813,7 +813,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -844,7 +844,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -863,7 +863,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -894,7 +894,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -913,7 +913,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -944,7 +944,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -963,7 +963,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -994,7 +994,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1013,7 +1013,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1044,7 +1044,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1066,7 +1066,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1097,7 +1097,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1120,7 +1120,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1151,7 +1151,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1176,7 +1176,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1207,7 +1207,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1232,7 +1232,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1263,7 +1263,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1288,7 +1288,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1319,7 +1319,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1344,7 +1344,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1375,7 +1375,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1398,7 +1398,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1429,7 +1429,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1452,7 +1452,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1483,7 +1483,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1506,7 +1506,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1537,7 +1537,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1559,7 +1559,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1590,7 +1590,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1614,7 +1614,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1645,7 +1645,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1670,7 +1670,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1701,7 +1701,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1721,7 +1721,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1752,7 +1752,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1771,7 +1771,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1802,7 +1802,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1821,7 +1821,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1852,7 +1852,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1874,7 +1874,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1905,7 +1905,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1928,7 +1928,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -1959,7 +1959,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -1979,7 +1979,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2010,7 +2010,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2029,7 +2029,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2060,7 +2060,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2080,7 +2080,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2111,7 +2111,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2131,7 +2131,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2162,7 +2162,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2181,7 +2181,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2212,7 +2212,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2232,7 +2232,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2263,7 +2263,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2283,7 +2283,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2314,7 +2314,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2333,7 +2333,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2364,7 +2364,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2383,7 +2383,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2414,7 +2414,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2433,7 +2433,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2464,7 +2464,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2483,7 +2483,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2514,7 +2514,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2536,7 +2536,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2567,7 +2567,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2589,7 +2589,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2620,7 +2620,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2639,7 +2639,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2670,7 +2670,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2689,7 +2689,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2720,7 +2720,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2739,7 +2739,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2770,7 +2770,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2789,7 +2789,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2820,7 +2820,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2839,7 +2839,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2870,7 +2870,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2889,7 +2889,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2920,7 +2920,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2939,7 +2939,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -2970,7 +2970,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -2989,7 +2989,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3020,7 +3020,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3039,7 +3039,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3070,7 +3070,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3089,7 +3089,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3120,7 +3120,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3139,7 +3139,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3170,7 +3170,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3189,7 +3189,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3220,7 +3220,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3239,7 +3239,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3270,7 +3270,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3289,7 +3289,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3320,7 +3320,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3339,7 +3339,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3370,7 +3370,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3389,7 +3389,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3420,7 +3420,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3439,7 +3439,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3470,7 +3470,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3489,7 +3489,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3520,7 +3520,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3539,7 +3539,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3570,7 +3570,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3589,7 +3589,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3620,7 +3620,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3639,7 +3639,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3670,7 +3670,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3689,7 +3689,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3720,7 +3720,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -3739,7 +3739,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -3770,7 +3770,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/builders/try/ios26-sdk-simulator/properties.json b/infra/config/generated/builders/try/ios26-sdk-simulator/properties.json
index e866182..1fe7852 100644
--- a/infra/config/generated/builders/try/ios26-sdk-simulator/properties.json
+++ b/infra/config/generated/builders/try/ios26-sdk-simulator/properties.json
@@ -62,5 +62,5 @@
   },
   "builder_group": "tryserver.chromium.mac",
   "recipe": "chromium_trybot",
-  "xcode_build_version": "17a5305f"
+  "xcode_build_version": "17a5305k"
 }
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/ios26-sdk-simulator/targets/chromium.fyi.json b/infra/config/generated/builders/try/ios26-sdk-simulator/targets/chromium.fyi.json
index 33667e9..afa1355 100644
--- a/infra/config/generated/builders/try/ios26-sdk-simulator/targets/chromium.fyi.json
+++ b/infra/config/generated/builders/try/ios26-sdk-simulator/targets/chromium.fyi.json
@@ -16,7 +16,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -47,7 +47,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -70,7 +70,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -101,7 +101,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -124,7 +124,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -155,7 +155,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -178,7 +178,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -209,7 +209,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -229,7 +229,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -260,7 +260,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -279,7 +279,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -310,7 +310,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
@@ -329,7 +329,7 @@
           "--out-dir",
           "${ISOLATED_OUTDIR}",
           "--xcode-build-version",
-          "17a5305f",
+          "17a5305k",
           "--xctest"
         ],
         "merge": {
@@ -360,7 +360,7 @@
               "path": "Runtime-ios-26.0"
             },
             {
-              "name": "xcode_ios_17a5305f",
+              "name": "xcode_ios_17a5305k",
               "path": "Xcode.app"
             }
           ],
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md
index 083f0ae6..5c16382 100644
--- a/infra/config/generated/cq-builders.md
+++ b/infra/config/generated/cq-builders.md
@@ -45,8 +45,6 @@
 
 * [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""fuchsia-x64-cast-receiver-rel""))
 
-* [ios-simulator](https://ci.chromium.org/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""ios-simulator""))
-
 * [linux-chromeos-compile-dbg](https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-chromeos-compile-dbg""))
 
 * [linux-chromeos-rel](https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-chromeos-rel""))
diff --git a/infra/config/generated/cq-usage/default.cfg b/infra/config/generated/cq-usage/default.cfg
index e6c4d6393..7c519c7 100644
--- a/infra/config/generated/cq-usage/default.cfg
+++ b/infra/config/generated/cq-usage/default.cfg
@@ -62,9 +62,6 @@
         name: "chromium/try/fuchsia-x64-cast-receiver-rel"
       }
       builders {
-        name: "chromium/try/ios-simulator"
-      }
-      builders {
         name: "chromium/try/linux-chromeos-compile-dbg"
       }
       builders {
diff --git a/infra/config/generated/cq-usage/full.cfg b/infra/config/generated/cq-usage/full.cfg
index ec3c387..2d43bc0 100644
--- a/infra/config/generated/cq-usage/full.cfg
+++ b/infra/config/generated/cq-usage/full.cfg
@@ -2572,29 +2572,6 @@
         }
       }
       builders {
-        name: "chromium/try/ios-simulator"
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "docs/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/generated/builders/try/ios-simulator/.+"
-        }
-      }
-      builders {
         name: "chromium/try/ios-simulator-full-configs"
         location_filters {
           gerrit_host_regexp: ".*"
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json
index 0ac4a6c..b2e8e12 100644
--- a/infra/config/generated/health-specs/health-specs.json
+++ b/infra/config/generated/health-specs/health-specs.json
@@ -7475,27 +7475,6 @@
           }
         ]
       },
-      "android-desktop-arm64-binary-size-generator": {
-        "contact_team_email": "clank-engprod@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
       "android-desktop-arm64-compile-dbg": {
         "contact_team_email": "clank-engprod@google.com",
         "problem_specs": [
@@ -7622,27 +7601,6 @@
           }
         ]
       },
-      "android-desktop-x64-binary-size-generator": {
-        "contact_team_email": "clank-engprod@google.com",
-        "problem_specs": [
-          {
-            "name": "Unhealthy",
-            "period_days": 7,
-            "score": 5,
-            "thresholds": {
-              "_default": "_default"
-            }
-          },
-          {
-            "name": "Low Value",
-            "period_days": 90,
-            "score": 1,
-            "thresholds": {
-              "_default": "_default"
-            }
-          }
-        ]
-      },
       "android-desktop-x64-compile-dbg": {
         "contact_team_email": "clank-engprod@google.com",
         "problem_specs": [
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index ff3799f3..16763a8 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -1871,11 +1871,6 @@
         disable_reuse_footers: "Include-Ci-Only-Tests"
       }
       builders {
-        name: "chromium/try/android-desktop-arm64-binary-size"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
         name: "chromium/try/android-desktop-arm64-clobber-rel"
         includable_only: true
         disable_reuse_footers: "Include-Ci-Only-Tests"
@@ -1906,11 +1901,6 @@
         disable_reuse_footers: "Include-Ci-Only-Tests"
       }
       builders {
-        name: "chromium/try/android-desktop-x64-binary-size"
-        includable_only: true
-        disable_reuse_footers: "Include-Ci-Only-Tests"
-      }
-      builders {
         name: "chromium/try/android-desktop-x64-clobber-rel"
         includable_only: true
         disable_reuse_footers: "Include-Ci-Only-Tests"
@@ -4412,29 +4402,8 @@
       }
       builders {
         name: "chromium/try/ios-simulator"
+        includable_only: true
         disable_reuse_footers: "Include-Ci-Only-Tests"
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "docs/.+"
-          exclude: true
-        }
-        location_filters {
-          gerrit_host_regexp: ".*"
-          gerrit_project_regexp: ".*"
-          gerrit_ref_regexp: ".*"
-          path_regexp: "infra/config/generated/builders/try/ios-simulator/.+"
-        }
-        mode_allowlist: "DRY_RUN"
-        mode_allowlist: "FULL_RUN"
       }
       builders {
         name: "chromium/try/ios-simulator-code-coverage"
@@ -8082,6 +8051,7 @@
       ref_regexp_exclude: "refs/branch-heads/7204"
       ref_regexp_exclude: "refs/branch-heads/7258"
       ref_regexp_exclude: "refs/branch-heads/7339"
+      ref_regexp_exclude: "refs/branch-heads/7390"
     }
   }
   verifiers {
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index e40caac..22be070 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -40985,126 +40985,6 @@
       }
     }
     builders {
-      name: "android-desktop-arm64-binary-size-generator"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:android-desktop-arm64-binary-size-generator"
-      dimensions: "cores:32"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:1"
-      exe {
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/main"
-        cmd: "luciexe"
-      }
-      properties:
-        '{'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_monitoring": true,'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "metrics_project": "chromium-reclient-metrics",'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
-        '  "$recipe_engine/resultdb/test_presentation": {'
-        '    "column_keys": [],'
-        '    "grouping_keys": ['
-        '      "status",'
-        '      "v.test_suite"'
-        '    ]'
-        '  },'
-        '  "builder_group": "chromium.android.desktop",'
-        '  "recipe": "binary_size_generator_tot"'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "Generates binary size data for android-desktop on arm64.<br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_monitoring": true,'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "metrics_project": "chromium-reclient-metrics",'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
-        dimensions: "builder:"
-        dimensions: "builderless:1"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "clank-engprod@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-desktop-arm64-compile-dbg"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:android-desktop-arm64-compile-dbg"
@@ -41778,126 +41658,6 @@
       }
     }
     builders {
-      name: "android-desktop-x64-binary-size-generator"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:android-desktop-x64-binary-size-generator"
-      dimensions: "cores:32"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.ci"
-      dimensions: "ssd:1"
-      exe {
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/main"
-        cmd: "luciexe"
-      }
-      properties:
-        '{'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_monitoring": true,'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "metrics_project": "chromium-reclient-metrics",'
-        '    "project": "rbe-chromium-trusted",'
-        '    "remote_jobs": 250'
-        '  },'
-        '  "$recipe_engine/resultdb/test_presentation": {'
-        '    "column_keys": [],'
-        '    "grouping_keys": ['
-        '      "status",'
-        '      "v.test_suite"'
-        '    ]'
-        '  },'
-        '  "builder_group": "chromium.android.desktop",'
-        '  "recipe": "binary_size_generator_tot"'
-        '}'
-      execution_timeout_secs: 10800
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "ci_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_ci_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "Generates binary size data for android-desktop on x64.<br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        properties:
-          '{'
-          '  "$build/siso": {'
-          '    "configs": ['
-          '      "builder"'
-          '    ],'
-          '    "enable_cloud_monitoring": true,'
-          '    "enable_cloud_profiler": true,'
-          '    "enable_cloud_trace": true,'
-          '    "experiments": [],'
-          '    "metrics_project": "chromium-reclient-metrics",'
-          '    "project": "rbe-chromium-untrusted",'
-          '    "remote_jobs": 250'
-          '  }'
-          '}'
-        dimensions: "builder:"
-        dimensions: "builderless:1"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "clank-engprod@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-desktop-x64-compile-dbg"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:android-desktop-x64-compile-dbg"
@@ -48523,8 +48283,8 @@
       priority: 35
       execution_timeout_secs: 10800
       caches {
-        name: "xcode_ios_17a5305f"
-        path: "xcode_ios_17a5305f.app"
+        name: "xcode_ios_17a5305k"
+        path: "xcode_ios_17a5305k.app"
       }
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -48593,8 +48353,9 @@
     builders {
       name: "ios-catalyst"
       swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:ios-catalyst"
-      dimensions: "cpu:x86-64"
+      dimensions: "builderless:1"
+      dimensions: "cpu:arm64"
+      dimensions: "free_space:standard"
       dimensions: "os:Mac-15"
       dimensions: "pool:luci.chromium.ci"
       exe {
@@ -48683,8 +48444,7 @@
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
-        dimensions: "builder:"
-        dimensions: "builderless:1"
+        dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
       custom_metric_definitions {
@@ -50089,8 +49849,8 @@
       priority: 35
       execution_timeout_secs: 36000
       caches {
-        name: "xcode_ios_17a5305f"
-        path: "xcode_ios_17a5305f.app"
+        name: "xcode_ios_17a5305k"
+        path: "xcode_ios_17a5305k.app"
       }
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -50307,8 +50067,8 @@
       priority: 35
       execution_timeout_secs: 36000
       caches {
-        name: "xcode_ios_17a5305f"
-        path: "xcode_ios_17a5305f.app"
+        name: "xcode_ios_17a5305k"
+        path: "xcode_ios_17a5305k.app"
       }
       build_numbers: YES
       service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -77822,7 +77582,7 @@
       name: "android-binary-size"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:android-binary-size"
-      dimensions: "cores:32"
+      dimensions: "cores:16|32"
       dimensions: "cpu:x86-64"
       dimensions: "os:Ubuntu-22.04"
       dimensions: "pool:luci.chromium.try"
@@ -81834,126 +81594,6 @@
       }
     }
     builders {
-      name: "android-desktop-arm64-binary-size"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:32"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      exe {
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/main"
-        cmd: "luciexe"
-      }
-      properties:
-        '{'
-        '  "$build/binary_size": {'
-        '    "analyze_targets": ['
-        '      "//chrome/android:trichrome_64_minimal_apks",'
-        '      "//chrome/android:trichrome_library_64_apk",'
-        '      "//chrome/android:validate_expectations",'
-        '      "//tools/binary_size:binary_size_trybot_py"'
-        '    ],'
-        '    "compile_targets": ['
-        '      "check_chrome_static_initializers",'
-        '      "monochrome_64_32_apk",'
-        '      "validate_expectations"'
-        '    ]'
-        '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_monitoring": true,'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "metrics_project": "chromium-reclient-metrics",'
-        '    "project": "rbe-chromium-untrusted",'
-        '    "remote_jobs": 150'
-        '  },'
-        '  "$recipe_engine/resultdb/test_presentation": {'
-        '    "column_keys": [],'
-        '    "grouping_keys": ['
-        '      "status",'
-        '      "v.test_suite"'
-        '    ]'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "recipe": "binary_size_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "Measures binary size of android-desktop on arm64.<br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>"
-      contact_team_email: "clank-engprod@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-desktop-arm64-clobber-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -82598,126 +82238,6 @@
       }
     }
     builders {
-      name: "android-desktop-x64-binary-size"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:32"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      exe {
-        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
-        cipd_version: "refs/heads/main"
-        cmd: "luciexe"
-      }
-      properties:
-        '{'
-        '  "$build/binary_size": {'
-        '    "analyze_targets": ['
-        '      "//chrome/android:trichrome_64_minimal_apks",'
-        '      "//chrome/android:trichrome_library_64_apk",'
-        '      "//chrome/android:validate_expectations",'
-        '      "//tools/binary_size:binary_size_trybot_py"'
-        '    ],'
-        '    "compile_targets": ['
-        '      "check_chrome_static_initializers",'
-        '      "monochrome_64_32_apk",'
-        '      "validate_expectations"'
-        '    ]'
-        '  },'
-        '  "$build/siso": {'
-        '    "configs": ['
-        '      "builder"'
-        '    ],'
-        '    "enable_cloud_monitoring": true,'
-        '    "enable_cloud_profiler": true,'
-        '    "enable_cloud_trace": true,'
-        '    "experiments": [],'
-        '    "metrics_project": "chromium-reclient-metrics",'
-        '    "project": "rbe-chromium-untrusted",'
-        '    "remote_jobs": 150'
-        '  },'
-        '  "$recipe_engine/resultdb/test_presentation": {'
-        '    "column_keys": [],'
-        '    "grouping_keys": ['
-        '      "status",'
-        '      "v.test_suite"'
-        '    ]'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "recipe": "binary_size_trybot"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium.use_per_builder_build_dir_name"
-        value: 100
-      }
-      experiments {
-        key: "luci.buildbucket.canary_software"
-        value: 5
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "Measures binary size of android-desktop on x64.<br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>"
-      contact_team_email: "clank-engprod@google.com"
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/cached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"true\""
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count"
-        predicates: "has(build.output.properties.ran_tests_retry_shard)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/ran_tests_without_patch_count"
-        predicates: "has(build.output.properties.ran_tests_without_patch)"
-      }
-      custom_metric_definitions {
-        name: "/chrome/infra/browser/builds/uncached_count"
-        predicates: "has(build.output.properties.is_cached)"
-        predicates: "string(build.output.properties.is_cached) == \"false\""
-      }
-    }
-    builders {
       name: "android-desktop-x64-clobber-rel"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -99288,8 +98808,8 @@
         seconds: 120
       }
       caches {
-        name: "xcode_ios_17a5305f"
-        path: "xcode_ios_17a5305f.app"
+        name: "xcode_ios_17a5305k"
+        path: "xcode_ios_17a5305k.app"
       }
       build_numbers: YES
       service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -99356,8 +98876,9 @@
     builders {
       name: "ios-catalyst"
       swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:ios-catalyst"
-      dimensions: "cpu:x86-64"
+      dimensions: "builderless:1"
+      dimensions: "cpu:arm64"
+      dimensions: "free_space:standard"
       dimensions: "os:Mac-15"
       dimensions: "pool:luci.chromium.try"
       exe {
@@ -99713,7 +99234,6 @@
         '    }'
         '  },'
         '  "builder_group": "tryserver.chromium.mac",'
-        '  "cq": "required",'
         '  "led_builder_is_bootstrapped": true,'
         '  "recipe": "chromium/orchestrator"'
         '}'
@@ -100829,8 +100349,8 @@
         seconds: 120
       }
       caches {
-        name: "xcode_ios_17a5305f"
-        path: "xcode_ios_17a5305f.app"
+        name: "xcode_ios_17a5305k"
+        path: "xcode_ios_17a5305k.app"
       }
       build_numbers: YES
       service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -101045,8 +100565,8 @@
         seconds: 120
       }
       caches {
-        name: "xcode_ios_17a5305f"
-        path: "xcode_ios_17a5305f.app"
+        name: "xcode_ios_17a5305k"
+        path: "xcode_ios_17a5305k.app"
       }
       build_numbers: YES
       service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 0d86fb5..bd8bc433 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -359,6 +359,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -1306,6 +1310,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -2041,6 +2049,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -2611,6 +2623,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -2989,6 +3005,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -3127,12 +3147,6 @@
     name: "buildbucket/luci.chromium.try/android-cronet-x86-dbg-marshmallow-tests"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-desktop-arm64-binary-size"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-desktop-x64-binary-size"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-desktop-x64-rel"
   }
   builders {
@@ -3885,6 +3899,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -4388,6 +4406,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -4821,6 +4843,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -5191,6 +5217,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -5564,6 +5594,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -5932,6 +5966,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -6380,6 +6418,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -7378,6 +7420,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -8141,6 +8187,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -8509,6 +8559,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -9152,6 +9206,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -9306,16 +9364,6 @@
     short_name: "x64-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/android-desktop-arm64-binary-size-generator"
-    category: "builder|size"
-    short_name: "arm64"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/android-desktop-x64-binary-size-generator"
-    category: "builder|size"
-    short_name: "x64"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/android-desktop-x64-rel-15-tests"
     category: "tester|x64"
     short_name: "15-rel"
@@ -9565,6 +9613,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -9928,6 +9980,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -10375,6 +10431,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -10808,6 +10868,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -11170,6 +11234,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -11686,6 +11754,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -12114,6 +12186,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -12722,6 +12798,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -13300,6 +13380,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -13918,6 +14002,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -14386,6 +14474,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -14776,6 +14868,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -15369,6 +15465,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -15960,6 +16060,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -16379,6 +16483,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -17141,6 +17249,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -17532,6 +17644,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -18277,6 +18393,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -18679,6 +18799,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -19131,6 +19255,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -19594,6 +19722,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -20062,6 +20194,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -20430,6 +20566,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -20828,6 +20968,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -21231,6 +21375,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -21779,6 +21927,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -22177,6 +22329,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -22606,6 +22762,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -23039,6 +23199,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -23412,6 +23576,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -23785,6 +23953,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -24258,6 +24430,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -24861,6 +25037,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -25255,6 +25435,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -25660,6 +25844,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -26043,6 +26231,10 @@
         url: "/p/chromium-m140/g/main/console"
       }
       links {
+        text: "m141"
+        url: "/p/chromium-m141/g/main/console"
+      }
+      links {
         text: "trunk"
         url: "/p/chromium/g/main/console"
         alt: "Trunk (ToT) console"
@@ -26379,9 +26571,6 @@
     name: "buildbucket/luci.chromium.try/android-desktop-15-x64-fyi-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-desktop-arm64-binary-size"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-desktop-arm64-clobber-rel"
   }
   builders {
@@ -26400,9 +26589,6 @@
     name: "buildbucket/luci.chromium.try/android-desktop-arm64-official"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-desktop-x64-binary-size"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-desktop-x64-clobber-rel"
   }
   builders {
@@ -27941,9 +28127,6 @@
     name: "buildbucket/luci.chromium.try/android-desktop-15-x64-fyi-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-desktop-arm64-binary-size"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-desktop-arm64-clobber-rel"
   }
   builders {
@@ -27959,9 +28142,6 @@
     name: "buildbucket/luci.chromium.try/android-desktop-arm64-deterministic-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-desktop-x64-binary-size"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-desktop-x64-clobber-rel"
   }
   builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index 8c0af634..efc94b4 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3542,15 +3542,6 @@
   }
 }
 job {
-  id: "android-desktop-arm64-binary-size-generator"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-desktop-arm64-binary-size-generator"
-  }
-}
-job {
   id: "android-desktop-arm64-compile-dbg"
   realm: "ci"
   buildbucket {
@@ -3605,15 +3596,6 @@
   }
 }
 job {
-  id: "android-desktop-x64-binary-size-generator"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-desktop-x64-binary-size-generator"
-  }
-}
-job {
   id: "android-desktop-x64-compile-dbg"
   realm: "ci"
   buildbucket {
@@ -6579,14 +6561,12 @@
   triggers: "android-cronet-x86-rel"
   triggers: "android-desktop-15-x64-fyi-rel"
   triggers: "android-desktop-arm64-archive-rel"
-  triggers: "android-desktop-arm64-binary-size-generator"
   triggers: "android-desktop-arm64-compile-dbg"
   triggers: "android-desktop-arm64-compile-rel"
   triggers: "android-desktop-arm64-deterministic-dbg"
   triggers: "android-desktop-arm64-deterministic-rel"
   triggers: "android-desktop-arm64-official"
   triggers: "android-desktop-x64-archive-rel"
-  triggers: "android-desktop-x64-binary-size-generator"
   triggers: "android-desktop-x64-compile-dbg"
   triggers: "android-desktop-x64-compile-rel"
   triggers: "android-desktop-x64-deterministic-dbg"
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index 7893395..06299837 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -554,6 +554,7 @@
     principals: "project:chromium-m138"
     principals: "project:chromium-m139"
     principals: "project:chromium-m140"
+    principals: "project:chromium-m141"
     principals: "project:dawn"
     principals: "user:chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
     principals: "user:findit-for-me@appspot.gserviceaccount.com"
@@ -609,6 +610,7 @@
     principals: "project:chromium-m138"
     principals: "project:chromium-m139"
     principals: "project:chromium-m140"
+    principals: "project:chromium-m141"
     principals: "project:dawn"
     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/lib/xcode.star b/infra/config/lib/xcode.star
index db0a3f87..d9d3b0d 100644
--- a/infra/config/lib/xcode.star
+++ b/infra/config/lib/xcode.star
@@ -26,7 +26,7 @@
     # Xcode 16 beta version used on beta bots.
     x16betabots = _xcode.for_ios("16f6"),
     # Xcode 26 beta version used on beta bots.
-    x26betabots = _xcode.for_ios("17a5305f"),
+    x26betabots = _xcode.for_ios("17a5305k"),
     # in use by ios-webkit-tot
     x14wk = _xcode.for_ios("14c18wk"),
 )
diff --git a/infra/config/milestones.json b/infra/config/milestones.json
index f082598c..64cdc8fe 100644
--- a/infra/config/milestones.json
+++ b/infra/config/milestones.json
@@ -18,5 +18,10 @@
         "name": "m140",
         "project": "chromium-m140",
         "ref": "refs/branch-heads/7339"
+    },
+    "141": {
+        "name": "m141",
+        "project": "chromium-m141",
+        "ref": "refs/branch-heads/7390"
     }
 }
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.desktop.star b/infra/config/subprojects/chromium/ci/chromium.android.desktop.star
index da050c75..8607b53 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.desktop.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.desktop.star
@@ -430,67 +430,3 @@
     execution_timeout = 6 * time.hour,
     siso_remote_jobs = siso.remote_jobs.DEFAULT,
 )
-
-ci.builder(
-    name = "android-desktop-arm64-binary-size-generator",
-    branch_selector = branches.selector.MAIN,
-    description_html = "Generates binary size data for android-desktop on arm64.",
-    executable = "recipe:binary_size_generator_tot",
-    gn_args = gn_args.config(
-        configs = [
-            "android_desktop",
-            "android_builder",
-            "arm64",
-            "chrome_with_codecs",
-            "remoteexec",
-            "minimal_symbols",
-            "official_optimize",
-            "stable_channel",
-            "v8_release_branch",
-        ],
-    ),
-    builderless = False,
-    cores = 32,
-    ssd = True,
-    # TODO(crbug.com/420639761): Enable gardening and tree closing when stable.
-    gardener_rotations = args.ignore_default(None),
-    tree_closing = False,
-    console_view_entry = consoles.console_view_entry(
-        category = "builder|size",
-        short_name = "arm64",
-    ),
-    contact_team_email = "clank-engprod@google.com",
-    siso_remote_jobs = siso.remote_jobs.DEFAULT,
-)
-
-ci.builder(
-    name = "android-desktop-x64-binary-size-generator",
-    branch_selector = branches.selector.MAIN,
-    description_html = "Generates binary size data for android-desktop on x64.",
-    executable = "recipe:binary_size_generator_tot",
-    gn_args = gn_args.config(
-        configs = [
-            "android_desktop",
-            "android_builder",
-            "x64",
-            "chrome_with_codecs",
-            "remoteexec",
-            "minimal_symbols",
-            "official_optimize",
-            "stable_channel",
-            "v8_release_branch",
-        ],
-    ),
-    builderless = False,
-    cores = 32,
-    ssd = True,
-    # TODO(crbug.com/420639761): Enable gardening and tree closing when stable.
-    gardener_rotations = args.ignore_default(None),
-    tree_closing = False,
-    console_view_entry = consoles.console_view_entry(
-        category = "builder|size",
-        short_name = "x64",
-    ),
-    contact_team_email = "clank-engprod@google.com",
-    siso_remote_jobs = siso.remote_jobs.DEFAULT,
-)
diff --git a/infra/config/subprojects/chromium/ci/chromium.mac.star b/infra/config/subprojects/chromium/ci/chromium.mac.star
index 3165fdd..9098b58 100644
--- a/infra/config/subprojects/chromium/ci/chromium.mac.star
+++ b/infra/config/subprojects/chromium/ci/chromium.mac.star
@@ -1138,6 +1138,8 @@
             "ios/chrome/test:all_fuzzer_tests",
         ],
     ),
+    builderless = True,
+    cpu = cpu.ARM64,
     tree_closing = False,
     console_view_entry = [
         consoles.console_view_entry(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star
index e1e5fd95..32642c7 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.desktop.star
@@ -202,61 +202,3 @@
         ],
     ),
 )
-
-try_.builder(
-    name = "android-desktop-arm64-binary-size",
-    # TODO(crbug.com/439887309): Enable on ANDROID_BRANCHES
-    #branch_selector = branches.selector.ANDROID_BRANCHES,
-    description_html = "Measures binary size of android-desktop on arm64.",
-    executable = "recipe:binary_size_trybot",
-    gn_args = "ci/android-desktop-arm64-binary-size-generator",
-    cores = 32,
-    ssd = True,
-    contact_team_email = "clank-engprod@google.com",
-    main_list_view = "try",
-    properties = {
-        "$build/binary_size": {
-            "analyze_targets": [
-                "//chrome/android:trichrome_64_minimal_apks",
-                "//chrome/android:trichrome_library_64_apk",
-                "//chrome/android:validate_expectations",
-                "//tools/binary_size:binary_size_trybot_py",
-            ],
-            "compile_targets": [
-                "check_chrome_static_initializers",
-                "monochrome_64_32_apk",
-                "validate_expectations",
-            ],
-        },
-    },
-    siso_remote_linking = False,
-)
-
-try_.builder(
-    name = "android-desktop-x64-binary-size",
-    # TODO(crbug.com/439887309): Enable on ANDROID_BRANCHES
-    #branch_selector = branches.selector.ANDROID_BRANCHES,
-    description_html = "Measures binary size of android-desktop on x64.",
-    executable = "recipe:binary_size_trybot",
-    gn_args = "ci/android-desktop-x64-binary-size-generator",
-    cores = 32,
-    ssd = True,
-    contact_team_email = "clank-engprod@google.com",
-    main_list_view = "try",
-    properties = {
-        "$build/binary_size": {
-            "analyze_targets": [
-                "//chrome/android:trichrome_64_minimal_apks",
-                "//chrome/android:trichrome_library_64_apk",
-                "//chrome/android:validate_expectations",
-                "//tools/binary_size:binary_size_trybot_py",
-            ],
-            "compile_targets": [
-                "check_chrome_static_initializers",
-                "monochrome_64_32_apk",
-                "validate_expectations",
-            ],
-        },
-    },
-    siso_remote_linking = False,
-)
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 6da2e93a..a6b2ad5 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -565,7 +565,7 @@
         ],
     ),
     builderless = not settings.is_main,
-    cores = 32,
+    cores = "16|32",
     ssd = True,
     main_list_view = "try",
     properties = {
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index e5549f8c..95d2d6bb 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -573,6 +573,8 @@
         "ci/ios-catalyst",
     ],
     gn_args = "ci/ios-catalyst",
+    builderless = True,
+    cpu = cpu.ARM64,
     siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ,
 )
 
@@ -625,7 +627,7 @@
         "chromium.add_one_test_shard": 10,
     },
     main_list_view = "try",
-    tryjob = try_.job(),
+    #tryjob = try_.job(),
     use_clang_coverage = True,
     xcode = xcode.xcode_default,
 )
diff --git a/infra/config/targets/bundles.star b/infra/config/targets/bundles.star
index 0b104dc7..93836f2e 100644
--- a/infra/config/targets/bundles.star
+++ b/infra/config/targets/bundles.star
@@ -5546,13 +5546,21 @@
             targets = "ios_eg2_cq_tests",
             mixins = [
                 "xcodebuild_sim_runner",
+                "mac_15_vm_optional",
             ],
             variants = [
-                "SIM_IPAD_PRO_6TH_GEN_17_5",
                 "SIM_IPAD_PRO_7TH_GEN_18_2",
-                "SIM_IPAD_PRO_7TH_GEN_26_0",
                 "SIM_IPHONE_14_17_5",
                 "SIM_IPHONE_15_18_2",
+            ],
+        ),
+        targets.bundle(
+            targets = "ios_eg2_cq_tests",
+            mixins = [
+                "xcodebuild_sim_runner",
+            ],
+            variants = [
+                "SIM_IPAD_PRO_7TH_GEN_26_0",
                 "SIM_IPHONE_16_26_0",
             ],
         ),
@@ -5560,11 +5568,18 @@
             targets = "ios_eg2_tests",
             mixins = [
                 "xcodebuild_sim_runner",
+                "mac_15_vm_optional",
+            ],
+            variants = [
+                "SIM_IPHONE_15_18_2",
+            ],
+        ),
+        targets.bundle(
+            targets = "ios_eg2_tests",
+            mixins = [
+                "xcodebuild_sim_runner",
             ],
             variants = [
-                "SIM_IPAD_PRO_7TH_GEN_18_2",
-                "SIM_IPAD_PRO_7TH_GEN_26_0",
-                "SIM_IPHONE_15_18_2",
                 "SIM_IPHONE_16_26_0",
             ],
         ),
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star
index ec4d9e9d..dd0df62 100644
--- a/infra/config/targets/mixins.star
+++ b/infra/config/targets/mixins.star
@@ -2702,12 +2702,12 @@
     generate_pyl_entry = False,
     args = [
         "--xcode-build-version",
-        "17a5305f",
+        "17a5305k",
     ],
     swarming = targets.swarming(
         named_caches = [
             swarming.cache(
-                name = "xcode_ios_17a5305f",
+                name = "xcode_ios_17a5305k",
                 path = "Xcode.app",
             ),
         ],
diff --git a/internal b/internal
index d9853f3..3ddd578 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit d9853f3ce8dce7ce84f0c2701cf93bfbed617347
+Subproject commit 3ddd5788bd026e3ed8a3f674c273a6030f54e656
diff --git a/ios/chrome/browser/bookmarks/model/bookmarks_utils.cc b/ios/chrome/browser/bookmarks/model/bookmarks_utils.cc
index fd50caba..c77675a6 100644
--- a/ios/chrome/browser/bookmarks/model/bookmarks_utils.cc
+++ b/ios/chrome/browser/bookmarks/model/bookmarks_utils.cc
@@ -15,16 +15,6 @@
 
 using bookmarks::BookmarkNode;
 
-namespace {
-
-void LogDefaultBookmarkFolderOutcome(
-    DefaultBookmarkFolderOutcomeForMetrics value) {
-  base::UmaHistogramEnumeration("IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-                                value);
-}
-
-}  // namespace
-
 const int64_t kLastUsedBookmarkFolderNone = -1;
 
 std::vector<const bookmarks::BookmarkNode*> PrimaryPermanentNodes(
@@ -83,30 +73,12 @@
   int64_t node_id =
       prefs->GetInt64(prefs::kIosBookmarkLastUsedFolderReceivingBookmarks);
 
-  if (node_id == kLastUsedBookmarkFolderNone) {
-    LogDefaultBookmarkFolderOutcome(
-        DefaultBookmarkFolderOutcomeForMetrics::kUnset);
-  } else {
-    BookmarkStorageType type =
-        static_cast<BookmarkStorageType>(prefs->GetInteger(
-            prefs::kIosBookmarkLastUsedStorageReceivingBookmarks));
-
+  if (node_id != kLastUsedBookmarkFolderNone) {
     const BookmarkNode* result =
         bookmarks::GetBookmarkNodeByID(bookmark_model, node_id);
+    // Make sure the bookmark node is a folder. See crbug.com/1450146.
     if (result && result->is_folder()) {
-      // Make sure the bookmark node is a folder. See crbug.com/1450146.
-      LogDefaultBookmarkFolderOutcome(
-          bookmark_model->IsLocalOnlyNode(*result)
-              ? DefaultBookmarkFolderOutcomeForMetrics::kExistingLocalFolderSet
-              : DefaultBookmarkFolderOutcomeForMetrics::
-                    kExistingAccountFolderSet);
       return result;
-    } else {
-      LogDefaultBookmarkFolderOutcome(
-          (type == BookmarkStorageType::kLocalOrSyncable)
-              ? DefaultBookmarkFolderOutcomeForMetrics::kMissingLocalFolderSet
-              : DefaultBookmarkFolderOutcomeForMetrics::
-                    kMissingAccountFolderSet);
     }
   }
 
diff --git a/ios/chrome/browser/bookmarks/model/bookmarks_utils.h b/ios/chrome/browser/bookmarks/model/bookmarks_utils.h
index fb247bf..79528b6a 100644
--- a/ios/chrome/browser/bookmarks/model/bookmarks_utils.h
+++ b/ios/chrome/browser/bookmarks/model/bookmarks_utils.h
@@ -19,19 +19,6 @@
 class BookmarkNode;
 }  // namespace bookmarks
 
-// Enum representing the internal behavior's outcome for
-// `GetDefaultBookmarkFolder()`, distinguishing the various cases depending on
-// the values in PrefService. These values are persisted to logs. Entries should
-// not be renumbered and numeric values should never be reused.
-enum class DefaultBookmarkFolderOutcomeForMetrics {
-  kUnset = 0,
-  kExistingLocalFolderSet = 1,
-  kExistingAccountFolderSet = 2,
-  kMissingLocalFolderSet = 3,
-  kMissingAccountFolderSet = 4,
-  kMaxValue = kMissingAccountFolderSet
-};
-
 // Used in the preference kIosBookmarkLastUsedFolderReceivingBookmarks.
 // It means that the user has not set a folder for bookmarks explicitly.
 extern const int64_t kLastUsedBookmarkFolderNone;
diff --git a/ios/chrome/browser/bookmarks/model/bookmarks_utils_unittest.mm b/ios/chrome/browser/bookmarks/model/bookmarks_utils_unittest.mm
index 5f63bef4f..3237f3e2 100644
--- a/ios/chrome/browser/bookmarks/model/bookmarks_utils_unittest.mm
+++ b/ios/chrome/browser/bookmarks/model/bookmarks_utils_unittest.mm
@@ -5,7 +5,6 @@
 #import "ios/chrome/browser/bookmarks/model/bookmarks_utils.h"
 
 #import "base/memory/raw_ptr.h"
-#import "base/test/metrics/histogram_tester.h"
 #import "components/bookmarks/browser/bookmark_model.h"
 #import "ios/chrome/browser/bookmarks/model/bookmark_ios_unit_test_support.h"
 #import "ios/chrome/browser/bookmarks/model/bookmark_storage_type.h"
@@ -46,7 +45,6 @@
   raw_ptr<const bookmarks::BookmarkNode> account_folder_node_ = nullptr;
   raw_ptr<const bookmarks::BookmarkNode> local_folder_node_ = nullptr;
   raw_ptr<const bookmarks::BookmarkNode> local_bookmark_node_ = nullptr;
-  base::HistogramTester histogram_tester_;
 };
 
 // Tests GetDefaultBookmarkFolder() when no default folder was set and account
@@ -57,9 +55,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, bookmark_model_->account_mobile_node());
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kUnset, 1);
 }
 
 // Tests GetDefaultBookmarkFolder() when no default folder was set and account
@@ -71,9 +66,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, bookmark_model_->mobile_node());
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kUnset, 1);
 }
 
 // Tests when an id of -1 (kLastUsedBookmarkFolderNone) is set as the default
@@ -83,9 +75,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, bookmark_model_->account_mobile_node());
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kUnset, 1);
 }
 
 // Tests when an unknown id is set as the default folder.
@@ -94,9 +83,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, bookmark_model_->account_mobile_node());
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kMissingLocalFolderSet, 1);
 }
 
 // Tests when the folder is set to a local bookmark.
@@ -106,9 +92,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, local_folder_node_);
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kExistingLocalFolderSet, 1);
 }
 
 // Tests when the folder is set to a local bookmark.
@@ -118,9 +101,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, account_folder_node_);
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kExistingAccountFolderSet, 1);
 }
 
 // Test when a bookmark node is set as the default folder.
@@ -130,9 +110,6 @@
   const bookmarks::BookmarkNode* default_folder_node =
       GetDefaultBookmarkFolderHelper();
   EXPECT_EQ(default_folder_node, bookmark_model_->account_mobile_node());
-  histogram_tester_.ExpectUniqueSample(
-      "IOS.Bookmarks.DefaultBookmarkFolderOutcome",
-      DefaultBookmarkFolderOutcomeForMetrics::kMissingLocalFolderSet, 1);
 }
 
 TEST_F(BookmarksUtilsTest, PrimaryPermanentNodes) {
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn
index d6e22fc..667c496 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/BUILD.gn
@@ -48,6 +48,7 @@
     "//ios/chrome/browser/bookmarks/model",
     "//ios/chrome/browser/commerce/model:shopping_service",
     "//ios/chrome/browser/commerce/model/push_notification",
+    "//ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator",
     "//ios/chrome/browser/content_suggestions/ui_bundled/cells",
     "//ios/chrome/browser/content_suggestions/ui_bundled/cells:most_visited_tiles",
     "//ios/chrome/browser/content_suggestions/ui_bundled/cells:shortcuts",
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/BUILD.gn
new file mode 100644
index 0000000..75cb5176
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("coordinator") {
+  sources = [
+    "app_bundle_promo_mediator.h",
+    "app_bundle_promo_mediator.mm",
+  ]
+
+  deps = [
+    "//base",
+    "//ios/chrome/browser/app_store_bundle/model",
+    "//ios/chrome/browser/content_suggestions/ui_bundled:public",
+    "//ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui",
+  ]
+
+  frameworks = [ "UIKit.framework" ]
+}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.h b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.h
new file mode 100644
index 0000000..60f6df9
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.h
@@ -0,0 +1,58 @@
+// Copyright 2025 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_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_COORDINATOR_APP_BUNDLE_PROMO_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_COORDINATOR_APP_BUNDLE_PROMO_MEDIATOR_H_
+
+#import <UIKit/UIKit.h>
+
+#import "base/ios/block_types.h"
+
+@protocol ContentSuggestionsViewControllerAudience;
+@class AppBundlePromoCommands;
+@class AppBundlePromoConfig;
+class AppStoreBundleService;
+
+// Handles App Bundle promo module events.
+@protocol AppBundlePromoMediatorDelegate
+
+// Indicates to the receiver that the App Bundle promo module should be removed.
+// The `completion` is called after the removal is finished.
+- (void)removeAppBundlePromoModuleWithCompletion:(ProceduralBlock)completion;
+
+@end
+
+// Mediator for managing the state of the App Bundle Promo (Magic Stack) module.
+@interface AppBundlePromoMediator : NSObject
+
+// Used by the App Bundle promo module for the module config.
+@property(nonatomic, strong) AppBundlePromoConfig* config;
+
+// Delegate.
+@property(nonatomic, weak) id<AppBundlePromoMediatorDelegate> delegate;
+
+// Audience for presentation actions.
+@property(nonatomic, weak) id<ContentSuggestionsViewControllerAudience>
+    presentationAudience;
+
+- (instancetype)initWithAppStoreBundleService:
+    (AppStoreBundleService*)appStoreBundleService;
+
+// Disconnects this mediator.
+- (void)disconnect;
+
+// Removes the module from the Magic Stack on the current homepage without
+// disabling the underlying feature. This prevents the module from being shown
+// on the current homepage but does not affect its functionality elsewhere.
+// The `completion` is called after the removal is finished.
+- (void)removeModuleWithCompletion:(ProceduralBlock)completion;
+
+// Presents the Best of Google bundle page in an App Store modal window using
+// `baseViewController`. Runs `completion` when the sheet is dismissed.
+- (void)presentAppStoreBundlePage:(UIViewController*)baseViewController
+                   withCompletion:(ProceduralBlock)completion;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_COORDINATOR_APP_BUNDLE_PROMO_MEDIATOR_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.mm
new file mode 100644
index 0000000..19a7200d
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.mm
@@ -0,0 +1,52 @@
+// Copyright 2025 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/content_suggestions/ui_bundled/app_bundle_promo/coordinator/app_bundle_promo_mediator.h"
+
+#import "base/check.h"
+#import "base/memory/raw_ptr.h"
+#import "ios/chrome/browser/app_store_bundle/model/app_store_bundle_service.h"
+#import "ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_audience.h"
+#import "ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.h"
+#import "ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_view_controller_audience.h"
+
+@interface AppBundlePromoMediator () <AppBundlePromoAudience>
+
+@end
+
+@implementation AppBundlePromoMediator {
+  raw_ptr<AppStoreBundleService> _appStoreBundleService;
+}
+
+- (instancetype)initWithAppStoreBundleService:
+    (AppStoreBundleService*)appStoreBundleService {
+  CHECK(appStoreBundleService);
+  if ((self = [super init])) {
+    _appStoreBundleService = appStoreBundleService;
+    self.config = [[AppBundlePromoConfig alloc] init];
+    self.config.audience = self;
+  }
+  return self;
+}
+
+- (void)disconnect {
+  self.config = nil;
+}
+
+- (void)removeModuleWithCompletion:(ProceduralBlock)completion {
+  [self.delegate removeAppBundlePromoModuleWithCompletion:completion];
+}
+
+- (void)didSelectAppBundlePromo {
+  [self.presentationAudience didSelectAppBundlePromo];
+}
+
+- (void)presentAppStoreBundlePage:(UIViewController*)baseViewController
+                   withCompletion:(ProceduralBlock)completion {
+  CHECK(_appStoreBundleService);
+  _appStoreBundleService->PresentAppStoreBundlePromo(baseViewController,
+                                                     completion);
+}
+
+@end
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/BUILD.gn
new file mode 100644
index 0000000..6079b22
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/BUILD.gn
@@ -0,0 +1,29 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("ui") {
+  sources = [
+    "app_bundle_promo_audience.h",
+    "app_bundle_promo_config.h",
+    "app_bundle_promo_config.mm",
+    "app_bundle_promo_view.h",
+    "app_bundle_promo_view.mm",
+  ]
+
+  deps = [
+    "//ios/chrome/app/strings",
+    "//ios/chrome/browser/content_suggestions/ui_bundled:constants",
+    "//ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources",
+    "//ios/chrome/browser/content_suggestions/ui_bundled/cells",
+    "//ios/chrome/browser/content_suggestions/ui_bundled/magic_stack:constants",
+    "//ios/chrome/browser/content_suggestions/ui_bundled/magic_stack:public",
+    "//ios/chrome/browser/shared/ui/symbols",
+    "//ios/chrome/browser/shared/ui/util",
+    "//ios/chrome/common/ui/colors",
+    "//ios/chrome/common/ui/util",
+    "//ui/base",
+  ]
+
+  frameworks = [ "UIKit.framework" ]
+}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_audience.h b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_audience.h
new file mode 100644
index 0000000..85d116d
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_audience.h
@@ -0,0 +1,16 @@
+// Copyright 2025 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_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_AUDIENCE_H_
+#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_AUDIENCE_H_
+
+// Interface to handle App Bundle promo card user events.
+@protocol AppBundlePromoAudience
+
+// Called when the promo is selected by the user.
+- (void)didSelectAppBundlePromo;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_AUDIENCE_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.h b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.h
new file mode 100644
index 0000000..62c02bf
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.h
@@ -0,0 +1,20 @@
+// Copyright 2025 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_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_CONFIG_H_
+#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_CONFIG_H_
+
+#import "ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module.h"
+
+@protocol AppBundlePromoAudience;
+
+// Config object for the App Bundle promo module.
+@interface AppBundlePromoConfig : MagicStackModule
+
+// The object that should handle user events.
+@property(nonatomic, weak) id<AppBundlePromoAudience> audience;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_CONFIG_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.mm b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.mm
new file mode 100644
index 0000000..4db97b3e
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.mm
@@ -0,0 +1,17 @@
+// Copyright 2025 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/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.h"
+
+#import "ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_constants.h"
+
+@implementation AppBundlePromoConfig
+
+#pragma mark - MagicStackModule
+
+- (ContentSuggestionsModuleType)type {
+  return ContentSuggestionsModuleType::kAppBundlePromo;
+}
+
+@end
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.h b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.h
new file mode 100644
index 0000000..e811230
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.h
@@ -0,0 +1,24 @@
+// Copyright 2025 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_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_VIEW_H_
+#define IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_VIEW_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_audience.h"
+
+@class AppBundlePromoConfig;
+
+@interface AppBundlePromoView : UIView
+
+// Default initializer.
+- (instancetype)initWithConfig:(AppBundlePromoConfig*)config;
+
+// The object that should handle user events.
+@property(nonatomic, weak) id<AppBundlePromoAudience> audience;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_APP_BUNDLE_PROMO_UI_APP_BUNDLE_PROMO_VIEW_H_
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.mm
new file mode 100644
index 0000000..ae648c2d
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.mm
@@ -0,0 +1,176 @@
+// Copyright 2025 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/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_view.h"
+
+#import "ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/app_bundle_promo_config.h"
+#import "ios/chrome/browser/content_suggestions/ui_bundled/cells/icon_view.h"
+#import "ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_constants.h"
+#import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
+#import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/constraints_ui_util.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/device_form_factor.h"
+#import "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+// `AppBundlePromoView` accessibility ID.
+NSString* const kAppBundlePromoViewID = @"kAppBundlePromoViewID";
+
+// The spacing between the title and description.
+constexpr CGFloat kTitleDescriptionSpacing = 2;
+
+// The spacing between elements within the item.
+constexpr CGFloat kContentStackSpacing = 14;
+
+// Constants related to the icon container view.
+constexpr CGFloat kIconSize = 40;
+constexpr CGFloat kIconContainerSize = 56;
+constexpr CGFloat kIconContainerCornerRadius = 12;
+
+}  // namespace
+
+@implementation AppBundlePromoView {
+  // UI tap gesture recognizer.
+  UITapGestureRecognizer* _tapGestureRecognizer;
+  AppBundlePromoConfig* _config;
+}
+
+- (instancetype)initWithConfig:(AppBundlePromoConfig*)config {
+  if ((self = [super init])) {
+    _config = config;
+  }
+  return self;
+}
+
+#pragma mark - UIView
+
+- (void)willMoveToSuperview:(UIView*)newSuperview {
+  [super willMoveToSuperview:newSuperview];
+  [self createSubviews];
+}
+
+#pragma mark - Private
+
+- (void)createSubviews {
+  if (!(self.subviews.count == 0)) {
+    return;
+  }
+
+  NSString* title =
+      l10n_util::GetNSString(IDS_IOS_MAGIC_STACK_APP_BUNDLE_PROMO_CARD_TITLE);
+  NSString* description =
+      (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET)
+          ? l10n_util::GetNSString(
+                IDS_IOS_MAGIC_STACK_APP_BUNDLE_PROMO_CARD_IPAD_DESCRIPTION)
+          : l10n_util::GetNSString(
+                IDS_IOS_MAGIC_STACK_APP_BUNDLE_PROMO_CARD_IPHONE_DESCRIPTION);
+
+  self.translatesAutoresizingMaskIntoConstraints = NO;
+  self.accessibilityIdentifier = kAppBundlePromoViewID;
+  self.isAccessibilityElement = YES;
+  self.accessibilityTraits = UIAccessibilityTraitButton;
+  self.accessibilityLabel =
+      [NSString stringWithFormat:@"%@, %@", title, description];
+
+  NSMutableArray* arrangedSubviews = [[NSMutableArray alloc] init];
+
+  UIView* imageContainerView = [self imageInContainer];
+  [arrangedSubviews addObject:imageContainerView];
+
+  UILabel* titleLabel = [self createTitleLabel:title];
+  [titleLabel
+      setContentCompressionResistancePriority:UILayoutPriorityDefaultHigh
+                                      forAxis:UILayoutConstraintAxisVertical];
+  UILabel* descriptionLabel = [self createDescriptionLabel:description];
+  [descriptionLabel
+      setContentCompressionResistancePriority:UILayoutPriorityDefaultLow
+                                      forAxis:UILayoutConstraintAxisVertical];
+
+  UIStackView* textStack = [[UIStackView alloc]
+      initWithArrangedSubviews:@[ titleLabel, descriptionLabel ]];
+  textStack.axis = UILayoutConstraintAxisVertical;
+  textStack.translatesAutoresizingMaskIntoConstraints = NO;
+  textStack.spacing = kTitleDescriptionSpacing;
+  [textStack setContentHuggingPriority:UILayoutPriorityDefaultLow
+                               forAxis:UILayoutConstraintAxisHorizontal];
+
+  [arrangedSubviews addObject:textStack];
+
+  UIStackView* contentStack =
+      [[UIStackView alloc] initWithArrangedSubviews:arrangedSubviews];
+  contentStack.translatesAutoresizingMaskIntoConstraints = NO;
+  contentStack.axis = UILayoutConstraintAxisHorizontal;
+  contentStack.alignment = UIStackViewAlignmentCenter;
+  contentStack.spacing = kContentStackSpacing;
+
+  [self addSubview:contentStack];
+  AddSameConstraints(contentStack, self);
+
+  _tapGestureRecognizer =
+      [[UITapGestureRecognizer alloc] initWithTarget:self
+                                              action:@selector(handleTap:)];
+  [self addGestureRecognizer:_tapGestureRecognizer];
+}
+
+- (void)handleTap:(UITapGestureRecognizer*)sender {
+  if (sender.state == UIGestureRecognizerStateEnded) {
+    [self.audience didSelectAppBundlePromo];
+  }
+}
+
+- (UIView*)imageInContainer {
+  UIView* iconContainer = [[UIView alloc] init];
+
+  iconContainer.backgroundColor = [UIColor colorNamed:kGrey100Color];
+  iconContainer.layer.cornerRadius = kIconContainerCornerRadius;
+
+  UIImageView* imageView =
+      [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"app_bundle"]];
+  imageView.contentMode = UIViewContentModeScaleAspectFit;
+  imageView.translatesAutoresizingMaskIntoConstraints = NO;
+  [NSLayoutConstraint activateConstraints:@[
+    [imageView.heightAnchor constraintEqualToConstant:kIconSize],
+    [imageView.widthAnchor constraintEqualToConstant:kIconSize],
+  ]];
+  [iconContainer addSubview:imageView];
+  AddSameCenterConstraints(imageView, iconContainer);
+
+  [NSLayoutConstraint activateConstraints:@[
+    [iconContainer.widthAnchor constraintEqualToConstant:kIconContainerSize],
+    [iconContainer.widthAnchor
+        constraintEqualToAnchor:iconContainer.heightAnchor],
+  ]];
+
+  return iconContainer;
+}
+
+- (UILabel*)createTitleLabel:(NSString*)title {
+  UILabel* label = [[UILabel alloc] init];
+  label.text = title;
+  label.translatesAutoresizingMaskIntoConstraints = NO;
+  label.numberOfLines = 0;
+  label.lineBreakMode = NSLineBreakByWordWrapping;
+  label.font =
+      PreferredFontForTextStyle(UIFontTextStyleFootnote, UIFontWeightSemibold,
+                                kMaxTextSizeForStyleFootnote);
+  label.adjustsFontForContentSizeCategory = YES;
+  label.textColor = [UIColor colorNamed:kTextPrimaryColor];
+  return label;
+}
+
+- (UILabel*)createDescriptionLabel:(NSString*)description {
+  UILabel* label = [[UILabel alloc] init];
+  label.text = description;
+  label.numberOfLines = 2;
+  label.lineBreakMode = NSLineBreakByTruncatingTail;
+  label.font = PreferredFontForTextStyle(UIFontTextStyleFootnote, std::nullopt,
+                                         kMaxTextSizeForStyleFootnote);
+  label.adjustsFontForContentSizeCategory = YES;
+  label.textColor = [UIColor colorNamed:kTextSecondaryColor];
+  return label;
+}
+
+@end
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/Contents.json b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/Contents.json b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/Contents.json
new file mode 100644
index 0000000..e228655
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "app_bundle@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "app_bundle@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/app_bundle@2x.png b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/app_bundle@2x.png
new file mode 100644
index 0000000..21de1cc
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/app_bundle@2x.png
Binary files differ
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/app_bundle@3x.png b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/app_bundle@3x.png
new file mode 100644
index 0000000..f389980c
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/Assets.xcassets/app_bundle.imageset/app_bundle@3x.png
Binary files differ
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/BUILD.gn b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/BUILD.gn
new file mode 100644
index 0000000..7ddf586
--- /dev/null
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/app_bundle_promo/ui/resources/BUILD.gn
@@ -0,0 +1,15 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/ios/rules.gni")
+
+bundle_data_xcassets("resources") {
+  catalog = "Assets.xcassets"
+  sources = [
+    "Assets.xcassets/Contents.json",
+    "Assets.xcassets/app_bundle.imageset/Contents.json",
+    "Assets.xcassets/app_bundle.imageset/app_bundle@2x.png",
+    "Assets.xcassets/app_bundle.imageset/app_bundle@3x.png",
+  ]
+}
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm
index 1edee03..4ca97d2a6 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_coordinator.mm
@@ -641,6 +641,16 @@
   [_tipsMediator removeModuleWithCompletion:completion];
 }
 
+- (void)didSelectAppBundlePromo {
+  // Note: The promo modal only works when the `kAppBundlePromoEphemeralCard`
+  // feature is enabled. If this card is forced in the
+  // #ios-segmentation-ephemeral-card-ranker, tapping the card does NOT do
+  // anything. This is because the creation of the AppStorePromoService is gated
+  // behind the feature flag.
+  // TODO(crbug.com/441731330): Link user interaction handling and implement
+  // once App Bundle promo module is integrated with Magic Stack ranking.
+}
+
 - (void)openTipDestination:(segmentation_platform::TipIdentifier)tip {
   CHECK(IsTipsMagicStackEnabled());
   CHECK(_tipsMediator);
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.h b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.h
index 757feea..3a8e8ed 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.h
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.h
@@ -55,6 +55,7 @@
 extern const char kMagicStackModuleEngagementShopCardIndexHistogram[];
 extern const char kMagicStackModuleEngagementSendTabPromoIndexHistogram[];
 extern const char kMagicStackModuleEngagementTipsIndexHistogram[];
+extern const char kMagicStackModuleEngagementAppBundlePromoIndexHistogram[];
 extern const char kMagicStackModuleDisabledHistogram[];
 extern const char kContentNotificationSnackbarEventHistogram[];
 extern const char kIOSSafetyCheckMagicStackHiddenReason[];
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.mm b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.mm
index 88249f5..0777455 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_constants.mm
@@ -64,6 +64,8 @@
     "IOS.MagicStack.Module.Click.SendTabPromo";
 const char kMagicStackModuleEngagementTipsIndexHistogram[] =
     "IOS.MagicStack.Module.Click.Tips";
+const char kMagicStackModuleEngagementAppBundlePromoIndexHistogram[] =
+    "IOS.MagicStack.Module.Click.AppBundlePromo";
 const char kMagicStackModuleDisabledHistogram[] =
     "IOS.MagicStack.Module.Disabled";
 const char kContentNotificationSnackbarEventHistogram[] =
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_recorder.mm b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_recorder.mm
index 2793a242..d4b9d01 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_recorder.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_metrics_recorder.mm
@@ -105,8 +105,10 @@
           kMaxModuleEngagementIndex);
       break;
     case ContentSuggestionsModuleType::kAppBundlePromo:
-      // TODO(crbug.com/441721282): Add metrics collection for the app bundle
-      // promo.
+      UMA_HISTOGRAM_EXACT_LINEAR(
+          kMagicStackModuleEngagementAppBundlePromoIndexHistogram, index,
+          kMaxModuleEngagementIndex);
+      break;
     case ContentSuggestionsModuleType::kPlaceholder:
     case ContentSuggestionsModuleType::kInvalid:
       break;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_view_controller_audience.h b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_view_controller_audience.h
index e61e461..ef01b38 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_view_controller_audience.h
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/content_suggestions_view_controller_audience.h
@@ -30,6 +30,9 @@
 // Indicates that the user has tapped the given `tip`.
 - (void)didSelectTip:(segmentation_platform::TipIdentifier)tip;
 
+// Indicates that the user has tapped the App Bundle promo.
+- (void)didSelectAppBundlePromo;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_CONTENT_SUGGESTIONS_UI_BUNDLED_CONTENT_SUGGESTIONS_VIEW_CONTROLLER_AUDIENCE_H_
diff --git a/ios/chrome/browser/flags/BUILD.gn b/ios/chrome/browser/flags/BUILD.gn
index c77d467..48da4ac 100644
--- a/ios/chrome/browser/flags/BUILD.gn
+++ b/ios/chrome/browser/flags/BUILD.gn
@@ -60,9 +60,11 @@
     "//components/sharing_message",
     "//components/signin/core/browser",
     "//components/signin/ios/browser",
+    "//components/strike_database:features",
     "//components/strings:components_strings",
     "//components/supervised_user/core/common:features",
     "//components/sync/service",
+    "//components/sync_preferences:features",
     "//components/translate/core/browser",
     "//components/translate/core/common",
     "//components/unified_consent",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 867be80..6e5e99e 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -79,11 +79,13 @@
 #import "components/signin/core/browser/account_reconcilor.h"
 #import "components/signin/ios/browser/features.h"
 #import "components/signin/public/base/signin_switches.h"
+#import "components/strike_database/strike_database_features.h"
 #import "components/strings/grit/components_strings.h"
 #import "components/supervised_user/core/common/features.h"
 #import "components/sync/base/command_line_switches.h"
 #import "components/sync/base/features.h"
 #import "components/sync/base/pref_names.h"
+#import "components/sync_preferences/features.h"
 #import "components/translate/core/browser/translate_prefs.h"
 #import "components/translate/core/common/translate_util.h"
 #import "components/variations/net/variations_command_line.h"
@@ -2728,7 +2730,7 @@
      flag_descriptions::kDisableAutofillStrikeSystemName,
      flag_descriptions::kDisableAutofillStrikeSystemDescription,
      flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(autofill::features::kDisableAutofillStrikeSystem)},
+     FEATURE_VALUE_TYPE(strike_database::features::kDisableStrikeSystem)},
     {"ios-default-browser-promo-propensity-model",
      flag_descriptions::kDefaultBrowserPromoPropensityModelName,
      flag_descriptions::kDefaultBrowserPromoPropensityModelDescription,
@@ -2922,6 +2924,12 @@
      flag_descriptions::kAutofillBottomSheetNewBlurName,
      flag_descriptions::kAutofillBottomSheetNewBlurDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kAutofillBottomSheetNewBlur)},
+    {"enable-cross-device-pref-tracker",
+     flag_descriptions::kEnableCrossDevicePrefTrackerName,
+     flag_descriptions::kEnableCrossDevicePrefTrackerDescription,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(
+         sync_preferences::features::kEnableCrossDevicePrefTracker)},
 };
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 77e7cab..fc4d24c 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -574,6 +574,12 @@
     "Enable the compromised password alert mutings in Password Manager to be "
     "respected in the app.";
 
+const char kEnableCrossDevicePrefTrackerName[] =
+    "Enable Cross-Device Pref Tracker";
+const char kEnableCrossDevicePrefTrackerDescription[] =
+    "Enables the tracking and sharing of select non-syncing preference values "
+    "across a user's signed-in devices.";
+
 const char kEnableDiscoverFeedDiscoFeedEndpointName[] =
     "Enable discover feed discofeed";
 const char kEnableDiscoverFeedDiscoFeedEndpointDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index ac35558..4306546e 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -302,6 +302,9 @@
 extern const char kEnableCompromisedPasswordsMutingName[];
 extern const char kEnableCompromisedPasswordsMutingDescription[];
 
+extern const char kEnableCrossDevicePrefTrackerName[];
+extern const char kEnableCrossDevicePrefTrackerDescription[];
+
 extern const char kEnableFeedHeaderSettingsName[];
 extern const char kEnableFeedHeaderSettingsDescription[];
 
diff --git a/ios/chrome/browser/ntp/search_engine_logo/mediator/search_engine_logo_mediator.mm b/ios/chrome/browser/ntp/search_engine_logo/mediator/search_engine_logo_mediator.mm
index 1970dd7..abc508a 100644
--- a/ios/chrome/browser/ntp/search_engine_logo/mediator/search_engine_logo_mediator.mm
+++ b/ios/chrome/browser/ntp/search_engine_logo/mediator/search_engine_logo_mediator.mm
@@ -389,6 +389,10 @@
 - (void)logoDownloaded:(const search_provider_logos::Logo*)logo
         callbackReason:
             (search_provider_logos::LogoCallbackReason)callbackReason {
+  if (!_logoService) {
+    // The mediator was disconnected.
+    return;
+  }
   switch (callbackReason) {
     case search_provider_logos::LogoCallbackReason::DETERMINED:
       [self updateLogo:logo animate:YES];
diff --git a/ios/chrome/browser/profile/model/BUILD.gn b/ios/chrome/browser/profile/model/BUILD.gn
index b152463..bae9fe0f 100644
--- a/ios/chrome/browser/profile/model/BUILD.gn
+++ b/ios/chrome/browser/profile/model/BUILD.gn
@@ -209,6 +209,7 @@
     "//ios/chrome/browser/promos_manager/model:factory",
     "//ios/chrome/browser/push_notification/model:profile_service_factory",
     "//ios/chrome/browser/reading_list/model",
+    "//ios/chrome/browser/regional_capabilities/model",
     "//ios/chrome/browser/safe_browsing/model",
     "//ios/chrome/browser/safe_browsing/model/tailored_security",
     "//ios/chrome/browser/safety_check/model:factory",
@@ -216,6 +217,7 @@
     "//ios/chrome/browser/saved_tab_groups/model:tab_group_service",
     "//ios/chrome/browser/screen_time/model:buildflags",
     "//ios/chrome/browser/script_blocking/model:factory",
+    "//ios/chrome/browser/search_engine_choice/model",
     "//ios/chrome/browser/search_engines/model",
     "//ios/chrome/browser/segmentation_platform/model",
     "//ios/chrome/browser/sessions/model",
@@ -236,6 +238,7 @@
     "//ios/chrome/browser/sync/model:data_type_store_service_factory",
     "//ios/chrome/browser/sync/model:device_info_sync_service_factory",
     "//ios/chrome/browser/sync/model:sync_invalidations_service_factory",
+    "//ios/chrome/browser/sync/model/prefs:cross_device_pref_tracker_factory",
     "//ios/chrome/browser/tab_switcher/model/inactive_tabs:model",
     "//ios/chrome/browser/tabs_search/model:model_factory",
     "//ios/chrome/browser/text_selection/model",
diff --git a/ios/chrome/browser/profile/model/DEPS b/ios/chrome/browser/profile/model/DEPS
index effa1ff..d86143f 100644
--- a/ios/chrome/browser/profile/model/DEPS
+++ b/ios/chrome/browser/profile/model/DEPS
@@ -69,11 +69,13 @@
     "+ios/chrome/browser/promos_manager/model",
     "+ios/chrome/browser/push_notification/model",
     "+ios/chrome/browser/reading_list/model",
+    "+ios/chrome/browser/regional_capabilities/model",
     "+ios/chrome/browser/safe_browsing/model",
     "+ios/chrome/browser/safety_check/model",
     "+ios/chrome/browser/saved_tab_groups/model",
     "+ios/chrome/browser/screen_time/model",
     "+ios/chrome/browser/script_blocking/model",
+    "+ios/chrome/browser/search_engine_choice/model",
     "+ios/chrome/browser/search_engines/model",
     "+ios/chrome/browser/segmentation_platform/model",
     "+ios/chrome/browser/sessions/model",
@@ -81,6 +83,7 @@
     "+ios/chrome/browser/share_kit/model",
     "+ios/chrome/browser/sharing_message/model",
     "+ios/chrome/browser/sync/model",
+    "+ios/chrome/browser/sync/model/prefs",
     "+ios/chrome/browser/tab_switcher/model",
     "+ios/chrome/browser/tabs_search/model",
     "+ios/chrome/browser/text_selection/model",
diff --git a/ios/chrome/browser/profile/model/keyed_service_factories.mm b/ios/chrome/browser/profile/model/keyed_service_factories.mm
index 3a039ddb..f4243d2 100644
--- a/ios/chrome/browser/profile/model/keyed_service_factories.mm
+++ b/ios/chrome/browser/profile/model/keyed_service_factories.mm
@@ -120,6 +120,7 @@
 #import "ios/chrome/browser/push_notification/model/push_notification_profile_service_factory.h"
 #import "ios/chrome/browser/reading_list/model/reading_list_download_service_factory.h"
 #import "ios/chrome/browser/reading_list/model/reading_list_model_factory.h"
+#import "ios/chrome/browser/regional_capabilities/model/regional_capabilities_service_factory.h"
 #import "ios/chrome/browser/safe_browsing/model/chrome_enterprise_url_lookup_service_factory.h"
 #import "ios/chrome/browser/safe_browsing/model/chrome_password_protection_service_factory.h"
 #import "ios/chrome/browser/safe_browsing/model/hash_realtime_service_factory.h"
@@ -135,6 +136,7 @@
 #import "ios/chrome/browser/saved_tab_groups/model/tab_group_sync_service_factory.h"
 #import "ios/chrome/browser/screen_time/model/screen_time_buildflags.h"
 #import "ios/chrome/browser/script_blocking/model/script_blocking_rule_applier_service_factory.h"
+#import "ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.h"
 #import "ios/chrome/browser/search_engines/model/search_engine_choice_service_factory.h"
 #import "ios/chrome/browser/search_engines/model/template_url_fetcher_factory.h"
 #import "ios/chrome/browser/search_engines/model/template_url_prepopulate_data_resolver_factory.h"
@@ -169,6 +171,7 @@
 #import "ios/chrome/browser/sync/model/data_type_store_service_factory.h"
 #import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h"
 #import "ios/chrome/browser/sync/model/ios_user_event_service_factory.h"
+#import "ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.h"
 #import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h"
 #import "ios/chrome/browser/sync/model/session_sync_service_factory.h"
 #import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h"
@@ -246,8 +249,10 @@
   ios::PasswordManagerLogRouterFactory::GetInstance();
   ios::PlaceholderServiceFactory::GetInstance();
   ios::ProviderStateServiceFactory::GetInstance();
+  ios::RegionalCapabilitiesServiceFactory::GetInstance();
   ios::SearchEngineChoiceServiceFactory::GetInstance();
   ios::ShortcutsBackendFactory::GetInstance();
+  ios::SearchEngineChoiceTriggeringServiceFactory::GetInstance();
   ios::SigninErrorControllerFactory::GetInstance();
   ios::TemplateURLFetcherFactory::GetInstance();
   ios::TemplateURLPrepopulateDataResolverFactory::GetInstance();
@@ -280,6 +285,7 @@
   ContentNotificationServiceFactory::GetInstance();
   ContextualPanelModelServiceFactory::GetInstance();
   CredentialsCleanerRunnerFactory::GetInstance();
+  CrossDevicePrefTrackerFactory::GetInstance();
   DataTypeStoreServiceFactory::GetInstance();
   DeviceAuthenticatorProxyFactory::GetInstance();
   DeviceInfoSyncServiceFactory::GetInstance();
diff --git a/ios/chrome/browser/profile/model/profile_manager_ios_impl.h b/ios/chrome/browser/profile/model/profile_manager_ios_impl.h
index 9b743bd8..731378a9 100644
--- a/ios/chrome/browser/profile/model/profile_manager_ios_impl.h
+++ b/ios/chrome/browser/profile/model/profile_manager_ios_impl.h
@@ -63,6 +63,7 @@
   bool IsProfileMarkedForDeletion(std::string_view name) const override;
   void PurgeProfilesMarkedForDeletion(base::OnceClosure callback) override;
   ProfileAttributesStorageIOS* GetProfileAttributesStorage() override;
+  base::FilePath GetProfilePath(std::string_view name) override;
 
   // ProfileIOS::Delegate:
   void OnProfileCreationStarted(ProfileIOS* profile,
diff --git a/ios/chrome/browser/profile/model/profile_manager_ios_impl.mm b/ios/chrome/browser/profile/model/profile_manager_ios_impl.mm
index 8c702b9..2b4a963 100644
--- a/ios/chrome/browser/profile/model/profile_manager_ios_impl.mm
+++ b/ios/chrome/browser/profile/model/profile_manager_ios_impl.mm
@@ -372,6 +372,12 @@
   return &profile_attributes_storage_;
 }
 
+base::FilePath ProfileManagerIOSImpl::GetProfilePath(std::string_view name) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(profile_attributes_storage_.HasProfileWithName(name));
+  return profile_data_dir_.Append(name);
+}
+
 void ProfileManagerIOSImpl::OnProfileCreationStarted(
     ProfileIOS* profile,
     CreationMode creation_mode) {
diff --git a/ios/chrome/browser/profile/model/profile_manager_ios_impl_unittest.mm b/ios/chrome/browser/profile/model/profile_manager_ios_impl_unittest.mm
index f40f3f8..3df27dd 100644
--- a/ios/chrome/browser/profile/model/profile_manager_ios_impl_unittest.mm
+++ b/ios/chrome/browser/profile/model/profile_manager_ios_impl_unittest.mm
@@ -712,3 +712,23 @@
   EXPECT_FALSE(profile_manager().HasProfileWithName(profile2));
   EXPECT_TRUE(profile_manager().HasProfileWithName(profile3));
 }
+
+// Tests that GetProfilePath() works for both loaded and non-loaded profiles.
+TEST_F(ProfileManagerIOSImplTest, GetProfilePath) {
+  // Create a few profiles synchronously.
+  ScopedProfileKeepAliveIOS keep_alive1 = CreateProfile(kProfileName1);
+  ScopedProfileKeepAliveIOS keep_alive2 = CreateProfile(kProfileName2);
+
+  keep_alive2.Reset();
+
+  ASSERT_TRUE(profile_manager().HasProfileWithName(kProfileName1));
+  ASSERT_TRUE(profile_manager().HasProfileWithName(kProfileName2));
+
+  ASSERT_TRUE(profile_manager().GetProfileWithName(kProfileName1));
+  ASSERT_FALSE(profile_manager().GetProfileWithName(kProfileName2));
+
+  EXPECT_EQ(base::FilePath::FromASCII(kProfileName1),
+            profile_manager().GetProfilePath(kProfileName1).BaseName());
+  EXPECT_EQ(base::FilePath::FromASCII(kProfileName2),
+            profile_manager().GetProfilePath(kProfileName2).BaseName());
+}
diff --git a/ios/chrome/browser/search_engine_choice/model/BUILD.gn b/ios/chrome/browser/search_engine_choice/model/BUILD.gn
index da893cd..4717128 100644
--- a/ios/chrome/browser/search_engine_choice/model/BUILD.gn
+++ b/ios/chrome/browser/search_engine_choice/model/BUILD.gn
@@ -4,11 +4,17 @@
 
 source_set("model") {
   sources = [
+    "search_engine_choice_triggering_service.h",
+    "search_engine_choice_triggering_service.mm",
+    "search_engine_choice_triggering_service_factory.h",
+    "search_engine_choice_triggering_service_factory.mm",
     "search_engine_choice_util.h",
     "search_engine_choice_util.mm",
   ]
   deps = [
     "//base",
+    "//components/keyed_service/core",
+    "//components/keyed_service/ios",
     "//components/search_engines",
     "//ios/chrome/app:tests_hook",
     "//ios/chrome/browser/policy/model",
@@ -16,8 +22,10 @@
     "//ios/chrome/browser/search_engines/model",
     "//ios/chrome/browser/shared/model/browser",
     "//ios/chrome/browser/shared/model/profile",
+    "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory",
     "//ios/chrome/browser/shared/public/features:system_flags",
     "//ios/public/provider/chrome/browser/signin:choice_api",
+    "//ios/web/public",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.h b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.h
new file mode 100644
index 0000000..cee9a586
--- /dev/null
+++ b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.h
@@ -0,0 +1,55 @@
+// Copyright 2025 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_SEARCH_ENGINE_CHOICE_MODEL_SEARCH_ENGINE_CHOICE_TRIGGERING_SERVICE_H_
+#define IOS_CHROME_BROWSER_SEARCH_ENGINE_CHOICE_MODEL_SEARCH_ENGINE_CHOICE_TRIGGERING_SERVICE_H_
+
+#import "base/memory/raw_ref.h"
+#import "components/keyed_service/core/keyed_service.h"
+
+namespace search_engines {
+class SearchEngineChoiceService;
+enum class SearchEngineChoiceScreenConditions;
+}  // namespace search_engines
+namespace policy {
+class PolicyService;
+}
+class TemplateURLService;
+class PrefService;
+
+namespace ios {
+
+// Service that is responsible for running dynamic checks to see if the search
+// engine choice screen should be shown.
+// More or less equivalent to `SearchEngineChoiceDialogService` on desktop.
+class SearchEngineChoiceTriggeringService : public KeyedService {
+ public:
+  SearchEngineChoiceTriggeringService(
+      PrefService& profile_prefs,
+      const policy::PolicyService& policy_service,
+      search_engines::SearchEngineChoiceService& search_engine_choice_service,
+      const TemplateURLService& template_url_service);
+  ~SearchEngineChoiceTriggeringService() override;
+
+  SearchEngineChoiceTriggeringService(
+      const SearchEngineChoiceTriggeringService&) = delete;
+  SearchEngineChoiceTriggeringService& operator=(
+      const SearchEngineChoiceTriggeringService&) = delete;
+
+  // Returns eligibility status for newly triggering a choice screen.
+  search_engines::SearchEngineChoiceScreenConditions
+  EvaluateTriggeringConditions(bool is_first_run_entrypoint,
+                               bool app_started_via_external_intent);
+
+ private:
+  const raw_ref<PrefService> profile_prefs_;
+  const raw_ref<const policy::PolicyService> policy_service_;
+  const raw_ref<search_engines::SearchEngineChoiceService>
+      search_engine_choice_service_;
+  const raw_ref<const TemplateURLService> template_url_service_;
+};
+
+}  // namespace ios
+
+#endif  // IOS_CHROME_BROWSER_SEARCH_ENGINE_CHOICE_MODEL_SEARCH_ENGINE_CHOICE_TRIGGERING_SERVICE_H_
diff --git a/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.mm b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.mm
new file mode 100644
index 0000000..8be3726
--- /dev/null
+++ b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.mm
@@ -0,0 +1,69 @@
+// Copyright 2025 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/search_engine_choice/model/search_engine_choice_triggering_service.h"
+
+#import "components/policy/core/common/policy_service.h"
+#import "components/prefs/pref_service.h"
+#import "components/search_engines/search_engine_choice/search_engine_choice_service.h"
+#import "components/search_engines/search_engines_pref_names.h"
+#import "components/search_engines/template_url_service.h"
+#import "ios/chrome/browser/search_engine_choice/model/search_engine_choice_util.h"
+#import "ios/chrome/browser/search_engine_choice/ui_bundled/search_engine_choice_ui_util.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+
+namespace ios {
+
+SearchEngineChoiceTriggeringService::SearchEngineChoiceTriggeringService(
+    PrefService& profile_prefs,
+    const policy::PolicyService& policy_service,
+    search_engines::SearchEngineChoiceService& search_engine_choice_service,
+    const TemplateURLService& template_url_service)
+    : profile_prefs_(profile_prefs),
+      policy_service_(policy_service),
+      search_engine_choice_service_(search_engine_choice_service),
+      template_url_service_(template_url_service) {}
+
+SearchEngineChoiceTriggeringService::~SearchEngineChoiceTriggeringService() =
+    default;
+
+search_engines::SearchEngineChoiceScreenConditions
+SearchEngineChoiceTriggeringService::EvaluateTriggeringConditions(
+    bool is_first_run_entrypoint,
+    bool app_started_via_external_intent) {
+  if (auto conditions =
+          search_engine_choice_service_->GetStaticChoiceScreenConditions(
+              policy_service_.get(), template_url_service_.get());
+      conditions !=
+      search_engines::SearchEngineChoiceScreenConditions::kEligible) {
+    return conditions;
+  }
+
+  if (auto conditions =
+          search_engine_choice_service_->GetDynamicChoiceScreenConditions(
+              template_url_service_.get());
+      conditions !=
+      search_engines::SearchEngineChoiceScreenConditions::kEligible) {
+    return conditions;
+  }
+
+  // If the app has been started via an external intent, skip the Dialog
+  // promo up to `kSearchEngineChoiceMaximumSkipCount` times.
+  if (app_started_via_external_intent && !is_first_run_entrypoint) {
+    const int count = profile_prefs_->GetInteger(
+        prefs::kDefaultSearchProviderChoiceScreenSkippedCount);
+
+    if (count < kSearchEngineChoiceMaximumSkipCount) {
+      profile_prefs_->SetInteger(
+          prefs::kDefaultSearchProviderChoiceScreenSkippedCount, count + 1);
+
+      return search_engines::SearchEngineChoiceScreenConditions::
+          kAppStartedByExternalIntent;
+    }
+  }
+
+  return search_engines::SearchEngineChoiceScreenConditions::kEligible;
+}
+
+}  // namespace ios
diff --git a/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.h b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.h
new file mode 100644
index 0000000..237b2df
--- /dev/null
+++ b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.h
@@ -0,0 +1,38 @@
+// Copyright 2025 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_SEARCH_ENGINE_CHOICE_MODEL_SEARCH_ENGINE_CHOICE_TRIGGERING_SERVICE_FACTORY_H_
+#define IOS_CHROME_BROWSER_SEARCH_ENGINE_CHOICE_MODEL_SEARCH_ENGINE_CHOICE_TRIGGERING_SERVICE_FACTORY_H_
+
+#import "base/no_destructor.h"
+#import "ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h"
+
+class ProfileIOS;
+
+namespace ios {
+
+class SearchEngineChoiceTriggeringService;
+
+// Singleton that owns all SearchEngineChoiceTriggeringService and associates
+// them with ChromeBrowserState.
+class SearchEngineChoiceTriggeringServiceFactory
+    : public ProfileKeyedServiceFactoryIOS {
+ public:
+  static SearchEngineChoiceTriggeringServiceFactory* GetInstance();
+  static SearchEngineChoiceTriggeringService* GetForProfile(
+      ProfileIOS* profile);
+
+ private:
+  friend class base::NoDestructor<SearchEngineChoiceTriggeringServiceFactory>;
+
+  SearchEngineChoiceTriggeringServiceFactory();
+  ~SearchEngineChoiceTriggeringServiceFactory() override;
+
+  // BrowserStateKeyedServiceFactory implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+};
+
+}  // namespace ios
+#endif  // IOS_CHROME_BROWSER_SEARCH_ENGINE_CHOICE_MODEL_SEARCH_ENGINE_CHOICE_TRIGGERING_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.mm b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.mm
new file mode 100644
index 0000000..b56d89c
--- /dev/null
+++ b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.mm
@@ -0,0 +1,75 @@
+// Copyright 2025 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/search_engine_choice/model/search_engine_choice_triggering_service_factory.h"
+
+#import "base/check_deref.h"
+#import "components/keyed_service/core/keyed_service.h"
+#import "components/keyed_service/ios/browser_state_dependency_manager.h"
+#import "components/prefs/pref_service.h"
+#import "components/search_engines/search_engine_choice/search_engine_choice_service.h"
+#import "components/search_engines/search_engine_choice/search_engine_choice_utils.h"
+#import "ios/chrome/browser/policy/model/profile_policy_connector.h"
+#import "ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.h"
+#import "ios/chrome/browser/search_engines/model/search_engine_choice_service_factory.h"
+#import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/web/public/browser_state.h"
+
+namespace ios {
+
+// static
+SearchEngineChoiceTriggeringServiceFactory*
+SearchEngineChoiceTriggeringServiceFactory::GetInstance() {
+  static base::NoDestructor<SearchEngineChoiceTriggeringServiceFactory>
+      instance;
+  return instance.get();
+}
+
+// static
+SearchEngineChoiceTriggeringService*
+SearchEngineChoiceTriggeringServiceFactory::GetForProfile(ProfileIOS* profile) {
+  return GetInstance()
+      ->GetServiceForProfileAs<SearchEngineChoiceTriggeringService>(
+          profile,
+          /*create=*/true);
+}
+
+SearchEngineChoiceTriggeringServiceFactory::
+    SearchEngineChoiceTriggeringServiceFactory()
+    : ProfileKeyedServiceFactoryIOS("SearchEngineChoiceTriggeringService",
+                                    ProfileSelection::kRedirectedInIncognito) {
+  DependsOn(ios::SearchEngineChoiceServiceFactory::GetInstance());
+  DependsOn(ios::TemplateURLServiceFactory::GetInstance());
+}
+
+SearchEngineChoiceTriggeringServiceFactory::
+    ~SearchEngineChoiceTriggeringServiceFactory() = default;
+
+std::unique_ptr<KeyedService>
+SearchEngineChoiceTriggeringServiceFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
+  CHECK_EQ(profile, profile->GetOriginalProfile());
+
+  search_engines::SearchEngineChoiceService& search_engine_choice_service =
+      CHECK_DEREF(
+          ios::SearchEngineChoiceServiceFactory::GetForProfile(profile));
+  const policy::PolicyService& policy_service =
+      CHECK_DEREF(profile->GetPolicyConnector()->GetPolicyService());
+  const TemplateURLService& template_url_service =
+      CHECK_DEREF(ios::TemplateURLServiceFactory::GetForProfile(profile));
+  auto condition = search_engine_choice_service.GetStaticChoiceScreenConditions(
+      policy_service, template_url_service);
+  if (condition !=
+      search_engines::SearchEngineChoiceScreenConditions::kEligible) {
+    return nullptr;
+  }
+
+  return std::make_unique<SearchEngineChoiceTriggeringService>(
+      CHECK_DEREF(profile->GetPrefs()), policy_service,
+      search_engine_choice_service, template_url_service);
+}
+
+}  // namespace ios
diff --git a/ios/chrome/browser/search_engine_choice/model/search_engine_choice_util.mm b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_util.mm
index 6fe7a62..85c9019 100644
--- a/ios/chrome/browser/search_engine_choice/model/search_engine_choice_util.mm
+++ b/ios/chrome/browser/search_engine_choice/model/search_engine_choice_util.mm
@@ -6,17 +6,14 @@
 
 #import "base/check_deref.h"
 #import "base/command_line.h"
-#import "components/prefs/pref_service.h"
 #import "components/search_engines/search_engine_choice/search_engine_choice_service.h"
-#import "components/search_engines/search_engine_choice/search_engine_choice_utils.h"
-#import "components/search_engines/search_engines_pref_names.h"
 #import "components/search_engines/search_engines_switches.h"
 #import "ios/chrome/app/tests_hook.h"
 #import "ios/chrome/browser/policy/model/profile_policy_connector.h"
-#import "ios/chrome/browser/search_engine_choice/ui_bundled/search_engine_choice_ui_util.h"
+#import "ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service.h"
+#import "ios/chrome/browser/search_engine_choice/model/search_engine_choice_triggering_service_factory.h"
 #import "ios/chrome/browser/search_engines/model/search_engine_choice_service_factory.h"
 #import "ios/chrome/browser/search_engines/model/template_url_service_factory.h"
-#import "ios/chrome/browser/shared/model/browser/browser.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/public/provider/chrome/browser/signin/choice_api.h"
 
@@ -50,41 +47,31 @@
     return false;
   }
   ProfileIOS* original_profile = profile.GetOriginalProfile();
-  // Getting data needed to check condition.
   search_engines::SearchEngineChoiceService* search_engine_choice_service =
       ios::SearchEngineChoiceServiceFactory::GetForProfile(original_profile);
-  ProfilePolicyConnector* policy_connector =
-      original_profile->GetPolicyConnector();
-  const policy::PolicyService& policy_service =
-      *policy_connector->GetPolicyService();
-  TemplateURLService* template_url_service =
-      ios::TemplateURLServiceFactory::GetForProfile(original_profile);
+  ios::SearchEngineChoiceTriggeringService* triggering_service =
+      ios::SearchEngineChoiceTriggeringServiceFactory::GetForProfile(&profile);
 
-  // Checking whether the user is eligible for the screen.
-  auto condition =
-      search_engine_choice_service->GetStaticChoiceScreenConditions(
-          policy_service, CHECK_DEREF(template_url_service));
-  if (condition ==
-      search_engines::SearchEngineChoiceScreenConditions::kEligible) {
-    condition = search_engine_choice_service->GetDynamicChoiceScreenConditions(
-        *template_url_service);
-  }
-
-  // If the app has been started via an external intent, skip the Dialog
-  // promo up to kSearchEngineChoiceMaximumSkipCount times.
-  if (app_started_via_external_intent && !is_first_run_entrypoint &&
-      condition ==
-          search_engines::SearchEngineChoiceScreenConditions::kEligible) {
-    PrefService* pref_service = original_profile->GetPrefs();
-    const int count = pref_service->GetInteger(
-        prefs::kDefaultSearchProviderChoiceScreenSkippedCount);
-
-    if (count < kSearchEngineChoiceMaximumSkipCount) {
-      pref_service->SetInteger(
-          prefs::kDefaultSearchProviderChoiceScreenSkippedCount, count + 1);
-
+  search_engines::SearchEngineChoiceScreenConditions condition;
+  if (triggering_service) {
+    condition = triggering_service->EvaluateTriggeringConditions(
+        is_first_run_entrypoint, app_started_via_external_intent);
+  } else {
+    // TODO(crbug.com/438717568): This branch is added only to record the legacy
+    // histograms. Investigate whether we need to keep it, or if we're fine with
+    // updating the record timing of these old histogram.
+    const policy::PolicyService& policy_service =
+        *original_profile->GetPolicyConnector()->GetPolicyService();
+    TemplateURLService* template_url_service =
+        ios::TemplateURLServiceFactory::GetForProfile(original_profile);
+    condition = search_engine_choice_service->GetStaticChoiceScreenConditions(
+        policy_service, CHECK_DEREF(template_url_service));
+    if (condition ==
+        search_engines::SearchEngineChoiceScreenConditions::kEligible) {
+      // If we didn't get a `triggering_service`, the search engine should not
+      // be eligible for choice screens either.
       condition = search_engines::SearchEngineChoiceScreenConditions::
-          kAppStartedByExternalIntent;
+          kUnsupportedBrowserType;
     }
   }
 
diff --git a/ios/chrome/browser/sessions/model/BUILD.gn b/ios/chrome/browser/sessions/model/BUILD.gn
index 8ef6ee9..3ecd88ec 100644
--- a/ios/chrome/browser/sessions/model/BUILD.gn
+++ b/ios/chrome/browser/sessions/model/BUILD.gn
@@ -243,6 +243,7 @@
     "//base",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/web_state_list",
+    "//ios/chrome/browser/tabs/model:features",
     "//ios/web/public",
     "//ios/web/public/session",
     "//ios/web/public/session/proto",
diff --git a/ios/chrome/browser/sessions/model/legacy_session_restoration_service.h b/ios/chrome/browser/sessions/model/legacy_session_restoration_service.h
index ffee865..bbc22d0 100644
--- a/ios/chrome/browser/sessions/model/legacy_session_restoration_service.h
+++ b/ios/chrome/browser/sessions/model/legacy_session_restoration_service.h
@@ -12,10 +12,12 @@
 
 #include "base/files/file_path.h"
 #include "base/observer_list.h"
+#include "base/scoped_multi_source_observation.h"
 #include "base/sequence_checker.h"
 #include "ios/chrome/browser/sessions/model/session_restoration_observer.h"
 #include "ios/chrome/browser/sessions/model/session_restoration_service.h"
 #include "ios/chrome/browser/shared/model/web_state_list/web_state_list_observer.h"
+#include "ios/web/public/web_state_observer.h"
 
 @class SessionServiceIOS;
 @class WebSessionStateCache;
@@ -27,7 +29,8 @@
 // TODO(crbug.com/40245950): Remove when the feature is fully launched.
 class LegacySessionRestorationService final : public SessionRestorationService,
                                               public SessionRestorationObserver,
-                                              public WebStateListObserver {
+                                              public WebStateListObserver,
+                                              public web::WebStateObserver {
  public:
   LegacySessionRestorationService(
       bool enable_pinned_tabs,
@@ -76,9 +79,17 @@
                              const WebStateListChange& change,
                              const WebStateListStatus& status) final;
 
+  // web::WebStateObserver implementation.
+  void WebStateRealized(web::WebState* web_state) final;
+  void WebStateDestroyed(web::WebState* web_state) final;
+
  private:
   SEQUENCE_CHECKER(sequence_checker_);
 
+  // Invoked when a WebState is inserted/removed from a WebStateList.
+  void WebStateInserted(web::WebState* web_state);
+  void WebStateDetached(web::WebState* web_state);
+
   // Observer list.
   base::ObserverList<SessionRestorationObserver, true> observers_;
 
@@ -102,6 +113,10 @@
   // Bi-directional mapping of observed Browser and their backup.
   std::map<Browser*, Browser*> browsers_to_backup_;
   std::map<Browser*, Browser*> backups_to_browser_;
+
+  // Used to observe unrealized WebStates.
+  base::ScopedMultiSourceObservation<web::WebState, web::WebStateObserver>
+      web_state_observations_{this};
 };
 
 #endif  // IOS_CHROME_BROWSER_SESSIONS_MODEL_LEGACY_SESSION_RESTORATION_SERVICE_H_
diff --git a/ios/chrome/browser/sessions/model/legacy_session_restoration_service.mm b/ios/chrome/browser/sessions/model/legacy_session_restoration_service.mm
index af4db0fc..d4fdbff 100644
--- a/ios/chrome/browser/sessions/model/legacy_session_restoration_service.mm
+++ b/ios/chrome/browser/sessions/model/legacy_session_restoration_service.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/browser/sessions/model/web_session_state_tab_helper.h"
 #import "ios/chrome/browser/shared/model/profile/profile_ios.h"
 #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h"
+#import "ios/chrome/browser/tabs/model/features.h"
 #import "ios/web/public/session/crw_session_storage.h"
 #import "ios/web/public/session/proto/storage.pb.h"
 #import "ios/web/public/web_state.h"
@@ -206,6 +207,16 @@
   // Destroy the SessionRestorationBrowserAgent for browser.
   SessionRestorationBrowserAgent::RemoveFromBrowser(browser);
 
+  // Stop observing the WebStates for realization is needed.
+  if (CreateTabHelperOnlyForRealizedWebStates()) {
+    WebStateList* list = browser->GetWebStateList();
+    const int list_count = list->count();
+    for (int index = 0; index < list_count; ++index) {
+      web::WebState* web_state = list->GetWebStateAt(index);
+      WebStateDetached(web_state);
+    }
+  }
+
   browser->GetWebStateList()->RemoveObserver(this);
 }
 
@@ -310,15 +321,20 @@
   switch (change.type()) {
     case WebStateListChange::Type::kInsert: {
       const auto& typed_change = change.As<WebStateListChangeInsert>();
-      WebSessionStateTabHelper::CreateForWebState(
-          typed_change.inserted_web_state());
+      WebStateInserted(typed_change.inserted_web_state());
       break;
     }
 
     case WebStateListChange::Type::kReplace: {
       const auto& typed_change = change.As<WebStateListChangeReplace>();
-      WebSessionStateTabHelper::CreateForWebState(
-          typed_change.inserted_web_state());
+      WebStateInserted(typed_change.inserted_web_state());
+      WebStateDetached(typed_change.replaced_web_state());
+      break;
+    }
+
+    case WebStateListChange::Type::kDetach: {
+      const auto& typed_change = change.As<WebStateListChangeDetach>();
+      WebStateDetached(typed_change.detached_web_state());
       break;
     }
 
@@ -326,3 +342,44 @@
       break;
   }
 }
+
+void LegacySessionRestorationService::WebStateRealized(
+    web::WebState* web_state) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(CreateTabHelperOnlyForRealizedWebStates());
+  web_state_observations_.RemoveObservation(web_state);
+  WebStateInserted(web_state);
+}
+
+void LegacySessionRestorationService::WebStateDestroyed(
+    web::WebState* web_state) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(CreateTabHelperOnlyForRealizedWebStates());
+  web_state_observations_.RemoveObservation(web_state);
+}
+
+void LegacySessionRestorationService::WebStateInserted(
+    web::WebState* web_state) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (CreateTabHelperOnlyForRealizedWebStates()) {
+    if (!web_state->IsRealized()) {
+      web_state_observations_.AddObservation(web_state);
+      return;
+    }
+  }
+
+  WebSessionStateTabHelper::CreateForWebState(web_state);
+}
+
+void LegacySessionRestorationService::WebStateDetached(
+    web::WebState* web_state) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (CreateTabHelperOnlyForRealizedWebStates()) {
+    if (!web_state->IsRealized()) {
+      web_state_observations_.RemoveObservation(web_state);
+      return;
+    }
+  }
+
+  // Nothing to do.
+}
diff --git a/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm b/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
index 7358d92..05639ac 100644
--- a/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/password/password_manager_egtest.mm
@@ -1734,7 +1734,13 @@
 // storing just about enough passwords to ensure filling more than one page on
 // any device. To limit the effect of (2), custom large scrolling steps are
 // added to the usual scrolling actions.
-- (void)testManyPasswords {
+// TODO(crbug.com/442382530): Re-enable this test once it has been fixed.
+#if !TARGET_OS_SIMULATOR
+#define MAYBE_testManyPasswords FLAKY_testManyPasswords
+#else
+#define MAYBE_testManyPasswords testManyPasswords
+#endif
+- (void)MAYBE_testManyPasswords {
   // Enough just to ensure filling more than one page on all devices.
   constexpr int kPasswordsCount = 15;
 
diff --git a/ios/chrome/browser/shared/model/profile/profile_manager_ios.h b/ios/chrome/browser/shared/model/profile/profile_manager_ios.h
index d514a9d..dbe2b44 100644
--- a/ios/chrome/browser/shared/model/profile/profile_manager_ios.h
+++ b/ios/chrome/browser/shared/model/profile/profile_manager_ios.h
@@ -115,6 +115,10 @@
   // Returns the ProfileAttributesStorageIOS associated with this manager.
   virtual ProfileAttributesStorageIOS* GetProfileAttributesStorage() = 0;
 
+  // Returns the path to a given profile's data on disk. It is an error to call
+  // this method for a non-existent profile.
+  virtual base::FilePath GetProfilePath(std::string_view name) = 0;
+
  protected:
   ProfileManagerIOS() {}
 
diff --git a/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.h b/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.h
index 8aa010a1..fe0bde86 100644
--- a/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.h
+++ b/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.h
@@ -50,6 +50,7 @@
   bool IsProfileMarkedForDeletion(std::string_view name) const override;
   void PurgeProfilesMarkedForDeletion(base::OnceClosure callback) override;
   ProfileAttributesStorageIOS* GetProfileAttributesStorage() override;
+  base::FilePath GetProfilePath(std::string_view name) override;
 
   // Builds and adds a TestProfileIOS using `builder`. Asserts that no Profile
   // share the same name. Returns a pointer to the new object.
diff --git a/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.mm b/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.mm
index 4f8d75ce..54ddff36 100644
--- a/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.mm
+++ b/ios/chrome/browser/shared/model/profile/test/test_profile_manager_ios.mm
@@ -164,6 +164,11 @@
   return &profile_attributes_storage_;
 }
 
+base::FilePath TestProfileManagerIOS::GetProfilePath(std::string_view name) {
+  CHECK(profile_attributes_storage_.HasProfileWithName(name));
+  return profile_data_dir_.Append(name);
+}
+
 TestProfileIOS* TestProfileManagerIOS::AddProfileWithBuilder(
     TestProfileIOS::Builder builder) {
   const std::string profile_name = builder.GetEffectiveName();
diff --git a/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm b/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm
index ff5a469f..adb3b13e 100644
--- a/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm
+++ b/ios/chrome/browser/signin/model/account_profile_mapper_unittest.mm
@@ -298,6 +298,10 @@
     return &profile_attributes_storage_;
   }
 
+  base::FilePath GetProfilePath(std::string_view name) override {
+    NOTREACHED();
+  }
+
  private:
   ScopedProfileKeepAliveIOS CreateScopedProfileKeepAlive(ProfileIOS* profile) {
     return ScopedProfileKeepAliveIOS(CreatePassKey(), profile, {});
diff --git a/ios/chrome/browser/sync/model/prefs/BUILD.gn b/ios/chrome/browser/sync/model/prefs/BUILD.gn
index ca3cafe..a45012c 100644
--- a/ios/chrome/browser/sync/model/prefs/BUILD.gn
+++ b/ios/chrome/browser/sync/model/prefs/BUILD.gn
@@ -2,6 +2,25 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+source_set("cross_device_pref_tracker_factory") {
+  sources = [
+    "cross_device_pref_tracker_factory.h",
+    "cross_device_pref_tracker_factory.mm",
+  ]
+  public_deps = [
+    "//base",
+    "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory",
+  ]
+  deps = [
+    "//components/keyed_service/core",
+    "//components/sync_preferences:cross_device_pref_tracker",
+    "//components/sync_preferences:features",
+    "//ios/chrome/browser/shared/model/application_context",
+    "//ios/chrome/browser/shared/model/profile",
+    "//ios/chrome/browser/sync/model:device_info_sync_service_factory",
+  ]
+}
+
 source_set("prefs") {
   sources = [
     "ios_chrome_syncable_prefs_database.cc",
diff --git a/ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.h b/ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.h
new file mode 100644
index 0000000..b8d967b
--- /dev/null
+++ b/ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.h
@@ -0,0 +1,52 @@
+// Copyright 2025 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_SYNC_MODEL_PREFS_CROSS_DEVICE_PREF_TRACKER_FACTORY_H_
+#define IOS_CHROME_BROWSER_SYNC_MODEL_PREFS_CROSS_DEVICE_PREF_TRACKER_FACTORY_H_
+
+#import <memory>
+
+#import "base/no_destructor.h"
+#import "ios/chrome/browser/shared/model/profile/profile_keyed_service_factory_ios.h"
+
+class KeyedService;
+class ProfileIOS;
+
+namespace web {
+class BrowserState;
+}  // namespace web
+
+namespace sync_preferences {
+class CrossDevicePrefTracker;
+}  // namespace sync_preferences
+
+// Singleton factory that creates and manages one `CrossDevicePrefTracker`
+// instance per `ProfileIOS`. The `CrossDevicePrefTracker` is responsible for
+// observing and sharing select non-syncing preference values across a user's
+// devices.
+class CrossDevicePrefTrackerFactory : public ProfileKeyedServiceFactoryIOS {
+ public:
+  static CrossDevicePrefTrackerFactory* GetInstance();
+
+  // Returns the `CrossDevicePrefTracker` associated with `profile`.
+  // If no instance exists, one will be created.
+  static sync_preferences::CrossDevicePrefTracker* GetForProfile(
+      ProfileIOS* profile);
+
+  CrossDevicePrefTrackerFactory(const CrossDevicePrefTrackerFactory&) = delete;
+  CrossDevicePrefTrackerFactory& operator=(
+      const CrossDevicePrefTrackerFactory&) = delete;
+
+ private:
+  friend class base::NoDestructor<CrossDevicePrefTrackerFactory>;
+
+  CrossDevicePrefTrackerFactory();
+  ~CrossDevicePrefTrackerFactory() override;
+
+  // `BrowserStateKeyedServiceFactory` implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+};
+
+#endif  // IOS_CHROME_BROWSER_SYNC_MODEL_PREFS_CROSS_DEVICE_PREF_TRACKER_FACTORY_H_
diff --git a/ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.mm b/ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.mm
new file mode 100644
index 0000000..153e29d
--- /dev/null
+++ b/ios/chrome/browser/sync/model/prefs/cross_device_pref_tracker_factory.mm
@@ -0,0 +1,58 @@
+// Copyright 2025 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/sync/model/prefs/cross_device_pref_tracker_factory.h"
+
+#import "base/check.h"
+#import "base/feature_list.h"
+#import "components/keyed_service/core/keyed_service.h"
+#import "components/sync_preferences/cross_device_pref_tracker.h"
+#import "components/sync_preferences/cross_device_pref_tracker_impl.h"
+#import "components/sync_preferences/features.h"
+#import "ios/chrome/browser/shared/model/application_context/application_context.h"
+#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
+#import "ios/chrome/browser/sync/model/device_info_sync_service_factory.h"
+
+// static
+sync_preferences::CrossDevicePrefTracker*
+CrossDevicePrefTrackerFactory::GetForProfile(ProfileIOS* profile) {
+  // The factory configuration ensures this is only called for the original
+  // profile.
+  CHECK(!profile->IsOffTheRecord());
+
+  return GetInstance()
+      ->GetServiceForProfileAs<sync_preferences::CrossDevicePrefTracker>(
+          profile, /*create=*/true);
+}
+
+// static
+CrossDevicePrefTrackerFactory* CrossDevicePrefTrackerFactory::GetInstance() {
+  static base::NoDestructor<CrossDevicePrefTrackerFactory> instance;
+  return instance.get();
+}
+
+CrossDevicePrefTrackerFactory::CrossDevicePrefTrackerFactory()
+    : ProfileKeyedServiceFactoryIOS("CrossDevicePrefTracker",
+                                    ServiceCreation::kCreateWithProfile,
+                                    TestingCreation::kNoServiceForTests) {
+  DependsOn(DeviceInfoSyncServiceFactory::GetInstance());
+}
+
+CrossDevicePrefTrackerFactory::~CrossDevicePrefTrackerFactory() = default;
+
+std::unique_ptr<KeyedService>
+CrossDevicePrefTrackerFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  if (!base::FeatureList::IsEnabled(
+          sync_preferences::features::kEnableCrossDevicePrefTracker)) {
+    return nullptr;
+  }
+
+  ProfileIOS* profile = ProfileIOS::FromBrowserState(context);
+
+  // The implementation in `components/sync_preferences` is platform-agnostic.
+  return std::make_unique<sync_preferences::CrossDevicePrefTrackerImpl>(
+      profile->GetPrefs(), GetApplicationContext()->GetLocalState(),
+      DeviceInfoSyncServiceFactory::GetForProfile(profile));
+}
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm
index df0b066..d91592c 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_grid_view_controller.mm
@@ -1348,7 +1348,7 @@
   _searchText = searchText;
   searchBar.searchTextField.accessibilityIdentifier =
       [kTabGridSearchTextFieldIdentifierPrefix
-          stringByAppendingString:searchText];
+          stringByAppendingString:searchText ?: @""];
   [self updateScrimVisibilityForText:searchText];
   switch (self.currentPage) {
     case TabGridPageIncognitoTabs:
diff --git a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
index 8d27646..fee1dec 100644
--- a/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
+++ b/ios/chrome/browser/tab_switcher/ui_bundled/tab_grid/tab_groups/shared_tab_groups_egtest.mm
@@ -966,7 +966,8 @@
 }
 
 // Ensures new tab is added when moving the last tab of a shared group.
-- (void)testMoveLastTabInSharedGroup {
+// TODO(crbug.com/442448866): Re-enable this test.
+- (void)FLAKY_testMoveLastTabInSharedGroup {
   // Create 2 groups, one shared and one local.
   [ChromeEarlGreyUI openNewTab];
   [ChromeEarlGrey loadURL:GetQueryTitleURL(self.testServer, kTab2Title)];
diff --git a/ios/chrome/browser/variations/model/variations_safe_mode_seedfile_egtest.mm b/ios/chrome/browser/variations/model/variations_safe_mode_seedfile_egtest.mm
index 416145c2..c204126 100644
--- a/ios/chrome/browser/variations/model/variations_safe_mode_seedfile_egtest.mm
+++ b/ios/chrome/browser/variations/model/variations_safe_mode_seedfile_egtest.mm
@@ -44,7 +44,7 @@
   config.additional_args = {"--disable-field-trial-config",
                             "--disable-variations-seed-fetch",
                             "--force-fieldtrials=SeedFileTrial/SeedFiles_V7",
-                            "--fake-variations-channel=stable"};
+                            "--fake-variations-channel=dev"};
   return config;
 }
 
@@ -62,7 +62,7 @@
   config.additional_args = {"--disable-field-trial-config",
                             "--disable-variations-seed-fetch",
                             "--force-fieldtrials=SeedFileTrial/SeedFiles_V7",
-                            "--fake-variations-channel=stable"};
+                            "--fake-variations-channel=dev"};
   return config;
 }
 
diff --git a/ios/chrome/browser/youtube_incognito/coordinator/youtube_incognito_coordinator.mm b/ios/chrome/browser/youtube_incognito/coordinator/youtube_incognito_coordinator.mm
index f591a1b..d03b1341 100644
--- a/ios/chrome/browser/youtube_incognito/coordinator/youtube_incognito_coordinator.mm
+++ b/ios/chrome/browser/youtube_incognito/coordinator/youtube_incognito_coordinator.mm
@@ -132,8 +132,8 @@
 // Presents the YoutubeIncognitoCoordinator's view controller.
 - (void)presentViewController {
   _viewController = [[YoutubeIncognitoSheet alloc] init];
-  _viewController.delegate = self;
   _viewController.URLLoaderDelegate = self;
+  _viewController.delegate = self;
   _viewController.sheetPresentationController.detents = @[
     [UISheetPresentationControllerDetent mediumDetent],
     [UISheetPresentationControllerDetent largeDetent]
diff --git a/ios/chrome/browser/youtube_incognito/ui/BUILD.gn b/ios/chrome/browser/youtube_incognito/ui/BUILD.gn
index bf80901a..26c0365 100644
--- a/ios/chrome/browser/youtube_incognito/ui/BUILD.gn
+++ b/ios/chrome/browser/youtube_incognito/ui/BUILD.gn
@@ -11,9 +11,13 @@
     "youtube_incognito_sheet_delegate.h",
   ]
   deps = [
+    "//components/strings",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/ntp/ui_bundled",
     "//ios/chrome/browser/ntp/ui_bundled/incognito",
+    "//ios/chrome/browser/ntp/ui_bundled/incognito:util",
     "//ios/chrome/browser/shared/ui/symbols",
+    "//ios/chrome/common:string_util",
     "//ios/chrome/common/ui/colors",
     "//ios/chrome/common/ui/confirmation_alert",
     "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/youtube_incognito/ui/DEPS b/ios/chrome/browser/youtube_incognito/ui/DEPS
index 9001004..61809af 100644
--- a/ios/chrome/browser/youtube_incognito/ui/DEPS
+++ b/ios/chrome/browser/youtube_incognito/ui/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
-  "+ios/chrome/browser/ntp/ui_bundled/incognito/incognito_view.h",
+  "+ios/chrome/browser/ntp/ui_bundled/incognito/incognito_view_util.h",
+  "+ios/chrome/browser/ntp/ui_bundled/new_tab_page_url_loader_delegate.h",
 ]
diff --git a/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.h b/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.h
index 7404746..e8551fc 100644
--- a/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.h
+++ b/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.h
@@ -5,16 +5,14 @@
 #ifndef IOS_CHROME_BROWSER_YOUTUBE_INCOGNITO_UI_YOUTUBE_INCOGNITO_SHEET_H_
 #define IOS_CHROME_BROWSER_YOUTUBE_INCOGNITO_UI_YOUTUBE_INCOGNITO_SHEET_H_
 
-#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h"
-#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h"
+#import <UIKit/UIKit.h>
 
 @protocol YoutubeIncognitoSheetDelegate;
 @protocol NewTabPageURLLoaderDelegate;
 
-// A `ConfirmationAlertViewController` for the Youtube Incognito interstitial,
-// to be managed by the associated `YoutubeIncognitoCoordinator`.
-@interface YoutubeIncognitoSheet
-    : ConfirmationAlertViewController <ConfirmationAlertActionHandler>
+// A `view controller for the Youtube Incognito interstitial, to be managed by
+// the associated `YoutubeIncognitoCoordinator`.
+@interface YoutubeIncognitoSheet : UIViewController
 
 // The delegate for interactions in this View Controller.
 @property(nonatomic, weak) id<YoutubeIncognitoSheetDelegate> delegate;
@@ -23,8 +21,6 @@
 @property(nonatomic, weak) id<NewTabPageURLLoaderDelegate> URLLoaderDelegate;
 
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
 - (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE;
 - (instancetype)initWithNibName:(NSString*)nibNameOrNil
                          bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.mm b/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.mm
index cd663d19..df0ecb1 100644
--- a/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.mm
+++ b/ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet.mm
@@ -6,10 +6,16 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ntp/ui_bundled/incognito/incognito_view.h"
+#import "base/ios/ns_range.h"
+#import "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/ntp/ui_bundled/incognito/incognito_view_util.h"
+#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_url_loader_delegate.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/youtube_incognito/ui/youtube_incognito_sheet_delegate.h"
+#import "ios/chrome/common/string_util.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
+#import "ios/chrome/common/ui/util/button_util.h"
+#import "ios/chrome/common/ui/util/chrome_button.h"
 #import "ios/chrome/common/ui/util/constraints_ui_util.h"
 #import "ios/chrome/grit/ios_branded_strings.h"
 #import "ios/chrome/grit/ios_strings.h"
@@ -17,7 +23,6 @@
 
 namespace {
 
-CGFloat const kUnderTitleViewHeightPadding = 50;
 CGFloat const kVerticalSpacing = 20;
 CGFloat const kTitleContainerCornerRadius = 15;
 CGFloat const kTitleContainerTopPadding = 33;
@@ -30,6 +35,57 @@
 CGFloat const kAnimationScalFactor = 0.5;
 CGFloat const kHalfSheetCornerRadius = 20;
 CGFloat const kHalfSheetFullHeightProportion = 0.9;
+CGFloat const kIncognitoStackWidthOffset = 32.0;
+CGFloat const kHorizontalPadding = 20.0;
+CGFloat const kButtonHeight = 50;
+
+NSString* const kPrimaryActionAccessibilityIdentifier =
+    @"PrimaryActionAccessibilityIdentifier";
+
+NSString* const kTitleAccessibilityIdentifier = @"TitleAccessibilityIdentifier";
+
+// Helpers copied from IncognitoView.mm
+// TODO(crbug.com/442531250): Merge the common utils between
+// `YoutubeIncognitoSheet` and `IncognitoView`.
+UIFont* BodyFont() {
+  return [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
+}
+
+UIFont* BoldBodyFont() {
+  UIFontDescriptor* baseDescriptor = [UIFontDescriptor
+      preferredFontDescriptorWithTextStyle:UIFontTextStyleSubheadline];
+  UIFontDescriptor* styleDescriptor = [baseDescriptor
+      fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
+  return [UIFont fontWithDescriptor:styleDescriptor size:0.0];
+}
+
+NSAttributedString* FormatHTMLListForUILabel(NSString* listString) {
+  listString = [listString stringByReplacingOccurrencesOfString:@"<ul>"
+                                                     withString:@""];
+  listString = [listString stringByReplacingOccurrencesOfString:@"</ul>"
+                                                     withString:@""];
+  listString = [listString
+      stringByReplacingOccurrencesOfString:@"\n *<li>"
+                                withString:@"\n\u2022  "
+                                   options:NSRegularExpressionSearch
+                                     range:NSMakeRange(0, [listString length])];
+  listString = [listString
+      stringByTrimmingCharactersInSet:[NSCharacterSet
+                                          whitespaceAndNewlineCharacterSet]];
+  const StringWithTag parsedString =
+      ParseStringWithTag(listString, @"<em>", @"</em>");
+  NSMutableAttributedString* attributedText =
+      [[NSMutableAttributedString alloc] initWithString:parsedString.string];
+  [attributedText addAttribute:NSFontAttributeName
+                         value:BodyFont()
+                         range:NSMakeRange(0, attributedText.length)];
+  if (parsedString.range.location != NSNotFound) {
+    [attributedText addAttribute:NSFontAttributeName
+                           value:BoldBodyFont()
+                           range:parsedString.range];
+  }
+  return attributedText;
+}
 
 }  // namespace
 
@@ -38,61 +94,142 @@
 }
 
 - (instancetype)init {
-  self = [super init];
-  return self;
+  return [super initWithNibName:nil bundle:nil];
 }
 
 - (void)viewDidLoad {
-  self.actionHandler = self;
-  self.topAlignedLayout = YES;
-  self.showDismissBarButton = NO;
+  [super viewDidLoad];
   self.overrideUserInterfaceStyle = UIUserInterfaceStyleDark;
-  self.aboveTitleView = [self animatedTitleView];
+  self.view.backgroundColor = [UIColor systemBackgroundColor];
 
-  self.titleString =
-      l10n_util::GetNSString(IDS_IOS_YOUTUBE_INCOGNITO_SHEET_TITLE);
-  self.primaryActionString = l10n_util::GetNSString(
-      IDS_IOS_YOUTUBE_INCOGNITO_SHEET_PRIMARY_BUTTON_TITLE);
+  UIScrollView* scrollView = [[UIScrollView alloc] init];
+  scrollView.translatesAutoresizingMaskIntoConstraints = NO;
+  [self.view addSubview:scrollView];
 
-  self.titleTextStyle = UIFontTextStyleTitle3;
-  self.scrollEnabled = YES;
-  self.customSpacing = kVerticalSpacing;
-  [self displayGradientView:YES];
+  UIStackView* mainStackView = [[UIStackView alloc] init];
+  mainStackView.axis = UILayoutConstraintAxisVertical;
+  mainStackView.spacing = kVerticalSpacing;
+  mainStackView.alignment = UIStackViewAlignmentCenter;
+  mainStackView.translatesAutoresizingMaskIntoConstraints = NO;
+  [scrollView addSubview:mainStackView];
 
-  UIView* underTitleView = [[UIView alloc] init];
-  underTitleView.translatesAutoresizingMaskIntoConstraints = NO;
+  UIView* animatedTitleView = [self animatedTitleView];
+  [mainStackView addArrangedSubview:animatedTitleView];
 
-  IncognitoView* incognitoView =
-      [[IncognitoView alloc] initWithFrame:CGRectZero
-             showTopIncognitoImageAndTitle:NO
-                 stackViewHorizontalMargin:0
-                         stackViewMaxWidth:CGFLOAT_MAX];
-  incognitoView.bounces = NO;
-  incognitoView.URLLoaderDelegate = self.URLLoaderDelegate;
-  incognitoView.showsHorizontalScrollIndicator = NO;
-  incognitoView.translatesAutoresizingMaskIntoConstraints = NO;
-  [underTitleView addSubview:incognitoView];
+  UILabel* titleLabel = [self createTitleLabel];
+  [mainStackView addArrangedSubview:titleLabel];
+  [mainStackView setCustomSpacing:kVerticalSpacing afterView:titleLabel];
 
-  self.underTitleView = underTitleView;
+  // Manually recreated IncognitoView content
+  UIStackView* incognitoContentStackView = [[UIStackView alloc] init];
+  incognitoContentStackView.axis = UILayoutConstraintAxisVertical;
+  incognitoContentStackView.spacing = kVerticalSpacing;
+  incognitoContentStackView.alignment = UIStackViewAlignmentLeading;
+  [mainStackView addArrangedSubview:incognitoContentStackView];
+
+  UIColor* bodyTextColor = [UIColor colorNamed:kTextSecondaryColor];
+  UIColor* linkTextColor = [UIColor colorNamed:kBlueColor];
+
+  UILabel* subtitleLabel = [[UILabel alloc] init];
+  subtitleLabel.font = BodyFont();
+  subtitleLabel.textColor = bodyTextColor;
+  subtitleLabel.numberOfLines = 0;
+  subtitleLabel.text =
+      l10n_util::GetNSString(IDS_NEW_TAB_OTR_SUBTITLE_WITH_READING_LIST);
+  subtitleLabel.adjustsFontForContentSizeCategory = YES;
+
+  UIButton* learnMoreButton = [UIButton buttonWithType:UIButtonTypeCustom];
+  [learnMoreButton
+      setTitle:l10n_util::GetNSString(IDS_NEW_TAB_OTR_LEARN_MORE_LINK)
+      forState:UIControlStateNormal];
+  [learnMoreButton setTitleColor:linkTextColor forState:UIControlStateNormal];
+  learnMoreButton.titleLabel.font = BodyFont();
+  learnMoreButton.titleLabel.adjustsFontForContentSizeCategory = YES;
+  [learnMoreButton addTarget:self
+                      action:@selector(learnMoreButtonPressed)
+            forControlEvents:UIControlEventTouchUpInside];
+
+  UIStackView* subtitleStackView = [[UIStackView alloc]
+      initWithArrangedSubviews:@[ subtitleLabel, learnMoreButton ]];
+  subtitleStackView.axis = UILayoutConstraintAxisVertical;
+  subtitleStackView.spacing = 0;
+  subtitleStackView.alignment = UIStackViewAlignmentLeading;
+  [incognitoContentStackView addArrangedSubview:subtitleStackView];
+
+  NSAttributedString* notSavedText = FormatHTMLListForUILabel(
+      l10n_util::GetNSString(IDS_NEW_TAB_OTR_NOT_SAVED));
+  UILabel* notSavedLabel = [[UILabel alloc] init];
+  notSavedLabel.numberOfLines = 0;
+  notSavedLabel.attributedText = notSavedText;
+  notSavedLabel.textColor = bodyTextColor;
+  [incognitoContentStackView addArrangedSubview:notSavedLabel];
+
+  NSAttributedString* visibleDataText =
+      FormatHTMLListForUILabel(l10n_util::GetNSString(IDS_NEW_TAB_OTR_VISIBLE));
+  UILabel* visibleDataLabel = [[UILabel alloc] init];
+  visibleDataLabel.numberOfLines = 0;
+  visibleDataLabel.attributedText = visibleDataText;
+  visibleDataLabel.textColor = bodyTextColor;
+  [incognitoContentStackView addArrangedSubview:visibleDataLabel];
+  // End of recreated content
+
+  UIButton* primaryButton = [self createPrimaryActionButton];
+
+  [self.view addSubview:primaryButton];
+
+  UIUserInterfaceIdiom idiom = [[UIDevice currentDevice] userInterfaceIdiom];
+
+  // Only apply a width offset if the device is Ipad.
+  CGFloat incognitoStackWidthOffset =
+      (idiom == UIUserInterfaceIdiomPad) ? kIncognitoStackWidthOffset : 0;
+
   [NSLayoutConstraint activateConstraints:@[
-    [underTitleView.heightAnchor
-        constraintEqualToAnchor:incognitoView.contentLayoutGuide.heightAnchor
-                       constant:-kUnderTitleViewHeightPadding],
-    [incognitoView.heightAnchor
-        constraintEqualToAnchor:incognitoView.contentLayoutGuide.heightAnchor],
-    [incognitoView.centerYAnchor
-        constraintEqualToAnchor:underTitleView.centerYAnchor],
-    [incognitoView.centerXAnchor
-        constraintEqualToAnchor:underTitleView.centerXAnchor],
-    [incognitoView.widthAnchor
-        constraintEqualToAnchor:underTitleView.widthAnchor],
+    [scrollView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
+    [scrollView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
+    [scrollView.trailingAnchor
+        constraintEqualToAnchor:self.view.trailingAnchor],
+    [scrollView.bottomAnchor constraintEqualToAnchor:primaryButton.topAnchor
+                                            constant:-kVerticalSpacing],
+
+    [mainStackView.topAnchor
+        constraintEqualToAnchor:scrollView.contentLayoutGuide.topAnchor],
+    [mainStackView.bottomAnchor
+        constraintEqualToAnchor:scrollView.contentLayoutGuide.bottomAnchor],
+    [mainStackView.leadingAnchor
+        constraintEqualToAnchor:scrollView.frameLayoutGuide.leadingAnchor
+                       constant:kHorizontalPadding],
+    [mainStackView.trailingAnchor
+        constraintEqualToAnchor:scrollView.frameLayoutGuide.trailingAnchor
+                       constant:-kHorizontalPadding],
+
+    [incognitoContentStackView.widthAnchor
+        constraintEqualToAnchor:mainStackView.widthAnchor
+                       constant:-incognitoStackWidthOffset],
+
+    [primaryButton.leadingAnchor
+        constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor
+                       constant:kHorizontalPadding],
+    [primaryButton.trailingAnchor
+        constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
+                       constant:-kHorizontalPadding],
+    [primaryButton.bottomAnchor
+        constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor
+                       constant:-kVerticalSpacing],
+    [primaryButton.heightAnchor constraintEqualToConstant:kButtonHeight]
   ]];
 
-  [super viewDidLoad];
   [self setUpBottomSheetPresentationController];
   [self setUpBottomSheetDetents];
 }
 
+- (void)primaryButtonTapped {
+  [self.delegate didTapPrimaryActionButton];
+}
+
+- (void)learnMoreButtonPressed {
+  [self.URLLoaderDelegate loadURLInTab:GetLearnMoreIncognitoUrl()];
+}
+
 - (void)viewDidAppear:(BOOL)animated {
   __weak __typeof(self) weakSelf = self;
   [super viewDidAppear:animated];
@@ -105,20 +242,6 @@
                    completion:nil];
 }
 
-- (void)customizeSubtitle:(UITextView*)subtitle {
-  subtitle.textAlignment = NSTextAlignmentNatural;
-  subtitle.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
-}
-
-#pragma mark - ConfirmationAlertActionHandler
-
-- (void)confirmationAlertPrimaryAction {
-  // `Got it` button was clicked.
-  [self.delegate didTapPrimaryActionButton];
-}
-
-#pragma mark - Private
-
 // Configures the bottom sheet's presentation controller appearance.
 - (void)setUpBottomSheetPresentationController {
   self.modalPresentationStyle = UIModalPresentationFormSheet;
@@ -206,4 +329,39 @@
       CGAffineTransformMakeTranslation(translationX, translationY));
 }
 
+- (ChromeButton*)createPrimaryActionButton {
+  ChromeButton* primaryActionButton = PrimaryActionButton();
+  [primaryActionButton addTarget:self
+                          action:@selector(primaryButtonTapped)
+                forControlEvents:UIControlEventTouchUpInside];
+  SetConfigurationTitle(
+      primaryActionButton,
+      l10n_util::GetNSString(
+          IDS_IOS_YOUTUBE_INCOGNITO_SHEET_PRIMARY_BUTTON_TITLE));
+  primaryActionButton.accessibilityIdentifier =
+      kPrimaryActionAccessibilityIdentifier;
+
+  return primaryActionButton;
+}
+
+- (UILabel*)createTitleLabel {
+  UILabel* title = [[UILabel alloc] init];
+  title.numberOfLines = 0;
+  UIFontDescriptor* descriptor = [UIFontDescriptor
+      preferredFontDescriptorWithTextStyle:UIFontTextStyleTitle3];
+  UIFont* font = [UIFont systemFontOfSize:descriptor.pointSize
+                                   weight:UIFontWeightBold];
+  UIFontMetrics* fontMetrics =
+      [UIFontMetrics metricsForTextStyle:UIFontTextStyleTitle3];
+  title.font = [fontMetrics scaledFontForFont:font];
+  title.textColor = [UIColor colorNamed:kTextPrimaryColor];
+  title.text = l10n_util::GetNSString(IDS_IOS_YOUTUBE_INCOGNITO_SHEET_TITLE);
+  title.textAlignment = NSTextAlignmentCenter;
+  title.translatesAutoresizingMaskIntoConstraints = NO;
+  title.adjustsFontForContentSizeCategory = YES;
+  title.accessibilityIdentifier = kTitleAccessibilityIdentifier;
+  title.accessibilityTraits = UIAccessibilityTraitHeader;
+  return title;
+}
+
 @end
diff --git a/ios_internal b/ios_internal
index 3feaf40..6842118 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 3feaf40d64066b385cb8b00b672e1aafe6d83978
+Subproject commit 684211821a75efa2da3fad3310385a55308a3da6
diff --git a/media/audio/apple/glitch_helper.cc b/media/audio/apple/glitch_helper.cc
index f115809..8205038 100644
--- a/media/audio/apple/glitch_helper.cc
+++ b/media/audio/apple/glitch_helper.cc
@@ -47,7 +47,13 @@
     return;
   }
 
-  if (last_sample_time_) {
+  // mSampleTime can get reset, e.g. if the sample rate is changed on the
+  // speaker in the macOS settings, while capturing loopback. If the current
+  // mSampleTime is lower than the last sample time, we know it was reset
+  // and skip the glitch calculation. The current mSampleTime will still be
+  // saved, so we can restart the glitch calculations on the next call to
+  // `OnFramesReceived()`.
+  if (last_sample_time_ && timestamp.mSampleTime > last_sample_time_) {
     DCHECK_NE(0U, last_number_of_frames_);
     UInt32 sample_time_diff =
         static_cast<UInt32>(timestamp.mSampleTime - last_sample_time_);
diff --git a/remoting/host/desktop_resizer_win.cc b/remoting/host/desktop_resizer_win.cc
index db4f5723..5cffca9 100644
--- a/remoting/host/desktop_resizer_win.cc
+++ b/remoting/host/desktop_resizer_win.cc
@@ -256,12 +256,10 @@
 bool DesktopResizerWin::GetPrimaryDisplayMode(DWORD mode_number,
                                               DWORD flags,
                                               DEVMODE* mode) {
-  UNSAFE_TODO(memset(mode, 0, sizeof(DEVMODE)));
-  mode->dmSize = sizeof(DEVMODE);
-  if (!EnumDisplaySettingsEx(nullptr, mode_number, mode, flags)) {
-    return false;
-  }
-  return true;
+  *mode = {
+      .dmSize = sizeof(DEVMODE),
+  };
+  return EnumDisplaySettingsEx(nullptr, mode_number, mode, flags);
 }
 
 // static
diff --git a/remoting/protocol/validating_authenticator_unittest.cc b/remoting/protocol/validating_authenticator_unittest.cc
index 836f69f..9bb3689e 100644
--- a/remoting/protocol/validating_authenticator_unittest.cc
+++ b/remoting/protocol/validating_authenticator_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "remoting/protocol/validating_authenticator.h"
+
 #include <memory>
 #include <string>
 #include <tuple>
@@ -12,11 +14,11 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
+#include "base/test/gmock_callback_support.h"
 #include "base/test/mock_callback.h"
 #include "base/test/task_environment.h"
 #include "remoting/protocol/authenticator.h"
 #include "remoting/protocol/protocol_mock_objects.h"
-#include "remoting/protocol/validating_authenticator.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/libjingle_xmpp/xmllite/xmlelement.h"
@@ -28,30 +30,21 @@
 using testing::_;
 using testing::Return;
 
-typedef ValidatingAuthenticator::Result ValidationResult;
+using ValidationResult = ValidatingAuthenticator::Result;
 
 constexpr char kRemoteTestJid[] = "ficticious_jid_for_testing";
 
-// testing::InvokeArgument<N> does not work with base::OnceCallback, fortunately
-// gmock makes it simple to create action templates that do for the various
-// possible numbers of arguments.
-ACTION_TEMPLATE(InvokeCallbackArgument,
-                HAS_1_TEMPLATE_PARAMS(int, k),
-                AND_0_VALUE_PARAMS()) {
-  std::move(const_cast<base::OnceClosure&>(std::get<k>(args))).Run();
-}
-
 }  // namespace
 
 class ValidatingAuthenticatorTest : public testing::Test {
  public:
-  ValidatingAuthenticatorTest();
+  ValidatingAuthenticatorTest() = default;
 
   ValidatingAuthenticatorTest(const ValidatingAuthenticatorTest&) = delete;
   ValidatingAuthenticatorTest& operator=(const ValidatingAuthenticatorTest&) =
       delete;
 
-  ~ValidatingAuthenticatorTest() override;
+  ~ValidatingAuthenticatorTest() override = default;
 
   void ValidateCallback(const std::string& remote_jid,
                         ValidatingAuthenticator::ResultCallback callback);
@@ -85,10 +78,6 @@
   base::test::SingleThreadTaskEnvironment task_environment_;
 };
 
-ValidatingAuthenticatorTest::ValidatingAuthenticatorTest() = default;
-
-ValidatingAuthenticatorTest::~ValidatingAuthenticatorTest() = default;
-
 void ValidatingAuthenticatorTest::ValidateCallback(
     const std::string& remote_jid,
     ValidatingAuthenticator::ResultCallback callback) {
@@ -118,8 +107,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, ValidConnection_SingleMessage) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::ACCEPTED));
@@ -134,7 +122,7 @@
   // like it is waiting for a second message.
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
       .Times(2)
-      .WillRepeatedly(InvokeCallbackArgument<1>());
+      .WillRepeatedly(base::test::RunOnceCallbackRepeatedly<1>());
 
   EXPECT_CALL(*mock_authenticator_, state())
       .WillRepeatedly(Return(Authenticator::MESSAGE_READY));
@@ -153,7 +141,6 @@
   std::unique_ptr<jingle_xmpp::XmlElement> next_message(
       Authenticator::CreateEmptyAuthenticatorMessage());
   EXPECT_CALL(*mock_authenticator_, GetNextMessagePtr())
-      .Times(1)
       .WillOnce(Return(next_message.release()));
 
   validating_authenticator_->GetNextMessage();
@@ -172,8 +159,7 @@
   // This test simulates an authenticator which needs to send a message before
   // transitioning to the ACCEPTED state.
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillRepeatedly(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   EXPECT_CALL(*mock_authenticator_, state())
       .WillOnce(Return(Authenticator::MESSAGE_READY))
@@ -185,7 +171,6 @@
   std::unique_ptr<jingle_xmpp::XmlElement> next_message(
       Authenticator::CreateEmptyAuthenticatorMessage());
   EXPECT_CALL(*mock_authenticator_, GetNextMessagePtr())
-      .Times(1)
       .WillOnce(Return(next_message.release()));
 
   SendMessageAndWaitForCallback();
@@ -199,8 +184,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, ValidConnection_ErrorInvalidCredentials) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::ACCEPTED));
@@ -216,8 +200,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, ValidConnection_ErrorRejectedByUser) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::ACCEPTED));
@@ -234,8 +217,7 @@
 TEST_F(ValidatingAuthenticatorTest,
        ValidConnectionMessageWaiting_ErrorRejectedByUser) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   EXPECT_CALL(*mock_authenticator_, state())
       .WillOnce(Return(Authenticator::MESSAGE_READY))
@@ -260,8 +242,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, ValidConnection_ErrorTooManyConnections) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::ACCEPTED));
@@ -277,8 +258,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, InvalidConnection_InvalidCredentials) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::REJECTED));
@@ -297,8 +277,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, InvalidConnection_InvalidAccount) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::REJECTED));
@@ -317,8 +296,7 @@
 
 TEST_F(ValidatingAuthenticatorTest, InvalidConnection_InvalidState) {
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .Times(1)
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::REJECTED));
@@ -339,7 +317,7 @@
   validating_authenticator_->set_state_change_after_accepted_callback(
       state_changed_after_accepted.Get());
   EXPECT_CALL(*mock_authenticator_, ProcessMessage(_, _))
-      .WillOnce(InvokeCallbackArgument<1>());
+      .WillOnce(base::test::RunOnceCallback<1>());
 
   ON_CALL(*mock_authenticator_, state())
       .WillByDefault(Return(Authenticator::ACCEPTED));
diff --git a/services/viz/public/cpp/gpu/context_provider_command_buffer.cc b/services/viz/public/cpp/gpu/context_provider_command_buffer.cc
index 5c1e7ed..8a1ed9c 100644
--- a/services/viz/public/cpp/gpu/context_provider_command_buffer.cc
+++ b/services/viz/public/cpp/gpu/context_provider_command_buffer.cc
@@ -258,7 +258,6 @@
     // gpu::ContextSupport interface.
     auto gles2_impl = std::make_unique<gpu::gles2::GLES2Implementation>(
         gles2_helper.get(), /*share_group=*/nullptr, transfer_buffer.get(),
-        /*bind_generates_resource=*/false,
         attributes_.lose_context_when_out_of_memory, command_buffer_.get());
     bind_result_ = gles2_impl->Initialize(memory_limits_);
     if (bind_result_ != gpu::ContextResult::kSuccess) {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 55485ba..c0688a0 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -10791,24 +10791,6 @@
             ]
         }
     ],
-    "FeedHeaderRemoval": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "EnabledWithNoHeader",
-                    "params": {
-                        "treatment": "none"
-                    },
-                    "enable_features": [
-                        "FeedHeaderRemoval"
-                    ]
-                }
-            ]
-        }
-    ],
     "FeedLoadingPlaceholder": [
         {
             "platforms": [
@@ -26856,21 +26838,6 @@
             ]
         }
     ],
-    "WebFeedDeprecation": [
-        {
-            "platforms": [
-                "android"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "WebFeedKillSwitch"
-                    ]
-                }
-            ]
-        }
-    ],
     "WebGPU": [
         {
             "platforms": [
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index ff59e04a..d855140 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -310,7 +310,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/14028295/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/14030484/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/angle b/third_party/angle
index d82a582..2d28e33 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit d82a5821d42ff564e2e45f69ad99bcb997f5ef4e
+Subproject commit 2d28e33f7a654e8e0553c13bac09fa688b6c1acb
diff --git a/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom b/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom
index 0defc810..437d65c 100644
--- a/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom
+++ b/third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom
@@ -50,15 +50,6 @@
   int32? receive_buffer_size;
 
   network.mojom.DnsQueryType? dns_query_type;
-
-  // Controls how far your multicast packets can travel across a network.
-  // If value is not specified, 1 will be used.
-  uint8? multicast_time_to_live;
-
-  // Sets whether multicast packets sent from the host to
-  // the multicast group will be looped back to the host.
-  // If value is not specified, true will be used.
-  bool? multicast_loopback;
 };
 
 struct DirectBoundUDPSocketOptions {
@@ -79,20 +70,6 @@
   // IPv4/IPv6 connections. Leaving this value unset results in platform default
   // being applied (|true| on Windows, |false| on Posix).
   bool? ipv6_only;
-
-  // Allows reusing port and address for multicast sockets.
-  // SO_REUSEADDR / SO_REUSEPORT in unix.
-  // If value is not specified, false will be used.
-  bool? multicast_allow_address_sharing;
-
-  // Controls how far your multicast packets can travel across a network.
-  // If value is not specified, 1 will be used.
-  uint8? multicast_time_to_live;
-
-  // Sets whether multicast packets sent from the host to
-  // the multicast group will be looped back to the host.
-  // If value is not specified, true will be used.
-  bool? multicast_loopback;
 };
 
 struct DirectTCPServerSocketOptions {
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index c1ee0c11..78a548d 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4962,6 +4962,7 @@
   kV8WasmCustomDescriptors = 5651,
   kSRIIntegrityAttributeOnInlineScript = 5652,
   kCredentialsGetImmediateMediationWithPasswordsOnly = 5653,
+  kCSSAtRuleRoute = 5654,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots. Also don't add extra
diff --git a/third_party/blink/renderer/DEPS b/third_party/blink/renderer/DEPS
index 5c82f95..122cdc8 100644
--- a/third_party/blink/renderer/DEPS
+++ b/third_party/blink/renderer/DEPS
@@ -15,6 +15,8 @@
     "+base/containers/contains.h",
     "+base/containers/cxx20_erase.h",
     "+base/containers/enum_set.h",
+    "+base/containers/fixed_flat_map.h",
+    "+base/containers/fixed_flat_set.h",
     "+base/containers/heap_array.h",
     "+base/containers/lru_cache.h",
     "+base/containers/span.h",
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni
index a908e15..15cf0298 100644
--- a/third_party/blink/renderer/bindings/generated_in_core.gni
+++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -882,6 +882,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_rgb.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_rotate.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_rotate.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_route_rule.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_route_rule.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_rule.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_rule.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_css_rule_list.cc",
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index acfbbcdb..81570df 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -3393,8 +3393,6 @@
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_tcp_socket.h",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_udp_socket.cc",
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_udp_socket.h",
-    "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_multicast_controller.cc",
-    "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_multicast_controller.h",
   ]
   generated_enumeration_sources_in_modules += [
     "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_socket_dns_query_type.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni
index 2d7b1e6..9ce0137 100644
--- a/third_party/blink/renderer/bindings/idl_in_core.gni
+++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -62,6 +62,7 @@
   "//third_party/blink/renderer/core/css/css_position_try_descriptors.idl",
   "//third_party/blink/renderer/core/css/css_position_try_rule.idl",
   "//third_party/blink/renderer/core/css/css_property_rule.idl",
+  "//third_party/blink/renderer/core/css/css_route_rule.idl",
   "//third_party/blink/renderer/core/css/css_rule.idl",
   "//third_party/blink/renderer/core/css/css_rule_list.idl",
   "//third_party/blink/renderer/core/css/css_scope_rule.idl",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni
index 6681097..f989217e 100644
--- a/third_party/blink/renderer/bindings/idl_in_modules.gni
+++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -1294,7 +1294,6 @@
     "//third_party/blink/renderer/modules/direct_sockets/tcp_socket.idl",
     "//third_party/blink/renderer/modules/direct_sockets/udp_message.idl",
     "//third_party/blink/renderer/modules/direct_sockets/udp_socket.idl",
-    "//third_party/blink/renderer/modules/direct_sockets/multicast_controller.idl",
   ]
 }
 
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 7dbb455..1c2fcec5 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -86,6 +86,7 @@
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/scheduler/public/event_loop.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -787,8 +788,9 @@
 
       DCHECK_EQ(V8AnimationPlayState::Enum::kRunning,
                 CalculateAnimationPlayState());
-      TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(
-          AnimationTraceCategories(), "Animation", this, "data",
+      TRACE_EVENT_INSTANT(
+          AnimationTraceCategories(), "Animation",
+          perfetto::Track::FromPointer(this), "data",
           [&](perfetto::TracedValue context) {
             inspector_animation_compositor_event::Data(
                 std::move(context), failure_reasons,
@@ -3384,23 +3386,25 @@
                      new_play_state == V8AnimationPlayState::Enum::kRunning;
 
     if (!was_active && is_active) {
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-          AnimationTraceCategories(), "Animation", this, "data",
-          [&](perfetto::TracedValue context) {
-            inspector_animation_event::Data(std::move(context), *this);
-          });
+      TRACE_EVENT_BEGIN(AnimationTraceCategories(), "Animation",
+                        perfetto::Track::FromPointer(this), "data",
+                        [&](perfetto::TracedValue context) {
+                          inspector_animation_event::Data(std::move(context),
+                                                          *this);
+                        });
     } else if (was_active && !is_active) {
-      TRACE_EVENT_NESTABLE_ASYNC_END1(
-          AnimationTraceCategories(), "Animation", this, "endData",
-          [&](perfetto::TracedValue context) {
+      TRACE_EVENT_END(
+          AnimationTraceCategories(), perfetto::Track::FromPointer(this),
+          "endData", [&](perfetto::TracedValue context) {
             inspector_animation_state_event::Data(std::move(context), *this);
           });
     } else {
-      TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(
-          AnimationTraceCategories(), "Animation", this, "data",
-          [&](perfetto::TracedValue context) {
-            inspector_animation_state_event::Data(std::move(context), *this);
-          });
+      TRACE_EVENT_INSTANT(AnimationTraceCategories(), "Animation",
+                          perfetto::Track::FromPointer(this), "data",
+                          [&](perfetto::TracedValue context) {
+                            inspector_animation_state_event::Data(
+                                std::move(context), *this);
+                          });
     }
   }
 }
diff --git a/third_party/blink/renderer/core/css/DEPS b/third_party/blink/renderer/core/css/DEPS
index 10d88aeb..1bf345b 100644
--- a/third_party/blink/renderer/core/css/DEPS
+++ b/third_party/blink/renderer/core/css/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-    "+base/containers/fixed_flat_map.h",
     "+base/cpu.h",
     "+ui/base/mojom/window_show_state.mojom-blink.h",
     "+ui/base/mojom/window_show_state.mojom-blink-forward.h",
diff --git a/third_party/blink/renderer/core/css/build.gni b/third_party/blink/renderer/core/css/build.gni
index 86f262a..ae986c5 100644
--- a/third_party/blink/renderer/core/css/build.gni
+++ b/third_party/blink/renderer/core/css/build.gni
@@ -290,6 +290,8 @@
   "css_revert_rule_value.h",
   "css_revert_value.cc",
   "css_revert_value.h",
+  "css_route_rule.cc",
+  "css_route_rule.h",
   "css_rule.cc",
   "css_rule.h",
   "css_rule_list.h",
diff --git a/third_party/blink/renderer/core/css/css_grouping_rule.h b/third_party/blink/renderer/core/css/css_grouping_rule.h
index ecaec88..1b7d783 100644
--- a/third_party/blink/renderer/core/css/css_grouping_rule.h
+++ b/third_party/blink/renderer/core/css/css_grouping_rule.h
@@ -136,6 +136,7 @@
       case CSSRule::kLayerBlockRule:
       case CSSRule::kMixinRule:
       case CSSRule::kPageRule:
+      case CSSRule::kRouteRule:
       case CSSRule::kScopeRule:
       case CSSRule::kStartingStyleRule:
         return true;
diff --git a/third_party/blink/renderer/core/css/css_route_rule.cc b/third_party/blink/renderer/core/css/css_route_rule.cc
new file mode 100644
index 0000000..ce91770
--- /dev/null
+++ b/third_party/blink/renderer/core/css/css_route_rule.cc
@@ -0,0 +1,32 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/core/css/css_route_rule.h"
+
+#include "third_party/blink/renderer/core/css/style_rule.h"
+
+namespace blink {
+
+CSSRouteRule::CSSRouteRule(StyleRuleRoute* route_rule, CSSStyleSheet* parent)
+    : CSSConditionRule(route_rule, parent), route_rule_(route_rule) {}
+
+CSSRouteRule::~CSSRouteRule() = default;
+
+String CSSRouteRule::cssText() const {
+  // TODO(crbug.com/436805487): Implement this.
+  NOTREACHED() << "Not yet implemented.";
+}
+
+void CSSRouteRule::Reattach(StyleRuleBase* rule) {
+  DCHECK(rule);
+  route_rule_ = To<StyleRuleRoute>(rule);
+  CSSConditionRule::Reattach(rule);
+}
+
+void CSSRouteRule::Trace(Visitor* visitor) const {
+  visitor->Trace(route_rule_);
+  CSSConditionRule::Trace(visitor);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_route_rule.h b/third_party/blink/renderer/core/css/css_route_rule.h
new file mode 100644
index 0000000..b1cd62b
--- /dev/null
+++ b/third_party/blink/renderer/core/css/css_route_rule.h
@@ -0,0 +1,44 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_ROUTE_RULE_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_ROUTE_RULE_H_
+
+#include "third_party/blink/renderer/core/css/css_condition_rule.h"
+#include "third_party/blink/renderer/platform/heap/member.h"
+#include "third_party/blink/renderer/platform/wtf/casting.h"
+
+namespace blink {
+
+class CSSStyleSheet;
+class StyleRuleRoute;
+
+class CORE_EXPORT CSSRouteRule final : public CSSConditionRule {
+  DEFINE_WRAPPERTYPEINFO();
+
+ public:
+  CSSRouteRule(StyleRuleRoute*, CSSStyleSheet*);
+  ~CSSRouteRule() override;
+
+  String cssText() const override;
+  void Reattach(StyleRuleBase*) override;
+
+  void Trace(Visitor*) const override;
+
+ private:
+  CSSRule::Type GetType() const override { return kRouteRule; }
+
+  Member<StyleRuleRoute> route_rule_;
+};
+
+template <>
+struct DowncastTraits<CSSRouteRule> {
+  static bool AllowFrom(const CSSRule& rule) {
+    return rule.GetType() == CSSRule::kRouteRule;
+  }
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_CSS_ROUTE_RULE_H_
diff --git a/third_party/blink/renderer/core/css/css_route_rule.idl b/third_party/blink/renderer/core/css/css_route_rule.idl
new file mode 100644
index 0000000..fc18fb1
--- /dev/null
+++ b/third_party/blink/renderer/core/css/css_route_rule.idl
@@ -0,0 +1,8 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// TODO(crbug.com/436805487): Link to spec, once it surfaces.
+
+[Exposed=Window, RuntimeEnabled=RouteMatching]
+interface CSSRouteRule : CSSConditionRule {};
diff --git a/third_party/blink/renderer/core/css/css_rule.h b/third_party/blink/renderer/core/css/css_rule.h
index a1c4117..1cfadcc 100644
--- a/third_party/blink/renderer/core/css/css_rule.h
+++ b/third_party/blink/renderer/core/css/css_rule.h
@@ -86,6 +86,7 @@
     kNestedDeclarationsRule,
     kPositionTryRule,
     kPropertyRule,
+    kRouteRule,
     kScopeRule,
     kStartingStyleRule,
     kViewTransitionRule,
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.cc b/third_party/blink/renderer/core/css/media_query_evaluator.cc
index c95fc0e..8634b6b 100644
--- a/third_party/blink/renderer/core/css/media_query_evaluator.cc
+++ b/third_party/blink/renderer/core/css/media_query_evaluator.cc
@@ -137,6 +137,13 @@
   visitor->Trace(media_values_);
 }
 
+const Document* MediaQueryEvaluator::GetDocument() const {
+  if (!media_values_) {
+    return nullptr;
+  }
+  return media_values_->GetDocument();
+}
+
 const String MediaQueryEvaluator::MediaType() const {
   // If a static mediaType was given by the constructor, we use it here.
   if (!media_type_.empty()) {
diff --git a/third_party/blink/renderer/core/css/media_query_evaluator.h b/third_party/blink/renderer/core/css/media_query_evaluator.h
index e0bdbeb1..8bad8862 100644
--- a/third_party/blink/renderer/core/css/media_query_evaluator.h
+++ b/third_party/blink/renderer/core/css/media_query_evaluator.h
@@ -39,6 +39,7 @@
 namespace blink {
 
 class CSSValue;
+class Document;
 class LocalFrame;
 class MediaQuery;
 class MediaQueryExpNode;
@@ -85,6 +86,8 @@
 
   const MediaValues& GetMediaValues() const { return *media_values_; }
 
+  const Document* GetDocument() const;
+
   bool MediaTypeMatch(const String& media_type_to_match) const;
 
   // Evaluates a list of media queries.
diff --git a/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc b/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc
index e84398a..050b7df 100644
--- a/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/at_rule_descriptor_parser.cc
@@ -296,6 +296,7 @@
     case StyleRule::kMedia:
     case StyleRule::kPage:
     case StyleRule::kPageMargin:
+    case StyleRule::kRoute:
     case StyleRule::kKeyframes:
     case StyleRule::kKeyframe:
     case StyleRule::kFontFeatureValues:
diff --git a/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc b/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc
index 9b7694cf..e5f1c0f4 100644
--- a/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc
+++ b/third_party/blink/renderer/core/css/parser/css_at_rule_id.cc
@@ -71,6 +71,9 @@
   if (EqualIgnoringASCIICase(name, "property")) {
     return CSSAtRuleID::kCSSAtRuleProperty;
   }
+  if (EqualIgnoringASCIICase(name, "route")) {
+    return CSSAtRuleID::kCSSAtRuleRoute;
+  }
   if (EqualIgnoringASCIICase(name, "container")) {
     return CSSAtRuleID::kCSSAtRuleContainer;
   }
@@ -191,6 +194,8 @@
       return "@position-try";
     case CSSAtRuleID::kCSSAtRuleProperty:
       return "@property";
+    case CSSAtRuleID::kCSSAtRuleRoute:
+      return "@route";
     case CSSAtRuleID::kCSSAtRuleContainer:
       return "@container";
     case CSSAtRuleID::kCSSAtRuleCounterStyle:
@@ -314,6 +319,8 @@
       return WebFeature::kCSSAtRulePageMargin;
     case CSSAtRuleID::kCSSAtRuleProperty:
       return WebFeature::kCSSAtRuleProperty;
+    case CSSAtRuleID::kCSSAtRuleRoute:
+      return WebFeature::kCSSAtRuleRoute;
     case CSSAtRuleID::kCSSAtRuleContainer:
       return WebFeature::kCSSAtRuleContainer;
     case CSSAtRuleID::kCSSAtRuleCounterStyle:
diff --git a/third_party/blink/renderer/core/css/parser/css_at_rule_id.h b/third_party/blink/renderer/core/css/parser/css_at_rule_id.h
index d630fbe..ac9892ce 100644
--- a/third_party/blink/renderer/core/css/parser/css_at_rule_id.h
+++ b/third_party/blink/renderer/core/css/parser/css_at_rule_id.h
@@ -25,6 +25,7 @@
   kCSSAtRulePage,
   kCSSAtRulePositionTry,
   kCSSAtRuleProperty,
+  kCSSAtRuleRoute,
   kCSSAtRuleContainer,
   kCSSAtRuleCounterStyle,
   kCSSAtRuleScope,
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
index 91ff67f..1fd11d7 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.cc
@@ -898,6 +898,8 @@
       return ConsumePageRule(stream);
     case CSSAtRuleID::kCSSAtRuleProperty:
       return ConsumePropertyRule(stream);
+    case CSSAtRuleID::kCSSAtRuleRoute:
+      return ConsumeRouteRule(stream, nesting_type, parent_rule_for_nesting);
     case CSSAtRuleID::kCSSAtRuleScope:
       return ConsumeScopeRule(stream, nesting_type, parent_rule_for_nesting);
     case CSSAtRuleID::kCSSAtRuleCounterStyle:
@@ -1891,6 +1893,40 @@
   return rule;
 }
 
+StyleRuleRoute* CSSParserImpl::ConsumeRouteRule(
+    CSSParserTokenStream& stream,
+    CSSNestingType nesting_type,
+    StyleRule* parent_rule_for_nesting) {
+  // Parse the prelude.
+  wtf_size_t prelude_offset_start = stream.LookAheadOffset();
+  const CSSParserToken& name_token = stream.Peek();
+  String name = name_token.Value().ToString();
+  stream.ConsumeIncludingWhitespace();
+  wtf_size_t prelude_offset_end = stream.LookAheadOffset();
+  if (!ConsumeEndOfPreludeForAtRuleWithBlock(stream,
+                                             CSSAtRuleID::kCSSAtRuleRoute)) {
+    return nullptr;
+  }
+
+  // Parse the body.
+  CSSParserTokenStream::BlockGuard guard(stream);
+  if (observer_) {
+    observer_->StartRuleHeader(StyleRule::kRoute, prelude_offset_start);
+    observer_->EndRuleHeader(prelude_offset_end);
+    observer_->StartRuleBody(stream.Offset());
+  }
+
+  HeapVector<Member<StyleRuleBase>, 4> rules;
+  ConsumeRuleListOrNestedDeclarationList(stream, nesting_type,
+                                         parent_rule_for_nesting, &rules);
+
+  if (observer_) {
+    observer_->EndRuleBody(stream.Offset());
+  }
+
+  return MakeGarbageCollected<StyleRuleRoute>(name, std::move(rules));
+}
+
 StyleRuleCounterStyle* CSSParserImpl::ConsumeCounterStyleRule(
     CSSParserTokenStream& stream) {
   // Parse the prelude.
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_impl.h b/third_party/blink/renderer/core/css/parser/css_parser_impl.h
index 2b8639d..a78df3c 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_impl.h
+++ b/third_party/blink/renderer/core/css/parser/css_parser_impl.h
@@ -48,6 +48,7 @@
 class StyleRulePage;
 class StyleRulePositionTry;
 class StyleRuleProperty;
+class StyleRuleRoute;
 class StyleRuleSupports;
 class StyleSheetContents;
 class Element;
@@ -80,6 +81,7 @@
           CSSAtRuleID::kCSSAtRulePage,
           CSSAtRuleID::kCSSAtRulePositionTry,
           CSSAtRuleID::kCSSAtRuleProperty,
+          CSSAtRuleID::kCSSAtRuleRoute,
           CSSAtRuleID::kCSSAtRuleContainer,
           CSSAtRuleID::kCSSAtRuleCounterStyle,
           CSSAtRuleID::kCSSAtRuleScope,
@@ -143,6 +145,7 @@
       CSSAtRuleID::kCSSAtRuleMedia,
       CSSAtRuleID::kCSSAtRuleSupports,
       CSSAtRuleID::kCSSAtRuleContainer,
+      CSSAtRuleID::kCSSAtRuleRoute,
   };
 
   // Rules that are valid when nested within a style rule.
@@ -314,6 +317,9 @@
                                            CSSParserTokenStream&);
   StyleRulePage* ConsumePageRule(CSSParserTokenStream&);
   StyleRuleProperty* ConsumePropertyRule(CSSParserTokenStream&);
+  StyleRuleRoute* ConsumeRouteRule(CSSParserTokenStream&,
+                                   CSSNestingType,
+                                   StyleRule* parent_rule_for_nesting);
   StyleRuleCounterStyle* ConsumeCounterStyleRule(CSSParserTokenStream&);
   StyleRuleBase* ConsumeScopeRule(CSSParserTokenStream&,
                                   CSSNestingType,
diff --git a/third_party/blink/renderer/core/css/parser/css_supports_parser.cc b/third_party/blink/renderer/core/css/parser/css_supports_parser.cc
index 90c7d82..f25123c0 100644
--- a/third_party/blink/renderer/core/css/parser/css_supports_parser.cc
+++ b/third_party/blink/renderer/core/css/parser/css_supports_parser.cc
@@ -259,6 +259,9 @@
     case CSSAtRuleID::kCSSAtRuleProperty:
       rule_type = StyleRule::kProperty;
       break;
+    case CSSAtRuleID::kCSSAtRuleRoute:
+      rule_type = StyleRule::kRoute;
+      break;
     case CSSAtRuleID::kCSSAtRuleScope:
       rule_type = StyleRule::kScope;
       break;
diff --git a/third_party/blink/renderer/core/css/resolver/style_cascade.cc b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
index bfe98f2..c3fb81c 100644
--- a/third_party/blink/renderer/core/css/resolver/style_cascade.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_cascade.cc
@@ -2021,6 +2021,10 @@
         FlattenFunctionBody(*container_rule, function_tree_scope, result,
                             locals);
       }
+    } else if (auto* route_rule = DynamicTo<StyleRuleRoute>(child.Get())) {
+      // TODO(crbug.com/431374376): Implement
+      (void)route_rule;
+      NOTREACHED() << "Not yet implemented.";
     }
   }
 }
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index 9d1a3ea..dd56fe0 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -41,6 +41,7 @@
 #include "third_party/blink/renderer/core/css/css_font_selector.h"
 #include "third_party/blink/renderer/core/css/css_selector.h"
 #include "third_party/blink/renderer/core/css/css_selector_list.h"
+#include "third_party/blink/renderer/core/css/media_values.h"
 #include "third_party/blink/renderer/core/css/robin_hood_map-inl.h"
 #include "third_party/blink/renderer/core/css/seeker.h"
 #include "third_party/blink/renderer/core/css/selector_checker-inl.h"
@@ -49,11 +50,13 @@
 #include "third_party/blink/renderer/core/css/style_rule_import.h"
 #include "third_party/blink/renderer/core/css/style_rule_nested_declarations.h"
 #include "third_party/blink/renderer/core/css/style_sheet_contents.h"
+#include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/html/shadow/shadow_element_names.h"
 #include "third_party/blink/renderer/core/html/shadow/shadow_element_utils.h"
 #include "third_party/blink/renderer/core/html/track/text_track_cue.h"
 #include "third_party/blink/renderer/core/html_names.h"
 #include "third_party/blink/renderer/core/inspector/invalidation_set_to_selector_map.h"
+#include "third_party/blink/renderer/core/route_matching/route_map.h"
 #include "third_party/blink/renderer/core/style/computed_style_constants.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/weborigin/security_origin.h"
@@ -880,6 +883,11 @@
   page_rules_.push_back(rule);
 }
 
+void RuleSet::AddRouteRule(StyleRuleRoute* rule) {
+  need_compaction_ = true;
+  route_rules_.push_back(rule);
+}
+
 void RuleSet::AddFontFaceRule(StyleRuleFontFace* rule) {
   need_compaction_ = true;
   font_face_rules_.push_back(rule);
@@ -942,6 +950,15 @@
     } else if (auto* page_rule = DynamicTo<StyleRulePage>(rule)) {
       page_rule->SetCascadeLayer(cascade_layer);
       AddPageRule(page_rule);
+    } else if (auto* route_rule = DynamicTo<StyleRuleRoute>(rule)) {
+      const Document* document = medium.GetMediaValues().GetDocument();
+      if (const RouteMap* route_map = RouteMap::Get(document)) {
+        if (route_map->MatchesRoute(document->Url(), route_rule->GetName())) {
+          AddChildRules(parent_rule, route_rule->ChildRules(), medium, mixins,
+                        add_rule_flags, container_query, cascade_layer,
+                        style_scope, apply_mixins_stack);
+        }
+      }
     } else if (auto* media_rule = DynamicTo<StyleRuleMedia>(rule)) {
       if (MatchMediaForAddRules(medium, media_rule->MediaQueries())) {
         AddChildRules(parent_rule, media_rule->ChildRules(), medium, mixins,
@@ -1133,6 +1150,14 @@
     }
   }
 
+  const Document* document = medium.GetDocument();
+  if (const RouteMap* route_map = RouteMap::Get(document)) {
+    // In case there are multiple style sheets, we only need to do this once:
+    if (active_routes_.empty()) {
+      active_routes_ = route_map->GetActiveRoutes(document->Url());
+    }
+  }
+
   InvalidationSetToSelectorMap::StyleSheetContentsScope contents_scope(sheet);
   ApplyMixinsStack apply_mixins_stack;
   AddChildRules(/*parent_rule=*/nullptr, sheet->ChildRules(), medium, mixins,
@@ -1669,6 +1694,20 @@
   return evaluator.DidResultsChange(media_query_set_results_);
 }
 
+bool RuleSet::DidRoutesChange(const Document* document) const {
+  if (!document) {
+    return false;
+  }
+  if (const RouteMap* route_map = RouteMap::Get(document)) {
+    HashSet<String> current_routes =
+        route_map->GetActiveRoutes(document->Url());
+    if (current_routes != active_routes_) {
+      return true;
+    }
+  }
+  return false;
+}
+
 const CascadeLayer* RuleSet::GetLayerForTest(const RuleData& rule) const {
   if (!layer_intervals_.size() ||
       layer_intervals_[0].start_position > rule.GetPosition()) {
@@ -1715,6 +1754,7 @@
   visitor->Trace(view_transition_rules_);
   visitor->Trace(keyframes_rules_);
   visitor->Trace(property_rules_);
+  visitor->Trace(route_rules_);
   visitor->Trace(counter_style_rules_);
   visitor->Trace(position_try_rules_);
   visitor->Trace(function_rules_);
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h
index 3612aaa..4e44942 100644
--- a/third_party/blink/renderer/core/css/rule_set.h
+++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -500,6 +500,9 @@
   const HeapVector<Member<StyleRulePage>>& PageRules() const {
     return page_rules_;
   }
+  const HeapVector<Member<StyleRuleRoute>>& RouteRules() const {
+    return route_rules_;
+  }
   const HeapVector<Member<StyleRuleFontFace>>& FontFaceRules() const {
     return font_face_rules_;
   }
@@ -593,6 +596,8 @@
            based_on_mixin_generation_ != current_mixin_generation;
   }
 
+  bool DidRoutesChange(const Document*) const;
+
   // We use a vector of Interval<T> to represent that rules with positions
   // between start_position (inclusive) and the next Interval<T>'s
   // start_position (exclusive) share some property:
@@ -652,6 +657,7 @@
   void AddToRuleSet(const AtomicString& key, RuleMap&, const RuleData&);
   void AddToRuleSet(HeapVector<RuleData>&, const RuleData&);
   void AddPageRule(StyleRulePage*);
+  void AddRouteRule(StyleRuleRoute*);
   void AddFontFaceRule(StyleRuleFontFace*);
   void AddKeyframesRule(StyleRuleKeyframes*);
   void AddPropertyRule(StyleRuleProperty*);
@@ -776,6 +782,7 @@
   HeapVector<RuleData> root_element_rules_;
   RuleFeatureSet features_;
   HeapVector<Member<StyleRulePage>> page_rules_;
+  HeapVector<Member<StyleRuleRoute>> route_rules_;
   HeapVector<Member<StyleRuleFontFace>> font_face_rules_;
   HeapVector<Member<StyleRuleFontPaletteValues>> font_palette_values_rules_;
   HeapVector<Member<StyleRuleFontFeatureValues>> font_feature_values_rules_;
@@ -786,6 +793,7 @@
   HeapVector<Member<StyleRulePositionTry>> position_try_rules_;
   HeapVector<MediaQuerySetResult> media_query_set_results_;
   HeapVector<Member<StyleRuleFunction>> function_rules_;
+  HashSet<String> active_routes_;
 
   // Whether there is a ruleset bucket for rules with a selector on
   // the style attribute (which is rare, but allowed). If so, the caller
diff --git a/third_party/blink/renderer/core/css/style_engine.h b/third_party/blink/renderer/core/css/style_engine.h
index 123d5d3..24fbf29 100644
--- a/third_party/blink/renderer/core/css/style_engine.h
+++ b/third_party/blink/renderer/core/css/style_engine.h
@@ -770,6 +770,10 @@
   void RevisitStyleSheetForInspector(StyleSheetContents* contents,
                                      const RuleFeatureSet* features) const;
 
+  // Call when @route rules may need to be re-evaluated, because the current URL
+  // has changed.
+  void RoutesMayHaveChanged() { SetNeedsActiveStyleUpdate(GetDocument()); }
+
  private:
   void UpdateCounters(const Element& element,
                       CountersAttachmentContext& context);
diff --git a/third_party/blink/renderer/core/css/style_rule.cc b/third_party/blink/renderer/core/css/style_rule.cc
index c33d22d6..00b5b08 100644
--- a/third_party/blink/renderer/core/css/style_rule.cc
+++ b/third_party/blink/renderer/core/css/style_rule.cc
@@ -47,6 +47,7 @@
 #include "third_party/blink/renderer/core/css/css_page_rule.h"
 #include "third_party/blink/renderer/core/css/css_position_try_rule.h"
 #include "third_party/blink/renderer/core/css/css_property_rule.h"
+#include "third_party/blink/renderer/core/css/css_route_rule.h"
 #include "third_party/blink/renderer/core/css/css_scope_rule.h"
 #include "third_party/blink/renderer/core/css/css_starting_style_rule.h"
 #include "third_party/blink/renderer/core/css/css_style_rule.h"
@@ -118,6 +119,9 @@
     case kProperty:
       To<StyleRuleProperty>(this)->TraceAfterDispatch(visitor);
       return;
+    case kRoute:
+      To<StyleRuleRoute>(this)->TraceAfterDispatch(visitor);
+      return;
     case kFontFace:
       To<StyleRuleFontFace>(this)->TraceAfterDispatch(visitor);
       return;
@@ -214,6 +218,9 @@
     case kProperty:
       To<StyleRuleProperty>(this)->~StyleRuleProperty();
       return;
+    case kRoute:
+      To<StyleRuleRoute>(this)->~StyleRuleRoute();
+      return;
     case kFontFace:
       To<StyleRuleFontFace>(this)->~StyleRuleFontFace();
       return;
@@ -303,6 +310,8 @@
       return To<StyleRulePageMargin>(this)->Copy();
     case kProperty:
       return To<StyleRuleProperty>(this)->Copy();
+    case kRoute:
+      return To<StyleRuleRoute>(this)->Copy();
     case kFontFace:
       return To<StyleRuleFontFace>(this)->Copy();
     case kFontPaletteValues:
@@ -378,6 +387,10 @@
       rule = MakeGarbageCollected<CSSMarginRule>(To<StyleRulePageMargin>(self),
                                                  parent_sheet);
       break;
+    case kRoute:
+      rule = MakeGarbageCollected<CSSRouteRule>(To<StyleRuleRoute>(self),
+                                                parent_sheet);
+      break;
     case kProperty:
       rule = MakeGarbageCollected<CSSPropertyRule>(To<StyleRuleProperty>(self),
                                                    parent_sheet);
@@ -675,6 +688,8 @@
       return RenestGroupRule(To<StyleRuleContainer>(this), new_parent);
     case kMedia:
       return RenestGroupRule(To<StyleRuleMedia>(this), new_parent);
+    case kRoute:
+      return RenestGroupRule(To<StyleRuleRoute>(this), new_parent);
     case kSupports:
       return RenestGroupRule(To<StyleRuleSupports>(this), new_parent);
     case kStartingStyle: {
@@ -1049,6 +1064,14 @@
   StyleRuleCondition::TraceAfterDispatch(visitor);
 }
 
+StyleRuleRoute::StyleRuleRoute(const String& name,
+                               HeapVector<Member<StyleRuleBase>> child_rules)
+    : StyleRuleCondition(kRoute, std::move(child_rules)), name_(name) {}
+
+StyleRuleRoute::StyleRuleRoute(const StyleRuleRoute& other,
+                               HeapVector<Member<StyleRuleBase>> child_rules)
+    : StyleRuleCondition(kRoute, std::move(child_rules)), name_(other.name_) {}
+
 StyleRuleStartingStyle::StyleRuleStartingStyle(
     HeapVector<Member<StyleRuleBase>> rules)
     : StyleRuleGroup(kStartingStyle, std::move(rules)) {}
diff --git a/third_party/blink/renderer/core/css/style_rule.h b/third_party/blink/renderer/core/css/style_rule.h
index b289c7a5..48673fa 100644
--- a/third_party/blink/renderer/core/css/style_rule.h
+++ b/third_party/blink/renderer/core/css/style_rule.h
@@ -63,6 +63,7 @@
     kPage,
     kPageMargin,
     kProperty,
+    kRoute,
     kKeyframes,
     kKeyframe,
     kLayerBlock,
@@ -118,6 +119,7 @@
   bool IsPageRule() const { return GetType() == kPage; }
   bool IsPageRuleMargin() const { return GetType() == kPageMargin; }
   bool IsPropertyRule() const { return GetType() == kProperty; }
+  bool IsRouteRule() const { return GetType() == kRoute; }
   bool IsStyleRule() const { return GetType() == kStyle; }
   bool IsScopeRule() const { return GetType() == kScope; }
   bool IsSupportsRule() const { return GetType() == kSupports; }
@@ -600,6 +602,27 @@
   Member<ContainerQuery> container_query_;
 };
 
+class StyleRuleRoute : public StyleRuleCondition {
+ public:
+  StyleRuleRoute(const String& name,
+                 HeapVector<Member<StyleRuleBase>> child_rules);
+  StyleRuleRoute(const StyleRuleRoute&) = default;
+  StyleRuleRoute(const StyleRuleRoute&, HeapVector<Member<StyleRuleBase>>);
+
+  StyleRuleRoute* Copy() const {
+    return MakeGarbageCollected<StyleRuleRoute>(*this);
+  }
+
+  const String& GetName() const { return name_; }
+
+  void TraceAfterDispatch(Visitor* v) const {
+    StyleRuleCondition::TraceAfterDispatch(v);
+  }
+
+ private:
+  String name_;
+};
+
 class StyleRuleStartingStyle : public StyleRuleGroup {
  public:
   explicit StyleRuleStartingStyle(HeapVector<Member<StyleRuleBase>> rules);
@@ -819,6 +842,13 @@
 };
 
 template <>
+struct DowncastTraits<StyleRuleRoute> {
+  static bool AllowFrom(const StyleRuleBase& rule) {
+    return rule.IsRouteRule();
+  }
+};
+
+template <>
 struct DowncastTraits<StyleRuleScope> {
   static bool AllowFrom(const StyleRuleBase& rule) {
     return rule.IsScopeRule();
diff --git a/third_party/blink/renderer/core/css/style_sheet_contents.cc b/third_party/blink/renderer/core/css/style_sheet_contents.cc
index 8e3af708..0f9e6434 100644
--- a/third_party/blink/renderer/core/css/style_sheet_contents.cc
+++ b/third_party/blink/renderer/core/css/style_sheet_contents.cc
@@ -671,6 +671,7 @@
       case StyleRuleBase::kContainer:
       case StyleRuleBase::kMedia:
       case StyleRuleBase::kLayerBlock:
+      case StyleRuleBase::kRoute:
       case StyleRuleBase::kScope:
       case StyleRuleBase::kStartingStyle:
         if (ChildRulesHaveFailedOrCanceledSubresources(
@@ -913,7 +914,8 @@
       rule_set_diff_->MarkUnrepresentable();
     }
   }
-  if (rule_set_ && rule_set_->DidMediaQueryResultsChange(medium)) {
+  if (rule_set_ && (rule_set_->DidMediaQueryResultsChange(medium) ||
+                    rule_set_->DidRoutesChange(medium.GetDocument()))) {
     rule_set_ = nullptr;
   }
   if (rule_set_diff_) {
diff --git a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
index 44fe911..b9432b99 100644
--- a/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
+++ b/third_party/blink/renderer/core/editing/finder/find_task_controller.cc
@@ -19,6 +19,7 @@
 #include "third_party/blink/renderer/core/scheduler/scripted_idle_task_controller.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/instrumentation/histogram.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -217,9 +218,6 @@
     int identifier,
     const String& search_text,
     const mojom::blink::FindOptions& options) {
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "blink", "FindInPageRequest",
-      TRACE_ID_WITH_SCOPE("FindInPageRequest", identifier));
   DCHECK(!finding_in_progress_);
   DCHECK_EQ(current_find_identifier_, kInvalidFindIdentifier);
   // This is a brand new search, so we need to reset everything.
diff --git a/third_party/blink/renderer/core/frame/DEPS b/third_party/blink/renderer/core/frame/DEPS
index 9a5ea87..3345352 100644
--- a/third_party/blink/renderer/core/frame/DEPS
+++ b/third_party/blink/renderer/core/frame/DEPS
@@ -24,9 +24,6 @@
   "dom_timer_test\.cc": [
     "+base/test/scoped_command_line.h",
   ],
-  "dom_window\.cc" : [
-    "+base/containers/fixed_flat_map.h"
-  ],
   "frame_view\.cc": [
     "+ui/gfx/transform.h"
   ],
diff --git a/third_party/blink/renderer/core/frame/frame_serializer.cc b/third_party/blink/renderer/core/frame/frame_serializer.cc
index 3034f8a..e2c35cc 100644
--- a/third_party/blink/renderer/core/frame/frame_serializer.cc
+++ b/third_party/blink/renderer/core/frame/frame_serializer.cc
@@ -1215,6 +1215,7 @@
       case CSSRule::kNestedDeclarationsRule:
       case CSSRule::kMediaRule:
       case CSSRule::kMixinRule:
+      case CSSRule::kRouteRule:
       case CSSRule::kSupportsRule:
       case CSSRule::kContainerRule:
       case CSSRule::kLayerBlockRule:
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
index bfdbe2e..fd838577 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -159,6 +159,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-blink.h"
 #include "ui/base/mojom/menu_source_type.mojom-blink-forward.h"
 #include "ui/base/mojom/window_show_state.mojom-blink.h"
@@ -1055,8 +1056,8 @@
         html_element->IsPluginElement()) {
       mouse_capture_element_ = To<HTMLPlugInElement>(hit_node);
       SetMouseCapture(true);
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("input", "capturing mouse",
-                                        TRACE_ID_LOCAL(this));
+      TRACE_EVENT_BEGIN("input", "capturing mouse",
+                        perfetto::Track::FromPointer(this));
     }
   }
 
@@ -3244,8 +3245,7 @@
 }
 
 void WebFrameWidgetImpl::MouseCaptureLost() {
-  TRACE_EVENT_NESTABLE_ASYNC_END0("input", "capturing mouse",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("input", perfetto::Track::FromPointer(this));
   mouse_capture_element_ = nullptr;
 }
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
index 8df9909..6421fb111 100644
--- a/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_emulation_agent.cc
@@ -37,6 +37,7 @@
 #include "third_party/blink/renderer/platform/scheduler/public/thread_cpu_throttler.h"
 #include "third_party/blink/renderer/platform/scheduler/public/virtual_time_controller.h"
 #include "third_party/blink/renderer/platform/theme/web_theme_engine_helper.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace {
 enum DataSaverOverride {
@@ -587,9 +588,9 @@
       virtual_time_controller_.EnableVirtualTime(initial_time);
   virtual_time_controller_.SetVirtualTimePolicy(scheduler_policy);
   if (virtual_time_budget_ms.value_or(0) > 0) {
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("renderer.scheduler", "VirtualTimeBudget",
-                                      TRACE_ID_LOCAL(this), "budget",
-                                      virtual_time_budget_ms.value());
+    TRACE_EVENT_BEGIN("renderer.scheduler", "VirtualTimeBudget",
+                      perfetto::Track::FromPointer(this), "budget",
+                      virtual_time_budget_ms.value());
     const base::TimeDelta budget_amount =
         base::Milliseconds(virtual_time_budget_ms.value());
     virtual_time_controller_.GrantVirtualTimeBudget(
@@ -671,8 +672,7 @@
 }
 
 void InspectorEmulationAgent::VirtualTimeBudgetExpired() {
-  TRACE_EVENT_NESTABLE_ASYNC_END0("renderer.scheduler", "VirtualTimeBudget",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("renderer.scheduler", perfetto::Track::FromPointer(this));
   // Disregard the event if the agent is disabled. Another agent may take care
   // of pausing the time in case of an in-process frame swap.
   if (!enabled_) {
diff --git a/third_party/blink/renderer/core/layout/layout_theme_mac.mm b/third_party/blink/renderer/core/layout/layout_theme_mac.mm
index 1371ae2..05c95c2 100644
--- a/third_party/blink/renderer/core/layout/layout_theme_mac.mm
+++ b/third_party/blink/renderer/core/layout/layout_theme_mac.mm
@@ -35,12 +35,6 @@
 namespace blink {
 
 namespace {
-// For light mode the focus ring base color is #0067f47f and dark mode
-// #1aa9ff7f. These can be obtained through
-// `GetSystemColor(MacSystemColorID::kKeyboardFocusIndicator, color_scheme)`,
-// which gets it from NSColor::keyboardFocusIndicatorColor.
-constexpr SkColor4f kFocusRingBaseColorLight = {0, 0.403922, 0.956863, 1};
-constexpr SkColor4f kFocusRingBaseColorDark = {0.101961, 0.662745, 1, 1};
 
 // The focus ring colors used in web tests for light and dark mode.
 constexpr Color kDefaultFocusRingColorForTestsLight =
@@ -151,36 +145,23 @@
     return Color::FromRGBA(0x10, 0x10, 0x10, 0xFF);
   }
 
-  if (RuntimeEnabledFeatures::SystemDefaultAccentColorsEnabled()) {
-    // If a custom focus ring color has been set, use that one.
-    if (HasCustomFocusRingColor()) {
-      return GetCustomFocusRingColor(color_scheme);
-    }
-    // Otherwise, use the system-default color based on the color scheme.
-    auto focus_ring_base_color =
-        color_scheme == mojom::blink::ColorScheme::kDark
-            ? kFocusRingBaseColorDark
-            : kFocusRingBaseColorLight;
-    return Color::FromSkColor4f(
-        ui::NativeTheme::GetInstanceForWeb()->FocusRingColorForBaseColor(
-            focus_ring_base_color));
-  }
-
-  SkColor4f keyboard_focus_indicator =
-      GetSystemColor(MacSystemColorID::kKeyboardFocusIndicator, color_scheme)
-          .toSkColor4f();
-  Color focus_ring = Color::FromSkColor4f(
-      ui::NativeTheme::GetInstanceForWeb()->FocusRingColorForBaseColor(
-          keyboard_focus_indicator));
-
-  if (!HasCustomFocusRingColor()) {
-    return focus_ring;
-  }
-  // Use the custom focus ring color when the system accent color wasn't
-  // changed.
-  if (!IsAccentColorCustomized(color_scheme)) {
+  if (HasCustomFocusRingColor() &&
+      (RuntimeEnabledFeatures::SystemDefaultAccentColorsEnabled() ||
+       !IsAccentColorCustomized(color_scheme))) {
     return GetCustomFocusRingColor(color_scheme);
   }
+
+  Color focus_ring;
+  if (RuntimeEnabledFeatures::SystemDefaultAccentColorsEnabled()) {
+    focus_ring =
+        Color::FromSkColor(color_scheme == mojom::blink::ColorScheme::kDark
+                               ? SkColorSetRGB(0x1A, 0xA9, 0xFF)
+                               : SkColorSetRGB(0x00, 0x67, 0xF4));
+  } else {
+    focus_ring =
+        GetSystemColor(MacSystemColorID::kKeyboardFocusIndicator, color_scheme);
+  }
+  focus_ring.SetAlpha(166 / 255.0f);
   return focus_ring;
 }
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc
index f4b965f..ac6666c 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.cc
@@ -167,6 +167,16 @@
   scaled_font_ = ComputeNewScaledFontForStyle(*this, scaling_factor_);
 }
 
+float LayoutSVGInlineText::ComputeFontScale(const LayoutObject& layout_object) {
+  const ComputedStyle& style = layout_object.StyleRef();
+  if (style.GetFontDescription().TextRendering() == kGeometricPrecision) {
+    return 1;
+  }
+  const float scaling_factor =
+      SVGLayoutSupport::CalculateScreenFontSizeScalingFactor(&layout_object);
+  return !scaling_factor ? 1 : scaling_factor;
+}
+
 const Font* LayoutSVGInlineText::ComputeNewScaledFontForStyle(
     const LayoutObject& layout_object,
     float& scaling_factor) {
@@ -174,28 +184,19 @@
 
   // Alter font-size to the right on-screen value to avoid scaling the glyphs
   // themselves, except when GeometricPrecision is specified.
-  scaling_factor =
-      SVGLayoutSupport::CalculateScreenFontSizeScalingFactor(&layout_object);
-  if (!scaling_factor) {
-    scaling_factor = 1;
-    // This is a hack. TextDecorationInfo's constructor wants to compare
-    // Font objects _by pointer_ to verify that it's a true override;
-    // otherwise, it sets the underline the wrong place. So we need to
-    // give it a pointer that is distinct from style.GetFont(), even though
-    // it contains the same information.
-    return MakeGarbageCollected<Font>(*style.GetFont());
-  }
+  scaling_factor = ComputeFontScale(layout_object);
 
   const FontDescription& unscaled_font_description = style.GetFontDescription();
-  if (unscaled_font_description.TextRendering() == kGeometricPrecision)
-    scaling_factor = 1;
-
   Document& document = layout_object.GetDocument();
   float scaled_font_size = FontSizeFunctions::GetComputedSizeFromSpecifiedSize(
       &document, scaling_factor, unscaled_font_description.IsAbsoluteSize(),
       unscaled_font_description.SpecifiedSize(), kDoNotApplyMinimumForFontSize);
   if (scaled_font_size == unscaled_font_description.ComputedSize()) {
-    // See above.
+    // This is a hack. TextDecorationInfo's constructor wants to compare
+    // Font objects _by pointer_ to verify that it's a true override;
+    // otherwise, it sets the underline the wrong place. So we need to
+    // give it a pointer that is distinct from style.GetFont(), even though
+    // it contains the same information.
     return MakeGarbageCollected<Font>(*style.GetFont());
   }
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h
index c6ffd8a..943cd3c3 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_inline_text.h
@@ -47,6 +47,7 @@
     return *scaled_font_;
   }
   void UpdateScaledFont();
+  static float ComputeFontScale(const LayoutObject&);
   static const Font* ComputeNewScaledFontForStyle(const LayoutObject&,
                                                   float& scaling_factor);
 
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 24ca17c..70c03c9 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -80,6 +80,7 @@
 #include "third_party/blink/public/web/blink.h"
 #include "third_party/blink/public/web/web_navigation_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_controller.h"
+#include "third_party/blink/renderer/core/css/style_engine.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/document_init.h"
 #include "third_party/blink/renderer/core/dom/document_parser.h"
@@ -136,6 +137,7 @@
 #include "third_party/blink/renderer/core/performance_entry_names.h"
 #include "third_party/blink/renderer/core/permissions_policy/document_policy_parser.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
+#include "third_party/blink/renderer/core/route_matching/route_map.h"
 #include "third_party/blink/renderer/core/speculation_rules/auto_speculation_rules_config.h"
 #include "third_party/blink/renderer/core/speculation_rules/document_speculation_rules.h"
 #include "third_party/blink/renderer/core/speculation_rules/speculation_rule_set.h"
@@ -1194,6 +1196,19 @@
     heuristics->SameDocumentNavigationCommitted(new_url,
                                                 soft_navigation_context);
   }
+
+  // Notify the style engine that routes may have changed because of the URL
+  // change. The `frame_` check is needed, even though there's a check further
+  // up -- it may be reset after that check.
+  //
+  // See
+  // https://github.com/WICG/declarative-partial-updates#part-2-route-matching
+  if (frame_) {
+    Document* document = frame_->GetDocument();
+    if (document && RouteMap::Get(document)) {
+      document->GetStyleEngine().RoutesMayHaveChanged();
+    }
+  }
 }
 
 const KURL& DocumentLoader::UrlForHistory() const {
diff --git a/third_party/blink/renderer/core/loader/interactive_detector.cc b/third_party/blink/renderer/core/loader/interactive_detector.cc
index 44b835bf..c82e8ba 100644
--- a/third_party/blink/renderer/core/loader/interactive_detector.cc
+++ b/third_party/blink/renderer/core/loader/interactive_detector.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -253,28 +254,26 @@
 
     if (delay > kFirstInputDelayTraceEventThreshold) {
       // Emit a trace event to highlight long first input delays.
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
-          "latency", "Long First Input Delay",
-          TRACE_ID_WITH_SCOPE("Long First Input Delay",
-                              g_num_long_input_events),
-          event_timestamp);
-      TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
-          "latency", "Long First Input Delay",
-          TRACE_ID_WITH_SCOPE("Long First Input Delay",
-                              g_num_long_input_events),
-          event_timestamp + delay);
+      TRACE_EVENT_BEGIN("latency", "Long First Input Delay",
+                        perfetto::NamedTrack("Long First Input Delay",
+                                             g_num_long_input_events),
+                        event_timestamp);
+      TRACE_EVENT_END("latency",
+                      perfetto::NamedTrack("Long First Input Delay",
+                                           g_num_long_input_events),
+                      event_timestamp + delay);
       g_num_long_input_events++;
     }
   } else if (delay > kInputDelayTraceEventThreshold) {
     // Emit a trace event to highlight long input delays from second input and
     // onwards.
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
+    TRACE_EVENT_BEGIN(
         "latency", "Long Input Delay",
-        TRACE_ID_WITH_SCOPE("Long Input Delay", g_num_long_input_events),
+        perfetto::NamedTrack("Long Input Delay", g_num_long_input_events),
         event_timestamp);
-    TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
-        "latency", "Long Input Delay",
-        TRACE_ID_WITH_SCOPE("Long Input Delay", g_num_long_input_events),
+    TRACE_EVENT_END(
+        "latency",
+        perfetto::NamedTrack("Long Input Delay", g_num_long_input_events),
         event_timestamp + delay);
     // Apply metadata on stack samples.
     base::ApplyMetadataToPastSamples(
diff --git a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
index b9331e7..acb8857 100644
--- a/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
+++ b/third_party/blink/renderer/core/loader/prefetched_signed_exchange_manager.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -59,9 +60,9 @@
       : request_(request),
         task_runner_(std::move(task_runner)),
         throttles_(std::move(throttles)) {
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("loading",
-                                      "PrefetchedSignedExchangeLoader", this,
-                                      "url", request_.url.spec());
+    TRACE_EVENT_BEGIN("loading", "PrefetchedSignedExchangeLoader",
+                      perfetto::Track::FromPointer(this), "url",
+                      request_.url.spec());
   }
 
   PrefetchedSignedExchangeLoader(const PrefetchedSignedExchangeLoader&) =
@@ -70,8 +71,7 @@
       const PrefetchedSignedExchangeLoader&) = delete;
 
   ~PrefetchedSignedExchangeLoader() override {
-    TRACE_EVENT_NESTABLE_ASYNC_END0("loading", "PrefetchedSignedExchangeLoader",
-                                    this);
+    TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this));
   }
 
   base::WeakPtr<PrefetchedSignedExchangeLoader> GetWeakPtr() {
@@ -226,8 +226,8 @@
     : frame_(frame),
       alternative_resources_(std::move(alternative_resources)),
       prefetched_exchanges_map_(std::move(prefetched_exchanges_map)) {
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("loading",
-                                    "PrefetchedSignedExchangeManager", this);
+  TRACE_EVENT_BEGIN("loading", "PrefetchedSignedExchangeManager",
+                    perfetto::Track::FromPointer(this));
 }
 
 PrefetchedSignedExchangeManager::~PrefetchedSignedExchangeManager() {}
@@ -360,9 +360,8 @@
       loader->SetURLLoader(
           CreateDefaultURLLoader(loader->request(), loader->TakeThrottles()));
     }
-    TRACE_EVENT_NESTABLE_ASYNC_END2(
-        "loading", "PrefetchedSignedExchangeManager", this, "match_result",
-        "failure", "reason", failure_reason);
+    TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this),
+                    "match_result", "failure", "reason", failure_reason);
     return;
   }
   for (wtf_size_t i = 0; i < loaders_.size(); ++i) {
@@ -381,8 +380,8 @@
     loader->SetURLLoader(CreatePrefetchedSignedExchangeURLLoader(
         loader->request(), loader->TakeThrottles(), loader_factory.Unbind()));
   }
-  TRACE_EVENT_NESTABLE_ASYNC_END1("loading", "PrefetchedSignedExchangeManager",
-                                  this, "match_result", "success");
+  TRACE_EVENT_END("loading", perfetto::Track::FromPointer(this), "match_result",
+                  "success");
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/paint/text_painter.cc b/third_party/blink/renderer/core/paint/text_painter.cc
index 8719aa2..6d86ef0 100644
--- a/third_party/blink/renderer/core/paint/text_painter.cc
+++ b/third_party/blink/renderer/core/paint/text_painter.cc
@@ -173,12 +173,11 @@
       case SvgPaintMode::kText:
         stroke_scale_factor = state.InlineText().ScalingFactor();
         break;
-      case SvgPaintMode::kTextDecoration: {
-        LayoutSVGInlineText::ComputeNewScaledFontForStyle(layout_parent,
-                                                          stroke_scale_factor);
+      case SvgPaintMode::kTextDecoration:
+        stroke_scale_factor =
+            LayoutSVGInlineText::ComputeFontScale(layout_parent);
         DCHECK(stroke_scale_factor);
         break;
-      }
     }
   }
 
diff --git a/third_party/blink/renderer/core/paint/theme_painter_default.cc b/third_party/blink/renderer/core/paint/theme_painter_default.cc
index 4acf573..abd38ab 100644
--- a/third_party/blink/renderer/core/paint/theme_painter_default.cc
+++ b/third_party/blink/renderer/core/paint/theme_painter_default.cc
@@ -26,10 +26,12 @@
 
 #include <variant>
 
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
 #include "third_party/blink/public/platform/web_theme_engine.h"
 #include "third_party/blink/public/resources/grit/blink_image_resources.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/frame/local_frame_view.h"
+#include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/html/forms/html_input_element.h"
 #include "third_party/blink/renderer/core/html/forms/slider_thumb_element.h"
 #include "third_party/blink/renderer/core/html/forms/spin_button_element.h"
@@ -69,12 +71,21 @@
 }
 
 WebThemeEngine::State GetWebThemeState(const Element& element) {
-  if (element.IsDisabledFormControl())
+  if (element.IsDisabledFormControl()) {
     return WebThemeEngine::kStateDisabled;
-  if (element.IsActive())
+  }
+  if (element.IsActive()) {
     return WebThemeEngine::kStatePressed;
-  if (element.IsHovered())
-    return WebThemeEngine::kStateHover;
+  }
+  if (element.IsHovered()) {
+    // Don't draw a hovered state when the device does not have hover available.
+    if (const Settings* const settings = element.GetDocument().GetSettings();
+        !settings ||
+        (settings->GetAvailableHoverTypes() &
+         static_cast<int>(mojom::blink::HoverType::kHoverHoverType))) {
+      return WebThemeEngine::kStateHover;
+    }
+  }
 
   return WebThemeEngine::kStateNormal;
 }
diff --git a/third_party/blink/renderer/core/route_matching/route_map.cc b/third_party/blink/renderer/core/route_matching/route_map.cc
index a28e42c..579bacc6 100644
--- a/third_party/blink/renderer/core/route_matching/route_map.cc
+++ b/third_party/blink/renderer/core/route_matching/route_map.cc
@@ -17,16 +17,22 @@
 
 const char RouteMap::kSupplementName[] = "RouteMap";
 
-const RouteMap* RouteMap::Get(const Document& document) {
-  return Supplement<Document>::From<RouteMap>(document);
+const RouteMap* RouteMap::Get(const Document* document) {
+  if (!document) {
+    return nullptr;
+  }
+  return Supplement<Document>::From<RouteMap>(*document);
 }
 
-RouteMap* RouteMap::Get(Document& document) {
-  return Supplement<Document>::From<RouteMap>(document);
+RouteMap* RouteMap::Get(Document* document) {
+  if (!document) {
+    return nullptr;
+  }
+  return Supplement<Document>::From<RouteMap>(*document);
 }
 
 RouteMap& RouteMap::Ensure(Document& document) {
-  RouteMap* route_map = Get(document);
+  RouteMap* route_map = Get(&document);
   if (!route_map) {
     route_map = MakeGarbageCollected<RouteMap>(document);
     Supplement<Document>::ProvideTo<RouteMap>(document, route_map);
diff --git a/third_party/blink/renderer/core/route_matching/route_map.h b/third_party/blink/renderer/core/route_matching/route_map.h
index a0f5314..ac77ae9 100644
--- a/third_party/blink/renderer/core/route_matching/route_map.h
+++ b/third_party/blink/renderer/core/route_matching/route_map.h
@@ -62,9 +62,10 @@
   // For testing only.
   RouteMap();
 
-  // Supplement support:
-  static const RouteMap* Get(const Document&);
-  static RouteMap* Get(Document&);
+  // Supplement support. Document pointers may be null (in which case null will
+  // be returned).
+  static const RouteMap* Get(const Document*);
+  static RouteMap* Get(Document*);
   static RouteMap& Ensure(Document&);
 
   ParseResult ParseAndApplyRoutes(const String& route_map_text);
diff --git a/third_party/blink/renderer/core/scroll/scrollbar.cc b/third_party/blink/renderer/core/scroll/scrollbar.cc
index c363d0c9..9c7ec30 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar.cc
@@ -33,6 +33,8 @@
 #include "third_party/blink/public/common/input/web_mouse_event.h"
 #include "third_party/blink/public/common/input/web_pointer_event.h"
 #include "third_party/blink/public/common/input/web_pointer_properties.h"
+#include "third_party/blink/public/mojom/webpreferences/web_preferences.mojom-blink.h"
+#include "third_party/blink/public/platform/web_theme_engine.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
@@ -151,6 +153,27 @@
   return orientation_ == kHorizontalScrollbar ? max_offset.x() : max_offset.y();
 }
 
+WebThemeEngine::State Scrollbar::GetStateForPart(ScrollbarPart part) const {
+  if (!enabled_) {
+    return WebThemeEngine::kStateDisabled;
+  }
+  if (part == pressed_part_) {
+    return WebThemeEngine::kStatePressed;
+  }
+  if (part == hovered_part_) {
+    // Don't draw a hovered state when the device does not have hover available.
+    if (const Settings* const settings =
+            style_source_ ? style_source_->GetDocument().GetSettings()
+                          : nullptr;
+        !settings ||
+        (settings->GetAvailableHoverTypes() &
+         static_cast<int>(mojom::blink::HoverType::kHoverHoverType))) {
+      return WebThemeEngine::kStateHover;
+    }
+  }
+  return WebThemeEngine::kStateNormal;
+}
+
 void Scrollbar::OffsetDidChange(mojom::blink::ScrollType scroll_type) {
   DCHECK(scrollable_area_);
   pending_injected_delta_ = ScrollOffset();
diff --git a/third_party/blink/renderer/core/scroll/scrollbar.h b/third_party/blink/renderer/core/scroll/scrollbar.h
index c4edab23..08a9a28 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar.h
+++ b/third_party/blink/renderer/core/scroll/scrollbar.h
@@ -28,6 +28,7 @@
 
 #include "third_party/blink/public/common/input/web_input_event.h"
 #include "third_party/blink/public/mojom/frame/color_scheme.mojom-blink-forward.h"
+#include "third_party/blink/public/platform/web_theme_engine.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/scroll/scroll_types.h"
 #include "third_party/blink/renderer/core/style/computed_style_constants.h"
@@ -99,6 +100,7 @@
 
   ScrollbarPart PressedPart() const { return pressed_part_; }
   ScrollbarPart HoveredPart() const { return hovered_part_; }
+  WebThemeEngine::State GetStateForPart(ScrollbarPart) const;
 
   virtual void StyleChanged() {}
   void SetScrollbarsHiddenFromExternalAnimator(bool);
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
index 883dfdc..28046c45 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
@@ -91,40 +91,20 @@
 PartPaintingParams ButtonPartPaintingParams(const Scrollbar& scrollbar,
                                             float position,
                                             ScrollbarPart part) {
-  WebThemeEngine::Part paint_part;
-  WebThemeEngine::State state = WebThemeEngine::kStateNormal;
-  bool check_min = false;
-  bool check_max = false;
-
-  if (scrollbar.Orientation() == kHorizontalScrollbar) {
-    if (part == kBackButtonStartPart) {
-      paint_part = WebThemeEngine::kPartScrollbarLeftArrow;
-      check_min = true;
-    } else {
-      paint_part = WebThemeEngine::kPartScrollbarRightArrow;
-      check_max = true;
-    }
-  } else {
-    if (part == kBackButtonStartPart) {
-      paint_part = WebThemeEngine::kPartScrollbarUpArrow;
-      check_min = true;
-    } else {
-      paint_part = WebThemeEngine::kPartScrollbarDownArrow;
-      check_max = true;
-    }
+  const WebThemeEngine::State state = scrollbar.GetStateForPart(part);
+  if (part == kBackButtonStartPart) {
+    return PartPaintingParams(
+        (scrollbar.Orientation() == kHorizontalScrollbar)
+            ? WebThemeEngine::kPartScrollbarLeftArrow
+            : WebThemeEngine::kPartScrollbarUpArrow,
+        (position <= 0) ? WebThemeEngine::kStateDisabled : state);
   }
-
-  if ((check_min && (position <= 0)) ||
-      (check_max && position >= scrollbar.Maximum())) {
-    state = WebThemeEngine::kStateDisabled;
-  } else {
-    if (part == scrollbar.PressedPart())
-      state = WebThemeEngine::kStatePressed;
-    else if (part == scrollbar.HoveredPart())
-      state = WebThemeEngine::kStateHover;
-  }
-
-  return PartPaintingParams(paint_part, state);
+  return PartPaintingParams((scrollbar.Orientation() == kHorizontalScrollbar)
+                                ? WebThemeEngine::kPartScrollbarRightArrow
+                                : WebThemeEngine::kPartScrollbarDownArrow,
+                            (position >= scrollbar.Maximum())
+                                ? WebThemeEngine::kStateDisabled
+                                : state);
 }
 
 }  // namespace
@@ -363,24 +343,17 @@
 
   DrawingRecorder recorder(gc, scrollbar, DisplayItem::kScrollbarThumb, rect);
 
-  WebThemeEngine::State state;
-  cc::PaintCanvas* canvas = gc.Canvas();
-  if (scrollbar.PressedPart() == kThumbPart) {
-    state = WebThemeEngine::kStatePressed;
-  } else if (scrollbar.HoveredPart() == kThumbPart) {
-    state = WebThemeEngine::kStateHover;
-  } else {
-    state = WebThemeEngine::kStateNormal;
-  }
+  const WebThemeEngine::Part part =
+      (scrollbar.Orientation() == kVerticalScrollbar)
+          ? WebThemeEngine::kPartScrollbarVerticalThumb
+          : WebThemeEngine::kPartScrollbarHorizontalThumb;
 
-  mojom::blink::ColorScheme color_scheme = scrollbar.UsedColorScheme();
   WebThemeEngine::ExtraParams params(BuildScrollbarThumbExtraParams(scrollbar));
+
+  const mojom::blink::ColorScheme color_scheme = scrollbar.UsedColorScheme();
   WebThemeEngineHelper::GetNativeThemeEngine()->Paint(
-      canvas,
-      scrollbar.Orientation() == kHorizontalScrollbar
-          ? WebThemeEngine::kPartScrollbarHorizontalThumb
-          : WebThemeEngine::kPartScrollbarVerticalThumb,
-      state, rect, &params, color_scheme, scrollbar.InForcedColorsMode(),
+      gc.Canvas(), part, scrollbar.GetStateForPart(kThumbPart), rect, &params,
+      color_scheme, scrollbar.InForcedColorsMode(),
       scrollbar.GetColorProvider(color_scheme));
 }
 
@@ -519,17 +492,10 @@
 
 SkColor4f ScrollbarThemeAura::ThumbColor(const Scrollbar& scrollbar) const {
   CHECK(UsesSolidColorThumb());
-  WebThemeEngine::State state;
-  if (scrollbar.PressedPart() == kThumbPart) {
-    state = WebThemeEngine::kStatePressed;
-  } else if (scrollbar.HoveredPart() == kThumbPart) {
-    state = WebThemeEngine::kStateHover;
-  } else {
-    state = WebThemeEngine::kStateNormal;
-  }
   WebThemeEngine::ExtraParams params(BuildScrollbarThumbExtraParams(scrollbar));
   return WebThemeEngineHelper::GetNativeThemeEngine()->GetScrollbarThumbColor(
-      state, &params, scrollbar.GetColorProvider(scrollbar.UsedColorScheme()));
+      scrollbar.GetStateForPart(kThumbPart), &params,
+      scrollbar.GetColorProvider(scrollbar.UsedColorScheme()));
 }
 
 bool ScrollbarThemeAura::UsesNinePatchTrackAndButtonsResource() const {
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.cc
index 8e740616..45ffe1c 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.cc
@@ -174,34 +174,15 @@
 void ScrollbarThemeOverlay::PaintThumb(GraphicsContext& context,
                                        const Scrollbar& scrollbar,
                                        const gfx::Rect& rect) {
-  if (DrawingRecorder::UseCachedDrawingIfPossible(context, scrollbar,
-                                                  DisplayItem::kScrollbarThumb))
+  if (DrawingRecorder::UseCachedDrawingIfPossible(
+          context, scrollbar, DisplayItem::kScrollbarThumb)) {
     return;
+  }
 
   DrawingRecorder recorder(context, scrollbar, DisplayItem::kScrollbarThumb,
                            rect);
 
-  WebThemeEngine::State state = WebThemeEngine::kStateNormal;
-
-  if (!scrollbar.Enabled())
-    state = WebThemeEngine::kStateDisabled;
-  else if (scrollbar.PressedPart() == kThumbPart)
-    state = WebThemeEngine::kStatePressed;
-  else if (scrollbar.HoveredPart() == kThumbPart)
-    state = WebThemeEngine::kStateHover;
-
   cc::PaintCanvas* canvas = context.Canvas();
-
-  WebThemeEngine::Part part = WebThemeEngine::kPartScrollbarHorizontalThumb;
-  if (scrollbar.Orientation() == kVerticalScrollbar)
-    part = WebThemeEngine::kPartScrollbarVerticalThumb;
-
-  blink::WebThemeEngine::ScrollbarThumbExtraParams scrollbar_thumb;
-  if (scrollbar.ScrollbarThumbColor().has_value()) {
-    scrollbar_thumb.thumb_color =
-        scrollbar.ScrollbarThumbColor().value().toSkColor4f().toSkColor();
-  }
-
   // Horizontally flip the canvas if it is left vertical scrollbar.
   if (scrollbar.IsLeftSideVerticalScrollbar()) {
     canvas->save();
@@ -209,15 +190,27 @@
     canvas->scale(-1, 1);
   }
 
+  const WebThemeEngine::Part part =
+      (scrollbar.Orientation() == kVerticalScrollbar)
+          ? WebThemeEngine::kPartScrollbarVerticalThumb
+          : WebThemeEngine::kPartScrollbarHorizontalThumb;
+
+  blink::WebThemeEngine::ScrollbarThumbExtraParams scrollbar_thumb;
+  if (scrollbar.ScrollbarThumbColor().has_value()) {
+    scrollbar_thumb.thumb_color =
+        scrollbar.ScrollbarThumbColor().value().toSkColor4f().toSkColor();
+  }
   blink::WebThemeEngine::ExtraParams params(scrollbar_thumb);
 
-  mojom::blink::ColorScheme color_scheme = scrollbar.UsedColorScheme();
+  const mojom::blink::ColorScheme color_scheme = scrollbar.UsedColorScheme();
   WebThemeEngineHelper::GetNativeThemeEngine()->Paint(
-      canvas, part, state, rect, &params, color_scheme,
-      scrollbar.InForcedColorsMode(), scrollbar.GetColorProvider(color_scheme));
+      canvas, part, scrollbar.GetStateForPart(kThumbPart), rect, &params,
+      color_scheme, scrollbar.InForcedColorsMode(),
+      scrollbar.GetColorProvider(color_scheme));
 
-  if (scrollbar.IsLeftSideVerticalScrollbar())
+  if (scrollbar.IsLeftSideVerticalScrollbar()) {
     canvas->restore();
+  }
 }
 
 ScrollbarPart ScrollbarThemeOverlay::HitTest(const Scrollbar& scrollbar,
diff --git a/third_party/blink/renderer/core/timing/window_performance.cc b/third_party/blink/renderer/core/timing/window_performance.cc
index 1e46472..eccd5ed 100644
--- a/third_party/blink/renderer/core/timing/window_performance.cc
+++ b/third_party/blink/renderer/core/timing/window_performance.cc
@@ -104,6 +104,7 @@
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 static constexpr base::TimeDelta kLongTaskObserverThreshold =
     base::Milliseconds(50);
@@ -1266,12 +1267,12 @@
     // perfetto events.
     unsigned hash = GetHash(entry->name());
     AddFloatToHash(hash, entry->startTime());
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1(
-        "devtools.timeline", "EventTiming", hash, entryInfo->creation_time,
-        "data", entry->ToTracedValue(DomWindow()->GetFrame()));
+    TRACE_EVENT_BEGIN("devtools.timeline", "EventTiming",
+                      perfetto::Track::Global(hash), entryInfo->creation_time,
+                      "data", entry->ToTracedValue(DomWindow()->GetFrame()));
 
-    TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
-        "devtools.timeline", "EventTiming", hash, entry->GetEndTime());
+    TRACE_EVENT_END("devtools.timeline", perfetto::Track::Global(hash),
+                    entry->GetEndTime());
   }
 }
 
diff --git a/third_party/blink/renderer/core/view_transition/view_transition.cc b/third_party/blink/renderer/core/view_transition/view_transition.cc
index a02f6c36..36fd4573 100644
--- a/third_party/blink/renderer/core/view_transition/view_transition.cc
+++ b/third_party/blink/renderer/core/view_transition/view_transition.cc
@@ -46,6 +46,7 @@
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 #include "v8-microtask-queue.h"
 
 namespace blink {
@@ -999,8 +1000,8 @@
   }
   style_tracker_->PauseRendering();
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("blink", "ViewTransition::PauseRendering",
-                                    this);
+  TRACE_EVENT_BEGIN("blink", "ViewTransition::PauseRendering",
+                    perfetto::Track::FromPointer(this));
   static const base::TimeDelta timeout_delay =
       RuntimeEnabledFeatures::
               ViewTransitionLongCallbackTimeoutForTestingEnabled()
@@ -1077,8 +1078,7 @@
   if (!rendering_paused_scope_)
     return;
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("blink", "ViewTransition::PauseRendering",
-                                  this);
+  TRACE_EVENT_END("blink", perfetto::Track::FromPointer(this));
   if (rendering_paused_scope_->ShouldThrottleRendering() && document_->View()) {
     document_->View()->SetThrottledForViewTransition(false);
   }
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc
index 7449e52..a0f7858 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -403,9 +403,6 @@
         back_forward_cache_controller_host) {
   DCHECK(GetExecutionContext()->IsContextThread());
   TRACE_EVENT("blink.worker", "DedicatedWorker::OnFinished");
-  TRACE_EVENT_NESTABLE_ASYNC_END0("blink.worker",
-                                  "LegacyDedicatedWorker Specific Setup",
-                                  TRACE_ID_LOCAL(this));
   if (classic_script_loader_->Canceled()) {
     // Do nothing.
   } else if (classic_script_loader_->Failed()) {
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
index 2fabd7a..988bc17b 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -69,6 +69,7 @@
 #include "third_party/blink/renderer/platform/bindings/source_location.h"
 #include "third_party/blink/renderer/platform/loader/fetch/fetch_client_settings_object_snapshot.h"
 #include "third_party/blink/renderer/platform/weborigin/security_policy.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -305,8 +306,8 @@
   TRACE_EVENT("blink.worker",
               "DedicatedWorkerGlobalScope::FetchAndRunClassicScript",
               "script_url", script_url);
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "blink.worker", "DedicatedWorkerGlobalScope Fetch", TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("blink.worker", "DedicatedWorkerGlobalScope Fetch",
+                    perfetto::Track::FromPointer(this));
   fetch_classic_script_start_time_ = base::TimeTicks::Now();
 
   // TODO(crbug.com/1177199): SetPolicyContainer once we passed down policy
@@ -452,8 +453,7 @@
   DCHECK(IsContextThread());
   TRACE_EVENT("blink.worker",
               "DedicatedWorkerGlobalScope::DidFetchClassicScript");
-  TRACE_EVENT_NESTABLE_ASYNC_END0(
-      "blink.worker", "DedicatedWorkerGlobalScope Fetch", TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("blink.worker", perfetto::Track::FromPointer(this));
   base::UmaHistogramTimes(
       "Worker.TopLevelScript.FetchClassicScriptTime",
       base::TimeTicks::Now() - fetch_classic_script_start_time_);
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc
index e6bf795..4e230b9 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -577,8 +577,7 @@
     debugger->ExternalAsyncTaskFinished(*stack_id_);
 
   script_eval_state_ = ScriptEvalState::kEvaluated;
-  TRACE_EVENT_NESTABLE_ASYNC_END0("blink.worker", "WorkerGlobalScope setup",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("blink.worker", perfetto::Track::FromPointer(this));
 }
 
 void WorkerGlobalScope::ReceiveMessage(BlinkTransferableMessage message) {
@@ -698,8 +697,8 @@
   // Workers should always maintain the default world of an isolate.
   CHECK(creation_params->is_default_world_of_isolate);
   TRACE_EVENT("blink.worker", "WorkerGlobalScope::WorkerGlobalScope");
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("blink.worker", "WorkerGlobalScope setup",
-                                    TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("blink.worker", "WorkerGlobalScope setup",
+                    perfetto::Track::FromPointer(this));
 
   InstanceCounters::IncrementCounter(
       InstanceCounters::kWorkerGlobalScopeCounter);
diff --git a/third_party/blink/renderer/modules/DEPS b/third_party/blink/renderer/modules/DEPS
index dc6b77a8..781f92c 100644
--- a/third_party/blink/renderer/modules/DEPS
+++ b/third_party/blink/renderer/modules/DEPS
@@ -65,6 +65,7 @@
     "web_ax_object.cc": [
         "+ui/accessibility/ax_action_data.h",
     ],
+
     "tcp_writable_stream_wrapper.h": [
         "+partition_alloc/partition_root.h",
     ],
@@ -76,12 +77,8 @@
     ],
     ".*socket.cc": [
         "+base/functional/identity.h",
-        "+net/base/ip_endpoint.h",
     ],
     "web_printing_manager.cc": [
       "+printing/buildflags/buildflags.h",
-    ],
-    "multicast_controller.*": [
-        "+net/base/ip_address.h",
-    ],
+    ]
 }
diff --git a/third_party/blink/renderer/modules/accessibility/DEPS b/third_party/blink/renderer/modules/accessibility/DEPS
index ac85986..47fdd603 100644
--- a/third_party/blink/renderer/modules/accessibility/DEPS
+++ b/third_party/blink/renderer/modules/accessibility/DEPS
@@ -1,6 +1,5 @@
 include_rules = [
     "-third_party/blink/renderer/modules",
-    "+base/containers/fixed_flat_set.h",
     "+services/metrics/public/cpp",
     "+third_party/blink/renderer/modules/accessibility",
     "+third_party/blink/renderer/modules/media_controls",
diff --git a/third_party/blink/renderer/modules/ai/DEPS b/third_party/blink/renderer/modules/ai/DEPS
index 43943ab..fd072df1 100644
--- a/third_party/blink/renderer/modules/ai/DEPS
+++ b/third_party/blink/renderer/modules/ai/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-    "+base/containers/fixed_flat_set.h",
     "+base/metrics/metrics_hashes.h",
     "+components/language_detection/content/common/language_detection.mojom-blink.h",
     "+components/language_detection/content/common/language_detection.mojom-blink-forward.h",
diff --git a/third_party/blink/renderer/modules/clipboard/DEPS b/third_party/blink/renderer/modules/clipboard/DEPS
index b7cfb009..907ec5db 100644
--- a/third_party/blink/renderer/modules/clipboard/DEPS
+++ b/third_party/blink/renderer/modules/clipboard/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-    "+base/containers/fixed_flat_set.h",
     "+mojo/public/cpp/base/big_buffer.h",
     "+net/base/mime_util.h",
     "+third_party/blink/renderer/core/clipboard",
diff --git a/third_party/blink/renderer/modules/direct_sockets/BUILD.gn b/third_party/blink/renderer/modules/direct_sockets/BUILD.gn
index fe35a3b..25328bb 100644
--- a/third_party/blink/renderer/modules/direct_sockets/BUILD.gn
+++ b/third_party/blink/renderer/modules/direct_sockets/BUILD.gn
@@ -6,8 +6,6 @@
 
 blink_modules_sources("direct_sockets") {
   sources = [
-    "multicast_controller.cc",
-    "multicast_controller.h",
     "socket.cc",
     "socket.h",
     "stream_wrapper.cc",
diff --git a/third_party/blink/renderer/modules/direct_sockets/README.md b/third_party/blink/renderer/modules/direct_sockets/README.md
index 065cd7cc..201acf5 100644
--- a/third_party/blink/renderer/modules/direct_sockets/README.md
+++ b/third_party/blink/renderer/modules/direct_sockets/README.md
@@ -1,6 +1,5 @@
 This directory implements the Blink side of the [Direct Sockets
-API](https://github.com/WICG/direct-sockets/blob/main/docs/explainer.md)
-and [Multicast API](https://github.com/explainers-by-googlers/multicast-in-direct-sockets).
+API](https://github.com/WICG/direct-sockets/blob/main/docs/explainer.md).
 
 It will connect to a DirectSocketsService Mojo service in the browser,
 which performs security checks, provides dialogs, and forwards requests to
diff --git a/third_party/blink/renderer/modules/direct_sockets/multicast_controller.cc b/third_party/blink/renderer/modules/direct_sockets/multicast_controller.cc
deleted file mode 100644
index 63db93d..0000000
--- a/third_party/blink/renderer/modules/direct_sockets/multicast_controller.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/modules/direct_sockets/multicast_controller.h"
-
-#include <optional>
-
-#include "net/base/ip_address.h"
-#include "net/base/net_errors.h"
-#include "third_party/blink/renderer/bindings/core/v8/frozen_array.h"
-#include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
-#include "third_party/blink/renderer/modules/direct_sockets/socket.h"
-#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
-#include "third_party/blink/renderer/platform/heap/persistent.h"
-#include "third_party/blink/renderer/platform/wtf/forward.h"
-#include "third_party/blink/renderer/platform/wtf/functional.h"
-#include "third_party/blink/renderer/platform/wtf/wtf_size_t.h"
-
-namespace blink {
-
-namespace {
-std::optional<net::IPAddress> CreateAndCheckIpAddress(
-    const String& ip_address,
-    ExceptionState& exception_state) {
-  if (!ip_address.ContainsOnlyASCIIOrEmpty()) {
-    exception_state.ThrowTypeError(
-        "ipAddress must contain only ascii characters");
-    return std::nullopt;
-  }
-
-  std::optional<net::IPAddress> parsed_ip_opt =
-      net::IPAddress::FromIPLiteral(ip_address.Ascii());
-  if (!parsed_ip_opt.has_value()) {
-    exception_state.ThrowTypeError("ipAddress is not valid ipv4 or ipv6");
-    return std::nullopt;
-  } else {
-    return parsed_ip_opt;
-  }
-}
-}  // namespace
-
-MulticastController::MulticastController(ExecutionContext* execution_context)
-    : ExecutionContextClient(execution_context) {}
-
-MulticastController::~MulticastController() = default;
-
-ScriptPromise<IDLUndefined> MulticastController::joinGroup(
-    ScriptState* script_state,
-    const String& ip_address,
-    ExceptionState& exception_state) {
-  if (state_ != State::kOpen) {
-    exception_state.ThrowTypeError(
-        "Cannot join group if the socket is not opened");
-    return {};
-  }
-
-  std::optional<net::IPAddress> parsed_ip_opt =
-      CreateAndCheckIpAddress(ip_address, exception_state);
-  if (!parsed_ip_opt.has_value()) {
-    return {};
-  }
-  auto normalized_ip = String::FromUTF8(parsed_ip_opt->ToString());
-  if (joined_groups_.Contains(normalized_ip)) {
-    exception_state.ThrowTypeError("Cannot join the same group again");
-    return {};
-  }
-
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver<IDLUndefined>>(
-      script_state, exception_state.GetContext());
-
-  // TODO(crbug.com/398934282): join the group. For now promise never resolves.
-
-  return resolver->Promise();
-}
-
-ScriptPromise<IDLUndefined> MulticastController::leaveGroup(
-    ScriptState* script_state,
-    const String& ip_address,
-    ExceptionState& exception_state) {
-  if (state_ != State::kOpen) {
-    exception_state.ThrowTypeError(
-        "Cannot leave group if the socket is not opened");
-    return {};
-  }
-
-  std::optional<net::IPAddress> parsed_ip_opt =
-      CreateAndCheckIpAddress(ip_address, exception_state);
-  if (!parsed_ip_opt.has_value()) {
-    return {};
-  }
-
-  auto normalized_ip = String::FromUTF8(parsed_ip_opt->ToString());
-  if (!joined_groups_.Contains(normalized_ip)) {
-    exception_state.ThrowTypeError("Cannot leave group which is not joined");
-    return {};
-  }
-
-  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver<IDLUndefined>>(
-      script_state, exception_state.GetContext());
-
-  // TODO(crbug.com/398934282): join the group. For now promise never resolves.
-
-  return resolver->Promise();
-}
-
-void MulticastController::Trace(Visitor* visitor) const {
-  ScriptWrappable::Trace(visitor);
-  ExecutionContextClient::Trace(visitor);
-}
-
-bool MulticastController::HasPendingActivity() const {
-  return false;
-}
-
-void MulticastController::OnCloseOrAbort() {
-  state_ = State::kClosed;
-  joined_groups_.clear();
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/modules/direct_sockets/multicast_controller.h b/third_party/blink/renderer/modules/direct_sockets/multicast_controller.h
deleted file mode 100644
index 0ec45d6..0000000
--- a/third_party/blink/renderer/modules/direct_sockets/multicast_controller.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2025 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_MULTICAST_CONTROLLER_H_
-#define THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_MULTICAST_CONTROLLER_H_
-
-#include "net/base/ip_address.h"
-#include "third_party/blink/renderer/bindings/core/v8/frozen_array.h"
-#include "third_party/blink/renderer/bindings/core/v8/idl_types.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h"
-#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context.h"
-#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
-#include "third_party/blink/renderer/modules/modules_export.h"
-#include "third_party/blink/renderer/platform/bindings/exception_state.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
-#include "third_party/blink/renderer/platform/heap/collection_support/heap_hash_set.h"
-#include "third_party/blink/renderer/platform/heap/garbage_collected.h"
-#include "third_party/blink/renderer/platform/heap/member.h"
-
-namespace blink {
-// MulticastController interface from multicast_controller.idl
-// MulticastController lives as long as UDPSocket, and extends the socket
-// lifecycle to be alive while there are pending joinGroup or leaveGroup
-// requests, otherwise it would not be possible to resolve returned promises.
-// It is not necessary to leave multicast groups. OS will do so automatically on
-// socket closure.
-class MODULES_EXPORT MulticastController final : public ScriptWrappable,
-                                                 public ExecutionContextClient {
-  DEFINE_WRAPPERTYPEINFO();
-
-  enum class State { kOpen, kClosed };
-
- public:
-  explicit MulticastController(ExecutionContext*);
-
-  ~MulticastController() override;
-
-  // multicast_controller.idl:
-  ScriptPromise<IDLUndefined> joinGroup(ScriptState*,
-                                        const String& ip_address,
-                                        ExceptionState&);
-
-  // multicast_controller.idl:
-  ScriptPromise<IDLUndefined> leaveGroup(ScriptState*,
-                                         const String& ip_address,
-                                         ExceptionState&);
-
-  // ScriptWrappable:
-  void Trace(Visitor* visitor) const override;
-
-  bool HasPendingActivity() const;
-
-  void OnCloseOrAbort();
-
-  // multicast_controller.idl:
-  const Vector<String>& joinedGroups() const { return joined_groups_; }
-
- private:
-  Vector<String> joined_groups_;
-
-  State state_ = State::kOpen;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_DIRECT_SOCKETS_MULTICAST_CONTROLLER_H_
diff --git a/third_party/blink/renderer/modules/direct_sockets/multicast_controller.idl b/third_party/blink/renderer/modules/direct_sockets/multicast_controller.idl
deleted file mode 100644
index b54c7c0a..0000000
--- a/third_party/blink/renderer/modules/direct_sockets/multicast_controller.idl
+++ /dev/null
@@ -1,16 +0,0 @@
-[
-    RuntimeEnabled=MulticastInDirectSockets,
-    Exposed=(Window, DedicatedWorker),
-    SecureContext,
-    IsolatedContext
-]
-interface MulticastController {
-  // TODO(crbug.com/398934282): add measure annotations to all methods.
-
-  [CallWith=ScriptState, RaisesException]
-  Promise<undefined> joinGroup(DOMString ipAddress);
-  [CallWith=ScriptState, RaisesException]
-  Promise<undefined> leaveGroup(DOMString ipAddress);
-
-  readonly attribute FrozenArray<DOMString> joinedGroups;
-};
diff --git a/third_party/blink/renderer/modules/direct_sockets/socket_connection.idl b/third_party/blink/renderer/modules/direct_sockets/socket_connection.idl
index 1339ff2..f70bf1a7 100644
--- a/third_party/blink/renderer/modules/direct_sockets/socket_connection.idl
+++ b/third_party/blink/renderer/modules/direct_sockets/socket_connection.idl
@@ -11,9 +11,7 @@
 
 dictionary TCPSocketOpenInfo : SocketOpenInfo {};
 
-dictionary UDPSocketOpenInfo : SocketOpenInfo {
-  [RuntimeEnabled=MulticastInDirectSockets] MulticastController multicastController;
-};
+dictionary UDPSocketOpenInfo : SocketOpenInfo {};
 
 dictionary TCPServerSocketOpenInfo {
   ReadableStream readable;
diff --git a/third_party/blink/renderer/modules/direct_sockets/socket_options.idl b/third_party/blink/renderer/modules/direct_sockets/socket_options.idl
index 6985141..c9c0049 100644
--- a/third_party/blink/renderer/modules/direct_sockets/socket_options.idl
+++ b/third_party/blink/renderer/modules/direct_sockets/socket_options.idl
@@ -29,11 +29,6 @@
 
   // TODO(crbug.com/1413161): Implement ipv6Only support.
   boolean ipv6Only;
-
-  [RuntimeEnabled=MulticastInDirectSockets] boolean multicastAllowAddressSharing;
-
-  [RuntimeEnabled=MulticastInDirectSockets, EnforceRange] octet multicastTimeToLive;
-  [RuntimeEnabled=MulticastInDirectSockets] boolean multicastLoopback;
 };
 
 dictionary TCPServerSocketOptions {
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc b/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc
index d113a1c..9105c4ff 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_socket.cc
@@ -21,7 +21,6 @@
 #include "third_party/blink/renderer/core/inspector/protocol/network.h"
 #include "third_party/blink/renderer/core/streams/readable_stream.h"
 #include "third_party/blink/renderer/core/streams/writable_stream.h"
-#include "third_party/blink/renderer/modules/direct_sockets/multicast_controller.h"
 #include "third_party/blink/renderer/modules/direct_sockets/socket.h"
 #include "third_party/blink/renderer/modules/direct_sockets/stream_wrapper.h"
 #include "third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.h"
@@ -30,7 +29,6 @@
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/persistent.h"
 #include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
 namespace blink {
@@ -129,15 +127,6 @@
     socket_options->send_buffer_size = options->sendBufferSize();
   }
 
-  if (RuntimeEnabledFeatures::MulticastInDirectSocketsEnabled()) {
-    if (options->hasMulticastTimeToLive()) {
-      socket_options->multicast_time_to_live = options->multicastTimeToLive();
-    }
-    if (options->hasMulticastLoopback()) {
-      socket_options->multicast_loopback = options->multicastLoopback();
-    }
-  }
-
   return socket_options;
 }
 
@@ -191,19 +180,6 @@
     socket_options->send_buffer_size = options->sendBufferSize();
   }
 
-  if (RuntimeEnabledFeatures::MulticastInDirectSocketsEnabled()) {
-    if (options->hasMulticastAllowAddressSharing()) {
-      socket_options->multicast_allow_address_sharing =
-          options->multicastAllowAddressSharing();
-    }
-    if (options->hasMulticastTimeToLive()) {
-      socket_options->multicast_time_to_live = options->multicastTimeToLive();
-    }
-    if (options->hasMulticastLoopback()) {
-      socket_options->multicast_loopback = options->multicastLoopback();
-    }
-  }
-
   return socket_options;
 }
 
@@ -454,8 +430,7 @@
   if (GetState() != State::kOpen) {
     return false;
   }
-  return writable_stream_wrapper_->HasPendingWrite() ||
-         multicast_controller_->HasPendingActivity();
+  return writable_stream_wrapper_->HasPendingWrite();
 }
 
 void UDPSocket::ContextDestroyed() {
@@ -471,16 +446,10 @@
       break;
     case Socket::State::kClosed:
       probe::DirectUDPSocketClosed(GetExecutionContext(), inspector_id_);
-      if (auto* multicast_controller = multicast_controller_.Get()) {
-        multicast_controller->OnCloseOrAbort();
-      }
       break;
     case Socket::State::kAborted:
       probe::DirectUDPSocketAborted(GetExecutionContext(), inspector_id_,
                                     abort_net_error_);
-      if (auto* multicast_controller = multicast_controller_.Get()) {
-        multicast_controller->OnCloseOrAbort();
-      }
       break;
   }
 }
@@ -491,7 +460,6 @@
   visitor->Trace(readable_stream_wrapper_);
   visitor->Trace(writable_stream_wrapper_);
   visitor->Trace(stream_error_);
-  visitor->Trace(multicast_controller_);
 
   ScriptWrappable::Trace(visitor);
   Socket::Trace(visitor);
diff --git a/third_party/blink/renderer/modules/direct_sockets/udp_socket.h b/third_party/blink/renderer/modules/direct_sockets/udp_socket.h
index 0db0c44..7e26b6c 100644
--- a/third_party/blink/renderer/modules/direct_sockets/udp_socket.h
+++ b/third_party/blink/renderer/modules/direct_sockets/udp_socket.h
@@ -14,7 +14,6 @@
 #include "services/network/public/mojom/restricted_udp_socket.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_property.h"
-#include "third_party/blink/renderer/modules/direct_sockets/multicast_controller.h"
 #include "third_party/blink/renderer/modules/direct_sockets/socket.h"
 #include "third_party/blink/renderer/modules/direct_sockets/udp_readable_stream_wrapper.h"
 #include "third_party/blink/renderer/modules/direct_sockets/udp_socket_mojo_remote.h"
@@ -136,8 +135,6 @@
 
   // Unique id for devtools inspector_network_agent.
   uint64_t inspector_id_ = CreateUniqueIdentifier();
-
-  Member<MulticastController> multicast_controller_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
index f8ad2e1..c540fec 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
@@ -58,6 +58,7 @@
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -211,8 +212,9 @@
     : type_(type), start_time_(base::TimeTicks::Now()) {
   static std::atomic<size_t> counter(0);
   id_ = counter.fetch_add(1, std::memory_order_relaxed);
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("IndexedDB", RequestTypeToName(type),
-                                    TRACE_ID_LOCAL(id_));
+  TRACE_EVENT_BEGIN("IndexedDB",
+                    perfetto::DynamicString(RequestTypeToName(type)),
+                    perfetto::Track(id_));
 }
 
 void IDBRequest::AsyncTraceState::WillDispatchResult(bool success) {
@@ -225,8 +227,7 @@
 
 void IDBRequest::AsyncTraceState::RecordAndReset() {
   if (type_) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0("IndexedDB", RequestTypeToName(*type_),
-                                    TRACE_ID_LOCAL(id_));
+    TRACE_EVENT_END("IndexedDB", perfetto::Track(id_));
     type_.reset();
   }
 }
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.h b/third_party/blink/renderer/modules/indexeddb/idb_request.h
index d53f035e..2b6b7cd 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.h
@@ -123,7 +123,7 @@
   // to generating unique IDs in a threadsafe manner. The atomic machinery is
   // used when tracing is enabled. The recording problem is solved by having
   // instances of this class store the information needed to record async trace
-  // end events (via TRACE_EVENT_NESTABLE_ASYNC_END).
+  // end events.
   //
   // From a mechanical perspective, creating an AsyncTraceState instance records
   // the beginning event of an async trace. The instance is then moved into an
diff --git a/third_party/blink/renderer/modules/mediarecorder/DEPS b/third_party/blink/renderer/modules/mediarecorder/DEPS
index 53e2538..1f6a4c9 100644
--- a/third_party/blink/renderer/modules/mediarecorder/DEPS
+++ b/third_party/blink/renderer/modules/mediarecorder/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-    "+base/containers/fixed_flat_map.h",
     "+base/containers/queue.h",
     "+base/memory/read_only_shared_memory_region.h",
     "+base/memory/unsafe_shared_memory_region.h",
diff --git a/third_party/blink/renderer/modules/mediasource/media_source.cc b/third_party/blink/renderer/modules/mediasource/media_source.cc
index 73b4a9a..5df3312 100644
--- a/third_party/blink/renderer/modules/mediasource/media_source.cc
+++ b/third_party/blink/renderer/modules/mediasource/media_source.cc
@@ -57,6 +57,7 @@
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 using blink::WebMediaSource;
 using blink::WebSourceBuffer;
@@ -768,14 +769,10 @@
 
     if (attachment_tracer_) {
       // Use of a tracer means we must be using same-thread attachment.
-      TRACE_EVENT_NESTABLE_ASYNC_END0(
-          "media", "MediaSource::StartAttachingToMediaElement",
-          TRACE_ID_LOCAL(this));
+      TRACE_EVENT_END("media", perfetto::Track::FromPointer(this));
     } else {
       // Otherwise, we must be using a cross-thread MSE-in-Workers attachment.
-      TRACE_EVENT_NESTABLE_ASYNC_END0(
-          "media", "MediaSource::StartWorkerAttachingToMainThreadMediaElement",
-          TRACE_ID_LOCAL(this));
+      TRACE_EVENT_END("media", perfetto::Track::FromPointer(this));
     }
     DCHECK(web_media_source);
     DCHECK(!web_media_source_);
@@ -1403,9 +1400,8 @@
   DCHECK(!context_already_destroyed_);
   DCHECK(IsClosed());
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media",
-                                    "MediaSource::StartAttachingToMediaElement",
-                                    TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("media", "MediaSource::StartAttachingToMediaElement",
+                    perfetto::Track::FromPointer(this));
   media_source_attachment_ = attachment;
   attachment_tracer_ =
       MakeGarbageCollected<SameThreadMediaSourceTracer>(element, this);
@@ -1430,9 +1426,9 @@
   }
 
   DCHECK(IsClosed());
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "media", "MediaSource::StartWorkerAttachingToMainThreadMediaElement",
-      TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("media",
+                    "MediaSource::StartWorkerAttachingToMainThreadMediaElement",
+                    perfetto::Track::FromPointer(this));
   media_source_attachment_ = attachment;
   return true;
 }
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer.cc b/third_party/blink/renderer/modules/mediasource/source_buffer.cc
index 78b18c1..ce449ae 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer.cc
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer.cc
@@ -81,6 +81,7 @@
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/math_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 using blink::WebSourceBuffer;
 
@@ -619,13 +620,13 @@
   UseCounter::Count(ExecutionContext::From(script_state),
                     WebFeature::kMediaSourceExtensionsForWebCodecs);
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "media", "SourceBuffer::appendEncodedChunks", TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("media", "SourceBuffer::appendEncodedChunks",
+                    perfetto::Track::FromPointer(this));
 
   if (ThrowExceptionIfRemovedOrUpdating(IsRemoved(), updating_,
                                         exception_state)) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "media", "SourceBuffer::appendEncodedChunks", TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::appendEncodedChunks*/
+                    perfetto::Track::FromPointer(this));
     return EmptyPromise();
   }
 
@@ -732,8 +733,8 @@
 
   double media_time = GetMediaTime();
   if (!PrepareAppend(media_time, size, *exception_state)) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "media", "SourceBuffer::appendEncodedChunks", TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::appendEncodedChunks*/
+                    perfetto::Track::FromPointer(this));
     append_encoded_chunks_resolver_ = nullptr;
     return;
   }
@@ -755,8 +756,8 @@
       BindOnce(&SourceBuffer::AppendEncodedChunksAsyncPart,
                WrapPersistent(this)));
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "delay", TRACE_ID_LOCAL(this),
-                                    "type", "initialDelay");
+  TRACE_EVENT_BEGIN("media", "delay", perfetto::Track::FromPointer(this),
+                    "type", "initialDelay");
 }
 
 void SourceBuffer::abort(ExceptionState& exception_state) {
@@ -907,8 +908,8 @@
     return;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "SourceBuffer::remove",
-                                    TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("media", "SourceBuffer::remove",
+                    perfetto::Track::FromPointer(this));
 
   // 6. If the readyState attribute of the parent media source is in the "ended"
   //    state then run the following steps:
@@ -1101,8 +1102,8 @@
     ScheduleEvent(event_type_names::kUpdateend);
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::remove",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("media", /*SourceBuffer::remove*/
+                  perfetto::Track::FromPointer(this));
 }
 
 void SourceBuffer::AbortIfUpdating() {
@@ -1139,8 +1140,8 @@
         append_encoded_chunks_resolver_->GetScriptState()->GetIsolate(),
         DOMExceptionCode::kAbortError, "Aborted by explicit abort()"));
     append_encoded_chunks_resolver_ = nullptr;
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "media", "SourceBuffer::appendEncodedChunks", TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::appendEncodedChunks*/
+                    perfetto::Track::FromPointer(this));
     return;
   }
 
@@ -1157,8 +1158,8 @@
   //      SourceBuffer object.
   ScheduleEvent(event_type_names::kUpdateend);
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::appendBuffer",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("media", /*SourceBuffer::appendBuffer*/
+                  perfetto::Track::FromPointer(this));
 }
 
 void SourceBuffer::RemovedFromMediaSource() {
@@ -1861,8 +1862,8 @@
   // done by the caller.
   // http://w3c.github.io/media-source/#sourcebuffer-prepare-append
   // 3.5.4 Prepare Append Algorithm
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "SourceBuffer::prepareAppend",
-                                    TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("media", "SourceBuffer::prepareAppend",
+                    perfetto::Track::FromPointer(this));
   // 3. If the HTMLMediaElement.error attribute is not null, then throw an
   //    InvalidStateError exception and abort these steps.
   DCHECK(source_);
@@ -1873,8 +1874,8 @@
     MediaSource::LogAndThrowDOMException(
         exception_state, DOMExceptionCode::kInvalidStateError,
         "The HTMLMediaElement.error attribute is not null.");
-    TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::prepareAppend",
-                                    TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::prepareAppend*/
+                    perfetto::Track::FromPointer(this));
     return false;
   }
 
@@ -1897,13 +1898,13 @@
         exception_state,
         "The SourceBuffer is full, and cannot free space to append additional "
         "buffers.");
-    TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::prepareAppend",
-                                    TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::prepareAppend*/
+                    perfetto::Track::FromPointer(this));
     return false;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::prepareAppend",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("media", /*SourceBuffer::prepareAppend*/
+                  perfetto::Track::FromPointer(this));
   return true;
 }
 
@@ -1927,8 +1928,8 @@
 
 void SourceBuffer::AppendBufferInternal(base::span<const unsigned char> data,
                                         ExceptionState& exception_state) {
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "SourceBuffer::appendBuffer",
-                                    TRACE_ID_LOCAL(this), "size", data.size());
+  TRACE_EVENT_BEGIN("media", "SourceBuffer::appendBuffer",
+                    perfetto::Track::FromPointer(this), "size", data.size());
   // Section 3.2 appendBuffer()
   // https://dvcs.w3.org/hg/html-media/raw-file/default/media-source/media-source.html#widl-SourceBuffer-appendBuffer-void-ArrayBufferView-data
   //
@@ -1948,8 +1949,8 @@
   //    exception and abort these steps.
   if (ThrowExceptionIfRemovedOrUpdating(IsRemoved(), updating_,
                                         exception_state)) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::appendBuffer",
-                                    TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::appendBuffer*/
+                    perfetto::Track::FromPointer(this));
     return;
   }
 
@@ -1979,12 +1980,12 @@
   // Finish the prepare append algorithm begun by the caller.
   double media_time = GetMediaTime();
   if (!PrepareAppend(media_time, data.size(), *exception_state)) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::appendBuffer",
-                                    TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*SourceBuffer::appendBuffer*/
+                    perfetto::Track::FromPointer(this));
     return;
   }
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "prepareAsyncAppend",
-                                    TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("media", "prepareAsyncAppend",
+                    perfetto::Track::FromPointer(this));
 
   // 2. Add data to the end of the input buffer. Zero-length appends result in
   // just a single async segment parser loop run later, with nothing added to
@@ -1993,8 +1994,8 @@
     MediaSource::LogAndThrowQuotaExceededError(
         *exception_state,
         "Unable to allocate space required to buffer appended media.");
-    TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::prepareAsyncAppend",
-                                    TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("media", /*prepareAsyncAppend*/
+                    perfetto::Track::FromPointer(this));
     return;
   }
 
@@ -2011,10 +2012,10 @@
       FROM_HERE,
       BindOnce(&SourceBuffer::AppendBufferAsyncPart, WrapPersistent(this)));
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "prepareAsyncAppend",
-                                  TRACE_ID_LOCAL(this));
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "delay", TRACE_ID_LOCAL(this),
-                                    "type", "initialDelay");
+  TRACE_EVENT_END("media", /*prepareAsyncAppend*/
+                  perfetto::Track::FromPointer(this));
+  TRACE_EVENT_BEGIN("media", "delay", perfetto::Track::FromPointer(this),
+                    "type", "initialDelay");
 }
 
 void SourceBuffer::AppendEncodedChunksAsyncPart() {
@@ -2068,10 +2069,9 @@
   // TODO(crbug.com/1144908): Consider buffering |pending_chunks_to_buffer_| in
   // multiple async iterations if it contains many buffers. It is unclear if
   // this is necessary when buffering encoded chunks.
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "delay", TRACE_ID_LOCAL(this));
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "appending", TRACE_ID_LOCAL(this),
-                                    "chunkCount",
-                                    pending_chunks_to_buffer_->size());
+  TRACE_EVENT_END("media", /* delay */ perfetto::Track::FromPointer(this));
+  TRACE_EVENT_BEGIN("media", "appending", perfetto::Track::FromPointer(this),
+                    "chunkCount", pending_chunks_to_buffer_->size());
 
   bool append_success = web_source_buffer_->AppendChunks(
       std::move(pending_chunks_to_buffer_), &timestamp_offset_);
@@ -2097,9 +2097,10 @@
     append_encoded_chunks_resolver_ = nullptr;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "appending", TRACE_ID_LOCAL(this));
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::appendEncodedChunks",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("media", /* appending */ perfetto::Track::FromPointer(this));
+  TRACE_EVENT_END("media",
+                  /* SourceBuffer::appendEncodedChunks */
+                  perfetto::Track::FromPointer(this));
 
   DVLOG(3) << __func__ << " done. this=" << this
            << " media_time=" << GetMediaTime() << " buffered="
@@ -2118,8 +2119,8 @@
   // 1. Run the segment parser loop algorithm.
   // Step 2 doesn't apply since we run Step 1 synchronously here.
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "delay", TRACE_ID_LOCAL(this));
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "appending", TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("media", /* delay */ perfetto::Track::FromPointer(this));
+  TRACE_EVENT_BEGIN("media", "appending", perfetto::Track::FromPointer(this));
   // The segment parser loop may not consume all of the pending appended data,
   // and lets us know via a distinct ParseStatus result. We parse incrementally
   // to avoid blocking the renderer event loop for too long. Note that even in
@@ -2141,10 +2142,10 @@
           *GetExecutionContext()->GetTaskRunner(TaskType::kMediaElementEvent),
           FROM_HERE,
           BindOnce(&SourceBuffer::AppendBufferAsyncPart, WrapPersistent(this)));
-      TRACE_EVENT_NESTABLE_ASYNC_END0("media", "appending",
-                                      TRACE_ID_LOCAL(this));
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "delay", TRACE_ID_LOCAL(this),
-                                        "type", "nextPieceDelay");
+      TRACE_EVENT_END("media",
+                      /* appending */ perfetto::Track::FromPointer(this));
+      TRACE_EVENT_BEGIN("media", "delay", perfetto::Track::FromPointer(this),
+                        "type", "nextPieceDelay");
       return;
     case media::StreamParser::ParseStatus::kSuccess:
       // 3. Set the updating attribute to false.
@@ -2162,9 +2163,9 @@
       break;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "appending", TRACE_ID_LOCAL(this));
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "SourceBuffer::appendBuffer",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("media", /* appending */ perfetto::Track::FromPointer(this));
+  TRACE_EVENT_END("media", /*SourceBuffer::appendBuffer*/
+                  perfetto::Track::FromPointer(this));
 
   double media_time = GetMediaTime();
   DVLOG(3) << __func__ << " done. this=" << this << " media_time=" << media_time
diff --git a/third_party/blink/renderer/modules/mediastream/scoped_media_stream_tracer.cc b/third_party/blink/renderer/modules/mediastream/scoped_media_stream_tracer.cc
index e8e7a7c..cd89e4f 100644
--- a/third_party/blink/renderer/modules/mediastream/scoped_media_stream_tracer.cc
+++ b/third_party/blink/renderer/modules/mediastream/scoped_media_stream_tracer.cc
@@ -4,6 +4,7 @@
 #include "third_party/blink/renderer/modules/mediastream/scoped_media_stream_tracer.h"
 
 #include "base/trace_event/typed_macros.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -16,8 +17,9 @@
 // Uses `this` as a default id as most of them can be unique.
 ScopedMediaStreamTracer::ScopedMediaStreamTracer(const String& event_name)
     : event_name_(event_name) {
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(kMediaStreamTraceCategory,
-                                    event_name_.Utf8().c_str(), this);
+  TRACE_EVENT_BEGIN(kMediaStreamTraceCategory,
+                    perfetto::DynamicString(event_name_.Utf8().c_str()),
+                    perfetto::Track::FromPointer(this));
 }
 
 ScopedMediaStreamTracer::~ScopedMediaStreamTracer() {
@@ -29,8 +31,8 @@
     return;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_END0(kMediaStreamTraceCategory,
-                                  event_name_.Utf8().c_str(), this);
+  TRACE_EVENT_END(kMediaStreamTraceCategory,
+                  perfetto::Track::FromPointer(this));
   finished_ = true;
 }
 
diff --git a/third_party/blink/renderer/modules/ml/DEPS b/third_party/blink/renderer/modules/ml/DEPS
index adeb204..689bcff 100644
--- a/third_party/blink/renderer/modules/ml/DEPS
+++ b/third_party/blink/renderer/modules/ml/DEPS
@@ -16,7 +16,4 @@
     "+base/memory/ref_counted_memory.h",
     "+base/strings/stringprintf.h",
   ],
-  "ml_graph_test.cc" : [
-    "+base/containers/fixed_flat_set.h",
-  ],
 }
\ No newline at end of file
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
index eff817c..17860c8 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
@@ -60,6 +60,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -174,9 +175,9 @@
 
 void ServiceWorkerGlobalScopeProxy::WillEvaluateScript() {
   DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_);
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "ServiceWorker", "ServiceWorkerGlobalScopeProxy::EvaluateTopLevelScript",
-      TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("ServiceWorker",
+                    "ServiceWorkerGlobalScopeProxy::EvaluateTopLevelScript",
+                    perfetto::Track::FromPointer(this));
   ScriptState::Scope scope(
       WorkerGlobalScope()->ScriptController()->GetScriptState());
   Client().WillEvaluateScript(
@@ -192,9 +193,8 @@
       base::TimeTicks::Now() - top_level_script_evaluation_start_time_);
   WorkerGlobalScope()->DidEvaluateScript();
   Client().DidEvaluateScript(success);
-  TRACE_EVENT_NESTABLE_ASYNC_END1(
-      "ServiceWorker", "ServiceWorkerGlobalScopeProxy::EvaluateTopLevelScript",
-      TRACE_ID_LOCAL(this), "success", success);
+  TRACE_EVENT_END("ServiceWorker", perfetto::Track::FromPointer(this),
+                  "success", success);
 }
 
 void ServiceWorkerGlobalScopeProxy::DidCloseWorkerGlobalScope() {
diff --git a/third_party/blink/renderer/modules/webcodecs/background_readback.cc b/third_party/blink/renderer/modules/webcodecs/background_readback.cc
index 1dd0834..2a8a015 100644
--- a/third_party/blink/renderer/modules/webcodecs/background_readback.cc
+++ b/third_party/blink/renderer/modules/webcodecs/background_readback.cc
@@ -28,6 +28,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace {
 bool CanUseRgbReadback(media::VideoFrame& frame) {
@@ -191,9 +192,9 @@
     return;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-      "media", "ReadbackRGBTextureBackedFrameToMemory", txt_frame.get(),
-      "timestamp", txt_frame->timestamp());
+  TRACE_EVENT_BEGIN("media", "ReadbackRGBTextureBackedFrameToMemory",
+                    perfetto::Track::FromPointer(txt_frame.get()), "timestamp",
+                    txt_frame->timestamp());
 
   base::span<uint8_t> dst_pixels =
       result->GetWritableVisiblePlaneData(media::VideoFrame::Plane::kARGB);
@@ -224,9 +225,8 @@
     scoped_refptr<media::VideoFrame> txt_frame,
     scoped_refptr<media::VideoFrame> result_frame,
     bool success) {
-  TRACE_EVENT_NESTABLE_ASYNC_END1("media",
-                                  "ReadbackRGBTextureBackedFrameToMemory",
-                                  txt_frame.get(), "success", success);
+  TRACE_EVENT_END("media", perfetto::Track::FromPointer(txt_frame.get()),
+                  "success", success);
   if (!success) {
     ReadbackOnThread(std::move(txt_frame), std::move(result_cb));
     return;
@@ -270,9 +270,9 @@
     return;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-      "media", "ReadbackRGBTextureBackedFrameToBuffer", txt_frame.get(),
-      "timestamp", txt_frame->timestamp());
+  TRACE_EVENT_BEGIN("media", "ReadbackRGBTextureBackedFrameToBuffer",
+                    perfetto::Track::FromPointer(txt_frame.get()), "timestamp",
+                    txt_frame->timestamp());
 
   SkImageInfo info = GetImageInfoForFrame(*txt_frame, src_rect.size());
   gfx::Point src_point = src_rect.origin();
@@ -299,9 +299,8 @@
     base::span<uint8_t> dest_buffer,
     ReadbackDoneCallback done_cb,
     bool success) {
-  TRACE_EVENT_NESTABLE_ASYNC_END1("media",
-                                  "ReadbackRGBTextureBackedFrameToBuffer",
-                                  txt_frame.get(), "success", success);
+  TRACE_EVENT_END("media", perfetto::Track::FromPointer(txt_frame.get()),
+                  "success", success);
   if (!success) {
     ReadbackOnThread(std::move(txt_frame), src_rect, dest_layout, dest_buffer,
                      std::move(done_cb));
diff --git a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc
index e314147..eab6c84b 100644
--- a/third_party/blink/renderer/modules/webcodecs/decoder_template.cc
+++ b/third_party/blink/renderer/modules/webcodecs/decoder_template.cc
@@ -44,6 +44,7 @@
 #include "third_party/blink/renderer/platform/heap/cross_thread_handle.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -893,7 +894,8 @@
   DCHECK(!is_tracing);
   is_tracing = true;
 #endif
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(kCategory, TraceNameFromType(), this);
+  TRACE_EVENT_BEGIN(kCategory, perfetto::DynamicString(TraceNameFromType()),
+                    perfetto::Track::FromPointer(this));
 }
 
 template <typename Traits>
@@ -902,8 +904,8 @@
   DCHECK(is_tracing);
   is_tracing = false;
 #endif
-  TRACE_EVENT_NESTABLE_ASYNC_END1(kCategory, TraceNameFromType(), this,
-                                  "completed", !shutting_down);
+  TRACE_EVENT_END(kCategory, perfetto::Track::FromPointer(this), "completed",
+                  !shutting_down);
 }
 
 template <typename Traits>
diff --git a/third_party/blink/renderer/modules/webcodecs/encoder_base.cc b/third_party/blink/renderer/modules/webcodecs/encoder_base.cc
index f0050eec..3e5d6b93 100644
--- a/third_party/blink/renderer/modules/webcodecs/encoder_base.cc
+++ b/third_party/blink/renderer/modules/webcodecs/encoder_base.cc
@@ -480,9 +480,9 @@
   DCHECK(!is_tracing);
   is_tracing = true;
 #endif
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(kCategory, TraceNameFromType(), this,
-                                    "key_frame", is_keyframe, "timestamp",
-                                    timestamp);
+  TRACE_EVENT_BEGIN(kCategory, perfetto::DynamicString(TraceNameFromType()),
+                    perfetto::Track::FromPointer(this), "key_frame",
+                    is_keyframe, "timestamp", timestamp);
 }
 
 template <typename Traits>
@@ -491,7 +491,8 @@
   DCHECK(!is_tracing);
   is_tracing = true;
 #endif
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(kCategory, TraceNameFromType(), this);
+  TRACE_EVENT_BEGIN(kCategory, perfetto::DynamicString(TraceNameFromType()),
+                    perfetto::Track::FromPointer(this));
 }
 
 template <typename Traits>
@@ -500,8 +501,8 @@
   DCHECK(is_tracing);
   is_tracing = false;
 #endif
-  TRACE_EVENT_NESTABLE_ASYNC_END1(kCategory, TraceNameFromType(), this,
-                                  "aborted", aborted);
+  TRACE_EVENT_END(kCategory, perfetto::Track::FromPointer(this), "aborted",
+                  aborted);
 }
 
 template class EncoderBase<VideoEncoderTraits>;
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
index af62186..3bcff36 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_encoder.cc
@@ -978,8 +978,9 @@
                               CrossThreadBindOnce(metadata_fix_lambda, frame))
                               .Then(std::move(pool_result_cb));
 
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN1("media", "CopyRGBATextureToVideoFrame",
-                                      this, "timestamp", frame->timestamp());
+    TRACE_EVENT_BEGIN("media", "CopyRGBATextureToVideoFrame",
+                      perfetto::Track::FromPointer(this), "timestamp",
+                      frame->timestamp());
     if (accelerated_frame_pool_->CopyRGBATextureToVideoFrame(
             frame->coded_size(), frame->shared_image(),
             frame->acquire_sync_token(), gfx::ColorSpace::CreateREC709(),
@@ -987,8 +988,8 @@
       return true;
     }
 
-    TRACE_EVENT_NESTABLE_ASYNC_END0("media", "CopyRGBATextureToVideoFrame",
-                                    this);
+    TRACE_EVENT_END("media", /*CopyRGBATextureToVideoFrame*/
+                    perfetto::Track::FromPointer(this));
 
     // Error occurred, fall through to normal readback path below.
     disable_accelerated_frame_pool_ = true;
@@ -1225,7 +1226,8 @@
     scoped_refptr<media::VideoFrame> txt_frame,
     media::VideoEncoder::EncoderStatusCB done_callback,
     scoped_refptr<media::VideoFrame> result_frame) {
-  TRACE_EVENT_NESTABLE_ASYNC_END0("media", "CopyRGBATextureToVideoFrame", this);
+  TRACE_EVENT_END("media", /*CopyRGBATextureToVideoFrame*/
+                  perfetto::Track::FromPointer(this));
   if (reset_count_ != request->reset_count) {
     return;
   }
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
index 2378703..7c60b5ce 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_provider.cc
@@ -261,8 +261,8 @@
   frame_data_time_.StartTimer();
   // `this` is an okay TRACE ID here, since we are only allowed one immersive
   // session at a time.
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("xr", "RequestImmersiveFrame",
-                                    TRACE_ID_LOCAL(this));
+  TRACE_EVENT_BEGIN("xr", "RequestImmersiveFrame",
+                    perfetto::Track::FromPointer(this));
   immersive_data_provider_->GetFrameData(
       std::move(options), BindOnce(&XRFrameProvider::OnImmersiveFrameData,
                                    WrapWeakPersistent(this)));
@@ -295,8 +295,8 @@
 void XRFrameProvider::OnImmersiveFrameData(
     device::mojom::blink::XRFrameDataPtr data) {
   frame_data_time_.StopTimer();
-  TRACE_EVENT_NESTABLE_ASYNC_END0("xr", "RequestImmersiveFrame",
-                                  TRACE_ID_LOCAL(this));
+  TRACE_EVENT_END("xr", /*RequestImmersiveFrame*/
+                  perfetto::Track::FromPointer(this));
   TRACE_EVENT0("gpu", "OnImmersiveFrameData");
 
   if (data.is_null()) {
diff --git a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
index 268187e..8450c8b 100644
--- a/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
+++ b/third_party/blink/renderer/modules/xr/xr_frame_request_callback_collection.cc
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/modules/xr/xr_frame.h"
 #include "third_party/blink/renderer/modules/xr/xr_session.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -22,8 +23,7 @@
 XRFrameRequestCallbackCollection::RegisterCallback(
     V8XRFrameRequestCallback* callback) {
   CallbackId id = ++next_callback_id_;
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("xr", "frameRequest",
-                                    TRACE_ID_LOCAL(trace_id_base_ + id));
+  TRACE_EVENT_BEGIN("xr", "frameRequest", perfetto::Track(trace_id_base_ + id));
   auto add_result_frame_request = callback_frame_requests_.Set(id, callback);
   auto add_result_async_task = callback_async_tasks_.Set(
       id, std::make_unique<probe::AsyncTaskContext>());
@@ -39,9 +39,8 @@
 
 void XRFrameRequestCallbackCollection::CancelCallback(CallbackId id) {
   if (IsValidCallbackId(id)) {
-    TRACE_EVENT_NESTABLE_ASYNC_END1("xr", "frameRequest",
-                                    TRACE_ID_LOCAL(trace_id_base_ + id),
-                                    "Cancelled", true);
+    TRACE_EVENT_END("xr", perfetto::Track(trace_id_base_ + id), "Cancelled",
+                    true);
     callback_frame_requests_.erase(id);
     callback_async_tasks_.erase(id);
     current_callback_frame_requests_.erase(id);
@@ -86,8 +85,7 @@
     }
     CHECK_NE(current_callback_async_tasks_.end(), it_async_task);
 
-    TRACE_EVENT_NESTABLE_ASYNC_END0("xr", "frameRequest",
-                                    TRACE_ID_LOCAL(trace_id_base_ + id));
+    TRACE_EVENT_END("xr", perfetto::Track(trace_id_base_ + id));
     probe::AsyncTask async_task(context_, it_async_task->value.get());
     it_frame_request->value->InvokeAndReportException(session, timestamp,
                                                       frame);
diff --git a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc
index ae1e036..621804d9 100644
--- a/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc
+++ b/third_party/blink/renderer/platform/graphics/animation_worklet_mutator_dispatcher_impl.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier_std.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -199,9 +200,8 @@
   DCHECK(host_queue_->BelongsToCurrentThread());
   on_async_mutation_complete_ = std::move(done_callback);
   int next_async_mutation_id = GetNextAsyncMutationId();
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-      "cc", "AnimationWorkletMutatorDispatcherImpl::MutateAsync",
-      TRACE_ID_LOCAL(next_async_mutation_id));
+  TRACE_EVENT_BEGIN("cc", "AnimationWorkletMutatorDispatcherImpl::MutateAsync",
+                    perfetto::Track(next_async_mutation_id));
 
   CrossThreadOnceClosure on_done = CrossThreadBindOnce(
       [](scoped_refptr<base::SingleThreadTaskRunner> host_queue,
@@ -239,9 +239,8 @@
   }
   // The trace event deos not include queuing time. It covers the interval
   // between dispatching the request and retrieving the results.
-  TRACE_EVENT_NESTABLE_ASYNC_END0(
-      "cc", "AnimationWorkletMutatorDispatcherImpl::MutateAsync",
-      TRACE_ID_LOCAL(async_mutation_id));
+  TRACE_EVENT_END("cc", /*AnimationWorkletMutatorDispatcherImpl::MutateAsync*/
+                  perfetto::Track(async_mutation_id));
   // The Async mutation duration is the total time between request and
   // completion, and thus includes queuing time.
   UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
index 7783861..9a3b4e3 100644
--- a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
+++ b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
@@ -37,6 +37,7 @@
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/graphics/canvas_resource.h"
 #include "third_party/blink/renderer/platform/graphics/video_frame_sink_bundle.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 #include "ui/gfx/presentation_feedback.h"
 
 namespace blink {
@@ -442,10 +443,9 @@
       }
     }
 
-    TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(
-        "media", "VideoFrameSubmitter",
-        TRACE_ID_WITH_SCOPE("VideoFrameSubmitter", frame_token),
-        feedback.timestamp);
+    TRACE_EVENT_END("media",
+                    perfetto::NamedTrack("VideoFrameSubmitter", frame_token),
+                    feedback.timestamp);
   }
 
   base::TimeTicks deadline_min = args.frame_time + args.interval;
@@ -882,15 +882,14 @@
 
   if (video_frame && video_frame->metadata().decode_end_time.has_value()) {
     base::TimeTicks value = *video_frame->metadata().decode_end_time;
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
-        "media", "VideoFrameSubmitter",
-        TRACE_ID_WITH_SCOPE("VideoFrameSubmitter", frame_token), value);
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
-        "media", "Pre-submit buffering",
-        TRACE_ID_WITH_SCOPE("VideoFrameSubmitter", frame_token), value);
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "media", "Pre-submit buffering",
-        TRACE_ID_WITH_SCOPE("VideoFrameSubmitter", frame_token));
+    TRACE_EVENT_BEGIN("media", "VideoFrameSubmitter",
+                      perfetto::NamedTrack("VideoFrameSubmitter", frame_token),
+                      value);
+    TRACE_EVENT_BEGIN("media", "Pre-submit buffering",
+                      perfetto::NamedTrack("VideoFrameSubmitter", frame_token),
+                      value);
+    TRACE_EVENT_END("media", /*Pre-submit buffering*/
+                    perfetto::NamedTrack("VideoFrameSubmitter", frame_token));
 
     if (begin_frame_ack.frame_id.source_id ==
         viz::BeginFrameArgs::kManualSourceId) {
@@ -902,10 +901,9 @@
     RecordUmaPreSubmitBufferingDelay(is_media_stream_,
                                      base::TimeTicks::Now() - value);
   } else {
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-        "media", "VideoFrameSubmitter",
-        TRACE_ID_WITH_SCOPE("VideoFrameSubmitter", frame_token),
-        "empty video frame?", !video_frame);
+    TRACE_EVENT_BEGIN("media", "VideoFrameSubmitter",
+                      perfetto::NamedTrack("VideoFrameSubmitter", frame_token),
+                      "empty video frame?", !video_frame);
   }
 
   // We don't assume that the ack is marked as having damage.  However, we're
diff --git a/third_party/blink/renderer/platform/loader/fetch/DEPS b/third_party/blink/renderer/platform/loader/fetch/DEPS
index 921a727..ec8c35f0 100644
--- a/third_party/blink/renderer/platform/loader/fetch/DEPS
+++ b/third_party/blink/renderer/platform/loader/fetch/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+base/containers/fixed_flat_set.h",
   "+base/containers/flat_set.h",
   "+components/subresource_filter/core/common/scoped_rule.h",
   "+net/base/auth.h",
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
index 7baf145..343a63f 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -108,6 +108,7 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -1267,10 +1268,8 @@
   resource_request.SetInspectorId(identifier);
   resource_request.SetFromOriginDirtyStyleSheet(
       params.IsFromOriginDirtyStyleSheet());
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-      TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
-      TRACE_ID_WITH_SCOPE("BlinkResourceID", TRACE_ID_LOCAL(identifier)), "url",
-      resource_request.Url());
+  TRACE_EVENT_BEGIN(TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
+                    perfetto::Track(identifier), "url", resource_request.Url());
   absl::Cleanup record_times = [start = base::TimeTicks::Now(), &params] {
     base::TimeDelta elapsed = base::TimeTicks::Now() - start;
     base::UmaHistogramMicrosecondsTimes("Blink.Fetch.RequestResourceTime2",
@@ -1525,10 +1524,8 @@
 
   if (resource->InspectorId() != identifier ||
       (!resource->StillNeedsLoad() && !resource->IsLoading())) {
-    TRACE_EVENT_NESTABLE_ASYNC_END1(
-        TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
-        TRACE_ID_WITH_SCOPE("BlinkResourceID", TRACE_ID_LOCAL(identifier)),
-        "outcome", "Fail");
+    TRACE_EVENT_END(TRACE_DISABLED_BY_DEFAULT("network"),
+                    perfetto::Track(identifier), "outcome", "Fail");
   }
   return resource;
 }
@@ -2807,11 +2804,10 @@
               resource->GetResourceRequest().Priority());
     resource->DidChangePriority(computed_load_priority,
                                 resource_priority.intra_priority_value);
-    TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(
-        TRACE_DISABLED_BY_DEFAULT("network"), "ResourcePrioritySet",
-        TRACE_ID_WITH_SCOPE("BlinkResourceID",
-                            TRACE_ID_LOCAL(resource->InspectorId())),
-        "data", CreateTracedValueWithPriority(computed_load_priority));
+    TRACE_EVENT_INSTANT(TRACE_DISABLED_BY_DEFAULT("network"),
+                        "ResourcePrioritySet",
+                        perfetto::Track(resource->InspectorId()), "data",
+                        CreateTracedValueWithPriority(computed_load_priority));
     DCHECK(!IsDetached());
     resource_load_observer_->DidChangePriority(
         resource->InspectorId(), computed_load_priority,
@@ -3522,11 +3518,10 @@
 
 void ResourceFetcher::ResourcePrepareHelper::RecordTrace() {
   const ResourceRequest& resource_request = params_.GetResourceRequest();
-  TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(
-      TRACE_DISABLED_BY_DEFAULT("network"), "ResourcePrioritySet",
-      TRACE_ID_WITH_SCOPE("BlinkResourceID",
-                          TRACE_ID_LOCAL(resource_request.InspectorId())),
-      "priority", resource_request.Priority());
+  TRACE_EVENT_INSTANT(TRACE_DISABLED_BY_DEFAULT("network"),
+                      "ResourcePrioritySet",
+                      perfetto::Track(resource_request.InspectorId()),
+                      "priority", resource_request.Priority());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
index e787ff2..35a646a 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_loader.cc
@@ -103,6 +103,7 @@
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/text/strcat.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 #include "url/url_constants.h"
 
 namespace blink {
@@ -1082,10 +1083,9 @@
 }
 
 void ResourceLoader::DidFinishLoadingFirstPartInMultipart() {
-  TRACE_EVENT_NESTABLE_ASYNC_END1(
-      TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
-      TRACE_ID_WITH_SCOPE("BlinkResourceID",
-                          TRACE_ID_LOCAL(resource_->InspectorId())),
+  TRACE_EVENT_END(
+      TRACE_DISABLED_BY_DEFAULT("network"),
+      perfetto::NamedTrack("BlinkResourceID", resource_->InspectorId()),
       "outcome", RequestOutcomeToString(RequestOutcome::kSuccess));
 
   fetcher_->HandleLoaderFinish(resource_.Get(), base::TimeTicks(),
@@ -1132,10 +1132,9 @@
   deferred_finish_loading_info_ = std::nullopt;
   finished_ = true;
 
-  TRACE_EVENT_NESTABLE_ASYNC_END1(
-      TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
-      TRACE_ID_WITH_SCOPE("BlinkResourceID",
-                          TRACE_ID_LOCAL(resource_->InspectorId())),
+  TRACE_EVENT_END(
+      TRACE_DISABLED_BY_DEFAULT("network"),
+      perfetto::NamedTrack("BlinkResourceID", resource_->InspectorId()),
       "outcome", RequestOutcomeToString(RequestOutcome::kSuccess));
 
   fetcher_->HandleLoaderFinish(resource_.Get(), response_end_time,
@@ -1219,10 +1218,9 @@
   deferred_finish_loading_info_ = std::nullopt;
   finished_ = true;
 
-  TRACE_EVENT_NESTABLE_ASYNC_END1(
-      TRACE_DISABLED_BY_DEFAULT("network"), "ResourceLoad",
-      TRACE_ID_WITH_SCOPE("BlinkResourceID",
-                          TRACE_ID_LOCAL(resource_->InspectorId())),
+  TRACE_EVENT_END(
+      TRACE_DISABLED_BY_DEFAULT("network"),
+      perfetto::NamedTrack("BlinkResourceID", resource_->InspectorId()),
       "outcome", RequestOutcomeToString(RequestOutcome::kFail));
 
   // Set Now() as the response time, in case a more accurate one wasn't set in
diff --git a/third_party/blink/renderer/platform/media/cdm_session_adapter.cc b/third_party/blink/renderer/platform/media/cdm_session_adapter.cc
index e10dde0d..490c917 100644
--- a/third_party/blink/renderer/platform/media/cdm_session_adapter.cc
+++ b/third_party/blink/renderer/platform/media/cdm_session_adapter.cc
@@ -22,6 +22,7 @@
 #include "third_party/blink/renderer/platform/media/create_cdm_uma_helper.h"
 #include "third_party/blink/renderer/platform/media/web_content_decryption_module_session_impl.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -35,8 +36,8 @@
 void CdmSessionAdapter::CreateCdm(media::CdmFactory* cdm_factory,
                                   const media::CdmConfig& cdm_config,
                                   WebCdmCreatedCB web_cdm_created_cb) {
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("media", "CdmSessionAdapter::CreateCdm",
-                                    ++trace_id_);
+  TRACE_EVENT_BEGIN("media", "CdmSessionAdapter::CreateCdm",
+                    perfetto::Track(++trace_id_));
 
   base::TimeTicks start_time = base::TimeTicks::Now();
 
@@ -165,9 +166,8 @@
            << (cdm ? "success" : "failure (" + base::ToString(status) + ")");
   DCHECK(!cdm_);
 
-  TRACE_EVENT_NESTABLE_ASYNC_END2("media", "CdmSessionAdapter::CreateCdm",
-                                  trace_id_, "success", base::ToString(cdm),
-                                  "status", status);
+  TRACE_EVENT_END("media", perfetto::Track(trace_id_), "success",
+                  base::ToString(cdm), "status", status);
 
   auto key_system_uma_prefix = GetUMAPrefixForCdm(cdm_config);
   ReportCreateCdmStatusUMA(key_system_uma_prefix, cdm != nullptr, status);
diff --git a/third_party/blink/renderer/platform/p2p/socket_client_impl.cc b/third_party/blink/renderer/platform/p2p/socket_client_impl.cc
index f3171b2..152261f 100644
--- a/third_party/blink/renderer/platform/p2p/socket_client_impl.cc
+++ b/third_party/blink/renderer/platform/p2p/socket_client_impl.cc
@@ -9,11 +9,13 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
 #include "base/trace_event/common/trace_event_common.h"
+#include "base/trace_event/trace_event.h"
 #include "crypto/random.h"
 #include "services/network/public/cpp/p2p_param_traits.h"
 #include "third_party/blink/renderer/platform/p2p/socket_client_delegate.h"
 #include "third_party/blink/renderer/platform/p2p/socket_dispatcher.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace {
 
@@ -96,7 +98,7 @@
     base::span<const uint8_t> data,
     const webrtc::AsyncSocketPacketOptions& options,
     uint64_t packet_id) {
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("p2p", "Send", packet_id);
+  TRACE_EVENT_BEGIN("p2p", "Send", perfetto::Track(packet_id));
 
   // Conditionally start or continue temporarily storing the packets of a batch.
   // We can't allow sending individual packets mid batch since we would receive
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index fb078ed8..9c22dfd8 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1861,7 +1861,7 @@
     {
       // https://chromestatus.com/feature/5067126381215744
       name: "DocumentActiveViewTransition",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "DocumentCookie",
@@ -4104,9 +4104,7 @@
     // https://chromestatus.com/feature/4771962874363904
     {
       name: "RouteMatching",
-      status: {
-        "default": "test",
-      },
+      status: "test",
     },
     {
       name: "RtcAudioJitterBufferMaxPackets",
@@ -5216,6 +5214,10 @@
       status: "test",
     },
     {
+      name: "UsePersistentCacheForCodeCache",
+      status: "test",
+    },
+    {
       name: "UsePositionForPointInFlexibleBoxWithSingleChildElement",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/scheduler/common/back_forward_cache_disabling_feature_tracker.cc b/third_party/blink/renderer/platform/scheduler/common/back_forward_cache_disabling_feature_tracker.cc
index 9a490fd..35c229d1 100644
--- a/third_party/blink/renderer/platform/scheduler/common/back_forward_cache_disabling_feature_tracker.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/back_forward_cache_disabling_feature_tracker.cc
@@ -5,6 +5,7 @@
 #include "third_party/blink/renderer/platform/scheduler/common/back_forward_cache_disabling_feature_tracker.h"
 
 #include "third_party/blink/renderer/platform/scheduler/common/thread_scheduler_base.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 namespace scheduler {
@@ -35,10 +36,9 @@
 
 void BackForwardCacheDisablingFeatureTracker::Reset() {
   for (const auto& it : back_forward_cache_disabling_feature_counts_) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "renderer.scheduler", "ActiveSchedulerTrackedFeature",
-        TRACE_ID_LOCAL(reinterpret_cast<intptr_t>(this) ^
-                       static_cast<int>(it.first)));
+    TRACE_EVENT_END("renderer.scheduler",
+                    perfetto::Track(reinterpret_cast<intptr_t>(this) ^
+                                    static_cast<int>(it.first)));
   }
 
   back_forward_cache_disabling_feature_counts_.clear();
@@ -142,17 +142,16 @@
   }
   switch (tracing_type) {
     case TracingType::kBegin:
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-          "renderer.scheduler", "ActiveSchedulerTrackedFeature",
-          TRACE_ID_LOCAL(reinterpret_cast<intptr_t>(this) ^
-                         static_cast<int>(traced_feature)),
-          "feature", FeatureToHumanReadableString(traced_feature));
+      TRACE_EVENT_BEGIN("renderer.scheduler", "ActiveSchedulerTrackedFeature",
+                        perfetto::Track(reinterpret_cast<intptr_t>(this) ^
+                                        static_cast<int>(traced_feature)),
+                        "feature",
+                        FeatureToHumanReadableString(traced_feature));
       break;
     case TracingType::kEnd:
-      TRACE_EVENT_NESTABLE_ASYNC_END0(
-          "renderer.scheduler", "ActiveSchedulerTrackedFeature",
-          TRACE_ID_LOCAL(reinterpret_cast<intptr_t>(this) ^
-                         static_cast<int>(traced_feature)));
+      TRACE_EVENT_END("renderer.scheduler",
+                      perfetto::Track(reinterpret_cast<intptr_t>(this) ^
+                                      static_cast<int>(traced_feature)));
       break;
   }
 }
diff --git a/third_party/blink/renderer/platform/scheduler/common/idle_helper.cc b/third_party/blink/renderer/platform/scheduler/common/idle_helper.cc
index eba626a..3c6b28c 100644
--- a/third_party/blink/renderer/platform/scheduler/common/idle_helper.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/idle_helper.cc
@@ -17,6 +17,7 @@
 #include "third_party/blink/renderer/platform/scheduler/common/blink_scheduler_single_thread_task_runner.h"
 #include "third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h"
 #include "third_party/blink/renderer/platform/scheduler/common/task_priority.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 namespace scheduler {
@@ -398,14 +399,14 @@
     running_idle_task_for_tracing_ = false;
     if (!idle_period_deadline_.is_null() && now > idle_period_deadline_) {
       if (last_sub_trace_event_name_) {
-        TRACE_EVENT_NESTABLE_ASYNC_END0("renderer.scheduler",
-                                        last_sub_trace_event_name_,
-                                        TRACE_ID_LOCAL(this));
+        TRACE_EVENT_END("renderer.scheduler",
+                        perfetto::Track(reinterpret_cast<uint64_t>(this)));
       }
       last_sub_trace_event_name_ = "DeadlineOverrun";
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(
-          "renderer.scheduler", last_sub_trace_event_name_,
-          TRACE_ID_LOCAL(this),
+      TRACE_EVENT_BEGIN(
+          "renderer.scheduler",
+          perfetto::StaticString(last_sub_trace_event_name_),
+          perfetto::Track(reinterpret_cast<uint64_t>(this)),
           std::max(idle_period_deadline_, last_idle_task_trace_time_));
     }
   }
@@ -413,9 +414,11 @@
   if (new_state != IdlePeriodState::kNotInIdlePeriod) {
     if (!idle_period_trace_event_started_) {
       idle_period_trace_event_started_ = true;
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-          "renderer.scheduler", idle_period_tracing_name_, TRACE_ID_LOCAL(this),
-          "idle_period_length_ms", (new_deadline - now).InMillisecondsF());
+      TRACE_EVENT_BEGIN("renderer.scheduler",
+                        perfetto::StaticString(idle_period_tracing_name_),
+                        perfetto::Track(reinterpret_cast<uint64_t>(this)),
+                        "idle_period_length_ms",
+                        (new_deadline - now).InMillisecondsF());
     }
 
     const char* new_sub_trace_event_name = nullptr;
@@ -443,23 +446,22 @@
 
     if (new_sub_trace_event_name) {
       if (last_sub_trace_event_name_) {
-        TRACE_EVENT_NESTABLE_ASYNC_END0("renderer.scheduler",
-                                        last_sub_trace_event_name_,
-                                        TRACE_ID_LOCAL(this));
+        TRACE_EVENT_END("renderer.scheduler",
+                        perfetto::Track(reinterpret_cast<uint64_t>(this)));
       }
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
-          "renderer.scheduler", new_sub_trace_event_name, TRACE_ID_LOCAL(this));
+      TRACE_EVENT_BEGIN("renderer.scheduler",
+                        perfetto::StaticString(new_sub_trace_event_name),
+                        perfetto::Track(reinterpret_cast<uint64_t>(this)));
       last_sub_trace_event_name_ = new_sub_trace_event_name;
     }
   } else if (idle_period_trace_event_started_) {
     if (last_sub_trace_event_name_) {
-      TRACE_EVENT_NESTABLE_ASYNC_END0("renderer.scheduler",
-                                      last_sub_trace_event_name_,
-                                      TRACE_ID_LOCAL(this));
+      TRACE_EVENT_END("renderer.scheduler",
+                      perfetto::Track(reinterpret_cast<uint64_t>(this)));
       last_sub_trace_event_name_ = nullptr;
     }
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "renderer.scheduler", idle_period_tracing_name_, TRACE_ID_LOCAL(this));
+    TRACE_EVENT_END("renderer.scheduler",
+                    perfetto::Track(reinterpret_cast<uint64_t>(this)));
     idle_period_trace_event_started_ = false;
   }
 }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index e9fcec4..0663430 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -64,6 +64,7 @@
 #include "third_party/blink/renderer/platform/scheduler/main_thread/widget_scheduler_impl.h"
 #include "third_party/blink/renderer/platform/scheduler/public/event_loop.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 #include "third_party/perfetto/protos/perfetto/trace/track_event/chrome_renderer_scheduler_state.pbzero.h"
 #include "third_party/perfetto/protos/perfetto/trace/track_event/track_event.pbzero.h"
 #include "v8/include/v8.h"
@@ -2135,10 +2136,11 @@
     trace_event_scope_id = this;
   }
 
-  TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-      TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), trace_event_scope_name,
-      trace_event_scope_id, "agent_group_scheduler",
-      static_cast<void*>(next_agent_group_scheduler));
+  TRACE_EVENT_BEGIN(
+      TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
+      perfetto::StaticString(trace_event_scope_name),
+      perfetto::Track(reinterpret_cast<uint64_t>(trace_event_scope_id)),
+      "agent_group_scheduler", static_cast<void*>(next_agent_group_scheduler));
 
   AgentGroupScheduler* previous_agent_group_scheduler =
       current_agent_group_scheduler_;
@@ -2194,10 +2196,10 @@
   current_agent_group_scheduler_ =
       agent_group_scheduler_scope.previous_agent_group_scheduler;
 
-  TRACE_EVENT_NESTABLE_ASYNC_END1(
+  TRACE_EVENT_END(
       TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
-      agent_group_scheduler_scope.trace_event_scope_name,
-      agent_group_scheduler_scope.trace_event_scope_id.get(),
+      perfetto::Track(reinterpret_cast<uint64_t>(
+          agent_group_scheduler_scope.trace_event_scope_id.get())),
       "agent_group_scheduler",
       static_cast<void*>(
           agent_group_scheduler_scope.current_agent_group_scheduler));
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/web_scoped_virtual_time_pauser.cc b/third_party/blink/renderer/platform/scheduler/main_thread/web_scoped_virtual_time_pauser.cc
index 6490d04..2c9546a 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/web_scoped_virtual_time_pauser.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/web_scoped_virtual_time_pauser.cc
@@ -7,6 +7,7 @@
 #include "base/trace_event/trace_event.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/traced_value.h"
 #include "third_party/blink/renderer/platform/scheduler/common/thread_scheduler_base.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -64,9 +65,9 @@
   if (virtual_time_enabled_when_paused_) {
     // This trace event shows when individual pausers are active (instead of the
     // global paused/unpaused state).
-    TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
-        "renderer.scheduler", "WebScopedVirtualTimePauser::PauseVirtualTime",
-        trace_id_, "name", debug_name_.Latin1());
+    TRACE_EVENT_BEGIN("renderer.scheduler",
+                      "WebScopedVirtualTimePauser::PauseVirtualTime",
+                      perfetto::Track(trace_id_), "name", debug_name_.Latin1());
   }
   virtual_time_when_paused_ = scheduler_->IncrementVirtualTimePauseCount();
 }
@@ -86,9 +87,7 @@
                                         base::Milliseconds(10));
   }
   if (virtual_time_enabled_when_paused_) {
-    TRACE_EVENT_NESTABLE_ASYNC_END0(
-        "renderer.scheduler", "WebScopedVirtualTimePauser::PauseVirtualTime",
-        trace_id_);
+    TRACE_EVENT_END("renderer.scheduler", perfetto::Track(trace_id_));
   }
 }
 
diff --git a/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc b/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc
index be913da..63a05908 100644
--- a/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc
+++ b/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc
@@ -36,6 +36,7 @@
 #include "gpu/ipc/client/client_shared_image_interface.h"
 #include "third_party/blink/public/common/switches.h"
 #include "third_party/blink/public/platform/platform.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/geometry/skia_conversions.h"
@@ -617,10 +618,10 @@
     bool needs_begin_frames) {
   if (needs_begin_frames_ != needs_begin_frames) {
     if (needs_begin_frames) {
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("cc,benchmark", "NeedsBeginFrames",
-                                        this);
+      TRACE_EVENT_BEGIN("cc,benchmark", "NeedsBeginFrames",
+                        perfetto::Track::FromPointer(this));
     } else {
-      TRACE_EVENT_NESTABLE_ASYNC_END0("cc,benchmark", "NeedsBeginFrames", this);
+      TRACE_EVENT_END("cc,benchmark", perfetto::Track::FromPointer(this));
     }
   }
   needs_begin_frames_ = needs_begin_frames;
diff --git a/third_party/blink/renderer/platform/widget/input/compositor_thread_event_queue.cc b/third_party/blink/renderer/platform/widget/input/compositor_thread_event_queue.cc
index a223fe5..5602166a 100644
--- a/third_party/blink/renderer/platform/widget/input/compositor_thread_event_queue.cc
+++ b/third_party/blink/renderer/platform/widget/input/compositor_thread_event_queue.cc
@@ -7,6 +7,7 @@
 #include "base/trace_event/trace_event.h"
 #include "cc/metrics/event_metrics.h"
 #include "third_party/blink/public/common/input/web_input_event_attribution.h"
+#include "third_party/perfetto/include/perfetto/tracing/track.h"
 
 namespace blink {
 
@@ -66,9 +67,9 @@
     if (new_event->first_original_event()) {
       // Trace could be nested as there might be multiple events in queue.
       // e.g. |ScrollUpdate|, |ScrollEnd|, and another scroll sequence.
-      TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("input",
-                                        "CompositorThreadEventQueue::Queue",
-                                        new_event->first_original_event());
+      TRACE_EVENT_BEGIN(
+          "input", "CompositorThreadEventQueue::Queue",
+          perfetto::Track::FromPointer(new_event->first_original_event()));
     }
     queue_.push_back(std::move(new_event));
     return;
@@ -187,10 +188,10 @@
   queue_.pop_front();
 
   if (result->first_original_event()) {
-    TRACE_EVENT_NESTABLE_ASYNC_END2(
-        "input", "CompositorThreadEventQueue::Queue",
-        result->first_original_event(), "type", result->event().GetType(),
-        "coalesced_count", result->coalesced_count());
+    TRACE_EVENT_END(
+        "input", perfetto::Track::FromPointer(result->first_original_event()),
+        "type", result->event().GetType(), "coalesced_count",
+        result->coalesced_count());
   }
   return result;
 }
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 03a93f0..77192d42 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -2423,7 +2423,7 @@
       "arichiv@chromium.org",
       "johannhof@chromium.org"
     ],
-    "expires": "Sep 1, 2025"
+    "expires": "Mar 1, 2026"
   },
   {
     "prefix": "permission-element",
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 30624e8..07981fe1 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -1713,6 +1713,7 @@
     attribute @@unscopables
     getter URL
     getter activeElement
+    getter activeViewTransition
     getter adoptedStyleSheets
     getter alinkColor
     getter all
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index f5d6354..194053a 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -1035,6 +1035,9 @@
     setter x
     setter y
     setter z
+interface CSSRouteRule : CSSConditionRule
+    attribute @@toStringTag
+    method constructor
 interface CSSRule
     attribute @@toStringTag
     attribute CHARSET_RULE
diff --git a/third_party/blink/web_tests/external/wpt/route/crashtests/routemap-src.html b/third_party/blink/web_tests/wpt_internal/route/crashtests/routemap-src.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/route/crashtests/routemap-src.html
rename to third_party/blink/web_tests/wpt_internal/route/crashtests/routemap-src.html
diff --git a/third_party/blink/web_tests/wpt_internal/route/routemap-001.html b/third_party/blink/web_tests/wpt_internal/route/routemap-001.html
new file mode 100644
index 0000000..4a97583
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/route/routemap-001.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<title>Simple routemap with one matching and one non-matching route</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://github.com/WICG/declarative-partial-updates?tab=readme-ov-file#part-2-route-matching">
+<!-- Assuming here that "route" is part of the test path. -->
+<script type="routemap">
+  {
+    "routes": [
+      {
+        "name": "r1",
+        "pattern": [ "route" ]
+      },
+      {
+        "name": "r2",
+        "pattern": [ "should-not-match" ]
+      }
+    ]
+  }
+</script>
+<style>
+  #target {
+    display: none;
+  }
+  @route r1 {
+    #target {
+      display: block;
+      width: 100px;
+      height: 100px;
+      background: green;
+    }
+  }
+  @route r2 {
+    #target {
+      border: 10px solid red;
+    }
+  }
+</style>
+<div id="target"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(()=> {
+    assert_equals(target.offsetWidth, 100);
+    assert_equals(target.offsetHeight, 100);
+    assert_equals(getComputedStyle(target).borderStyle, "none");
+  }, "Only route r1 should match");
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/route/routemap-002.html b/third_party/blink/web_tests/wpt_internal/route/routemap-002.html
new file mode 100644
index 0000000..a76db82
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/route/routemap-002.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<title>Set new URL, then go back</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://github.com/WICG/declarative-partial-updates?tab=readme-ov-file#part-2-route-matching">
+<!-- Assuming here that "route" is part of the test path. -->
+<script type="routemap">
+  {
+    "routes": [
+      {
+        "name": "r1",
+        "pattern": [ "route" ]
+      },
+      {
+        "name": "r2",
+        "pattern": [ "match-later" ]
+      }
+    ]
+  }
+</script>
+<style>
+  #target {
+    width: 7px;
+    height: 7px;
+  }
+
+  @route r1 {
+    #target {
+      width: 100px;
+    }
+  }
+
+  @route r2 {
+    #target {
+      height: 100px;
+    }
+  }
+</style>
+<div id="target"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(()=> {
+    assert_equals(getComputedStyle(target).width, "100px");
+    assert_equals(getComputedStyle(target).height, "7px");
+  }, "Initially only route r1 should match");
+
+  test(()=> {
+    history.pushState(0, null, "match-later");
+    assert_equals(getComputedStyle(target).width, "100px");
+    assert_equals(getComputedStyle(target).height, "100px");
+  }, "Both routes should match");
+
+  promise_test(async t => {
+    window.onpopstate = t.step_func_done(() => {
+      assert_equals(getComputedStyle(target).width, "100px");
+      assert_equals(getComputedStyle(target).height, "7px");
+    });
+    history.back();
+  }, "Going back again, only route r1 should match");
+</script>
diff --git a/third_party/blink/web_tests/wpt_internal/route/routemap-003.html b/third_party/blink/web_tests/wpt_internal/route/routemap-003.html
new file mode 100644
index 0000000..fac91b7
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/route/routemap-003.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html>
+<title>Set new URL, add @route rule</title>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://github.com/WICG/declarative-partial-updates?tab=readme-ov-file#part-2-route-matching">
+<script type="routemap">
+  {
+    "routes": [
+      {
+        "name": "r1",
+        "pattern": [ "match-later" ]
+      }
+    ]
+  }
+</script>
+<style id="sheetElm">
+  #target {
+    width: 7px;
+  }
+</style>
+<div id="target"></div>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+  test(()=> {
+    assert_equals(getComputedStyle(target).width, "7px");
+  }, "Initially no match");
+
+  test(()=> {
+    history.pushState(0, null, "match-later");
+    sheetElm.sheet.insertRule("@route r1 { #target { width: 100px; } }", 1);
+    assert_equals(getComputedStyle(target).width, "100px");
+  }, "New URL, add route rule");
+
+  test(()=> {
+    sheetElm.sheet.deleteRule(1);
+    assert_equals(getComputedStyle(target).width, "7px");
+  }, "Remove route rule");
+
+  test(()=> {
+    sheetElm.sheet.insertRule("@route r1 { #target { width: 200px; } }", 1);
+    assert_equals(getComputedStyle(target).width, "200px");
+  }, "Add route rule again");
+</script>
diff --git a/third_party/dawn b/third_party/dawn
index 6bab1bd..b0a54bf 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit 6bab1bd9fd23c03ab2b0f26e9b489e0b6b1844f2
+Subproject commit b0a54bfe2da42392af08f2cfa3d9cf023650a61e
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index c6af98d..5c0782b 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit c6af98d7a7a5cdb38791e6861f6e75cc98251ca7
+Subproject commit 5c0782b1ec316a185616cd76223d66c8b2b4dbbb
diff --git a/third_party/freetype/README.chromium b/third_party/freetype/README.chromium
index 2c6546fe..e674242 100644
--- a/third_party/freetype/README.chromium
+++ b/third_party/freetype/README.chromium
@@ -1,7 +1,7 @@
 Name: FreeType
 URL: http://www.freetype.org/
-Version: VER-2-13-3-320-g61a423426
-Revision: 61a423426089e65c27699d824303f209026b2f05
+Version: VER-2-13-3-321-gc6cf32de3
+Revision: c6cf32de3b3582d0eea9f6372121f0f07d22ae68
 CPEPrefix: cpe:/a:freetype:freetype:2.13.3
 License: FTL
 License File: src/docs/FTL.TXT
diff --git a/third_party/freetype/src b/third_party/freetype/src
index 61a4234..c6cf32d 160000
--- a/third_party/freetype/src
+++ b/third_party/freetype/src
@@ -1 +1 @@
-Subproject commit 61a423426089e65c27699d824303f209026b2f05
+Subproject commit c6cf32de3b3582d0eea9f6372121f0f07d22ae68
diff --git a/third_party/libc++/src b/third_party/libc++/src
index 65a5746..23b5bc9 160000
--- a/third_party/libc++/src
+++ b/third_party/libc++/src
@@ -1 +1 @@
-Subproject commit 65a5746fb4cc5fd7fdd1773b0c50bc556ff8900a
+Subproject commit 23b5bc93867b93b73f7be97cf2e8a71e95770e07
diff --git a/third_party/perfetto b/third_party/perfetto
index 9e99848..d17b40b 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 9e99848ef108842c9c6f1fefe5bf8d4fd44c8496
+Subproject commit d17b40b3b5e36f3744f1d010fe3ba2d3c55559c0
diff --git a/third_party/skia b/third_party/skia
index 4cc541b..359f3d7 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 4cc541b8014920519c812cca60d48c584a9a7425
+Subproject commit 359f3d7cc7edfcb93e99ab5ed7e9f2f5fdd8ef85
diff --git a/third_party/webrtc b/third_party/webrtc
index 3f6f3de..db0e64c 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit 3f6f3decfcf874544fd2afff11e0c26bdf9b6fdb
+Subproject commit db0e64c5e80168839d74ae0cc6173ccd537ae211
diff --git a/tools/android/logcat_filtering/index.html b/tools/android/logcat_filtering/index.html
index 0ab1fdf..56fc685 100644
--- a/tools/android/logcat_filtering/index.html
+++ b/tools/android/logcat_filtering/index.html
@@ -32,40 +32,6 @@
       <input type="button" id="paste-logcat-button" class="hidden-element">
     </div>
 
-    <div class="button-with-feedback">
-      <label for="next-exception-button" class="google-button">
-        <i class="material-icons">error</i> Jump to Next Exception
-      </label>
-      <input type="button" id="next-exception-button" class="hidden-element">
-      <span id="next-exception-feedback"
-            class="feedback-text hidden-element"></span>
-    </div>
-
-    <div class="button-with-feedback">
-      <label for="prev-exception-button" class="google-button">
-        <i class="material-icons">error</i> Jump to Previous Exception
-      </label>
-      <input type="button" id="prev-exception-button" class="hidden-element">
-      <span id="prev-exception-feedback"
-            class="feedback-text hidden-element"></span>
-    </div>
-
-    <div class="button-with-feedback">
-      <label for="next-test-button" class="google-button">
-        <i class="material-icons">rule</i> Jump to Next Test
-      </label>
-      <input type="button" id="next-test-button" class="hidden-element">
-      <span id="next-test-feedback" class="feedback-text hidden-element"></span>
-    </div>
-
-    <div class="button-with-feedback">
-      <label for="prev-test-button" class="google-button">
-        <i class="material-icons">rule</i> Jump to Previous Test
-      </label>
-      <input type="button" id="prev-test-button" class="hidden-element">
-      <span id="prev-test-feedback" class="feedback-text hidden-element"></span>
-    </div>
-
     <div class="dropdown">
       <div id="dropdown-header-process" class="dropdown-header">
         <i class="material-icons">memory</i> Filter Logcat By Process
@@ -142,6 +108,40 @@
       </ol>
     </div>
 
+    <div class="button-with-feedback">
+      <label for="next-exception-button" class="google-button">
+        <i class="material-icons">error</i> Jump to Next Exception
+      </label>
+      <input type="button" id="next-exception-button" class="hidden-element">
+      <span id="next-exception-feedback"
+            class="feedback-text hidden-element"></span>
+    </div>
+
+    <div class="button-with-feedback">
+      <label for="prev-exception-button" class="google-button">
+        <i class="material-icons">error</i> Jump to Previous Exception
+      </label>
+      <input type="button" id="prev-exception-button" class="hidden-element">
+      <span id="prev-exception-feedback"
+            class="feedback-text hidden-element"></span>
+    </div>
+
+    <div class="button-with-feedback">
+      <label for="next-test-button" class="google-button">
+        <i class="material-icons">rule</i> Jump to Next Test
+      </label>
+      <input type="button" id="next-test-button" class="hidden-element">
+      <span id="next-test-feedback" class="feedback-text hidden-element"></span>
+    </div>
+
+    <div class="button-with-feedback">
+      <label for="prev-test-button" class="google-button">
+        <i class="material-icons">rule</i> Jump to Previous Test
+      </label>
+      <input type="button" id="prev-test-button" class="hidden-element">
+      <span id="prev-test-feedback" class="feedback-text hidden-element"></span>
+    </div>
+
     <div id="checkbox-controls">
       <div class="checkbox-column">
         <label>
@@ -159,15 +159,15 @@
           <span>Display Non Logcat Lines</span>
         </label>
         <label>
-          <input type="checkbox" id="toggle-dark-mode-checkbox">
-          <span>Toggle Dark Mode</span>
+          <input type="checkbox"
+                 id="always-show-activity-manager-checkbox" checked>
+          <span>Always Show ActivityManager</span>
         </label>
       </div>
       <div class="checkbox-column">
         <label>
-          <input type="checkbox"
-                 id="always-show-activity-manager-checkbox" checked>
-          <span>Always Show ActivityManager</span>
+          <input type="checkbox" id="toggle-dark-mode-checkbox">
+          <span>Toggle Dark Mode</span>
         </label>
       </div>
     </div>
diff --git a/tools/android/logcat_filtering/script.js b/tools/android/logcat_filtering/script.js
index f20069c2..a367378f 100644
--- a/tools/android/logcat_filtering/script.js
+++ b/tools/android/logcat_filtering/script.js
@@ -35,16 +35,6 @@
 const pasteLogcatButton = document.getElementById('paste-logcat-button');
 const pasteLogcatButtonLabel = document.querySelector(
   'label[for="paste-logcat-button"]');
-const nextExceptionButton = document.getElementById('next-exception-button');
-const nextExceptionFeedback = document.getElementById(
-  'next-exception-feedback');
-const prevExceptionButton = document.getElementById('prev-exception-button');
-const prevExceptionFeedback = document.getElementById(
-  'prev-exception-feedback');
-const nextTestButton = document.getElementById('next-test-button');
-const nextTestFeedback = document.getElementById('next-test-feedback');
-const prevTestButton = document.getElementById('prev-test-button');
-const prevTestFeedback = document.getElementById('prev-test-feedback');
 const dropdownHeaderProcess = document.getElementById(
   'dropdown-header-process');
 const dropdownSearchProcess = document.getElementById(
@@ -56,14 +46,24 @@
 const dropdownHeaderPriority = document.getElementById(
   'dropdown-header-priority');
 const dropdownListPriority = document.getElementById('dropdown-list-priority');
+const nextExceptionButton = document.getElementById('next-exception-button');
+const nextExceptionFeedback = document.getElementById(
+  'next-exception-feedback');
+const prevExceptionButton = document.getElementById('prev-exception-button');
+const prevExceptionFeedback = document.getElementById(
+  'prev-exception-feedback');
+const nextTestButton = document.getElementById('next-test-button');
+const nextTestFeedback = document.getElementById('next-test-feedback');
+const prevTestButton = document.getElementById('prev-test-button');
+const prevTestFeedback = document.getElementById('prev-test-feedback');
 const hideDateTimeCheckbox = document.getElementById('hide-date-time-checkbox');
 const wrapTextCheckbox = document.getElementById('wrap-text-checkbox');
 const displayNonLogcatCheckbox = document.getElementById(
   'display-non-logcat-checkbox');
-const toggleDarkModeCheckbox = document.getElementById(
-  'toggle-dark-mode-checkbox');
 const alwaysShowActivityManagerCheckbox = document.getElementById(
   'always-show-activity-manager-checkbox');
+const toggleDarkModeCheckbox = document.getElementById(
+  'toggle-dark-mode-checkbox');
 const textDisplayArea = document.getElementById('text-display-area');
 
 // Event listeners:
@@ -72,14 +72,6 @@
 
 pasteLogcatButton.addEventListener('click', handlePasteLogcatButtonClick);
 
-nextExceptionButton.addEventListener('click', jumpToNextException);
-
-prevExceptionButton.addEventListener('click', jumpToPreviousException);
-
-nextTestButton.addEventListener('click', jumpToNextTest);
-
-prevTestButton.addEventListener('click', jumpToPreviousTest);
-
 dropdownHeaderProcess.addEventListener('click', (event) => {
   // Prevent this click from propagating to the document
   event.stopPropagation();
@@ -114,6 +106,14 @@
 
 dropdownListPriority.addEventListener('click', handlePriorityFilterOptionClick);
 
+nextExceptionButton.addEventListener('click', jumpToNextException);
+
+prevExceptionButton.addEventListener('click', jumpToPreviousException);
+
+nextTestButton.addEventListener('click', jumpToNextTest);
+
+prevTestButton.addEventListener('click', jumpToPreviousTest);
+
 hideDateTimeCheckbox.addEventListener('change', updateTextDisplayArea);
 
 wrapTextCheckbox.addEventListener('change', () => {
@@ -129,6 +129,9 @@
 
 displayNonLogcatCheckbox.addEventListener('change', updateTextDisplayArea);
 
+alwaysShowActivityManagerCheckbox.addEventListener('change',
+  updateTextDisplayArea);
+
 toggleDarkModeCheckbox.addEventListener('change', () => {
   const isDarkMode = toggleDarkModeCheckbox.checked;
   if (isDarkMode) {
@@ -140,9 +143,6 @@
   }
 });
 
-alwaysShowActivityManagerCheckbox.addEventListener('change',
-  updateTextDisplayArea);
-
 // Global click listener to close dropdowns when clicking outside
 document.addEventListener('click', (event) => {
   document.querySelectorAll('.dropdown-list').forEach(dropdown => {
diff --git a/tools/gritsettings/translation_expectations.pyl b/tools/gritsettings/translation_expectations.pyl
index 7535405..3dc6085 100644
--- a/tools/gritsettings/translation_expectations.pyl
+++ b/tools/gritsettings/translation_expectations.pyl
@@ -143,6 +143,6 @@
   "internal_grds": [
     # Test grd that contains a part file that doesn't exist.
     "tools/translation/testdata/internal.grd",
-    "third_party/search_engines_data/resources_internal/search_engine_descriptions_strings.grd": "The strings are already translated when provided",
+    "third_party/search_engines_data/resources_internal/search_engine_descriptions_strings.grd",
   ],
 }
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 8d316ec..739944c 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -4721,6 +4721,9 @@
 </action>
 
 <action name="Autofill_PolledCreditCardSuggestions">
+  <obsolete>
+    Deprecated as of 09/2025. All suggestions generators always poll the data
+  </obsolete>
   <owner>battre@chromium.org</owner>
   <description>
     This user action is logged when the user interacts with an autofillable
@@ -4729,6 +4732,9 @@
 </action>
 
 <action name="Autofill_PolledLoyaltyCardSuggestions">
+  <obsolete>
+    Deprecated as of 09/2025. All suggestions generators always poll the data
+  </obsolete>
   <owner>vizcay@google.com</owner>
   <description>
     This user action is logged when the user interacts with an autofillable
@@ -4737,6 +4743,9 @@
 </action>
 
 <action name="Autofill_PolledProfileSuggestions">
+  <obsolete>
+    Deprecated as of 09/2025. All suggestions generators always poll the data
+  </obsolete>
   <owner>battre@chromium.org</owner>
   <description>
     This user action is logged when the user interacts with an autofillable
@@ -4836,8 +4845,7 @@
   <owner>battre@chromium.org</owner>
   <description>
     This user action is logged when the user is shown some credit card
-    suggestions. This should always happen after a
-    Autofill_PolledCreditCardSuggestion.
+    suggestions.
   </description>
 </action>
 
@@ -4863,7 +4871,6 @@
   <owner>battre@chromium.org</owner>
   <description>
     This user action is logged when the user is shown some profile suggestions.
-    This should always happen after a Autofill_PolledProfileSuggestion.
   </description>
 </action>
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index db723d52..3a8254e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -97,7 +97,6 @@
   <int value="0" label="None"/>
   <int value="1" label="Dark"/>
   <int value="2" label="Light"/>
-  <int value="3" label="Custom"/>
 </enum>
 
 <enum name="AccessibilityModeFlagEnum">
@@ -6746,14 +6745,6 @@
 
 <!-- LINT.ThenChange(//ios/chrome/browser/contextual_panel/utils/contextual_panel_metrics.h:ModelRelevanceType) -->
 
-<enum name="IOSDefaultBookmarkFolderOutcome">
-  <int value="0" label="kUnset"/>
-  <int value="1" label="kExistingLocalFolderSet"/>
-  <int value="2" label="kExistingAccountFolderSet"/>
-  <int value="3" label="kMissingLocalFolderSet"/>
-  <int value="4" label="kMissingAccountFolderSet"/>
-</enum>
-
 <enum name="IOSParcelCarrier">
   <int value="0" label="Unkown"/>
   <int value="1" label="Fedex"/>
@@ -10819,6 +10810,7 @@
   <int value="-1241220708" label="QuickShareV2:enabled"/>
   <int value="-1241002324" label="FocusMode:enabled"/>
   <int value="-1240498859" label="ReparentAuxiliaryNavigationFromPWA:disabled"/>
+  <int value="-1239962224" label="AndroidZoomIndicator:disabled"/>
   <int value="-1239605812" label="MlUrlSearchBlending:disabled"/>
   <int value="-1239515260" label="OmniboxDisableCGIParamMatching:disabled"/>
   <int value="-1239262870" label="TextFragmentAnchor:enabled"/>
@@ -11691,6 +11683,7 @@
       label="AutofillRationalizeRepeatedServerPredictions:disabled"/>
   <int value="-929290033" label="CrosSodaConchLanguages:disabled"/>
   <int value="-928138978" label="IPH_DemoMode:disabled"/>
+  <int value="-926780551" label="AndroidZoomIndicator:enabled"/>
   <int value="-926422468" label="disable-embedded-shared-worker"/>
   <int value="-926236394" label="SendTabToSelfHistory:enabled"/>
   <int value="-926039080" label="VaapiVp9kSVCHWEncoding:disabled"/>
diff --git a/tools/metrics/histograms/metadata/ai/histograms.xml b/tools/metrics/histograms/metadata/ai/histograms.xml
index a513a0c..98e40cc 100644
--- a/tools/metrics/histograms/metadata/ai/histograms.xml
+++ b/tools/metrics/histograms/metadata/ai/histograms.xml
@@ -204,7 +204,7 @@
 </histogram>
 
 <histogram name="AI.Session.{SessionType}.PromptRequestSize" units="bytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>leimy@chromium.org</owner>
   <owner>fergal@chromium.org</owner>
   <owner>src/chrome/browser/ai/OWNERS</owner>
@@ -228,7 +228,7 @@
 </histogram>
 
 <histogram name="AI.Session.{SessionType}.PromptResponseSize" units="bytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>leimy@chromium.org</owner>
   <owner>fergal@chromium.org</owner>
   <owner>src/chrome/browser/ai/OWNERS</owner>
@@ -240,7 +240,7 @@
 </histogram>
 
 <histogram name="AI.Session.{SessionType}.PromptResponseStatus"
-    enum="AIModelStreamingResponseStatus" expires_after="2025-12-28">
+    enum="AIModelStreamingResponseStatus" expires_after="2026-03-01">
   <owner>leimy@chromium.org</owner>
   <owner>fergal@chromium.org</owner>
   <owner>src/chrome/browser/ai/OWNERS</owner>
@@ -301,7 +301,7 @@
 </histogram>
 
 <histogram name="AI.Translation.LoadTranslateKitResult"
-    enum="LoadTranslateKitResult" expires_after="2025-12-28">
+    enum="LoadTranslateKitResult" expires_after="2026-03-01">
   <owner>mych@google.com</owner>
   <owner>fergal@google.com</owner>
   <owner>src/chrome/browser/ai/OWNERS</owner>
@@ -314,7 +314,7 @@
 </histogram>
 
 <histogram name="AI.{SessionType}.AvailabilityV2" enum="Availability"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>leimy@chromium.org</owner>
   <owner>fergal@chromium.org</owner>
   <owner>src/chrome/browser/ai/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/android/enums.xml b/tools/metrics/histograms/metadata/android/enums.xml
index dd08417..1a5b71c4 100644
--- a/tools/metrics/histograms/metadata/android/enums.xml
+++ b/tools/metrics/histograms/metadata/android/enums.xml
@@ -262,6 +262,15 @@
   <int value="4" label="Sandbox Engaged"/>
 </enum>
 
+<enum name="AndroidStorageSystemType">
+  <int value="0" label="UFS"/>
+  <int value="1" label="EMMC"/>
+  <int value="2" label="Unknown"/>
+  <int value="3" label="Undetermined">
+    Failed to determine storage type by falling through all checks.
+  </int>
+</enum>
+
 <enum name="AndroidThemeSettingsEntry">
   <summary>See Android.DarkTheme.ThemeSettingsEntry.</summary>
   <int value="0" label="Settings"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 6ac9c459..7cbda31 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -449,7 +449,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.Settings.Changed"
-    enum="AdaptiveToolbarRadioButtonState" expires_after="2025-12-28">
+    enum="AdaptiveToolbarRadioButtonState" expires_after="2026-03-01">
   <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -460,7 +460,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.Settings.Startup"
-    enum="AdaptiveToolbarRadioButtonState" expires_after="2025-12-28">
+    enum="AdaptiveToolbarRadioButtonState" expires_after="2026-03-01">
   <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -482,7 +482,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.SettingsToggle.Startup"
-    enum="BooleanEnabled" expires_after="2025-12-28">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -505,7 +505,7 @@
 </histogram>
 
 <histogram name="Android.AdaptiveToolbarButton.Variant.OnStartNavigation"
-    enum="AdaptiveToolbarButtonVariant" expires_after="2025-12-28">
+    enum="AdaptiveToolbarButtonVariant" expires_after="2026-03-01">
   <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
   <summary>
@@ -519,7 +519,7 @@
 
 <histogram
     name="Android.ApplicationState.TimeInBackgroundBeforeForegroundedAgain"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>lizeb@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
@@ -636,7 +636,7 @@
 
 <histogram
     name="Android.AssistContent.WebPageContentProvider.Latency.CreateToExtractionStart"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>salg@google.com</owner>
   <owner>ssid@google.com</owner>
   <summary>
@@ -648,7 +648,7 @@
 
 <histogram
     name="Android.AssistContent.WebPageContentProvider.Latency.ExtractionStartToEnd"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>salg@google.com</owner>
   <owner>ssid@google.com</owner>
   <summary>
@@ -952,7 +952,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.Failure" enum="BackPressConsumer"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -1058,7 +1058,7 @@
 </histogram>
 
 <histogram name="Android.BackPress.SwipeEdge{Type}" enum="SwipeEdge"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/chrome/browser/back_press/android/OWNERS</owner>
   <summary>
@@ -1152,7 +1152,7 @@
 </histogram>
 
 <histogram name="Android.BrowserControls.OutstandingChangedOnFinish"
-    enum="BooleanChanged" expires_after="2025-12-28">
+    enum="BooleanChanged" expires_after="2026-03-01">
   <owner>skym@chromium.org</owner>
   <owner>pnoland@chromium.org</owner>
   <summary>
@@ -1165,7 +1165,7 @@
 </histogram>
 
 <histogram name="Android.BrowserControls.OutstandingChangedOnStart"
-    enum="BooleanChanged" expires_after="2025-12-28">
+    enum="BooleanChanged" expires_after="2026-03-01">
   <owner>skym@chromium.org</owner>
   <owner>pnoland@chromium.org</owner>
   <summary>
@@ -1178,7 +1178,7 @@
 </histogram>
 
 <histogram name="Android.BrowserControls.OutstandingNavigationsOnFinish"
-    units="navigations" expires_after="2025-12-28">
+    units="navigations" expires_after="2026-03-01">
   <owner>skym@chromium.org</owner>
   <owner>pnoland@chromium.org</owner>
   <summary>
@@ -1429,7 +1429,7 @@
 </histogram>
 
 <histogram name="Android.CpuAbiBitnessSupport" enum="CpuAbiBitnessSupport"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>tasak@google.com</owner>
   <owner>lizeb@chromium.org</owner>
   <summary>
@@ -1474,7 +1474,7 @@
 </histogram>
 
 <histogram name="Android.DarkTheme.EnabledState" enum="BooleanEnabled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>twellington@chromium.org</owner>
   <owner>clank-app-team@google.com</owner>
   <summary>
@@ -1512,7 +1512,7 @@
 
 <histogram
     name="Android.DefaultBrowserPromo.Outcome.{CurrentState}.{PromoCount}"
-    enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2025-12-28">
+    enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2026-03-01">
   <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -1535,7 +1535,7 @@
 </histogram>
 
 <histogram name="Android.DefaultBrowserPromo.RoleManagerShown"
-    enum="AndroidDefaultBrowserPromoType" expires_after="2025-12-28">
+    enum="AndroidDefaultBrowserPromoType" expires_after="2026-03-01">
   <owner>lazzzis@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -1545,7 +1545,7 @@
 </histogram>
 
 <histogram name="Android.DesktopWindowHeuristicResult4"
-    enum="DesktopWindowHeuristicResult" expires_after="2025-12-31">
+    enum="DesktopWindowHeuristicResult" expires_after="2026-03-01">
   <owner>aishwaryarj@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1584,7 +1584,7 @@
 </histogram>
 
 <histogram name="Android.DeviceSize.ScreenSizeInTensOfInches"
-    units="10x inches" expires_after="2025-12-28">
+    units="10x inches" expires_after="2026-03-01">
   <owner>twellington@chromium.org</owner>
   <owner>aishwaryarj@google.com</owner>
   <owner>clank-app-team@google.com</owner>
@@ -1647,7 +1647,7 @@
 </histogram>
 
 <histogram name="Android.DownloadManager.OpenSource.Other"
-    enum="AndroidDownloadOpenSource" expires_after="2025-12-28">
+    enum="AndroidDownloadOpenSource" expires_after="2026-03-01">
   <owner>shaktisahu@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -1659,7 +1659,7 @@
 </histogram>
 
 <histogram name="Android.DownloadManager.OpenSource.Video"
-    enum="AndroidDownloadOpenSource" expires_after="2025-12-28">
+    enum="AndroidDownloadOpenSource" expires_after="2026-03-01">
   <owner>shaktisahu@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -1708,7 +1708,7 @@
 </histogram>
 
 <histogram name="Android.DownloadPage.OpenSource"
-    enum="AndroidDownloadOpenSource" expires_after="2025-12-28">
+    enum="AndroidDownloadOpenSource" expires_after="2026-03-01">
   <owner>qinmin@chromium.org</owner>
   <owner>clank-downloads@google.com</owner>
   <summary>
@@ -1761,7 +1761,7 @@
 </histogram>
 
 <histogram name="Android.DragDrop.FromWebContent.TargetType"
-    enum="AndroidDragTargetType" expires_after="2025-11-16">
+    enum="AndroidDragTargetType" expires_after="2026-03-01">
   <owner>wenyufu@chromium.org</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -2051,7 +2051,7 @@
 </histogram>
 
 <histogram name="Android.EdgeToEdge.IneligibilityReason"
-    enum="IneligibilityReason" expires_after="2025-12-28">
+    enum="IneligibilityReason" expires_after="2026-03-01">
   <owner>lazzzis@google.com</owner>
   <owner>edge-to-edge@chromium.org</owner>
   <summary>
@@ -2503,7 +2503,7 @@
 </histogram>
 
 <histogram name="Android.IncognitoReauth.PromoAcceptedOrDismissed"
-    enum="IncognitoReauthPromoActionType" expires_after="2025-12-28">
+    enum="IncognitoReauthPromoActionType" expires_after="2026-03-01">
   <owner>roagarwal@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -2530,7 +2530,7 @@
 </histogram>
 
 <histogram name="Android.IncognitoReauth.ToggleOnOrOff" enum="BooleanToggled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>roagarwal@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -2906,7 +2906,7 @@
 </histogram>
 
 <histogram name="Android.KernelVersion" enum="AndroidKernelVersion"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rsesek@chromium.org</owner>
   <summary>
     Reports the kernel major and minor version from the utsname.release field.
@@ -3077,7 +3077,7 @@
 </histogram>
 
 <histogram name="Android.Messages.FullyVisible" enum="MessageIdentifier"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>lazzzis@chromium.org</owner>
   <owner>src/components/messages/OWNERS</owner>
   <summary>
@@ -3201,7 +3201,7 @@
 </histogram>
 
 <histogram name="Android.MultiInstance.MaxWindowLimitExceeded" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ranjithkagathi@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -3516,7 +3516,7 @@
 </histogram>
 
 <histogram name="Android.NTP.Impression" enum="NTPImpressionType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>finkm@chromium.org</owner>
   <summary>
     Counts impressions of the NTP on Android. It also counts potential
@@ -4385,7 +4385,7 @@
 </histogram>
 
 <histogram name="Android.PartnerHomepageCustomization.Delegate2"
-    enum="PartnerCustomizationProviderDelegate" expires_after="2025-12-28">
+    enum="PartnerCustomizationProviderDelegate" expires_after="2026-03-01">
   <owner>donnd@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>wenyufu@chromium.org</owner>
@@ -4790,7 +4790,7 @@
 </histogram>
 
 <histogram name="Android.PlayServices.ShortVersion" enum="GmsShortVersionCode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>twellington@chromium.org</owner>
   <owner>tedchoc@chromium.org</owner>
   <summary>
@@ -4803,7 +4803,7 @@
 </histogram>
 
 <histogram name="Android.PlayServices.Version" units="versioncode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>twellington@chromium.org</owner>
   <owner>tedchoc@chromium.org</owner>
   <summary>
@@ -4951,7 +4951,7 @@
 </histogram>
 
 <histogram name="Android.RequestDesktopSite.UseDesktopUserAgent" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gangwu@chromium.org</owner>
   <owner>fgorski@chromium.org</owner>
   <summary>
@@ -5283,8 +5283,18 @@
   </summary>
 </histogram>
 
+<histogram name="Android.StorageSystem.Type" enum="AndroidStorageSystemType"
+    expires_after="2026-01-18">
+  <owner>yfriedman@chromium.org</owner>
+  <owner>clank-performance-team@google.com</owner>
+  <summary>
+    Records the type of storage system on the device. This is determined by
+    inspecting system files. Recorded once on deferred startup.
+  </summary>
+</histogram>
+
 <histogram name="Android.StrictMode.OverrideUrlLoadingTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yfriedman@chromium.org</owner>
   <owner>wnwen@chromium.org</owner>
   <summary>
@@ -5375,7 +5385,7 @@
 </histogram>
 
 <histogram name="Android.Sync.ActualSyncedTabCountPercentage"
-    units="% of tab count" expires_after="2025-12-29">
+    units="% of tab count" expires_after="2026-03-01">
   <owner>bjfong@google.com</owner>
   <owner>ckitagawa@chromium.org</owner>
   <summary>
@@ -5493,7 +5503,7 @@
 </histogram>
 
 <histogram name="Android.TabMultiSelectV2.BookmarkTabsCount" units="count"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>ckitagawa@chromium.org</owner>
   <owner>bjfong@google.com</owner>
   <owner>fredmello@chromium.org</owner>
@@ -5538,7 +5548,7 @@
 </histogram>
 
 <histogram name="Android.TabNavigationInterceptResult.For{ProtocolType}"
-    enum="NavigationInterceptResult" expires_after="2025-12-28">
+    enum="NavigationInterceptResult" expires_after="2026-03-01">
   <owner>blundell@chromium.org</owner>
   <owner>mthiesse@chromium.org</owner>
   <owner>tedchoc@chromium.org</owner>
@@ -5679,7 +5689,7 @@
 </histogram>
 
 <histogram name="Android.TabStrip.TempBackgroundTimedOut" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>nemco@google.com</owner>
   <owner>skavuluru@google.com</owner>
   <summary>
@@ -5706,7 +5716,7 @@
 </histogram>
 
 <histogram name="Android.TabStrip.TitleBitmapFactory.getTitleBitmap.Duration"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>peilinwang@google.com</owner>
   <summary>
     The duration of TitleBitmapFactory.getTitleBitmap, recorded once per call.
@@ -5803,7 +5813,7 @@
 </histogram>
 
 <histogram name="Android.Toolbar.BitmapCapture" enum="ToolbarCaptureType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>skym@chromium.org</owner>
   <owner>fredmello@chromium.org</owner>
   <summary>
@@ -9255,7 +9265,7 @@
 </histogram>
 
 <histogram name="GridTabSwitcher.FramePerSecond.{GridTabSwitcherAnimationType}"
-    units="frame/sec" expires_after="2025-12-28">
+    units="frame/sec" expires_after="2026-03-01">
   <owner>ckitagawa@chromium.org</owner>
   <owner>meiliang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/apps/histograms.xml b/tools/metrics/histograms/metadata/apps/histograms.xml
index 46ffd72..b84d524 100644
--- a/tools/metrics/histograms/metadata/apps/histograms.xml
+++ b/tools/metrics/histograms/metadata/apps/histograms.xml
@@ -2167,7 +2167,7 @@
 </histogram>
 
 <histogram name="Apps.AppsCount.{AppType}" units="Apps"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ovn@google.com</owner>
   <owner>lt-web-apps-team@google.com</owner>
   <component>1389907</component>
@@ -2955,7 +2955,7 @@
 </histogram>
 
 <histogram name="Apps.UsageTime.{AppType}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ovn@google.com</owner>
   <owner>lt-web-apps-team@google.com</owner>
   <component>1389907</component>
@@ -2967,7 +2967,7 @@
 </histogram>
 
 <histogram name="Apps.UsageTimeV2.{AppTypeV2}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ovn@google.com</owner>
   <owner>lt-web-apps-team@google.com</owner>
   <component>1389907</component>
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 701c11c..6216e25 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -1330,7 +1330,7 @@
 </histogram>
 
 <histogram name="Arc.IdleManager.ScreenOffTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>raging@google.com</owner>
   <owner>arcvm-eng@google.com</owner>
   <summary>
@@ -2503,7 +2503,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.Duration" units="seconds"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2514,7 +2514,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.EndStatus"
-    enum="CrOSFileSystemMigrationEndStatus" expires_after="2025-12-31">
+    enum="CrOSFileSystemMigrationEndStatus" expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2525,7 +2525,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.FailedErrorCode" enum="PlatformFileError"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2539,7 +2539,7 @@
 
 <histogram name="Arc.VmDataMigration.FailedOperationType"
     enum="CrOSFileSystemMigrationFailedOperationType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2552,7 +2552,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.FailedPathType"
-    enum="ArcVmDataMigrationFailedPathType" expires_after="2025-12-31">
+    enum="ArcVmDataMigrationFailedPathType" expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2600,7 +2600,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.MigrationFinishReason{ArcUserTypes}"
-    enum="ArcVmDataMigrationFinishReason" expires_after="2025-12-31">
+    enum="ArcVmDataMigrationFinishReason" expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2611,7 +2611,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.MigrationStatusOnArcStarted{ArcUserTypes}"
-    enum="ArcVmDataMigrationStatus" expires_after="2025-12-31">
+    enum="ArcVmDataMigrationStatus" expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2757,7 +2757,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.SetupResult"
-    enum="ArcVmDataMigrationSetupResult" expires_after="2025-12-31">
+    enum="ArcVmDataMigrationSetupResult" expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2768,7 +2768,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.StartStatus"
-    enum="CrOSFileSystemMigrationStartStatus" expires_after="2025-12-31">
+    enum="CrOSFileSystemMigrationStartStatus" expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2779,7 +2779,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.TotalFiles" units="files"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
@@ -2790,7 +2790,7 @@
 </histogram>
 
 <histogram name="Arc.VmDataMigration.TotalSizeMB" units="MB"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>momohatt@google.com</owner>
   <owner>youkichihosoi@google.com</owner>
   <owner>arc-storage@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 957b55b..9c7b15b 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1050,7 +1050,7 @@
 </histogram>
 
 <histogram name="Ash.Birch.Chip.Activate" enum="BirchItemType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jamescook@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -1091,7 +1091,7 @@
 </histogram>
 
 <histogram name="Ash.Birch.Chip.Impression" enum="BirchItemType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jamescook@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>Recorded when the user is shown a chip of a given type.</summary>
@@ -1230,7 +1230,7 @@
 </histogram>
 
 <histogram name="Ash.Birch.ResultsReturned{Type}" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jamescook@chromium.org</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -1721,7 +1721,7 @@
 </histogram>
 
 <histogram name="Ash.Calendar.{CalendarChildView}.Activated"
-    enum="CalendarEventSource" expires_after="2025-11-02">
+    enum="CalendarEventSource" expires_after="2026-03-01">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>Recorded when the {CalendarChildView} is activated.</summary>
@@ -3394,7 +3394,7 @@
 </histogram>
 
 <histogram name="Ash.Display.InternalDisplay.ActiveEffectiveResolution"
-    enum="EffectiveResolution" expires_after="2025-12-28">
+    enum="EffectiveResolution" expires_after="2026-03-01">
   <owner>malaykeshav@chromium.org</owner>
   <owner>oshima@chromium.org</owner>
   <summary>
@@ -4314,7 +4314,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.Api.{Method}.Latency" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4334,7 +4334,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.Api.{Method}.PagesCount" units="pages"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4351,7 +4351,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.Api.{Method}.Status" enum="ApiErrorCode"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4416,7 +4416,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.TimeManagement.Classroom.UserAction"
-    enum="ClassroomUserAction" expires_after="2025-12-31">
+    enum="ClassroomUserAction" expires_after="2026-03-01">
   <owner>tbarzic@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4533,7 +4533,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.TimeManagement.Tasks.UserAction"
-    enum="TasksUserAction" expires_after="2025-12-31">
+    enum="TasksUserAction" expires_after="2026-03-01">
   <owner>tbarzic@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4543,7 +4543,7 @@
 </histogram>
 
 <histogram name="Ash.Glanceables.TimeManagement.TasksCountInDefaultTaskList"
-    units="tasks" expires_after="2025-12-31">
+    units="tasks" expires_after="2026-03-01">
   <owner>amitrokhin@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4614,7 +4614,7 @@
 
 <histogram
     name="Ash.Glanceables.TimeManagement{GlanceableBubble}.TotalShowTime"
-    units="ms" expires_after="2025-12-31">
+    units="ms" expires_after="2026-03-01">
   <owner>anasalazar@google.com</owner>
   <owner>chromeos-launcher@google.com</owner>
   <summary>
@@ -4741,7 +4741,7 @@
 </histogram>
 
 <histogram name="Ash.KcerPkcs12Migration.Events"
-    enum="KcerPkcs12MigrationEvent" expires_after="2025-12-28">
+    enum="KcerPkcs12MigrationEvent" expires_after="2026-03-01">
   <owner>miersh@google.com</owner>
   <owner>olsa@google.com</owner>
   <summary>
@@ -4816,7 +4816,7 @@
 </histogram>
 
 <histogram name="Ash.Login.Lock.SessionStateChange" enum="SessionLockEvent"
-    expires_after="2025-10-29">
+    expires_after="2026-03-01">
   <owner>mslus@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>Records all session lock and unlock events.</summary>
@@ -6748,7 +6748,7 @@
 </histogram>
 
 <histogram name="Ash.Picker.Search.{Provider}Provider.QueryTime" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>shend@chromium.org</owner>
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
@@ -6774,7 +6774,7 @@
 </histogram>
 
 <histogram name="Ash.Picker.Session.InputReadyLatency" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>shend@chromium.org</owner>
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
@@ -6788,7 +6788,7 @@
 </histogram>
 
 <histogram name="Ash.Picker.Session.Outcome" enum="PickerSessionOutcome"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>shend@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
   <summary>
@@ -6798,7 +6798,7 @@
 </histogram>
 
 <histogram name="Ash.Picker.Session.PresentationLatency.SearchField" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>shend@chromium.org</owner>
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
@@ -6812,7 +6812,7 @@
 </histogram>
 
 <histogram name="Ash.Picker.Session.PresentationLatency.SearchResults"
-    units="ms" expires_after="2025-12-31">
+    units="ms" expires_after="2026-03-01">
   <owner>shend@chromium.org</owner>
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
@@ -6826,7 +6826,7 @@
 </histogram>
 
 <histogram name="Ash.Picker.Session.SearchLatency" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>shend@chromium.org</owner>
   <owner>jopalmer@chromium.org</owner>
   <owner>essential-inputs-team@google.com</owner>
@@ -7289,7 +7289,7 @@
 </histogram>
 
 <histogram name="Ash.QuickSettings.FeaturePod.{FeaturePodBehavior}"
-    enum="QsFeatureCatalogName" expires_after="2025-12-28">
+    enum="QsFeatureCatalogName" expires_after="2026-03-01">
   <owner>jiamingc@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -8996,7 +8996,7 @@
 </histogram>
 
 <histogram name="Ash.VideoConferenceTray.BackgroundBlur.Click"
-    enum="BackgroundBlurState" expires_after="2025-12-14">
+    enum="BackgroundBlurState" expires_after="2026-03-01">
   <owner>leandre@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -9007,7 +9007,7 @@
 </histogram>
 
 <histogram name="Ash.VideoConferenceTray.BackgroundBlur.InitialState"
-    enum="BackgroundBlurState" expires_after="2025-12-28">
+    enum="BackgroundBlurState" expires_after="2026-03-01">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -9057,7 +9057,7 @@
 </histogram>
 
 <histogram name="Ash.VideoConferenceTray.{Device}MuteButton.Click"
-    enum="BooleanMuted" expires_after="2025-12-14">
+    enum="BooleanMuted" expires_after="2026-03-01">
   <owner>leandre@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -9072,7 +9072,7 @@
 </histogram>
 
 <histogram name="Ash.VideoConferenceTray.{EffectName}.Click"
-    enum="BooleanEnabled" expires_after="2025-12-14">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>leandre@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -9093,7 +9093,7 @@
 </histogram>
 
 <histogram name="Ash.VideoConferenceTray.{EffectName}.InitialState"
-    enum="BooleanEnabled" expires_after="2025-12-28">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>newcomer@google.com</owner>
   <owner>cros-status-area-eng@google.com</owner>
   <summary>
@@ -9300,7 +9300,7 @@
 </histogram>
 
 <histogram name="Ash.Wallpaper.SeaPen.Template.Settled" enum="SeaPenTemplateId"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>thuongphan@chromium.org</owner>
   <owner>cros-p13n-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ash_clipboard/histograms.xml b/tools/metrics/histograms/metadata/ash_clipboard/histograms.xml
index 33fcbbf2..57375d9 100644
--- a/tools/metrics/histograms/metadata/ash_clipboard/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash_clipboard/histograms.xml
@@ -61,7 +61,7 @@
 </histogram>
 
 <histogram name="Ash.ClipboardHistory.ContextMenu.DisplayFormatDeleted"
-    enum="ClipboardHistoryDisplayFormat" expires_after="2025-12-28">
+    enum="ClipboardHistoryDisplayFormat" expires_after="2026-03-01">
   <owner>newcomer@chromium.org</owner>
   <owner>multipaste@google.com</owner>
   <summary>
@@ -75,7 +75,7 @@
 </histogram>
 
 <histogram name="Ash.ClipboardHistory.ContextMenu.DisplayFormatPasted"
-    enum="ClipboardHistoryDisplayFormat" expires_after="2025-12-28">
+    enum="ClipboardHistoryDisplayFormat" expires_after="2026-03-01">
   <owner>newcomer@chromium.org</owner>
   <owner>multipaste@google.com</owner>
   <summary>
@@ -90,7 +90,7 @@
 </histogram>
 
 <histogram name="Ash.ClipboardHistory.ContextMenu.DisplayFormatShown"
-    enum="ClipboardHistoryDisplayFormat" expires_after="2025-12-28">
+    enum="ClipboardHistoryDisplayFormat" expires_after="2026-03-01">
   <owner>newcomer@chromium.org</owner>
   <owner>multipaste@google.com</owner>
   <summary>
@@ -100,7 +100,7 @@
 </histogram>
 
 <histogram name="Ash.ClipboardHistory.ContextMenu.MenuOptionSelected"
-    units="index" expires_after="2025-12-28">
+    units="index" expires_after="2026-03-01">
   <owner>newcomer@chromium.org</owner>
   <owner>multipaste@google.com</owner>
   <summary>
@@ -110,7 +110,7 @@
 </histogram>
 
 <histogram name="Ash.ClipboardHistory.ContextMenu.NumberOfItemsShown"
-    units="Items Shown" expires_after="2025-12-28">
+    units="Items Shown" expires_after="2026-03-01">
   <owner>newcomer@chromium.org</owner>
   <owner>multipaste@google.com</owner>
   <summary>
@@ -130,7 +130,7 @@
 </histogram>
 
 <histogram name="Ash.ClipboardHistory.ContextMenu.UserJourneyTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>newcomer@chromium.org</owner>
   <owner>multipaste@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
index 60b5815..d9af2832 100644
--- a/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
+++ b/tools/metrics/histograms/metadata/attribution_reporting/histograms.xml
@@ -244,7 +244,7 @@
 
 <histogram
     name="Conversions.AggregatableReport.TimeFromTriggerToReportSentSuccessfully"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -604,7 +604,7 @@
 </histogram>
 
 <histogram name="Conversions.ExtraReportDelay2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>apaseltiner@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -864,7 +864,7 @@
 
 <histogram name="Conversions.NavigationUnexpectedRegistration"
     enum="ConversionNavigationUnexpectedRegistration"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1215,7 +1215,7 @@
 </histogram>
 
 <histogram name="Conversions.SourceRegistrationError13"
-    enum="ConversionSourceRegistrationError" expires_after="2025-12-28">
+    enum="ConversionSourceRegistrationError" expires_after="2026-03-01">
   <owner>tquintanilla@chromium.org</owner>
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
@@ -1376,7 +1376,7 @@
 
 <histogram
     name="Conversions.TimeFromLastNavigationToDelivery_Failed.{ReportType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>tquintanilla@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1392,7 +1392,7 @@
 
 <histogram
     name="Conversions.TimeFromLastNavigationToDelivery_Succeeded.{ReportType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>tquintanilla@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1478,7 +1478,7 @@
 
 <histogram
     name="Conversions.UniqueReportingOriginsPerDestAndReportingSiteForSource"
-    units="reporting origins" expires_after="2025-12-28">
+    units="reporting origins" expires_after="2026-03-01">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1489,7 +1489,7 @@
 </histogram>
 
 <histogram name="Conversions.UniqueReportingOriginsPerReportingSiteForSource"
-    units="reporting origins" expires_after="2025-12-28">
+    units="reporting origins" expires_after="2026-03-01">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1535,7 +1535,7 @@
 </histogram>
 
 <histogram name="Conversions.VerboseDebugReport.HttpResponseOrNetErrorCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-12-28">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2026-03-01">
   <owner>linnan@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
@@ -1547,7 +1547,7 @@
 
 <histogram
     name="Conversions.{ContextType}HttpResponseOrNetErrorCodeAggregatable2"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-12-28">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2026-03-01">
   <owner>apaseltiner@chromium.org</owner>
   <owner>measurement-api-dev+metrics@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 56f17afc..a7e23eb 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -891,7 +891,7 @@
 </histogram>
 
 <histogram name="Autofill.Address.DisabledReason.PageLoad"
-    enum="AutofillPreferenceSetter" expires_after="2025-12-28">
+    enum="AutofillPreferenceSetter" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>bwolfgang@google.com</owner>
   <owner>mlerman@google.com</owner>
@@ -905,7 +905,7 @@
 </histogram>
 
 <histogram name="Autofill.Address.DisabledReason.Startup"
-    enum="AutofillPreferenceSetter" expires_after="2025-12-28">
+    enum="AutofillPreferenceSetter" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>bwolfgang@google.com</owner>
   <owner>mlerman@google.com</owner>
@@ -958,7 +958,7 @@
 </histogram>
 
 <histogram name="Autofill.AddressesSuppressedForDisuse" units="addresses"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -993,7 +993,7 @@
 </histogram>
 
 <histogram name="Autofill.AddressProfileImportStatus"
-    enum="AutofillAddressProfileImportStatus" expires_after="2025-12-28">
+    enum="AutofillAddressProfileImportStatus" expires_after="2026-03-01">
   <owner>koerber@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -1555,7 +1555,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.PredictionCollisionState"
-    enum="PredictionStateAutocompleteStatePair" expires_after="2025-12-28">
+    enum="PredictionStateAutocompleteStatePair" expires_after="2026-03-01">
   <owner>koerber@google.com</owner>
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -1627,7 +1627,7 @@
 </histogram>
 
 <histogram name="Autofill.Autocomplete.SingleEntryRemovalMethod"
-    enum="AutofillSingleEntryRemovalMethod" expires_after="2025-12-28">
+    enum="AutofillSingleEntryRemovalMethod" expires_after="2026-03-01">
   <owner>jkeitel@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -1660,7 +1660,7 @@
 </histogram>
 
 <histogram name="Autofill.AutomationRate.{FormType}" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>bwolfgang@google.com</owner>
   <owner>mlerman@google.com</owner>
@@ -2645,7 +2645,7 @@
 </histogram>
 
 <histogram name="Autofill.DataList.Events" enum="AutofillDataListEvents"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>brunobraga@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -2656,7 +2656,7 @@
 </histogram>
 
 <histogram name="Autofill.DataUtilization.ByPossibleType"
-    enum="AutofillDataUtilizationByFieldType" expires_after="2025-12-28">
+    enum="AutofillDataUtilizationByFieldType" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>bwolfgang@google.com</owner>
   <owner>mlerman@google.com</owner>
@@ -2715,7 +2715,7 @@
 </histogram>
 
 <histogram name="Autofill.DataUtilization.{FieldTypesSelection}.{FieldState}"
-    enum="AutofillDataUtilization" expires_after="2025-12-28">
+    enum="AutofillDataUtilization" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>bwolfgang@google.com</owner>
   <owner>mlerman@google.com</owner>
@@ -2766,7 +2766,7 @@
 </histogram>
 
 <histogram name="Autofill.DaysSinceLastUse.Profile" units="days"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -2805,7 +2805,7 @@
 </histogram>
 
 <histogram name="Autofill.DaysSinceLastUse.StoredProfile.{Category}"
-    units="days" expires_after="2025-12-28">
+    units="days" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -2831,7 +2831,7 @@
 </histogram>
 
 <histogram name="Autofill.DeveloperEngagement"
-    enum="AutofillDeveloperEngagement" expires_after="2025-12-12">
+    enum="AutofillDeveloperEngagement" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -2978,7 +2978,7 @@
 </histogram>
 
 <histogram name="Autofill.EmailPredictionCorrectness.Precision"
-    enum="EmailPredictionConfusionMatrix" expires_after="2025-12-28">
+    enum="EmailPredictionConfusionMatrix" expires_after="2026-03-01">
   <owner>vizcay@chromium.org</owner>
   <owner>jkeitel@chromium.org</owner>
   <owner>src/components/autofill/OWNERS</owner>
@@ -2989,7 +2989,7 @@
 </histogram>
 
 <histogram name="Autofill.EmailPredictionCorrectness.Recall"
-    enum="EmailPredictionConfusionMatrix" expires_after="2025-12-28">
+    enum="EmailPredictionConfusionMatrix" expires_after="2026-03-01">
   <owner>vizcay@chromium.org</owner>
   <owner>jkeitel@chromium.org</owner>
   <owner>src/components/autofill/OWNERS</owner>
@@ -3131,7 +3131,7 @@
 </histogram>
 
 <histogram name="Autofill.FieldCount" units="form fields"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>Number of fields in a form that Autofill encounters.</summary>
@@ -3261,7 +3261,7 @@
 </histogram>
 
 <histogram name="Autofill.FieldPrediction{AutofillFieldPredictionSource}"
-    units="units" expires_after="2025-12-28">
+    units="units" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3278,7 +3278,7 @@
 
 <histogram
     name="Autofill.FillDuration.FromInteraction.WithAutofill{AutofillFormType}"
-    units="units" expires_after="2025-12-28">
+    units="units" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3294,7 +3294,7 @@
 
 <histogram
     name="Autofill.FillDuration.FromInteraction.WithoutAutofill{AutofillFormType}"
-    units="units" expires_after="2025-12-28">
+    units="units" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3309,7 +3309,7 @@
 </histogram>
 
 <histogram name="Autofill.FillDuration.FromLoad.WithAutofill" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3608,7 +3608,7 @@
 </histogram>
 
 <histogram name="Autofill.FormSubmission.PerProfileType"
-    enum="BrowserProfileType" expires_after="2025-12-28">
+    enum="BrowserProfileType" expires_after="2026-03-01">
   <owner>arabm@google.com</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
@@ -3663,7 +3663,7 @@
 
 <histogram name="Autofill.Funnel.InteractionAfterParsedAsType.{FormType}"
     enum="BooleanAutofillInteractionAfterParsedAsType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -3722,7 +3722,7 @@
 </histogram>
 
 <histogram name="Autofill.Funnel.SubmissionAfterFill.{FormType}"
-    enum="BooleanAutofillSubmissionAfterFill" expires_after="2025-12-28">
+    enum="BooleanAutofillSubmissionAfterFill" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -4058,7 +4058,7 @@
 </histogram>
 
 <histogram name="Autofill.iOS.FormRemoval.RemovedUnownedFields" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vincb@google.com</owner>
   <owner>eic@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -4070,7 +4070,7 @@
 </histogram>
 
 <histogram name="Autofill.iOS.FormRemoval.SubmissionDetected" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vincb@google.com</owner>
   <owner>eic@google.com</owner>
   <owner>bling-transactions@google.com</owner>
@@ -4142,7 +4142,7 @@
 </histogram>
 
 <histogram name="Autofill.IsEnabled.PageLoad" enum="BooleanEnabled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>osaul@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -4156,7 +4156,7 @@
 </histogram>
 
 <histogram name="Autofill.IsEnabled.Startup" enum="BooleanEnabled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>osaul@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -4286,7 +4286,7 @@
 
 <histogram
     name="Autofill.Leipzig.Duplication.NumberOfLocalSupersetProfilesOnStartup"
-    units="Profiles" expires_after="2025-12-28">
+    units="Profiles" expires_after="2026-03-01">
   <owner>koerber@google.com</owner>
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -4361,7 +4361,7 @@
 </histogram>
 
 <histogram name="Autofill.LogEvent.{LogEventTypes}" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -4410,7 +4410,7 @@
 </histogram>
 
 <histogram name="Autofill.LoyaltyCard.FillingAcceptance.Affiliated"
-    enum="BooleanAutofillFillingAcceptance" expires_after="2025-12-12">
+    enum="BooleanAutofillFillingAcceptance" expires_after="2026-03-01">
   <owner>vizcay@google.com</owner>
   <owner>tchudakov@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -5153,7 +5153,7 @@
 </histogram>
 
 <histogram name="Autofill.PopupHidingReason"
-    enum="AutofillSuggestionHidingReason" expires_after="2025-12-28">
+    enum="AutofillSuggestionHidingReason" expires_after="2026-03-01">
   <owner>koerber@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -5164,7 +5164,7 @@
 </histogram>
 
 <histogram name="Autofill.PopupHidingReason.{FillingProduct}"
-    enum="AutofillSuggestionHidingReason" expires_after="2025-12-28">
+    enum="AutofillSuggestionHidingReason" expires_after="2026-03-01">
   <owner>brunobraga@google.com</owner>
   <owner>jkeitel@google.com</owner>
   <summary>
@@ -5206,7 +5206,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileDeleted.{DeletionType}"
-    enum="BooleanAutofillDeleteAddress" expires_after="2025-12-28">
+    enum="BooleanAutofillDeleteAddress" expires_after="2026-03-01">
   <owner>tchudakov@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -5291,7 +5291,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.MigrateProfileDecision"
-    enum="AutofillProfileImportDecision" expires_after="2025-12-28">
+    enum="AutofillProfileImportDecision" expires_after="2026-03-01">
   <owner>koerber@google.com</owner>
   <owner>fleimgruber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
@@ -5407,7 +5407,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileImport.UpdateProfileAffectedType.{Decision}"
-    enum="AutofillSettingsVisibleTypes" expires_after="2025-12-28">
+    enum="AutofillSettingsVisibleTypes" expires_after="2026-03-01">
   <owner>koerber@google.com</owner>
   <owner>src/components/autofill/OWNERS</owner>
   <summary>
@@ -5611,7 +5611,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileTokenQuality.PerProfile" units="Percents"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -5622,7 +5622,7 @@
 
 <histogram
     name="Autofill.ProfileTokenQuality.StoredObservationsCount.PerProfile"
-    units="Observations" expires_after="2025-12-28">
+    units="Observations" expires_after="2026-03-01">
   <owner>fleimgruber@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -5658,7 +5658,7 @@
 </histogram>
 
 <histogram name="Autofill.ProfileTokenQualityScore" units="bits"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>bwolfgang@google.com</owner>
   <owner>mlerman@google.com</owner>
@@ -6520,7 +6520,7 @@
 </histogram>
 
 <histogram name="Autofill.Settings.EditAddress"
-    enum="BooleanAutofillEditAddress" expires_after="2025-12-28">
+    enum="BooleanAutofillEditAddress" expires_after="2026-03-01">
   <owner>brunobraga@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -6612,7 +6612,7 @@
 </histogram>
 
 <histogram name="Autofill.SkippingFormFillDueToChangedFieldCount"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -7087,7 +7087,7 @@
 </histogram>
 
 <histogram name="Autofill.SuggestionAccepted.OffTheRecord" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>arabm@google.com</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
@@ -7215,7 +7215,7 @@
 </histogram>
 
 <histogram name="Autofill.Timing.ParseFormUntilInteraction2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>schwering@google.com</owner>
   <owner>brunobraga@google.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
@@ -7227,7 +7227,7 @@
 </histogram>
 
 <histogram name="Autofill.Timing.{AutofillTimedFunction}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>schwering@google.com</owner>
   <owner>kenjitoyama@chromium.org</owner>
   <owner>battre@chromium.org</owner>
@@ -7505,7 +7505,7 @@
 </histogram>
 
 <histogram name="Autofill.TransliteratorInitStatus" enum="BooleanSuccess"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>sygiet@google.com</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -7729,7 +7729,7 @@
 </histogram>
 
 <histogram name="Autofill.UploadEvent{AutofillUploadEvents}" enum="BooleanSent"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -8273,7 +8273,7 @@
 </histogram>
 
 <histogram name="Autofill.WebView.Enabled" enum="BooleanEnabled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -8353,7 +8353,7 @@
 
 <histogram
     name="Autofill.WebView.KeyMetrics.FillingAssistance{AutofillFormType}"
-    enum="BooleanAutofillFillingAssistance" expires_after="2025-12-28">
+    enum="BooleanAutofillFillingAssistance" expires_after="2026-03-01">
   <owner>pkotwicz@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -8370,7 +8370,7 @@
 
 <histogram
     name="Autofill.WebView.KeyMetrics.FillingCorrectness{AutofillFormType}"
-    enum="BooleanAutofillFillingCorrectness" expires_after="2025-12-28">
+    enum="BooleanAutofillFillingCorrectness" expires_after="2026-03-01">
   <owner>pkotwicz@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -8383,7 +8383,7 @@
 
 <histogram
     name="Autofill.WebView.KeyMetrics.FormSubmission.Autofilled{AutofillFormType}"
-    enum="BooleanAutofillSubmission" expires_after="2025-12-28">
+    enum="BooleanAutofillSubmission" expires_after="2026-03-01">
   <owner>pkotwicz@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -8400,7 +8400,7 @@
 
 <histogram
     name="Autofill.WebView.KeyMetrics.FormSubmission.NotAutofilled{AutofillFormType}"
-    enum="BooleanAutofillSubmission" expires_after="2025-12-28">
+    enum="BooleanAutofillSubmission" expires_after="2026-03-01">
   <owner>pkotwicz@chromium.org</owner>
   <owner>chrome-autofill-alerts@google.com</owner>
   <summary>
@@ -8464,7 +8464,7 @@
 </histogram>
 
 <histogram name="Autofill.WebView.ServerPredicton.PredictionAvailability"
-    enum="AutofillServerPredictionAvailability" expires_after="2025-12-28">
+    enum="AutofillServerPredictionAvailability" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>src/android_webview/OWNERS</owner>
   <summary>
@@ -8503,7 +8503,7 @@
 </histogram>
 
 <histogram name="WebDatabase.AutofillWebDataBackendImpl.OperationResult"
-    enum="AutofillWebDataBackendImplOperationResult" expires_after="2025-12-28">
+    enum="AutofillWebDataBackendImplOperationResult" expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>asully@chromium.org</owner>
   <summary>
@@ -8513,7 +8513,7 @@
 </histogram>
 
 <histogram name="WebDatabase.DatabaseErrors" enum="SqliteLoggedResultCode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>battre@chromium.org</owner>
   <owner>asully@chromium.org</owner>
   <summary>Records the errors reported by SQLite.</summary>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml
index e75c7263..d7bd5b5 100644
--- a/tools/metrics/histograms/metadata/blink/enums.xml
+++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -6253,6 +6253,7 @@
   <int value="5651" label="V8WasmCustomDescriptors"/>
   <int value="5652" label="SRIIntegrityAttributeOnInlineScript"/>
   <int value="5653" label="CredentialsGetImmediateMediationWithPasswordsOnly"/>
+  <int value="5654" label="CSSAtRuleRoute"/>
 </enum>
 
 <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) -->
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index 4e67fdb6..e33949c 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -839,7 +839,7 @@
 </histogram>
 
 <histogram name="Blink.CookiesTime.AblationDelay2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>elkurin@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -851,7 +851,7 @@
 </histogram>
 
 <histogram name="Blink.CookiesTime.AblationSleepTime" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>elkurin@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -866,7 +866,7 @@
 </histogram>
 
 <histogram name="Blink.CookiesTime.{IpcNeeded}2" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>elkurin@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -889,7 +889,7 @@
 </histogram>
 
 <histogram name="Blink.CookiesTime.{PipeState}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mmenke@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1102,7 +1102,7 @@
 </histogram>
 
 <histogram name="Blink.DecodedImageType" enum="DecodedImageType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>urvang@chromium.org</owner>
   <summary>
     Image codec inferred during decode. The histogram is incremented when enough
@@ -1169,7 +1169,7 @@
 
 <histogram
     name="Blink.DocumentLoader.CommitNavigationToStartLoadingResponse.Time.OutermostMainFrame.NewNavigation.IsHTTPOrHTTPS"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1193,7 +1193,7 @@
   </summary>
 </histogram>
 
-<histogram name="Blink.EffectiveZoom" units="%" expires_after="2025-12-28">
+<histogram name="Blink.EffectiveZoom" units="%" expires_after="2026-03-01">
   <owner>pdr@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
@@ -1232,7 +1232,7 @@
 </histogram>
 
 <histogram name="Blink.Experimental.Cookies.IpcNeeded" enum="BooleanYesNo"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>lizeb@google.com</owner>
   <owner>clank-performance-team@google</owner>
   <summary>
@@ -2338,7 +2338,7 @@
 </histogram>
 
 <histogram name="Blink.FencedFrame.CreationOrNavigationOutcome"
-    enum="FencedFrameCreationOutcome" expires_after="2025-12-28">
+    enum="FencedFrameCreationOutcome" expires_after="2026-03-01">
   <owner>shivanisha@chromium.org</owner>
   <owner>dom@chromium.org</owner>
   <owner>lbrady@google.com</owner>
@@ -2535,7 +2535,7 @@
 </histogram>
 
 <histogram name="Blink.Fonts.DecodeTime" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gjc@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -2559,7 +2559,7 @@
 </histogram>
 
 <histogram name="Blink.Fonts.FontServiceThread.MatchFamilyNameTime"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -2571,7 +2571,7 @@
 </histogram>
 
 <histogram name="Blink.Fonts.FontServiceThread.OpenStreamTime"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -2648,7 +2648,7 @@
 </histogram>
 
 <histogram name="Blink.History.VisitedLinks.IsLinkStyledAsVisited"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>kyraseevers@chromium.org</owner>
   <owner>janiceliu@chromium.org</owner>
   <summary>
@@ -2659,7 +2659,7 @@
 </histogram>
 
 <histogram name="Blink.History.VisitedLinks.IsSaltFromNavigationThrottle"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>kyraseevers@chromium.org</owner>
   <owner>janiceliu@chromium.org</owner>
   <summary>
@@ -3371,7 +3371,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.DeferUnusedPreload.DeferredResourceCount"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>sisidovski@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3715,7 +3715,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PrewarmHttpDiskCache.{PrewarmMethod}.CacheExists"
-    enum="BooleanExists" expires_after="2025-12-28">
+    enum="BooleanExists" expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -3733,7 +3733,7 @@
 </histogram>
 
 <histogram name="Blink.LCPP.PrewarmHttpDiskCacheURL.Count" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>
     src/third_party/blink/renderer/core/lcp_critical_path_predictor/OWNERS
@@ -4179,7 +4179,7 @@
 </histogram>
 
 <histogram name="Blink.ParseStyleSheet.UpdateTime{BlinkUpdateTimeSuffixes}"
-    units="microseconds" expires_after="2025-12-08">
+    units="microseconds" expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -4324,7 +4324,7 @@
 </histogram>
 
 <histogram name="Blink.PrepareToStopParsingTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -4334,7 +4334,7 @@
   </summary>
 </histogram>
 
-<histogram name="Blink.PumpTokenizerTime" units="ms" expires_after="2025-12-28">
+<histogram name="Blink.PumpTokenizerTime" units="ms" expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -4779,7 +4779,7 @@
 </histogram>
 
 <histogram name="Blink.ScanAndPreloadTime.{FrameType}.{IsInitial}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
@@ -4958,7 +4958,7 @@
 </histogram>
 
 <histogram name="Blink.SetCookieTime.AblationDelay" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>elkurin@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -5191,7 +5191,7 @@
 </histogram>
 
 <histogram name="Blink.UpdateViewportIntersection.RemoteFrameNeedsUpdate"
-    enum="BooleanYesNo" expires_after="2025-12-28">
+    enum="BooleanYesNo" expires_after="2026-03-01">
   <owner>lizeb@chromium.org</owner>
   <owner>paint-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
index faa8ff53..27b4150 100644
--- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml
+++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -69,7 +69,7 @@
 </histogram>
 
 <histogram name="Bookmarks.AddedPerProfileType" enum="BrowserProfileType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
@@ -245,7 +245,7 @@
 </histogram>
 
 <histogram name="Bookmarks.BookmarksExistInStorageType.{SubtreeSelection}"
-    enum="BookmarksExistInStorageType" expires_after="2025-12-28">
+    enum="BookmarksExistInStorageType" expires_after="2026-03-01">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -274,7 +274,7 @@
 </histogram>
 
 <histogram name="Bookmarks.Count.OnProfileLoad3" units="bookmarks"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mamir@chromium.org</owner>
   <summary>
     The total number of bookmarks a user has saved, excluding folders. Recorded
@@ -330,7 +330,7 @@
 </histogram>
 
 <histogram name="Bookmarks.LaunchLocation" enum="BookmarkLaunchLocation"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ianwen@chromium.org</owner>
   <summary>Logs a UI location from which a bookmark is launched.</summary>
 </histogram>
@@ -721,7 +721,7 @@
 </histogram>
 
 <histogram name="Bookmarks.UsageCountPerProfileType" enum="BrowserProfileType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 58c632e..5a7e527 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -104,7 +104,7 @@
 </histogram>
 
 <histogram name="Browser.ChromeOS.HatsStatus" enum="HatsStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>aalsum@chromium.org</owner>
   <owner>chromeos-data-eng@google.com</owner>
   <summary>
@@ -571,7 +571,7 @@
 </histogram>
 
 <histogram name="Browser.MainThreadsCongestion.1MinAfterResume" units="janks"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kawasin@google.com</owner>
   <owner>baseos-perf@google.com</owner>
   <summary>
@@ -645,7 +645,7 @@
 </histogram>
 
 <histogram name="Browser.MainThreadsCongestion.Used" units="janks"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>pmonette@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -963,7 +963,7 @@
 </histogram>
 
 <histogram name="Browser.Responsiveness.IOJanksTotalPerMinute" units="janks"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gab@chromium.org</owner>
   <owner>olivierli@chromium.org</owner>
   <summary>
@@ -977,7 +977,7 @@
 </histogram>
 
 <histogram name="Browser.Responsiveness.IOJankyIntervalsPerMinute"
-    units="janks" expires_after="2025-12-28">
+    units="janks" expires_after="2026-03-01">
   <owner>gab@chromium.org</owner>
   <owner>olivierli@chromium.org</owner>
   <summary>
@@ -1064,7 +1064,7 @@
 </histogram>
 
 <histogram name="Browser.Tabs.TotalIncompleteSwitchDuration3{TabSwitchingType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>fdoray@chromium.org</owner>
   <owner>jonross@chromium.org</owner>
   <owner>joenotcharles@google.com</owner>
@@ -1104,7 +1104,7 @@
 </histogram>
 
 <histogram name="Browser.WindowCount.Incognito" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-privacy-core@google.com</owner>
   <summary>
@@ -1415,7 +1415,7 @@
 
 <histogram
     name="BrowserRenderProcessHost.SpareProcessMaybeTakeAction.NavigationRequest"
-    enum="SpareProcessMaybeTakeAction" expires_after="2025-12-31">
+    enum="SpareProcessMaybeTakeAction" expires_after="2026-03-01">
   <owner>gjc@google.com</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1426,7 +1426,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareProcessMaybeTakeTime"
-    units="seconds" expires_after="2025-12-28">
+    units="seconds" expires_after="2026-03-01">
   <owner>gjc@google.com</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1441,7 +1441,7 @@
 
 <histogram
     name="BrowserRenderProcessHost.SpareProcessMaybeTakeTime.{SpareProcessMaybeTakeAction}"
-    units="seconds" expires_after="2025-12-28">
+    units="seconds" expires_after="2026-03-01">
   <owner>gjc@google.com</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1454,7 +1454,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareProcessRefusedByEmbedderReason"
-    enum="SpareProcessRefusedByEmbedderReason" expires_after="2025-12-28">
+    enum="SpareProcessRefusedByEmbedderReason" expires_after="2026-03-01">
   <owner>gjc@google.com</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1532,7 +1532,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareRendererTaken.IsReady"
-    enum="BooleanReady" expires_after="2025-12-28">
+    enum="BooleanReady" expires_after="2026-03-01">
   <owner>pmonette@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1541,7 +1541,7 @@
 </histogram>
 
 <histogram name="BrowserRenderProcessHost.SpareRendererTaken.TimeSinceCreation"
-    units="seconds" expires_after="2025-12-28">
+    units="seconds" expires_after="2026-03-01">
   <owner>pmonette@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -1628,7 +1628,7 @@
 </histogram>
 
 <histogram name="BrowserScheduler.UIThread.TaskOffCpuDuration" units="ms"
-    expires_after="2025-12-25">
+    expires_after="2026-03-01">
   <owner>anandrv@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
@@ -1639,7 +1639,7 @@
 </histogram>
 
 <histogram name="BrowserScheduler.UIThread.TaskOnCpuDuration" units="ms"
-    expires_after="2025-12-25">
+    expires_after="2026-03-01">
   <owner>anandrv@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
@@ -1650,7 +1650,7 @@
 </histogram>
 
 <histogram name="BrowserScheduler.UIThread.TaskOnCpuPercentage" units="%"
-    expires_after="2025-12-25">
+    expires_after="2026-03-01">
   <owner>anandrv@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
@@ -2072,7 +2072,7 @@
 </histogram>
 
 <histogram name="SidePanel.{SidePanelEntry}.TimeFromEntryTriggerToShown"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>corising@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/browsing_topics/histograms.xml b/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
index 2dcabb0..9059c53 100644
--- a/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
+++ b/tools/metrics/histograms/metadata/browsing_topics/histograms.xml
@@ -34,7 +34,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.BrowsingTopicsState.LoadFinishStatus"
-    enum="BooleanSuccess" expires_after="2025-12-28">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -178,7 +178,7 @@
 
 <histogram
     name="BrowsingTopics.EpochTopicsCalculation.TopTopicsCountBeforePadding"
-    units="topics" expires_after="2025-12-28">
+    units="topics" expires_after="2026-03-01">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -214,7 +214,7 @@
 </histogram>
 
 <histogram name="BrowsingTopics.JavaScriptAPI.TimeToResolve" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
@@ -251,7 +251,7 @@
 
 <histogram
     name="BrowsingTopics.RedirectChain.OnTopicsFirstInvokedForSite.TopicsCallingSitesCount"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/bruschetta/histograms.xml b/tools/metrics/histograms/metadata/bruschetta/histograms.xml
index de8495b..c941a51 100644
--- a/tools/metrics/histograms/metadata/bruschetta/histograms.xml
+++ b/tools/metrics/histograms/metadata/bruschetta/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Bruschetta.InstallResult" enum="BruschettaInstallResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>uekawa@google.com</owner>
   <owner>drmasquatch@google.com</owner>
   <owner>src/chrome/browser/ash/bruschetta/OWNERS</owner>
@@ -31,7 +31,7 @@
 </histogram>
 
 <histogram name="Bruschetta.LaunchResult" enum="BruschettaResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>uekawa@google.com</owner>
   <owner>drmasquatch@google.com</owner>
   <owner>src/chrome/browser/ash/bruschetta/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/chrome/histograms.xml b/tools/metrics/histograms/metadata/chrome/histograms.xml
index 9c4c983..fe1fe93f 100644
--- a/tools/metrics/histograms/metadata/chrome/histograms.xml
+++ b/tools/metrics/histograms/metadata/chrome/histograms.xml
@@ -91,7 +91,7 @@
 </histogram>
 
 <histogram name="Chrome.KAnonymityService.QuerySet.Latency" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <summary>
@@ -138,7 +138,7 @@
 </histogram>
 
 <histogram name="Chrome.ProcessSingleton.NotifyResult" enum="NotifyResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gab@chromium.org</owner>
   <owner>etienneb@chromium.org</owner>
   <summary>
@@ -236,7 +236,7 @@
 
 <histogram
     name="Chrome.SystemNetworkContextManager.NetworkSandboxEarlyLaunchCrashed"
-    enum="Boolean" expires_after="2025-12-31">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>mmenke@chromium.org</owner>
   <summary>
@@ -247,7 +247,7 @@
 
 <histogram
     name="Chrome.SystemNetworkContextManager.NetworkSandboxLaunchFailed.ErrorCode"
-    enum="LaunchErrorCodes" expires_after="2025-12-31">
+    enum="LaunchErrorCodes" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>mmenke@chromium.org</owner>
   <summary>
@@ -272,7 +272,7 @@
 </histogram>
 
 <histogram name="Chrome.SystemNetworkContextManager.NetworkSandboxState"
-    enum="NetworkSandboxState" expires_after="2025-12-31">
+    enum="NetworkSandboxState" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>mmenke@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index 4513df6..3282e4b 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -1343,7 +1343,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Debugd.Perf.{FunctionName}" units="ms"
-    expires_after="2025-10-05">
+    expires_after="2026-04-01">
   <owner>enlightened@google.com</owner>
   <owner>jorgelo@google.com</owner>
   <owner>chromeos-security-core@google.com</owner>
@@ -1422,7 +1422,7 @@
 </histogram>
 
 <histogram name="ChromeOS.DiagnosticsUi.OpenDuration" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>byronlee@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
   <summary>
@@ -1462,7 +1462,7 @@
 </histogram>
 
 <histogram name="ChromeOS.DiagnosticsUi.{RoutineType}Result"
-    enum="CrosDiagnosticsRoutineResult" expires_after="2025-12-31">
+    enum="CrosDiagnosticsRoutineResult" expires_after="2026-03-01">
   <owner>byronlee@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
   <summary>Records the result of the {RoutineType} Routine.</summary>
@@ -1531,7 +1531,7 @@
 </histogram>
 
 <histogram name="ChromeOS.FeatureUsage.{FeatureName}" enum="FeatureUsageEvent"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>antrim@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -1543,7 +1543,7 @@
 </histogram>
 
 <histogram name="ChromeOS.FeatureUsage.{FeatureName}.Usetime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>antrim@chromium.org</owner>
   <owner>cros-oac@google.com</owner>
   <summary>
@@ -1699,7 +1699,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Gaia.Done.Oobe.NewAccount" enum="BooleanNewAccount"
-    expires_after="2025-12-07">
+    expires_after="2026-03-01">
   <owner>thv@google.com</owner>
   <owner>cros-growth@google.com</owner>
   <summary>
@@ -1794,7 +1794,7 @@
 </histogram>
 
 <histogram name="ChromeOS.HaTS.{Survey}" enum="HaTSSurvey"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>aalsum@chromium.org</owner>
   <owner>jackshira@google.com</owner>
   <owner>iby@chromium.org</owner>
@@ -1820,7 +1820,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Healthd.DiagnosticResult.{Routine}"
-    enum="CrosHealthdDiagnosticResult" expires_after="2025-12-31">
+    enum="CrosHealthdDiagnosticResult" expires_after="2026-03-01">
   <owner>weiluanwang@google.com</owner>
   <owner>dennyh@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
@@ -1891,7 +1891,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Healthd.RoutineCreation"
-    enum="CrosHealthdRoutineCategory" expires_after="2025-12-31">
+    enum="CrosHealthdRoutineCategory" expires_after="2026-03-01">
   <owner>weiluanwang@google.com</owner>
   <owner>dennyh@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
@@ -1902,7 +1902,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Healthd.TelemetryResult.{Category}"
-    enum="CrosHealthdTelemetryResult" expires_after="2025-12-31">
+    enum="CrosHealthdTelemetryResult" expires_after="2026-03-01">
   <owner>weiluanwang@google.com</owner>
   <owner>dennyh@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
@@ -2129,7 +2129,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.InternalKeyboard.NumberOfTopRowKeys"
-    units="keys" expires_after="2025-12-28">
+    units="keys" expires_after="2026-03-01">
   <owner>jimmyxgong@chromium.org</owner>
   <owner>wangdanny@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -2192,7 +2192,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.Keyboard.{FunctionKeyPressed}"
-    enum="InputKeyEventToFunctionKey" expires_after="2025-12-28">
+    enum="InputKeyEventToFunctionKey" expires_after="2026-03-01">
   <owner>jimmyxgong@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -2219,7 +2219,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Inputs.KeyUsage.Internal.{KeyboardKey}"
-    enum="KeyUsageCategory" expires_after="2025-12-28">
+    enum="KeyUsageCategory" expires_after="2026-03-01">
   <owner>jimmyxgong@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -2466,7 +2466,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Kcer.KcerPkcs12ImportEvent"
-    enum="KcerPkcs12ImportEvent" expires_after="2025-12-28">
+    enum="KcerPkcs12ImportEvent" expires_after="2026-03-01">
   <owner>miersh@google.com</owner>
   <owner>olsa@google.com</owner>
   <summary>Tracks events related to the import of PKCS#12 files.</summary>
@@ -2781,7 +2781,7 @@
 </histogram>
 
 <histogram name="ChromeOS.MachineStatistic.{MachineStatistic}.LoadingTime"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>asumaneev@google.com</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
   <summary>
@@ -3080,7 +3080,7 @@
 </histogram>
 
 <histogram name="ChromeOS.PrivacyHub.Opened" enum="PrivacyHubNavigationOrigin"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>zauri@google.com</owner>
   <owner>chromeos-privacyhub@google.com</owner>
   <summary>
@@ -3189,7 +3189,7 @@
 </histogram>
 
 <histogram name="ChromeOS.SAML.APIError" enum="ChromeOSSamlApiError"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>andreydav@google.com</owner>
   <owner>cros-3pidp@google.com</owner>
   <summary>Recorded when the Credentials Passing API call fails.</summary>
@@ -3239,7 +3239,7 @@
 </histogram>
 
 <histogram name="ChromeOS.SAML.Scraping.PasswordCountAll" units="passwords"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mslus@chromium.org</owner>
   <owner>emaxx@chromium.org</owner>
   <summary>
@@ -3263,7 +3263,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sandboxing.NoNewPrivsProcPercentage" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -3277,7 +3277,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sandboxing.NonInitNsProcPercentage" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -3291,7 +3291,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sandboxing.NonRootProcPercentage" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -3305,7 +3305,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sandboxing.SecCompCoverage" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -3319,7 +3319,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Sandboxing.UnprivProcPercentage" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>enlightened@chromium.org</owner>
   <owner>chromeos-hardening@google.com</owner>
   <summary>
@@ -4476,7 +4476,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Stability.{Severity}" enum="CrashSeverityProductType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>iby@chromium.org</owner>
   <owner>chromeos-data-eng@google.com</owner>
   <summary>
@@ -4648,7 +4648,7 @@
 </histogram>
 
 <histogram name="ChromeOS.TelemetryExtension.RoutineSupportedStatusQuery"
-    enum="TelemetryExtensionRoutineCategory" expires_after="2025-12-31">
+    enum="TelemetryExtensionRoutineCategory" expires_after="2026-03-01">
   <owner>weiluanwang@google.com</owner>
   <owner>dennyh@google.com</owner>
   <owner>cros-tdm-tpe-eng@google.com</owner>
@@ -4880,7 +4880,7 @@
 </histogram>
 
 <histogram name="ChromeOS.UserTypeByDeviceType.LogSegment"
-    enum="UserDeviceMatrix" expires_after="2025-12-28">
+    enum="UserDeviceMatrix" expires_after="2026-03-01">
   <owner>bmalcolm@chromium.org</owner>
   <owner>cros-client-wa@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
index 0e56f09..cf95ddc 100644
--- a/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos_settings/histograms.xml
@@ -227,7 +227,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.Device.Keyboard.BrightnessSliderAdjusted"
-    units="%" expires_after="2025-12-31">
+    units="%" expires_after="2026-03-01">
   <owner>longbo@google.com</owner>
   <owner>jimmyxgong@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
@@ -693,7 +693,7 @@
 
 <histogram
     name="ChromeOS.Settings.NumNavigationsUntilChange{OsSettingsChangeType}"
-    units="navigations" expires_after="2025-12-28">
+    units="navigations" expires_after="2026-03-01">
   <owner>wesokuhara@google.com</owner>
   <owner>xiaohuic@chromium.org</owner>
   <owner>cros-settings@google.com</owner>
@@ -749,7 +749,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.NumUniqueSettingsChanged.PerSession"
-    units="UniqueChanges" expires_after="2025-12-28">
+    units="UniqueChanges" expires_after="2026-03-01">
   <owner>moteva@google.com</owner>
   <owner>wesokuhara@google.com</owner>
   <owner>cros-settings@google.com</owner>
@@ -760,7 +760,7 @@
 </histogram>
 
 <histogram name="ChromeOS.Settings.OverscrollHistoryNavigation.Enabled"
-    enum="BooleanEnabled" expires_after="2025-12-28">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>katie@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/commerce/histograms.xml b/tools/metrics/histograms/metadata/commerce/histograms.xml
index 8488b9c..7b6b97db 100644
--- a/tools/metrics/histograms/metadata/commerce/histograms.xml
+++ b/tools/metrics/histograms/metadata/commerce/histograms.xml
@@ -178,7 +178,7 @@
 </histogram>
 
 <histogram name="Commerce.Compare.Table.ColumnCount" units="columns"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mdjones@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
   <summary>
@@ -662,7 +662,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceInsights.OmniboxIconClicked"
-    enum="PriceInsightsIconLabelType" expires_after="2025-12-28">
+    enum="PriceInsightsIconLabelType" expires_after="2026-03-01">
   <owner>mdjones@chromium.org</owner>
   <owner>ayman@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -674,7 +674,7 @@
 </histogram>
 
 <histogram name="Commerce.PriceInsights.OmniboxIconShown"
-    enum="PriceInsightsIconLabelType" expires_after="2025-12-28">
+    enum="PriceInsightsIconLabelType" expires_after="2026-03-01">
   <owner>mdjones@chromium.org</owner>
   <owner>ayman@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
@@ -928,7 +928,7 @@
 </histogram>
 
 <histogram name="Commerce.{FeatureName}.IconInteractionState"
-    enum="CommerceIconInteractionState" expires_after="2025-12-28">
+    enum="CommerceIconInteractionState" expires_after="2026-03-01">
   <owner>mdjones@chromium.org</owner>
   <owner>chrome-shopping@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/compositing/histograms.xml b/tools/metrics/histograms/metadata/compositing/histograms.xml
index 7f76d95..809c31e 100644
--- a/tools/metrics/histograms/metadata/compositing/histograms.xml
+++ b/tools/metrics/histograms/metadata/compositing/histograms.xml
@@ -233,7 +233,7 @@
 </histogram>
 
 <histogram name="Compositing.DirectRenderer.PartialSwap.RootDamage" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vasilyt@chromium.org</owner>
   <owner>petermcneeley@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -406,7 +406,7 @@
 </histogram>
 
 <histogram name="Compositing.Display.Draw.Quads" units="quads"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vmiura@chromium.org</owner>
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -873,7 +873,7 @@
 </histogram>
 
 <histogram name="Compositing.{Process}.CompositorFrame.Quads" units="quads"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vmiura@chromium.org</owner>
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -889,7 +889,7 @@
 </histogram>
 
 <histogram name="CompositorLatency.IpcThread.{LatencyType}"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1150,7 +1150,7 @@
 </histogram>
 
 <histogram name="Graphics.Smoothness.Jank3.AllSequences" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -1197,7 +1197,7 @@
 </histogram>
 
 <histogram name="Graphics.Smoothness.Jank3.{Thread}{Sequence}" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index 349037c..8d0ccae 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -680,7 +680,7 @@
 
 <histogram
     name="ContentSettings.{RegularProfileFiltered}DefaultRequestDesktopSiteSetting"
-    enum="ContentSetting" expires_after="2025-12-28">
+    enum="ContentSetting" expires_after="2026-03-01">
   <owner>shuyng@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -1137,7 +1137,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.Network.Duration{NetworkEvent}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>sczs@chromium.org</owner>
   <owner>harringtond@chromium.org</owner>
   <owner>feed@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index dc685874..c821f71 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -38,7 +38,7 @@
 </histogram>
 
 <histogram name="Cookie.AvgCookieJarSizePerKey2" units="bytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -181,7 +181,7 @@
   </summary>
 </histogram>
 
-<histogram name="Cookie.Count2" units="units" expires_after="2025-12-28">
+<histogram name="Cookie.Count2" units="units" expires_after="2026-03-01">
   <owner>morlovich@chromium.org</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -303,7 +303,7 @@
 </histogram>
 
 <histogram name="Cookie.ErrorInitializeDB" enum="SqliteLoggedResultCode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -614,7 +614,7 @@
 </histogram>
 
 <histogram name="Cookie.MaxCookieJarSizePerKey" units="kibibytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dylancutler@google.com</owner>
   <owner>src/net/cookies/OWNERS</owner>
   <summary>
@@ -674,7 +674,7 @@
 </histogram>
 
 <histogram name="Cookie.OnCookiesAccessed.BatchSize.CookieAccessObserver"
-    units="accesses" expires_after="2025-12-28">
+    units="accesses" expires_after="2026-03-01">
   <owner>kawasin@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/cras/histograms.xml b/tools/metrics/histograms/metadata/cras/histograms.xml
index 82e9648d..9f4b8b92 100644
--- a/tools/metrics/histograms/metadata/cras/histograms.xml
+++ b/tools/metrics/histograms/metadata/cras/histograms.xml
@@ -356,7 +356,7 @@
 
 <histogram
     name="Cras.DeviceRuntime.Output{Device}{HostCapability}{PeripheralCapability}"
-    units="seconds" expires_after="2025-12-28">
+    units="seconds" expires_after="2026-03-01">
   <owner>jrwu@google.com</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -414,7 +414,7 @@
 </histogram>
 
 <histogram name="Cras.DeviceTypeInput" enum="CrasDeviceType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yuhsuan@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -425,7 +425,7 @@
 </histogram>
 
 <histogram name="Cras.DeviceTypeOutput" enum="CrasDeviceType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yuhsuan@chromium.org</owner>
   <owner>chromeos-audio@google.com</owner>
   <summary>
@@ -491,7 +491,7 @@
 </histogram>
 
 <histogram name="Cras.FetchDelayMilliSeconds" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
 <!-- Name completed by histogram_suffixes
      name="Cras.ClientType" and
      name="Cras.StreamType" -->
@@ -1063,7 +1063,7 @@
 </histogram>
 
 <histogram name="Cras.StreamFlags{Cras_Direction}" units="value"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
 <!-- Name completed by histogram_suffixes
      name="Cras.Direction" and
      name="Cras.ClientType" -->
diff --git a/tools/metrics/histograms/metadata/cros_audio/histograms.xml b/tools/metrics/histograms/metadata/cros_audio/histograms.xml
index 559f601..16b21f9 100644
--- a/tools/metrics/histograms/metadata/cros_audio/histograms.xml
+++ b/tools/metrics/histograms/metadata/cros_audio/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="ChromeOS.AudioSelection" enum="AudioSelectionEvents"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -79,7 +79,7 @@
 </histogram>
 
 <histogram name="ChromeOS.AudioSelection.{AudioType}.SystemSwitchAudio"
-    enum="BooleanSwitched" expires_after="2025-12-31">
+    enum="BooleanSwitched" expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -247,7 +247,7 @@
 
 <histogram
     name="ChromeOS.AudioSelection.{AudioType}.UserOverrideSystem{SwitchDecision}Audio.BeforeAndAfterAudioDeviceSet"
-    enum="AudioSelectionBeforeAndAfterDeviceSet" expires_after="2025-12-31">
+    enum="AudioSelectionBeforeAndAfterDeviceSet" expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -267,7 +267,7 @@
 
 <histogram
     name="ChromeOS.AudioSelection.{AudioType}.UserOverrideSystem{SwitchDecision}TimeElapsed"
-    units="minutes" expires_after="2025-12-31">
+    units="minutes" expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -387,7 +387,7 @@
 </histogram>
 
 <histogram name="ChromeOS.CrosAudioConfig.OutputVolumeSetTo" units="%"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
index 6462663..dcfc39d9 100644
--- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
+++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -545,7 +545,7 @@
 </histogram>
 
 <histogram name="CustomTabs.MayLaunchUrlType" enum="MayLaunchUrlType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>lizeb@chromium.org</owner>
   <summary>
     Android only. Which flavors of mayLaunchUrl() were used before a tab launch.
@@ -560,7 +560,7 @@
 </histogram>
 
 <histogram name="CustomTabs.Minimized.MinimizeSuccess" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sinansahin@google.com</owner>
   <owner>chrome-connective-tissue@google.com</owner>
   <summary>
@@ -697,7 +697,7 @@
 </histogram>
 
 <histogram name="CustomTabs.Prefetch.PrefetchCalled" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>taiyo@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -784,7 +784,7 @@
 </histogram>
 
 <histogram name="CustomTabs.SpareRenderer" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>adelm@google.com</owner>
   <owner>chrome-connective-tissue@google.com</owner>
   <summary>
@@ -803,7 +803,7 @@
 </histogram>
 
 <histogram name="CustomTabs.Startup.StartedNavigationEarly" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mthiesse@chromium.org</owner>
   <owner>chrome-connective-tissue@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/data/histograms.xml b/tools/metrics/histograms/metadata/data/histograms.xml
index e999e728..ec4232f 100644
--- a/tools/metrics/histograms/metadata/data/histograms.xml
+++ b/tools/metrics/histograms/metadata/data/histograms.xml
@@ -105,7 +105,7 @@
 </histogram>
 
 <histogram name="DataUse.BytesReceived3.Delegate" units="bytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>curranmax@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>spelchat@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/dev/histograms.xml b/tools/metrics/histograms/metadata/dev/histograms.xml
index bfe54ad..9811a17 100644
--- a/tools/metrics/histograms/metadata/dev/histograms.xml
+++ b/tools/metrics/histograms/metadata/dev/histograms.xml
@@ -152,7 +152,7 @@
 </histogram>
 
 <histogram name="DevTools.ExperimentDisabledAtLaunch"
-    enum="DevtoolsExperiments" expires_after="2025-12-28">
+    enum="DevtoolsExperiments" expires_after="2026-03-01">
   <owner>yangguo@google.com</owner>
   <owner>changhaohan@google.com</owner>
   <summary>
@@ -305,7 +305,7 @@
 </histogram>
 
 <histogram name="DevTools.Launch{DevToolsLaunchPanels}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yangguo@google.com</owner>
   <owner>bmeurer@google.com</owner>
   <summary>
@@ -519,7 +519,7 @@
   </summary>
 </histogram>
 
-<histogram name="DevTools.TraceLoad" units="ms" expires_after="2025-12-28">
+<histogram name="DevTools.TraceLoad" units="ms" expires_after="2026-03-01">
   <owner>paulirish@google.com</owner>
   <owner>jacktfranklin@google.com</owner>
   <owner>victorporof@google.com</owner>
@@ -541,7 +541,7 @@
 </histogram>
 
 <histogram name="DevTools.VisualLogging.ProcessingTime" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>danilsomsikov@google.com</owner>
   <owner>hablich@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/disk/histograms.xml b/tools/metrics/histograms/metadata/disk/histograms.xml
index c893334..e22b24a 100644
--- a/tools/metrics/histograms/metadata/disk/histograms.xml
+++ b/tools/metrics/histograms/metadata/disk/histograms.xml
@@ -33,7 +33,7 @@
   </summary>
 </histogram>
 
-<histogram name="DiskCache.0.EvictedAge" units="ms" expires_after="2025-12-28">
+<histogram name="DiskCache.0.EvictedAge" units="ms" expires_after="2026-03-01">
   <owner>ricea@chromium.org</owner>
   <owner>src/net/disk_cache/OWNERS</owner>
   <summary>
@@ -54,7 +54,7 @@
 </histogram>
 
 <histogram name="DiskCache.0.TotalIOTimeRead" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jam@chromium.org</owner>
   <owner>swarm-team@google.com</owner>
   <summary>
@@ -65,7 +65,7 @@
 </histogram>
 
 <histogram name="DiskCache.0.TotalIOTimeWrite" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jam@chromium.org</owner>
   <owner>swarm-team@google.com</owner>
   <summary>
@@ -76,7 +76,7 @@
 </histogram>
 
 <histogram name="DiskCache.0.TrimmedDeletedRankingEntries" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ricea@chromium.org</owner>
   <owner>src/net/disk_cache/OWNERS</owner>
   <summary>
@@ -90,7 +90,7 @@
 </histogram>
 
 <histogram name="DiskCache.HashBucketOK.Sampled" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>morlovich@chromium.org</owner>
   <owner>src/net/disk_cache/OWNERS</owner>
   <summary>
@@ -100,7 +100,7 @@
 </histogram>
 
 <histogram name="DiskCache.MoveCacheToRestartCache.Windows"
-    enum="BooleanSuccess" expires_after="2025-12-28">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -111,7 +111,7 @@
 </histogram>
 
 <histogram name="DiskCache.MoveCacheToRestartCacheError.Windows"
-    enum="WinGetLastError" expires_after="2025-12-28">
+    enum="WinGetLastError" expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml
index 68d5fd7..befeff5 100644
--- a/tools/metrics/histograms/metadata/download/histograms.xml
+++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -156,7 +156,7 @@
 </histogram>
 
 <histogram name="Download.ApiFunctions" enum="DownloadFunctions"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dtrainor@chromium.org</owner>
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index abee944..4ad51958 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -2731,7 +2731,7 @@
 </histogram>
 
 <histogram name="Enterprise.OnBulkDataEntry.DataSize" units="bytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>domfc@chromium.org</owner>
   <owner>webprotect-team@google.com</owner>
   <summary>
@@ -3048,7 +3048,7 @@
 </histogram>
 
 <histogram name="Enterprise.RegularUserSession.SessionLength" units="minutes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bfranz@chromium.org</owner>
   <owner>chromeos-kiosk-eng@google.com</owner>
   <summary>
@@ -3766,7 +3766,7 @@
 </histogram>
 
 <histogram name="Enterprise.UserPolicy.Count" units="policies"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vincb@google.com</owner>
   <owner>ftirelo@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/event/histograms.xml b/tools/metrics/histograms/metadata/event/histograms.xml
index 1a168c9..47d565a9 100644
--- a/tools/metrics/histograms/metadata/event/histograms.xml
+++ b/tools/metrics/histograms/metadata/event/histograms.xml
@@ -605,7 +605,7 @@
 </histogram>
 
 <histogram name="Event.ScrollJank.DelayedFramesPercentage.PerScroll{Length}"
-    units="%" expires_after="2025-12-28">
+    units="%" expires_after="2026-03-01">
   <owner>kartarsingh@google.com</owner>
   <owner>jonross@chromium.org</owner>
   <owner>woa-performance-team@google.com</owner>
@@ -627,7 +627,7 @@
 </histogram>
 
 <histogram name="Event.ScrollJank.MissedVsyncs.PerFrame" units="counts"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kartarsingh@google.com</owner>
   <owner>jonross@chromium.org</owner>
   <owner>woa-performance-team@google.com</owner>
@@ -1009,7 +1009,7 @@
 </histogram>
 
 <histogram name="EventLatency.TotalLatency" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1023,7 +1023,7 @@
 
 <histogram
     name="EventLatency.{NonGsuScrollEventType}.{ScrollInputType}.TotalLatency2"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1089,7 +1089,7 @@
 </histogram>
 
 <histogram name="EventLatency.{PinchEventType}.{PinchInputType}.TotalLatency"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1141,7 +1141,7 @@
 </histogram>
 
 <histogram name="EventLatency.{ScrollEventType}.{DispatchStage}.{RatioType}"
-    units="%" expires_after="2025-12-28">
+    units="%" expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index f5187f5..07b1698 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -3387,7 +3387,7 @@
 </histogram>
 
 <histogram name="Extensions.ManifestVersion2Count.{ManifestLocation}"
-    units="number of extensions" expires_after="2025-12-28">
+    units="number of extensions" expires_after="2026-03-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3413,7 +3413,7 @@
 </histogram>
 
 <histogram name="Extensions.ManifestVersionByLocation.{ManifestLocation}"
-    units="manifest version" expires_after="2025-12-28">
+    units="manifest version" expires_after="2026-03-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -3848,7 +3848,7 @@
 </histogram>
 
 <histogram name="Extensions.SearchEngineOverrides2" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>kelvinjiang@chromium.org</owner>
   <summary>
@@ -3978,7 +3978,7 @@
 </histogram>
 
 <histogram name="Extensions.ServiceWorkerBackground.Registration_FailStatus"
-    enum="ServiceWorkerStatusCode" expires_after="2025-12-28">
+    enum="ServiceWorkerStatusCode" expires_after="2026-03-01">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4150,7 +4150,7 @@
 </histogram>
 
 <histogram name="Extensions.ServiceWorkerBackground.WorkerCountAfterAdd"
-    units="registered workers" expires_after="2025-12-28">
+    units="registered workers" expires_after="2026-03-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4161,7 +4161,7 @@
 </histogram>
 
 <histogram name="Extensions.ServiceWorkerBackground.WorkerCountAfterRemove"
-    units="registered workers" expires_after="2025-12-28">
+    units="registered workers" expires_after="2026-03-01">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4274,7 +4274,7 @@
 
 <histogram
     name="Extensions.ServiceWorkerRenderer.ExtensionLoadStatusInWorkerScriptEvaluation"
-    enum="ExtensionLoadStatusOnScriptEval" expires_after="2025-12-28">
+    enum="ExtensionLoadStatusOnScriptEval" expires_after="2026-03-01">
   <owner>jlulejian@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
@@ -4396,7 +4396,7 @@
 </histogram>
 
 <histogram name="Extensions.Toolbar.ExtensionsActivatedFromRequestAccessButton"
-    units="Extension Count" expires_after="2025-12-28">
+    units="Extension Count" expires_after="2026-03-01">
   <owner>emiliapaz@chromium.org</owner>
   <owner>extensions-core@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/families/histograms.xml b/tools/metrics/histograms/metadata/families/histograms.xml
index 3d04c9f..6d6fb96c 100644
--- a/tools/metrics/histograms/metadata/families/histograms.xml
+++ b/tools/metrics/histograms/metadata/families/histograms.xml
@@ -243,7 +243,7 @@
 </histogram>
 
 <histogram name="ChromeOS.FamilyUser.NumSecondaryAccounts" units="accounts"
-    expires_after="2025-11-01">
+    expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>longbowei@google.com</owner>
   <owner>cros-families-eng@google.com</owner>
@@ -750,7 +750,7 @@
 </histogram>
 
 <histogram name="FamilyUser.{ExtensionStatus}ExtensionsCount2"
-    units="Number of Extensions" expires_after="2025-12-28">
+    units="Number of Extensions" expires_after="2026-03-01">
   <owner>zhangwenyu@google.com</owner>
   <owner>longbowei@google.com</owner>
   <owner>cros-families-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 94e3578..0bf9170 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -824,7 +824,7 @@
 </histogram>
 
 <histogram name="InProductHelp.ShownTime2.{IPHFeature}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gayane@google.com</owner>
   <owner>lpromero@google.com</owner>
   <owner>gambard@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml b/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml
index 092461a..2d683c1 100644
--- a/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml
+++ b/tools/metrics/histograms/metadata/fingerprinting_protection/histograms.xml
@@ -25,7 +25,7 @@
 <histogram
     name="FingerprintingProtection.BlockedDomainListComponent.InstallationResult"
     enum="FingerprintingProtectionComponentInstallationResult"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>trishalfonso@google.com</owner>
   <owner>src/components/fingerprinting_protection_filter/OWNERS</owner>
   <summary>
@@ -160,7 +160,7 @@
 
 <histogram
     name="FingerprintingProtection.DocumentLoad.SubframeFilteringDelay.{Result}"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>thesalsa@google.com</owner>
   <owner>trishalfonso@google.com</owner>
   <owner>rizvis@google.com</owner>
@@ -182,7 +182,7 @@
 
 <histogram
     name="FingerprintingProtection.DocumentLoad.SubframeFilteringDelay.{Result}.Incognito"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>thesalsa@google.com</owner>
   <owner>trishalfonso@google.com</owner>
   <owner>rizvis@google.com</owner>
@@ -247,7 +247,7 @@
 </histogram>
 
 <histogram name="FingerprintingProtection.IndexRuleset.Verify2.WallDuration"
-    units="ms" expires_after="2025-12-30">
+    units="ms" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -320,7 +320,7 @@
 </histogram>
 
 <histogram name="FingerprintingProtection.PageLoad.ActivationLevel"
-    enum="FingerprintingProtectionActivationLevel" expires_after="2025-12-30">
+    enum="FingerprintingProtectionActivationLevel" expires_after="2026-03-01">
   <owner>thesalsa@google.com</owner>
   <owner>trishalfonso@google.com</owner>
   <owner>rizvis@google.com</owner>
@@ -335,7 +335,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.NumSubresourceLoads.Disallowed"
-    units="resource loads" expires_after="2025-12-30">
+    units="resource loads" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -365,7 +365,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.NumSubresourceLoads.Evaluated"
-    units="resource loads" expires_after="2025-12-30">
+    units="resource loads" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -396,7 +396,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.NumSubresourceLoads.MatchedRules"
-    units="resource loads" expires_after="2025-12-30">
+    units="resource loads" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -411,7 +411,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.NumSubresourceLoads.MatchedRules.Incognito"
-    units="resource loads" expires_after="2025-12-30">
+    units="resource loads" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -425,7 +425,7 @@
 </histogram>
 
 <histogram name="FingerprintingProtection.PageLoad.NumSubresourceLoads.Total"
-    units="resource loads" expires_after="2025-12-30">
+    units="resource loads" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -486,7 +486,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.RootNavigation.ActivationState"
-    enum="SubresourceFilterActivationState" expires_after="2025-12-30">
+    enum="SubresourceFilterActivationState" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>trishalfonso@google.com</owner>
   <owner>thesalsa@google.com</owner>
@@ -516,7 +516,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.SubresourceEvaluation.TotalCPUDuration"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -533,7 +533,7 @@
 
 <histogram
     name="FingerprintingProtection.PageLoad.SubresourceEvaluation.TotalWallDuration"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -550,7 +550,7 @@
 
 <histogram
     name="FingerprintingProtection.SubresourceLoad.Evaluation.CPUDuration"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -570,7 +570,7 @@
 
 <histogram
     name="FingerprintingProtection.SubresourceLoad.Evaluation.WallDuration"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
@@ -590,7 +590,7 @@
 
 <histogram
     name="FingerprintingProtection.SubresourceLoad.TotalDeferTime.{Result}"
-    units="microseconds" expires_after="2025-12-30">
+    units="microseconds" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <summary>
@@ -614,7 +614,7 @@
 </histogram>
 
 <histogram name="FingerprintingProtection.WebContentsObserver.RefreshCount"
-    units="refresh counts" expires_after="2025-12-30">
+    units="refresh counts" expires_after="2026-03-01">
   <owner>rizvis@google.com</owner>
   <owner>thesalsa@google.com</owner>
   <owner>tanub@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml
index 924bd20..4f23f0a 100644
--- a/tools/metrics/histograms/metadata/geolocation/histograms.xml
+++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -237,7 +237,7 @@
 </histogram>
 
 <histogram name="Geolocation.NetworkLocationProvider.SessionResult"
-    enum="NetworkLocationRequestResult" expires_after="2025-12-28">
+    enum="NetworkLocationRequestResult" expires_after="2026-03-01">
   <owner>alvinji@chromium.org</owner>
   <owner>device-dev@chromium.org</owner>
   <summary>
@@ -251,7 +251,7 @@
 </histogram>
 
 <histogram name="Geolocation.NetworkLocationProvider.TimeToFirstPosition"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>alvinji@chromium.org</owner>
   <owner>device-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index 27285fd..4a025cf9f 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -343,7 +343,7 @@
 </histogram>
 
 <histogram name="GPU.ANGLE.D3D11FeatureLevel" enum="D3DFeatureLevel"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>geofflang@google.com</owner>
   <owner>angle-team@google.com</owner>
   <summary>
@@ -502,7 +502,7 @@
 </histogram>
 
 <histogram name="GPU.ContextLost.{ContextType}" enum="ContextLostReason"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -790,7 +790,7 @@
 </histogram>
 
 <histogram name="GPU.EGLDisplayType" enum="EGLDisplayType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>The display type used to ask for an EGLDisplay.</summary>
@@ -837,7 +837,7 @@
 </histogram>
 
 <histogram name="GPU.EstablishGpuChannelSyncRetry" enum="BooleanSuccess"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fangzhoug@chromium.org</owner>
   <owner>kylechar@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
@@ -871,7 +871,7 @@
 </histogram>
 
 <histogram name="GPU.FallbackEventCause" enum="GPUFallbackEventCauseType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>blundell@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@google.com</owner>
   <summary>
@@ -946,7 +946,7 @@
 </histogram>
 
 <histogram name="GPU.GPUProcessExitCode" enum="GPUProcessExitCode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -955,7 +955,7 @@
 </histogram>
 
 <histogram name="GPU.GPUProcessLaunchTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vmiura@chromium.org</owner>
   <summary>
     Startup time of the GPU process as measured by the GPU process host.
@@ -980,7 +980,7 @@
 </histogram>
 
 <histogram name="GPU.GPUProcessTerminationStatus2" enum="GpuTerminationStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vmiura@chromium.org</owner>
   <summary>
     Counts for each time the GPU Process Host detects the process dies.
@@ -1034,7 +1034,7 @@
 </histogram>
 
 <histogram name="Gpu.GrLinkProgramUs" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>geofflang@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1045,7 +1045,7 @@
 </histogram>
 
 <histogram name="Gpu.GrShaderCacheEnabled" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>geofflang@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1099,7 +1099,7 @@
 </histogram>
 
 <histogram name="GPU.IntelGpuGeneration" enum="IntelGpuGeneration"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1152,7 +1152,7 @@
 </histogram>
 
 <histogram name="Gpu.Metal.FamilyMac" enum="MetalFamilyMac"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>cwallez@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1289,7 +1289,7 @@
 </histogram>
 
 <histogram name="GPU.ProcessLifetimeEvents.HardwareAccelerated"
-    enum="GPUProcessLifetimeEvent" expires_after="2025-12-28">
+    enum="GPUProcessLifetimeEvent" expires_after="2026-03-01">
   <owner>vmiura@chromium.org</owner>
   <summary>
     Recorded once for every GPU process launch and crash when GPU process is
@@ -1344,7 +1344,7 @@
 </histogram>
 
 <histogram name="GPU.SharedImage.BackingType" enum="SharedImageBackingType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kylechar@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@google.com</owner>
   <summary>
@@ -1375,7 +1375,7 @@
 </histogram>
 
 <histogram name="GPU.SoftwareRendering" enum="BooleanSoftwareRendering"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1438,7 +1438,7 @@
 </histogram>
 
 <histogram name="GPU.Vulkan.PipelineCache.vkCreateGraphicsPipelines"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>vasilyt@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -1600,7 +1600,7 @@
 </histogram>
 
 <histogram name="GPU.{GraphiteDawnOrWebGPU}.{Cacheable}.CacheHit"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>lokokung@google.com</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/help_app/histograms.xml b/tools/metrics/histograms/metadata/help_app/histograms.xml
index 5c3d06f1..e771ad8 100644
--- a/tools/metrics/histograms/metadata/help_app/histograms.xml
+++ b/tools/metrics/histograms/metadata/help_app/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Discover.Overall.AppLaunched" enum="LaunchSource"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>callistus@google.com</owner>
   <owner>showoff-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/history/histograms.xml b/tools/metrics/histograms/metadata/history/histograms.xml
index 6b4afc8..3ec8688 100644
--- a/tools/metrics/histograms/metadata/history/histograms.xml
+++ b/tools/metrics/histograms/metadata/history/histograms.xml
@@ -1392,7 +1392,7 @@
 </histogram>
 
 <histogram name="History.DatabaseSqliteError" enum="SqliteLoggedResultCode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sophiechang@chromium.org</owner>
   <owner>asully@chromium.org</owner>
   <component>1456716</component>
@@ -1403,7 +1403,7 @@
 </histogram>
 
 <histogram name="History.DomainCount1Day_V2" units="domains"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1445,7 +1445,7 @@
 </histogram>
 
 <histogram name="History.DomainCount1Day_V3" units="domains"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1481,7 +1481,7 @@
 </histogram>
 
 <histogram name="History.DomainCount28Day_V2" units="domains"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -1559,7 +1559,7 @@
 </histogram>
 
 <histogram name="History.DomainCount7Day_V2" units="domains"
-    expires_after="2025-10-26">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>mjzhang@chromium.org</owner>
   <owner>chrome-analysis-team@google.com</owner>
@@ -2825,7 +2825,7 @@
   </summary>
 </histogram>
 
-<histogram name="History.URLTableCount" units="URLs" expires_after="2025-12-28">
+<histogram name="History.URLTableCount" units="URLs" expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>sky@chromium.org</owner>
   <component>1456716</component>
@@ -2868,7 +2868,7 @@
 </histogram>
 
 <histogram name="History.VisitedLinks.NumSaltsForNavigationsDuringBuild"
-    units="salts" expires_after="2025-12-28">
+    units="salts" expires_after="2026-03-01">
   <owner>kyraseevers@chromium.org</owner>
   <owner>janiceliu@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/holding_space/histograms.xml b/tools/metrics/histograms/metadata/holding_space/histograms.xml
index 10ab8e2..dc62c70 100644
--- a/tools/metrics/histograms/metadata/holding_space/histograms.xml
+++ b/tools/metrics/histograms/metadata/holding_space/histograms.xml
@@ -130,7 +130,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.All" enum="HoldingSpaceItemAction"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>dmblack@google.com</owner>
   <owner>alexandrahill@google.com</owner>
   <summary>
@@ -190,7 +190,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}" enum="HoldingSpaceItemType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>dmblack@google.com</owner>
   <owner>alexandrahill@google.com</owner>
   <summary>
@@ -212,7 +212,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.Action.{action}.FileSystemType"
-    enum="HoldingSpaceFileSystemType" expires_after="2025-12-31">
+    enum="HoldingSpaceFileSystemType" expires_after="2026-03-01">
   <owner>dmblack@google.com</owner>
   <owner>alexandrahill@google.com</owner>
   <summary>
@@ -250,7 +250,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Item.VisibleCount.{type}" units="items"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>dmblack@google.com</owner>
   <owner>alexandrahill@google.com</owner>
   <summary>
@@ -262,7 +262,7 @@
 
 <histogram
     name="HoldingSpace.Item.VisibleCount.{type}.FileSystemType.{fs_type}"
-    units="items" expires_after="2025-12-31">
+    units="items" expires_after="2026-03-01">
   <owner>dmblack@google.com</owner>
   <owner>alexandrahill@google.com</owner>
   <summary>
@@ -285,7 +285,7 @@
 </histogram>
 
 <histogram name="HoldingSpace.Suggestions.Action.All"
-    enum="HoldingSpaceSuggestionsAction" expires_after="2025-12-31">
+    enum="HoldingSpaceSuggestionsAction" expires_after="2026-03-01">
   <owner>dmblack@google.com</owner>
   <owner>alexandrahill@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/input/histograms.xml b/tools/metrics/histograms/metadata/input/histograms.xml
index a927a207..50b989bd 100644
--- a/tools/metrics/histograms/metadata/input/histograms.xml
+++ b/tools/metrics/histograms/metadata/input/histograms.xml
@@ -113,7 +113,7 @@
 </histogram>
 
 <histogram name="Input.ToolType.Android" units="tool type"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>alexmitra@chromium.org</owner>
   <owner>flackr@chromium.org</owner>
   <owner>peconn@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/interstitial/histograms.xml b/tools/metrics/histograms/metadata/interstitial/histograms.xml
index 8412ca6..69a06e5 100644
--- a/tools/metrics/histograms/metadata/interstitial/histograms.xml
+++ b/tools/metrics/histograms/metadata/interstitial/histograms.xml
@@ -396,7 +396,7 @@
 
 <histogram
     name="interstitial.{SecurityInterstitialSBType}decision{RepeatVisit}{IsPostCommitInterstitialSuffix}"
-    enum="SecurityInterstitialDecision" expires_after="2025-12-28">
+    enum="SecurityInterstitialDecision" expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -488,7 +488,7 @@
 
 <histogram
     name="interstitial.{SecurityInterstitialSBType}show_delay{TimeRange}{SecurityInterstitialSBWithSourceType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index d6cd37de..7183270a 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -347,17 +347,6 @@
   </summary>
 </histogram>
 
-<histogram name="IOS.Bookmarks.DefaultBookmarkFolderOutcome"
-    enum="IOSDefaultBookmarkFolderOutcome" expires_after="2025-08-24">
-  <owner>mastiz@chromium.org</owner>
-  <owner>arthurmilchior@chromium.org</owner>
-  <component>1457392</component>
-  <summary>
-    Logs how the default bookmark folder is determined, when one or more
-    bookmarks are being saved by the user. Only recorded on iOS.
-  </summary>
-</histogram>
-
 <histogram name="IOS.BringAndroidTabs.ActionOnPrompt"
     enum="IOSBringAndroidTabsPromptActionType" expires_after="2026-01-04">
   <owner>hiramahmood@google.com</owner>
@@ -1669,7 +1658,7 @@
 </histogram>
 
 <histogram name="IOS.DocumentDownload.MimeType" enum="DownloadMimeTypeResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>qpubert@google.com</owner>
   <owner>olivierrobin@chromium.org</owner>
   <owner>bling-team@google.com</owner>
@@ -1765,7 +1754,7 @@
 </histogram>
 
 <histogram name="IOS.ExplainWithGemini.CharSelected" units="characters"
-    expires_after="2025-08-31">
+    expires_after="2026-03-01">
   <owner>prasanaa@google.com</owner>
   <owner>bling-alchemy-eng@google.com</owner>
   <summary>
@@ -1812,7 +1801,7 @@
 </histogram>
 
 <histogram name="IOS.FilePicker.Drive.AccountSelection"
-    enum="IOSFilePickerDriveAccountSelection" expires_after="2025-12-28">
+    enum="IOSFilePickerDriveAccountSelection" expires_after="2026-03-01">
   <owner>qpubert@google.com</owner>
   <owner>erahmaoui@google.com</owner>
   <owner>bling-team@google.com</owner>
@@ -2469,7 +2458,7 @@
 </histogram>
 
 <histogram name="IOS.HomeCustomization.MagicStack.SafetyCheck.Enabled"
-    enum="Boolean" expires_after="2025-10-12">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>adamta@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -2479,7 +2468,7 @@
 </histogram>
 
 <histogram name="IOS.HomeCustomization.MagicStack.SetUpList.Enabled"
-    enum="Boolean" expires_after="2025-10-12">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>adamta@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -2489,7 +2478,7 @@
 </histogram>
 
 <histogram name="IOS.HomeCustomization.MagicStack.TabResumption.Enabled"
-    enum="Boolean" expires_after="2025-10-12">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>adamta@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -2499,7 +2488,7 @@
 </histogram>
 
 <histogram name="IOS.HomeCustomization.MagicStack.Tips.Enabled" enum="Boolean"
-    expires_after="2025-10-12">
+    expires_after="2026-03-01">
   <owner>bwwilliams@google.com</owner>
   <owner>adamta@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
@@ -2510,7 +2499,7 @@
 </histogram>
 
 <histogram name="IOS.HomeCustomization.Opened"
-    enum="IOSHomeCustomizationEntrypoint" expires_after="2025-12-14">
+    enum="IOSHomeCustomizationEntrypoint" expires_after="2026-03-01">
   <owner>adamta@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -2877,6 +2866,16 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.MagicStack.Module.Click.AppBundlePromo" units="index"
+    expires_after="2026-01-18">
+  <owner>ericekey@google.com</owner>
+  <owner>bling-pandamonium@google.com</owner>
+  <summary>
+    Records the rank index of the App Bundle promo module when a user clicks on
+    it.
+  </summary>
+</histogram>
+
 <histogram name="IOS.MagicStack.Module.Click.MostVisited" units="index"
     expires_after="2026-09-28">
   <owner>thegreenfrog@chromium.org</owner>
@@ -2925,7 +2924,7 @@
 </histogram>
 
 <histogram name="IOS.MagicStack.Module.Click.SendTabPromo" units="index"
-    expires_after="2025-05-20">
+    expires_after="2026-02-28">
   <owner>hiramahmood@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -3644,7 +3643,7 @@
 
 <histogram
     name="IOS.Notifications.SendTab.MagicStack.AllowNotificationsPressed"
-    enum="Boolean" expires_after="2025-09-13">
+    enum="Boolean" expires_after="2026-02-28">
   <owner>hiramahmood@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -3655,7 +3654,7 @@
 
 <histogram name="IOS.Notifications.SendTab.Received"
     enum="PushNotificationSettingsAuthorizationStatus"
-    expires_after="2025-11-23">
+    expires_after="2026-02-28">
   <owner>hiramahmood@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -3738,7 +3737,7 @@
 </histogram>
 
 <histogram name="IOS.NTP.Impression" enum="IOSNTPImpressionType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -3778,7 +3777,7 @@
 </histogram>
 
 <histogram name="IOS.NumberOfContextsToOpen" enum="ContextsToOpen"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>fedegermi@google.com</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -3825,7 +3824,7 @@
 </histogram>
 
 <histogram name="IOS.Omnibox.DeviceSwitcherResult.{Context}"
-    enum="OmniboxDeviceSwitcherResult" expires_after="2025-12-28">
+    enum="OmniboxDeviceSwitcherResult" expires_after="2026-03-01">
   <owner>christianxu@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -3839,7 +3838,7 @@
 </histogram>
 
 <histogram name="IOS.Omnibox.SteadyStatePositionAtStartup"
-    enum="OmniboxPositionType" expires_after="2025-12-28">
+    enum="OmniboxPositionType" expires_after="2026-03-01">
   <owner>christianxu@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -3858,7 +3857,7 @@
 </histogram>
 
 <histogram name="IOS.Omnibox.SuggestionsListScrolled.{PageClass}"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>christianxu@chromium.org</owner>
   <owner>stkhapugin@chromium.org</owner>
   <owner>bling-team@google.com</owner>
@@ -4572,7 +4571,7 @@
 </histogram>
 
 <histogram name="IOS.PushNotification.ChimeDeviceRegistration"
-    enum="BooleanSuccess" expires_after="2025-12-28">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>danieltwhite@google.com</owner>
   <owner>scottyoder@google.com</owner>
   <summary>
@@ -4614,7 +4613,7 @@
 </histogram>
 
 <histogram name="IOS.PushNotification.ClientManagerAccessFailure"
-    enum="PushNotificationClientManagerFailurePoint" expires_after="2025-12-28">
+    enum="PushNotificationClientManagerFailurePoint" expires_after="2026-03-01">
   <owner>bwwilliams@google.com</owner>
   <owner>scottyoder@google.com</owner>
   <owner>treib@google.com</owner>
@@ -4724,7 +4723,7 @@
 <histogram
     name="IOS.PushNotification.NotificationAutorizationStatusChangedToDenied"
     enum="PushNotificationSettingsAuthorizationStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>danieltwhite@google.com</owner>
   <owner>scottyoder@google.com</owner>
   <summary>
@@ -4752,7 +4751,7 @@
 
 <histogram name="IOS.PushNotification.NotificationSettingsAuthorizationStatus"
     enum="PushNotificationSettingsAuthorizationStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>danieltwhite@google.com</owner>
   <owner>scottyoder@google.com</owner>
   <summary>
@@ -5680,7 +5679,7 @@
 </histogram>
 
 <histogram name="IOS.Sessions.DiscardedSceneConnectedAfterBeingPurged"
-    enum="Boolean" expires_after="2025-12-31">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>sdefresne@google.com</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -5702,7 +5701,7 @@
 </histogram>
 
 <histogram name="IOS.Sessions.DiscardedScenesStillConnectedCount"
-    units="sessions" expires_after="2025-12-31">
+    units="sessions" expires_after="2026-03-01">
   <owner>sdefresne@google.com</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -5733,7 +5732,7 @@
 </histogram>
 
 <histogram name="IOS.SetUpList.Displayed" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>scottyoder@google.com</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -6346,7 +6345,7 @@
 </histogram>
 
 <histogram name="IOS.TipsMagicStack.Module.DisplayedType" enum="TipIdentifier"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmcclure@google.com</owner>
   <owner>bwwilliams@google.com</owner>
   <summary>
@@ -6356,7 +6355,7 @@
 </histogram>
 
 <histogram name="IOS.TipsMagicStack.Module.TappedType" enum="TipIdentifier"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmcclure@google.com</owner>
   <owner>bwwilliams@google.com</owner>
   <summary>
@@ -6456,7 +6455,7 @@
 </histogram>
 
 <histogram name="IOS.Variations.FirstRun.SeedFetchTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ginnyhuang@chromium.org</owner>
   <owner>bling-pandamonium@google.com</owner>
   <summary>
@@ -6479,7 +6478,7 @@
 </histogram>
 
 <histogram name="IOS.Web.FileInput.Clicked" enum="IOSWebFileInputAttributes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>olivierrobin@chromium.org</owner>
   <owner>qpubert@google.com</owner>
   <summary>
@@ -6620,7 +6619,7 @@
 </histogram>
 
 <histogram name="IOS.WidgetKit.Action" enum="IOSWidgetKitAction"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rkgibson@google.com</owner>
   <owner>muradyan@google.com</owner>
   <summary>
@@ -6630,7 +6629,7 @@
 </histogram>
 
 <histogram name="IOS.WidgetKit.{Status}" enum="IOSWidgetKitExtensionKind"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rkgibson@google.com</owner>
   <owner>muradyan@chromium.org</owner>
   <summary>
@@ -6649,7 +6648,7 @@
 </histogram>
 
 <histogram name="IOS.WidgetsForMIM.DeletedAccountUiDisplayed"
-    enum="IOSWidgetKitDeletedUiCount" expires_after="2025-12-31">
+    enum="IOSWidgetKitDeletedUiCount" expires_after="2026-03-01">
   <owner>fedegermi@google.com</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -6793,7 +6792,7 @@
 </histogram>
 
 <histogram name="ManualFallback.VisibleSuggestions.OpenCreditCards"
-    units="Suggestions" expires_after="2025-12-28">
+    units="Suggestions" expires_after="2026-03-01">
   <owner>tmartino@chromium.org</owner>
   <owner>bling-transactions@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/language/histograms.xml b/tools/metrics/histograms/metadata/language/histograms.xml
index ab6d112e..c685e3c 100644
--- a/tools/metrics/histograms/metadata/language/histograms.xml
+++ b/tools/metrics/histograms/metadata/language/histograms.xml
@@ -128,7 +128,7 @@
 </histogram>
 
 <histogram name="LanguageDetection.TFLiteModel.LanguageDetectionModelState"
-    enum="LanguageDetectionModelState" expires_after="2025-12-28">
+    enum="LanguageDetectionModelState" expires_after="2026-03-01">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -139,7 +139,7 @@
 
 <histogram
     name="LanguageDetection.TFLiteModel.UpdateLanaguageDetectionModelTime"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>suzukikeita@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -289,7 +289,7 @@
 </histogram>
 
 <histogram name="LanguageSettings.PageImpression"
-    enum="LanguageSettingsPageType" expires_after="2025-10-26">
+    enum="LanguageSettingsPageType" expires_after="2026-03-01">
   <owner>googleo@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -312,7 +312,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguage" enum="LanguageName"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -322,7 +322,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguage.Count" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dvallet@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -354,7 +354,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguageAndContentLanguageUsage"
-    enum="AcceptLanguageAndContentLanguageUsage" expires_after="2025-12-28">
+    enum="AcceptLanguageAndContentLanguageUsage" expires_after="2026-03-01">
   <owner>victortan@chromium.org</owner>
   <owner>katabolism-finch@google.com</owner>
   <summary>
@@ -365,7 +365,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.AcceptLanguageAndXmlHtmlLangUsage"
-    enum="AcceptLanguageAndXmlHtmlLangUsage" expires_after="2025-12-28">
+    enum="AcceptLanguageAndXmlHtmlLangUsage" expires_after="2026-03-01">
   <owner>victortan@chromium.org</owner>
   <owner>katabolism-finch@google.com</owner>
   <summary>
@@ -376,7 +376,7 @@
 </histogram>
 
 <histogram name="LanguageUsage.MostFrequentPageLanguages" enum="LanguageName"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/lens/histograms.xml b/tools/metrics/histograms/metadata/lens/histograms.xml
index dc28435..4990786 100644
--- a/tools/metrics/histograms/metadata/lens/histograms.xml
+++ b/tools/metrics/histograms/metadata/lens/histograms.xml
@@ -678,7 +678,7 @@
 </histogram>
 
 <histogram name="Lens.Overlay.Performance.AverageFPS" units="fps"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mercerd@google.com</owner>
   <owner>lens-chrome@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml
index 8eac81be..c10d154 100644
--- a/tools/metrics/histograms/metadata/login/histograms.xml
+++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -99,7 +99,7 @@
 </histogram>
 
 <histogram name="Login.DevicePolicyState" enum="DevicePoliciesState"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>igorcov@chromium.org</owner>
   <owner>chromeos-commercial-remote-management@chromium.org</owner>
   <summary>
@@ -314,7 +314,7 @@
 </histogram>
 
 <histogram name="Login.StateKeyGenerationStatus"
-    enum="LoginStateKeyGenerationStatus" expires_after="2025-12-28">
+    enum="LoginStateKeyGenerationStatus" expires_after="2026-03-01">
   <owner>sergiyb@chromium.org</owner>
   <owner>chromeos-commercial-remote-management@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/magic_stack/histograms.xml b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
index a8ce6c27..bc8ef58 100644
--- a/tools/metrics/histograms/metadata/magic_stack/histograms.xml
+++ b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
@@ -273,7 +273,7 @@
 </histogram>
 
 <histogram name="MagicStack.Clank.Settings.{ToggleState}" enum="ModuleType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>hanxi@chromium.org</owner>
   <owner>xinyiji@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 5ba535ca..8ab1501 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -939,7 +939,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Capture.Win.VoiceProcessingEffects"
-    enum="AudioEffectType" expires_after="2025-12-30">
+    enum="AudioEffectType" expires_after="2026-03-01">
   <owner>henrika@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1359,7 +1359,7 @@
 </histogram>
 
 <histogram name="Media.Audio.Processing.RenderDelayMs" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>saza@chromium.org</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -1716,7 +1716,7 @@
 </histogram>
 
 <histogram name="Media.Audio.{Type}.SystemGlitchDuration" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fhernqvist@google.com</owner>
   <owner>olka@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -3912,7 +3912,7 @@
 </histogram>
 
 <histogram name="Media.GetDisplayMedia.Constraints.SystemAudio"
-    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2025-12-28">
+    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2026-03-01">
   <owner>eladalon@chromium.org</owner>
   <owner>fbeaufort@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -4286,7 +4286,7 @@
 </histogram>
 
 <histogram name="Media.HLS.ParserError" units="sparse"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>tmathmeyer@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -4569,7 +4569,7 @@
 </histogram>
 
 <histogram name="Media.MediaDevices.GetUserMedia.Result2"
-    enum="UserMediaRequestResult" expires_after="2025-12-28">
+    enum="UserMediaRequestResult" expires_after="2026-03-01">
   <owner>toprice@chromium.org</owner>
   <owner>agpalak@chromium.org</owner>
   <owner>video-cmi-apis@google.com</owner>
@@ -6907,7 +6907,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.StartErrorCode" enum="VideoCaptureError"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>toprice@chromium.org</owner>
   <owner>video-cmi-apis@google.com</owner>
   <summary>
@@ -6930,7 +6930,7 @@
 </histogram>
 
 <histogram name="Media.VideoCapture.StartSourceSuccessLatency" units="ms"
-    expires_after="2025-12-14">
+    expires_after="2026-03-01">
   <owner>herre@google.com</owner>
   <owner>video-cmi-apis@google.com</owner>
   <summary>
@@ -7219,7 +7219,7 @@
 </histogram>
 
 <histogram name="Media.VideoEncoder.{Usage}.{Impl}.Profile"
-    enum="VideoCodecProfile" expires_after="2025-12-25">
+    enum="VideoCodecProfile" expires_after="2026-03-01">
   <owner>hiroh@chromium.org</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -8159,7 +8159,7 @@
 </histogram>
 
 <histogram name="MediaRouter.Discovery.LocalNetworkAccessPermissionGranted"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>muyaoxu@google.com</owner>
   <owner>openscreen-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/memory/histograms.xml b/tools/metrics/histograms/metadata/memory/histograms.xml
index f17b0d10..ebc6049 100644
--- a/tools/metrics/histograms/metadata/memory/histograms.xml
+++ b/tools/metrics/histograms/metadata/memory/histograms.xml
@@ -863,7 +863,7 @@
 </histogram>
 
 <histogram name="HeapProfiling.InProcess.SampledAddressCacheHitCount{Process}"
-    units="hits" expires_after="2025-12-28">
+    units="hits" expires_after="2026-03-01">
   <owner>joenotcharles@google.com</owner>
   <owner>chrome-memory@google.com</owner>
   <summary>
@@ -892,7 +892,7 @@
 
 <histogram
     name="HeapProfiling.InProcess.SampledAddressCacheMaxLoadFactor{Process}"
-    units="%" expires_after="2025-12-28">
+    units="%" expires_after="2026-03-01">
   <owner>joenotcharles@google.com</owner>
   <owner>chrome-memory@google.com</owner>
   <summary>
@@ -904,7 +904,7 @@
 </histogram>
 
 <histogram name="HeapProfiling.InProcess.SampledAddressCacheMaxSize{Process}"
-    units="entries" expires_after="2025-12-28">
+    units="entries" expires_after="2026-03-01">
   <owner>joenotcharles@google.com</owner>
   <owner>chrome-memory@google.com</owner>
   <summary>
@@ -1123,7 +1123,7 @@
 </histogram>
 
 <histogram name="Memory.Browser.PrivateSwapFootprint" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -1159,7 +1159,7 @@
 </histogram>
 
 <histogram name="Memory.Browser.SharedMemoryFootprint" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>erikchen@chromium.org</owner>
   <summary>
     A rough estimate of the shared memory footprint of the browser process.
@@ -1831,7 +1831,7 @@
 </histogram>
 
 <histogram name="Memory.Extension.PrivateMemoryFootprint" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
@@ -1874,7 +1874,7 @@
 </histogram>
 
 <histogram name="Memory.Gpu.MappingsCount" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>lizeb@chromium.org</owner>
   <owner>chrome-memory@google.com</owner>
   <summary>
@@ -2003,7 +2003,7 @@
 </histogram>
 
 <histogram name="Memory.LowMemoryKiller.Count" units="low-memory kills"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>khmel@google.com</owner>
   <owner>vovoy@google.com</owner>
   <summary>
@@ -2483,7 +2483,7 @@
 </histogram>
 
 <histogram name="Memory.PressureWindowDuration.{Type}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fdoray@chromium.org</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
@@ -2500,7 +2500,7 @@
 </histogram>
 
 <histogram name="Memory.ProcessCount2" units="processes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>creis@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
   <summary>
@@ -2512,7 +2512,7 @@
 </histogram>
 
 <histogram name="Memory.Renderer.EvictedLockedResources.{Source}" units="KB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-memory@google.com</owner>
   <summary>
@@ -2778,7 +2778,7 @@
 </histogram>
 
 <histogram name="Memory.System.MemAvailableMB" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>andreaorru@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -2790,7 +2790,7 @@
   </summary>
 </histogram>
 
-<histogram name="Memory.System.MemUsedMB" units="MB" expires_after="2025-12-28">
+<histogram name="Memory.System.MemUsedMB" units="MB" expires_after="2026-03-01">
   <owner>andreaorru@chromium.org</owner>
   <owner>hidehiko@chromium.org</owner>
   <summary>
@@ -3435,7 +3435,7 @@
 </histogram>
 
 <histogram name="Memory.{UtilityProcessType}.SharedMemoryFootprint" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>erikchen@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/mobile/histograms.xml b/tools/metrics/histograms/metadata/mobile/histograms.xml
index 685d59d1..2b3177dc 100644
--- a/tools/metrics/histograms/metadata/mobile/histograms.xml
+++ b/tools/metrics/histograms/metadata/mobile/histograms.xml
@@ -189,7 +189,7 @@
 </histogram>
 
 <histogram name="Mobile.ContextMenu.{EntryPoint}.Actions" enum="IOSMenuAction"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gambard@chromium.org</owner>
   <owner>bling-team@chromium.org</owner>
   <summary>
@@ -516,7 +516,7 @@
 </histogram>
 
 <histogram name="Mobile.Share.EntryPoints" enum="IOSActivityScenario"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dimich@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <owner>chrome-with-friends-robots@google.com</owner>
@@ -1185,7 +1185,7 @@
 </histogram>
 
 <histogram name="MobileStartup.DailyLaunchCount" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>tedchoc@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -1237,7 +1237,7 @@
 </histogram>
 
 <histogram name="MobileStartup.LaunchCause" enum="LaunchCause"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mthiesse@chromium.org</owner>
   <owner>tedchoc@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/navigation/histograms.xml b/tools/metrics/histograms/metadata/navigation/histograms.xml
index c5de23c..cf241b7 100644
--- a/tools/metrics/histograms/metadata/navigation/histograms.xml
+++ b/tools/metrics/histograms/metadata/navigation/histograms.xml
@@ -765,7 +765,7 @@
 </histogram>
 
 <histogram name="Navigation.BrowserInitiatedSessionHistoryCount"
-    enum="HistoryNavType" expires_after="2025-12-28">
+    enum="HistoryNavType" expires_after="2026-03-01">
   <owner>liuwilliam@chromium.org</owner>
   <owner>chrome-seamless-core@google.com</owner>
   <summary>
@@ -855,7 +855,7 @@
 </histogram>
 
 <histogram name="Navigation.CompositorCreationTo{Stage}2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rakina@chromium.org</owner>
   <owner>bfcache-dev@chromium.org</owner>
   <summary>
@@ -1319,7 +1319,7 @@
 </histogram>
 
 <histogram name="Navigation.IsGuest" enum="NavigationIsGuest"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>alexmos@chromium.org</owner>
   <owner>creis@chromium.org</owner>
   <owner>wjmaclean@chromium.org</owner>
@@ -1353,7 +1353,7 @@
 </histogram>
 
 <histogram name="Navigation.IsProcessBackgrounded2.{Timing}" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -1414,7 +1414,7 @@
 </histogram>
 
 <histogram name="Navigation.MainFrame.FromAdClick" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yaoxia@chromium.org</owner>
   <owner>jkarlin@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
@@ -1568,7 +1568,7 @@
 
 <histogram
     name="Navigation.MainframeSameDocumentNavigationCommitToPresentFirstFrame"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>liuwilliam@chromium.org</owner>
   <owner>chrome-seamless-core@google.com</owner>
   <summary>
@@ -1685,7 +1685,7 @@
 
 <histogram
     name="Navigation.OnGestureStart.NavigationInProgress{NavigationMode}"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>lazzzis@google.com</owner>
   <owner>liuwilliam@chromium.org</owner>
   <owner>chrome-seamless-core@google.com</owner>
@@ -1923,7 +1923,7 @@
 
 <histogram
     name="Navigation.ProcessNavigationThrottlesTime.WillStartRequest.{FrameType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -2767,7 +2767,7 @@
 </histogram>
 
 <histogram name="Navigation.TimeToReadyToCommit2{NavigationProcessType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>clamy@chromium.org</owner>
   <owner>nasko@chromium.org</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -3391,7 +3391,7 @@
 
 <histogram
     name="Prerender.Experimental.ActivationNavigationParamsMatch{PreloadingTriggerType}"
-    enum="PrerenderActivationNavigationParamsMatch" expires_after="2025-12-28">
+    enum="PrerenderActivationNavigationParamsMatch" expires_after="2026-03-01">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -3441,7 +3441,7 @@
 </histogram>
 
 <histogram name="Prerender.Experimental.FoundReusePrerenderHost" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>gjc@google.com</owner>
   <owner>chrome-prerendering@google.com</owner>
   <owner>chrome-loading@google.com</owner>
@@ -3601,7 +3601,7 @@
 </histogram>
 
 <histogram name="Prerender.Experimental.PrerenderProcessReuseAvailability"
-    enum="PrerenderProcessReuseAvailability" expires_after="2025-12-31">
+    enum="PrerenderProcessReuseAvailability" expires_after="2026-03-01">
   <owner>gjc@google.com</owner>
   <owner>chrome-prerendering@google.com</owner>
   <owner>chrome-loading@google.com</owner>
@@ -3651,7 +3651,7 @@
 
 <histogram
     name="Prerender.Experimental.ReusePrerenderHost.PrerenderHostCount.Failed"
-    units="count" expires_after="2025-12-31">
+    units="count" expires_after="2026-03-01">
   <owner>suzukikeita@google.com</owner>
   <owner>gjc@google.com</owner>
   <owner>chrome-prerendering@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index e9fa7295..c97f97a 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -553,7 +553,7 @@
 </histogram>
 
 <histogram name="HttpCache.AddTransactionToEntry" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bashi@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -967,7 +967,7 @@
 </histogram>
 
 <histogram name="HttpCache.NoVarySearch.NotUsableLostTime2{HostAndFrameType}"
-    units="ms" expires_after="2025-12-16">
+    units="ms" expires_after="2026-03-01">
   <owner>ricea@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1331,7 +1331,7 @@
 </histogram>
 
 <histogram name="Net.CachingCertVerifier.CacheHit{HostType}" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-network-stack@google.com</owner>
   <summary>
@@ -1349,7 +1349,7 @@
 
 <histogram
     name="Net.CachingCertVerifier.{VerificationCompletionType}.UncachedVerifyTime{HostType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-network-stack@google.com</owner>
   <summary>
@@ -1967,7 +1967,7 @@
 </histogram>
 
 <histogram name="Net.DNS.DnsConfig.DnsClientCapability"
-    enum="DNS.DnsClientCapability" expires_after="2025-12-28">
+    enum="DNS.DnsClientCapability" expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2173,7 +2173,7 @@
 </histogram>
 
 <histogram name="Net.DNS.DnsTransaction.AttemptType" enum="DNS.AttemptType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -2333,7 +2333,7 @@
 </histogram>
 
 <histogram name="Net.DNS.HostCache.EraseStale.StaleHits{HostType}" units="hits"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>suzukikeita@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -2868,7 +2868,7 @@
 </histogram>
 
 <histogram name="Net.ErrorPageCounts" enum="NetErrorPageEvents"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>edwardjung@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -3731,7 +3731,7 @@
 </histogram>
 
 <histogram name="Net.HttpTimeToFirstByte.TLS13.Google" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>davidben@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -3777,7 +3777,7 @@
 </histogram>
 
 <histogram name="Net.MultiThreadedCertVerifier.RequestDuration{HostType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-network-stack@google.com</owner>
   <summary>
@@ -5022,7 +5022,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.ConnectionDuration{HostType}{Initiator}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>renjietang@chromium.org</owner>
   <owner>suzukikeita@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
@@ -7752,7 +7752,7 @@
 </histogram>
 
 <histogram name="Net.SSL.ECHResult" enum="SSLECHResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>davidben@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -7871,7 +7871,7 @@
 </histogram>
 
 <histogram name="Net.SSLHandshakeDetails" enum="SSLHandshakeDetails"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>davidben@chromium.org</owner>
   <owner>src/net/OWNERS</owner>
   <summary>
@@ -8234,7 +8234,7 @@
 </histogram>
 
 <histogram name="Net.URLLoader.AcceptCHFrameReceivedOnHttp2" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -8244,7 +8244,7 @@
 </histogram>
 
 <histogram name="Net.URLLoader.AcceptCHFrameReceivedOnHttp3" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -8265,7 +8265,7 @@
 </histogram>
 
 <histogram name="Net.URLLoaderThrottle.OnReceiveResponseTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>nidhijaju@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -8392,7 +8392,7 @@
 </histogram>
 
 <histogram name="Net.WebSocket.ProtocolHeaderSize" units="bytes"
-    expires_after="2025-12-14">
+    expires_after="2026-03-01">
   <owner>ricea@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml
index a08b9a7..0e91998 100644
--- a/tools/metrics/histograms/metadata/network/histograms.xml
+++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -1823,7 +1823,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.DnsOverHttpsMode"
-    enum="DnsProxy.DnsOverHttpsMode" expires_after="2025-12-31">
+    enum="DnsProxy.DnsOverHttpsMode" expires_after="2026-03-01">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2016,7 +2016,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{ProcessType}.Event"
-    enum="DnsProxy.ProcessEvent" expires_after="2025-12-31">
+    enum="DnsProxy.ProcessEvent" expires_after="2026-03-01">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2034,7 +2034,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.Errors"
-    enum="DnsProxy.QueryError" expires_after="2025-12-31">
+    enum="DnsProxy.QueryError" expires_after="2026-03-01">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2049,7 +2049,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.FailedResolveDuration" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2091,7 +2091,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.Results"
-    enum="DnsProxy.QueryResult" expires_after="2025-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2026-03-01">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2106,7 +2106,7 @@
 </histogram>
 
 <histogram name="Network.DnsProxy.{Type}Query.ResultsWithRetries"
-    enum="DnsProxy.QueryResult" expires_after="2025-12-31">
+    enum="DnsProxy.QueryResult" expires_after="2026-03-01">
   <owner>garrick@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2121,7 +2121,7 @@
 </histogram>
 
 <histogram name="Network.Mdns.{ServiceType}" enum="MdnsQueryType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>nmuggli@google.com</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -2182,7 +2182,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.TotalCount" units="packets"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2193,7 +2193,7 @@
 </histogram>
 
 <histogram name="Network.Multicast.{Technology}.ConnectedCount" units="packets"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>jasongustaman@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2293,7 +2293,7 @@
 </histogram>
 
 <histogram name="Network.NetworkPortalSigninTime" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>stevenjb@chromium.org</owner>
   <owner>cros-network-health-team@google.com</owner>
   <summary>
@@ -2512,7 +2512,7 @@
 
 <histogram name="Network.Shill.Cellular.3GPPRegistrationDelayedDrop"
     enum="NetworkCellular3GPPRegistrationDelayedDrop"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2563,7 +2563,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.ConnectResult.{ApnType}"
-    enum="PlatformCellularConnectResult" expires_after="2025-12-31">
+    enum="PlatformCellularConnectResult" expires_after="2026-03-01">
   <owner>danielwinkler@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2577,7 +2577,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.DevicePresenceStatus"
-    enum="BooleanPresent" expires_after="2025-12-31">
+    enum="BooleanPresent" expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2587,7 +2587,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.Drop" enum="NetworkCellularTechnology"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2651,7 +2651,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.SignalStrengthBeforeDrop" units="units"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2661,7 +2661,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TechnologyEnabled"
-    enum="BooleanEnabled" expires_after="2025-12-31">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>rmao@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2671,7 +2671,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToConfig" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2681,7 +2681,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToConnect" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2691,7 +2691,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToDisable" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2701,7 +2701,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToEnable" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2721,7 +2721,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToOnline" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2731,7 +2731,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToPortal" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>ejcaruso@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2741,7 +2741,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Cellular.TimeToRedirectFound" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2829,7 +2829,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.Driver" enum="EthernetDriver"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>chuweih@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2839,7 +2839,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Ethernet.ExpiredLeaseLengthSeconds2"
-    units="seconds" expires_after="2025-12-31">
+    units="seconds" expires_after="2026-03-01">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2974,7 +2974,7 @@
 
 <histogram
     name="Network.Shill.PortalDetector.AggregateCAPPORTResult.{Technology}"
-    enum="PortalDetectorAggregateCAPPORTResult" expires_after="2025-12-31">
+    enum="PortalDetectorAggregateCAPPORTResult" expires_after="2026-03-01">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2986,7 +2986,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AggregateResult.{Technology}"
-    enum="PortalDetectorAggregateResult" expires_after="2025-12-31">
+    enum="PortalDetectorAggregateResult" expires_after="2026-03-01">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -2998,7 +2998,7 @@
 
 <histogram
     name="Network.Shill.PortalDetector.AttemptsToDisconnect.{Technology}"
-    units="attempts" expires_after="2025-12-31">
+    units="attempts" expires_after="2026-03-01">
   <owner>hugobenichi@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3011,7 +3011,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.AttemptsToOnline.{Technology}"
-    units="attempts" expires_after="2025-12-31">
+    units="attempts" expires_after="2026-03-01">
   <owner>hugobenichi@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3024,7 +3024,7 @@
 
 <histogram
     name="Network.Shill.PortalDetector.AttemptsToRedirectFound.{Technology}"
-    units="attempts" expires_after="2025-12-31">
+    units="attempts" expires_after="2026-03-01">
   <owner>hugobenichi@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3111,7 +3111,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.HTTPResponseCode.{Technology}"
-    units="response code" expires_after="2025-12-31">
+    units="response code" expires_after="2026-03-01">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3149,7 +3149,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.InitialResult.{Technology}"
-    enum="PortalDetectorResult" expires_after="2025-12-31">
+    enum="PortalDetectorResult" expires_after="2026-03-01">
   <owner>hugobenichi@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3200,7 +3200,7 @@
 </histogram>
 
 <histogram name="Network.Shill.PortalDetector.{ProbeType}Duration.{Technology}"
-    units="ms" expires_after="2025-12-31">
+    units="ms" expires_after="2026-03-01">
   <owner>hugobenichi@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3250,7 +3250,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Vpn.Driver" enum="VPNDriver"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3709,7 +3709,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.AdapterAllowlisted"
-    enum="WiFiAdapterInAllowlist" expires_after="2025-12-31">
+    enum="WiFiAdapterInAllowlist" expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3731,7 +3731,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.ANQP.NetworkAuthTypeSupport"
-    enum="WiFiANQPNetworkAuthTypeSupport" expires_after="2025-12-31">
+    enum="WiFiANQPNetworkAuthTypeSupport" expires_after="2026-03-01">
   <owner>damiendejean@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3885,7 +3885,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.AssocFailureType" enum="WiFiStatusCode"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3962,7 +3962,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.Channel" enum="NetworkChannelType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3972,7 +3972,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.CiscoAdaptiveFTSupport"
-    enum="WiFiCiscoAdaptiveFTSupport" expires_after="2025-12-31">
+    enum="WiFiCiscoAdaptiveFTSupport" expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3983,7 +3983,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.ClientDisconnectReason"
-    enum="WiFiReasonCode" expires_after="2025-12-31">
+    enum="WiFiReasonCode" expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -3993,7 +3993,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.ClientDisconnectType" enum="WiFiStatusType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4015,7 +4015,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.DevicePresenceStatus" enum="BooleanPresent"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4025,7 +4025,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.Disconnect"
-    enum="NetworkWiFiDisconnectType" expires_after="2025-12-31">
+    enum="NetworkWiFiDisconnectType" expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4036,7 +4036,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.EapInnerProtocol" enum="EAPInnerProtocol"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4046,7 +4046,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.EapOuterProtocol" enum="EAPOuterProtocol"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4056,7 +4056,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.ExpiredLeaseLengthSeconds2" units="seconds"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4120,7 +4120,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.HiddenSSIDNetworkCount" units="units"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>tnagel@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <owner>cros-privacy-core@google.com</owner>
@@ -4374,7 +4374,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.PortalResult" enum="NetworkPortalResult"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>hugobenichi@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4491,7 +4491,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.Security" enum="NetworkSecurityType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4602,7 +4602,7 @@
 </histogram>
 
 <histogram name="Network.Shill.Wifi.TimeResumeToReady" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4757,7 +4757,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.TransmitBitrateMbps" units="Mbps"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4779,7 +4779,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.UserInitiatedConnectionFailureReason"
-    enum="ConnectionFailureReason" expires_after="2025-12-31">
+    enum="ConnectionFailureReason" expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4791,7 +4791,7 @@
 </histogram>
 
 <histogram name="Network.Shill.WiFi.UserInitiatedConnectionResult"
-    enum="ConnectionResult" expires_after="2025-12-31">
+    enum="ConnectionResult" expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4801,7 +4801,7 @@
 </histogram>
 
 <histogram name="Network.Shill.{Technology}.DHCPv4ProvisionDurationMillis"
-    units="ms" expires_after="2025-12-31">
+    units="ms" expires_after="2026-03-01">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4815,7 +4815,7 @@
 </histogram>
 
 <histogram name="Network.Shill.{Technology}.DHCPv4RenewRebind"
-    enum="DHCPv4RenewRebind" expires_after="2025-12-31">
+    enum="DHCPv4RenewRebind" expires_after="2026-03-01">
   <owner>chenzikai@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -4827,7 +4827,7 @@
 </histogram>
 
 <histogram name="Network.Shill.{Technology}.IPType" enum="NetworkIPType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>jiejiang@chromium.org</owner>
   <owner>cros-device-enablement@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
@@ -4857,7 +4857,7 @@
 
 <histogram
     name="Network.Shill.{Technology}.{DHCPProvisionReason}.DHCPv4ProvisionResult"
-    enum="DHCPv4ProvisionResult" expires_after="2025-12-31">
+    enum="DHCPv4ProvisionResult" expires_after="2026-03-01">
   <owner>chenzikai@google.com</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
@@ -5738,7 +5738,7 @@
 </histogram>
 
 <histogram name="NetworkService.NetworkLoaderCompletionTime2.{Source}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>hayato@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
@@ -5842,7 +5842,7 @@
 
 <histogram
     name="NetworkService.Scheduler.IOThread.NumberOfPendingTasks.{QueueName}Queue"
-    units="count" expires_after="2025-12-25">
+    units="count" expires_after="2026-03-01">
   <owner>hayato@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -5858,7 +5858,7 @@
 
 <histogram
     name="NetworkService.Scheduler.IOThread.QueuingTime.{QueueName}Queue"
-    units="ms" expires_after="2025-12-25">
+    units="ms" expires_after="2026-03-01">
   <owner>hayato@chromium.org</owner>
   <owner>net-dev@chromium.org</owner>
   <summary>
@@ -6028,7 +6028,7 @@
 
 <histogram
     name="NetworkService.URLLoader.CloneDeviceBoundSessionAccessObserver"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>blink-network-stack@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
index 2f9d9410..eedf4c9 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -233,7 +233,7 @@
   </summary>
 </histogram>
 
-<histogram name="NewTabPage.Click" enum="NTPElement" expires_after="2025-12-28">
+<histogram name="NewTabPage.Click" enum="NTPElement" expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -246,7 +246,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Collections.IdOnLoad" enum="NTPCollectionId"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>pauladedeji@google.com</owner>
   <owner>danpeng@google.com</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -749,7 +749,7 @@
 </histogram>
 
 <histogram name="NewTabPage.CustomizeShortcutAction"
-    enum="NTPCustomizeShortcutAction" expires_after="2025-12-28">
+    enum="NTPCustomizeShortcutAction" expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1103,7 +1103,7 @@
 </histogram>
 
 <histogram name="NewTabPage.LogoDownloadOutcome"
-    enum="NewTabPageLogoDownloadOutcome" expires_after="2025-12-28">
+    enum="NewTabPageLogoDownloadOutcome" expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1352,7 +1352,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.DataRequest" enum="NtpModules"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1365,7 +1365,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.Disabled{Interaction}" enum="NtpModules"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1522,7 +1522,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.LoadDuration{NewTabPageModules}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1674,7 +1674,7 @@
 </histogram>
 
 <histogram name="NewTabPage.Modules.ShownTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -1809,7 +1809,7 @@
 </histogram>
 
 <histogram name="NewTabPage.NavigationOrActivationToFirstContentfulPaint"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>robertlin@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -1837,7 +1837,7 @@
 </histogram>
 
 <histogram name="NewTabPage.NavigationOrActivationToLargestContentfulPaint"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>robertlin@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -1896,7 +1896,7 @@
 </histogram>
 
 <histogram name="NewTabPage.OpenedInNewTab" enum="TabLaunchType"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>eirage@chromium.org</owner>
   <owner>hanxi@chromium.org</owner>
   <summary>
@@ -2127,7 +2127,7 @@
 </histogram>
 
 <histogram name="NewTabPage.SuggestionsImpression{NewTabPageIconTypes}"
-    enum="MostVisitedTileIndex" expires_after="2025-12-28">
+    enum="MostVisitedTileIndex" expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
@@ -2141,7 +2141,7 @@
 </histogram>
 
 <histogram name="NewTabPage.SuggestionsImpression{NewTabPageProviders}"
-    enum="MostVisitedTileIndex" expires_after="2025-12-28">
+    enum="MostVisitedTileIndex" expires_after="2026-03-01">
   <owner>romanarora@chromium.org</owner>
   <owner>tiborg@chromium.org</owner>
   <owner>chrome-desktop-ntp@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/notifications/histograms.xml b/tools/metrics/histograms/metadata/notifications/histograms.xml
index 50c9f5a..18749ac7 100644
--- a/tools/metrics/histograms/metadata/notifications/histograms.xml
+++ b/tools/metrics/histograms/metadata/notifications/histograms.xml
@@ -197,7 +197,7 @@
 </histogram>
 
 <histogram name="Notifications.Android.JobNativeStartupDuration{IntentAction}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>peter@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <summary>
@@ -720,7 +720,7 @@
 </histogram>
 
 <histogram name="Notifications.NonPersistentNotificationThirdPartyCount"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>awillia@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
@@ -885,7 +885,7 @@
 </histogram>
 
 <histogram name="Notifications.PersistentNotificationThirdPartyCount"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>awillia@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/omnibox/histograms.xml b/tools/metrics/histograms/metadata/omnibox/histograms.xml
index f5ef9a5..1744ec3 100644
--- a/tools/metrics/histograms/metadata/omnibox/histograms.xml
+++ b/tools/metrics/histograms/metadata/omnibox/histograms.xml
@@ -1144,7 +1144,7 @@
 
 <histogram
     name="Omnibox.DocumentSuggest.HttpResponseCode.IsSubjectToEnterprisePolicies.{SigninTribool}"
-    enum="HttpResponseCode" expires_after="2025-12-28">
+    enum="HttpResponseCode" expires_after="2026-03-01">
   <owner>mahmadi@google.com</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -1797,7 +1797,7 @@
 </histogram>
 
 <histogram name="Omnibox.JustDeletedText" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -2901,7 +2901,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.AnswerInSuggest"
-    enum="SuggestionAnswerOptionalType" expires_after="2025-12-28">
+    enum="SuggestionAnswerOptionalType" expires_after="2026-03-01">
   <owner>jdonnelly@chromium.org</owner>
   <owner>mpearson@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -2914,7 +2914,7 @@
 </histogram>
 
 <histogram name="Omnibox.SuggestionUsed.ClientSummarizedResultType"
-    enum="ClientSummarizedResultType" expires_after="2025-12-28">
+    enum="ClientSummarizedResultType" expires_after="2026-03-01">
   <owner>nyquist@chromium.org</owner>
   <owner>ssid@chromium.org</owner>
   <owner>chrome-segmentation-platform@google.com</owner>
@@ -3130,7 +3130,7 @@
 
 <histogram
     name="Omnibox.SuggestionUsed.Search.NavigationToLargestContentfulPaint2.1"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>lingqi@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -3621,7 +3621,7 @@
 </histogram>
 
 <histogram name="Omnibox.URLNavigationScheme" enum="NavigationScheme"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
@@ -4372,7 +4372,7 @@
 </histogram>
 
 <histogram name="ShortcutsProvider.DatabaseSize" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -4386,7 +4386,7 @@
 </histogram>
 
 <histogram name="ShortcutsProvider.DatabaseSize.OldEntries" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -4409,7 +4409,7 @@
 </histogram>
 
 <histogram name="ShortcutsProvider.DatabaseSize.OldEntriesPercentage"
-    units="10ths of a %" expires_after="2025-12-28">
+    units="10ths of a %" expires_after="2026-03-01">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
@@ -4452,7 +4452,7 @@
 </histogram>
 
 <histogram name="ShortcutsProvider.OldEntryDeletions.OnHistoryDeletions"
-    units="units" expires_after="2025-12-28">
+    units="units" expires_after="2026-03-01">
   <owner>jdonnelly@chromium.org</owner>
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/on_device_model/histograms.xml b/tools/metrics/histograms/metadata/on_device_model/histograms.xml
index e5dc462c..e5698a6f 100644
--- a/tools/metrics/histograms/metadata/on_device_model/histograms.xml
+++ b/tools/metrics/histograms/metadata/on_device_model/histograms.xml
@@ -57,7 +57,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.BenchmarkDuration" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -68,7 +68,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.BenchmarkEstimatedTokensPerSecond.{Stage}"
-    units="tk/s" expires_after="2025-12-28">
+    units="tk/s" expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -94,7 +94,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.BenchmarkVeryLowReason"
-    enum="VeryLowPerformanceReason" expires_after="2025-12-28">
+    enum="VeryLowPerformanceReason" expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -104,7 +104,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.DeviceHeapSize.{GpuType}" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -164,7 +164,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.GpuBlockedReason" enum="GpuBlockedReason"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -184,7 +184,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.LoadModelDuration" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -194,7 +194,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.LoadPlatformModelStatus"
-    enum="LoadPlatformModelStatus" expires_after="2025-12-28">
+    enum="LoadPlatformModelStatus" expires_after="2026-03-01">
   <owner>jmpollock@chromium.org</owner>
   <owner>yich@google.com</owner>
   <summary>
@@ -233,7 +233,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.SystemRAM.{GpuType}" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -265,7 +265,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.TokenCount.{Stage}" units="tokens"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
@@ -298,7 +298,7 @@
 </histogram>
 
 <histogram name="OnDeviceModel.TokensPerSecond.{Stage}" units="tk/s"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>sophiechang@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/optimization/histograms.xml b/tools/metrics/histograms/metadata/optimization/histograms.xml
index af0cb3d5..d82a5cdc 100644
--- a/tools/metrics/histograms/metadata/optimization/histograms.xml
+++ b/tools/metrics/histograms/metadata/optimization/histograms.xml
@@ -785,7 +785,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.HintsFetcher.GetHintsRequest.Status"
-    enum="HttpResponseCode" expires_after="2025-12-28">
+    enum="HttpResponseCode" expires_after="2026-03-01">
   <owner>rajendrant@chromium.org</owner>
   <owner>catliu@chromium.org</owner>
   <summary>
@@ -867,7 +867,7 @@
 <histogram
     name="OptimizationGuide.HintsManager.RaceNavigationFetchAttemptStatus"
     enum="OptimizationGuideRaceNavigationFetchAttemptStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rajendrant@chromium.org</owner>
   <owner>catliu@chromium.org</owner>
   <summary>
@@ -924,7 +924,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecution.ContextStartToExecutionTime.{ModelExecutionFeature}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>cduvall@chromium.org</owner>
   <owner>holte@chromium.org</owner>
   <summary>
@@ -985,7 +985,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceAdaptationModelAvailability.{ModelExecutionFeature}"
-    enum="OnDeviceModelAdaptationAvailability" expires_after="2025-12-28">
+    enum="OnDeviceModelAdaptationAvailability" expires_after="2026-03-01">
   <owner>rajendrant@chromium.org</owner>
   <owner>holte@chromium.org</owner>
   <summary>
@@ -1078,7 +1078,7 @@
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceExecuteModelResult.{ModelExecutionFeature}"
     enum="OptimizationGuideOnDeviceExecuteModelResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>holte@chromium.org</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
@@ -1115,7 +1115,7 @@
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceModelEligibilityReason.{ModelExecutionFeature}"
     enum="OptimizationGuideOnDeviceModelEligibilityReason"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>holte@chromium.org</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
@@ -1127,7 +1127,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceModelInstallCriteria.AtRegistration.DiskSpaceWhenNotEnoughAvailable"
-    units="GB" expires_after="2025-12-28">
+    units="GB" expires_after="2026-03-01">
   <owner>holte@chromium.org</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
@@ -1140,7 +1140,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceModelInstallCriteria.{Event}.{Criteria}"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>holte@chromium.org</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
@@ -1173,7 +1173,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecution.OnDeviceModelInstalledAtRegistrationTime"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>holte@chromium.org</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
@@ -1391,7 +1391,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutionFetcher.RequestStatus.{ModelExecutionFeature}"
-    enum="OptimizationGuideFetcherRequestStatus" expires_after="2025-12-28">
+    enum="OptimizationGuideFetcherRequestStatus" expires_after="2026-03-01">
   <owner>rajendrant@chromium.org</owner>
   <owner>freedjm@google.com</owner>
   <summary>
@@ -1536,7 +1536,7 @@
 
 <histogram
     name="OptimizationGuide.ModelExecutor.TaskSchedulingLatency.{OptimizationTarget}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>wittman@chromium.org</owner>
   <owner>rajendrant@chromium.org</owner>
   <summary>
@@ -1637,7 +1637,7 @@
 <histogram
     name="OptimizationGuide.ModelQualityLogsUploaderService.UploadStatus.{LogAiDataRequestFeature}"
     enum="OptimizationGuideModelQualityLogsUploadStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sreejakshetty@chromium.org</owner>
   <owner>rajendrant@chromium.org</owner>
   <summary>
@@ -2003,7 +2003,7 @@
 
 <histogram
     name="OptimizationGuide.PredictionModelFetcher.GetModelsResponse.NetErrorCode.{OptimizationTarget}"
-    enum="NetErrorCodes" expires_after="2025-12-28">
+    enum="NetErrorCodes" expires_after="2026-03-01">
   <owner>rajendrant@chromium.org</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
@@ -2210,7 +2210,7 @@
 </histogram>
 
 <histogram name="OptimizationGuide.PushNotifications.ReceivedNotificationType"
-    enum="OptimizationType" expires_after="2025-12-28">
+    enum="OptimizationType" expires_after="2026-03-01">
   <owner>rajendrant@chromium.org</owner>
   <owner>catliu@chromium.org</owner>
   <summary>
@@ -2234,7 +2234,7 @@
 
 <histogram name="OptimizationGuide.TextSafetyChecker.InferenceResult"
     enum="OptimizationGuideTextSafetyInferenceResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>holte@google.com</owner>
   <owner>wittman@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index dddf9c7..89f051b 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -1193,7 +1193,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.Auction.NumOwnersWithoutInterestGroups"
-    units="owners" expires_after="2025-12-28">
+    units="owners" expires_after="2026-03-01">
   <owner>dmcardle@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
   <summary>
@@ -2231,7 +2231,7 @@
 </histogram>
 
 <histogram name="Ads.InterestGroup.ServerAuction.KeyFetch.NetworkCached"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>behamilton@google.com</owner>
   <owner>pauljensen@chromium.org</owner>
   <owner>privacy-sandbox-dev@chromium.org</owner>
@@ -4129,7 +4129,7 @@
 </histogram>
 
 <histogram name="Document.BeforeUnloadDialog" enum="BeforeUnloadDialogResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>panicker@chromium.org</owner>
   <owner>chikamune@chromium.org</owner>
   <summary>
@@ -4184,7 +4184,7 @@
 </histogram>
 
 <histogram name="DocumentScan.ScanRequested" enum="DocumentScanSaneBackend"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -4194,7 +4194,7 @@
 </histogram>
 
 <histogram name="DocumentScan.ScanSucceeded" enum="DocumentScanSaneBackend"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -4973,7 +4973,7 @@
 </histogram>
 
 <histogram name="Feedback.TrustSafetySentiment.CallTriggerOccurred"
-    enum="TrustSafetySentimentFeatureArea" expires_after="2025-12-28">
+    enum="TrustSafetySentimentFeatureArea" expires_after="2026-03-01">
   <owner>skrakowi@google.com</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -5053,7 +5053,7 @@
 </histogram>
 
 <histogram name="FetchKeepAlive.Requests2.Network"
-    enum="FetchKeepAliveRequestNetworkMetricType" expires_after="2025-12-28">
+    enum="FetchKeepAliveRequestNetworkMetricType" expires_after="2026-03-01">
   <owner>mych@chromium.org</owner>
   <owner>chrome-bfcache@google.com</owner>
   <summary>
@@ -5094,7 +5094,7 @@
 </histogram>
 
 <histogram name="FetchKeepAlive.Requests2.{RequestState}.{Process}"
-    enum="FetchKeepAliveRequestMetricType" expires_after="2025-12-28">
+    enum="FetchKeepAliveRequestMetricType" expires_after="2026-03-01">
   <owner>mych@chromium.org</owner>
   <owner>chrome-bfcache@google.com</owner>
   <summary>
@@ -5129,7 +5129,7 @@
 </histogram>
 
 <histogram name="FetchLater.Browser.Metrics" enum="FetchLaterBrowserMetricType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mych@chromium.org</owner>
   <owner>chrome-bfcache@google.com</owner>
   <summary>
@@ -5210,7 +5210,7 @@
 </histogram>
 
 <histogram name="FirstPartySets.Initialization.ClearSiteDataOutcome"
-    enum="BooleanSuccess" expires_after="2025-12-28">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>shuuran@google.com</owner>
   <owner>kaustubhag@google.com</owner>
   <summary>
@@ -5554,7 +5554,7 @@
 </histogram>
 
 <histogram name="Hardware.Display.Count.OnChange" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sashamcintosh@chromium.org</owner>
   <owner>chromeos-gfx@chromium.org</owner>
   <summary>
@@ -5564,7 +5564,7 @@
 </histogram>
 
 <histogram name="Hardware.Display.Count.OnStartup" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sashamcintosh@chromium.org</owner>
   <owner>chromeos-gfx@chromium.org</owner>
   <summary>
@@ -5574,7 +5574,7 @@
 </histogram>
 
 <histogram name="Hardware.Display.SupportsHDR" enum="BooleanSupported"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cassew@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
   <summary>
@@ -5586,7 +5586,7 @@
   </summary>
 </histogram>
 
-<histogram name="Hardware.TotalDiskSpace" units="GB" expires_after="2025-12-28">
+<histogram name="Hardware.TotalDiskSpace" units="GB" expires_after="2026-03-01">
   <owner>zmo@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -5972,7 +5972,7 @@
 </histogram>
 
 <histogram name="LoadingPredictor.SetLCPPNavigationHint.Time" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>chikamune@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -6587,7 +6587,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AppBoundEncryption.SupportLevel"
-    enum="AppBoundEncryptionSupportLevel" expires_after="2025-12-28">
+    enum="AppBoundEncryptionSupportLevel" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -6609,7 +6609,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AppBoundProvider.Decrypt.ResultLastError"
-    enum="WinGetLastError" expires_after="2025-12-28">
+    enum="WinGetLastError" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -6635,7 +6635,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AppBoundProvider.Encrypt.ResultLastError"
-    enum="WinGetLastError" expires_after="2025-12-28">
+    enum="WinGetLastError" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -6648,7 +6648,7 @@
 </histogram>
 
 <histogram name="OSCrypt.AppBoundProvider.KeyRetrieval.Status"
-    enum="OSCryptAppBoundKeyRetrievalStatus" expires_after="2025-12-28">
+    enum="OSCryptAppBoundKeyRetrievalStatus" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -6703,7 +6703,7 @@
 </histogram>
 
 <histogram name="OSCrypt.EncryptorKeyCount{EncryptorKeyType}" units="key count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>chrome-platform-security-core@google.com</owner>
   <summary>
@@ -6830,7 +6830,7 @@
 </histogram>
 
 <histogram name="OSCrypt.Win.Decrypt.Result" enum="BooleanSuccess"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -6850,7 +6850,7 @@
 </histogram>
 
 <histogram name="OSCrypt.Win.Encrypt.Result" enum="BooleanSuccess"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <owner>nparker@chromium.org</owner>
   <summary>
@@ -7585,7 +7585,7 @@
 </histogram>
 
 <histogram name="PushMessaging.UnregistrationStatus"
-    enum="PushUnregistrationStatus" expires_after="2025-12-28">
+    enum="PushUnregistrationStatus" expires_after="2026-03-01">
   <owner>peter@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
   <summary>
@@ -7751,7 +7751,7 @@
 </histogram>
 
 <histogram name="ReadingList.{ReadStatus}.Count.{RecordedAt}.{StorageState}"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>mastiz@chromium.org</owner>
   <owner>mmrashad@google.com</owner>
   <owner>treib@chromium.org</owner>
@@ -8234,7 +8234,7 @@
 </histogram>
 
 <histogram name="Shutdown.BrowserExit.Time2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -8245,7 +8245,7 @@
 </histogram>
 
 <histogram name="Shutdown.EndSession.Time2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -8279,7 +8279,7 @@
 </histogram>
 
 <histogram name="Shutdown.ShutdownType2" enum="ShutdownType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -8339,7 +8339,7 @@
 </histogram>
 
 <histogram name="Shutdown.WindowClose.Time2" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>
@@ -8885,7 +8885,7 @@
 </histogram>
 
 <histogram name="Style.InvalidationTime" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>futhark@chromium.org</owner>
   <summary>
     Microseconds spent in StyleEngine::InvalidateStyle. Only samples from high
@@ -8894,7 +8894,7 @@
 </histogram>
 
 <histogram name="Style.RebuildLayoutTreeTime" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>futhark@chromium.org</owner>
   <summary>
     Microseconds spent in RebuildLayoutTree called from Document::UpdateStyle.
@@ -8902,7 +8902,7 @@
 </histogram>
 
 <histogram name="Style.RecalcTime" units="microseconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>futhark@chromium.org</owner>
   <summary>
     Microseconds spent in RecalcStyle called from Document::UpdateStyle.
@@ -9773,7 +9773,7 @@
 </histogram>
 
 <histogram name="UsageStats.Events" enum="UsageStatsEvents"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>pnoland@chromium.org</owner>
   <owner>fgorski@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index 5b19da8..b973f757 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -523,7 +523,7 @@
 
 <histogram
     name="PageLoad.Clients.Ads.AdPaintTiming.NavigationToFirstContentfulPaint3.Incognito"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>kjarosz@google.com</owner>
   <owner>polonium@google.com</owner>
   <summary>
@@ -666,7 +666,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.HeavyAds.DisallowedByBlocklist"
-    enum="BooleanBlocked" expires_after="2025-12-28">
+    enum="BooleanBlocked" expires_after="2026-03-01">
   <owner>jkarlin@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
@@ -677,7 +677,7 @@
 </histogram>
 
 <histogram name="PageLoad.Clients.Ads.HeavyAds.NetworkBytesAtFrameUnload"
-    units="bytes" expires_after="2025-12-28">
+    units="bytes" expires_after="2026-03-01">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
@@ -1131,7 +1131,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.ConnectTiming.FinalRequestConnectDelay{ConnectionProtocolType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1163,7 +1163,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.ConnectTiming.FinalRequestSslDelay{ConnectionProtocolType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1195,7 +1195,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.ConnectTiming.FirstRequestDomainLookupDelay{ConnectionProtocolType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1211,7 +1211,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.ConnectTiming.FirstRequestSslDelay{ConnectionProtocolType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>horo@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -1505,7 +1505,7 @@
 
 <histogram
     name="PageLoad.Clients.GoogleSearch.NavigationTiming.NavigationStartToOnComplete"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>suzukikeita@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <improvement direction="LOWER_IS_BETTER"/>
@@ -3010,7 +3010,7 @@
   </summary>
 </histogram>
 
-<histogram name="PageLoad.Cpu.TotalUsage" units="ms" expires_after="2025-12-28">
+<histogram name="PageLoad.Cpu.TotalUsage" units="ms" expires_after="2026-03-01">
   <owner>alexmt@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
   <summary>
@@ -3034,7 +3034,7 @@
 
 <histogram
     name="PageLoad.DocumentTiming.NavigationToDOMContentLoadedEventFired"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -3277,7 +3277,7 @@
 
 <histogram
     name="PageLoad.Experimental.NavigationTiming.NavigationStartToFirstRequestStart"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -3420,7 +3420,7 @@
 </histogram>
 
 <histogram name="PageLoad.Experimental.PreviewFinalStatus"
-    enum="PreviewFinalStatus" expires_after="2025-12-28">
+    enum="PreviewFinalStatus" expires_after="2026-03-01">
   <owner>toyoshim@chromium.org</owner>
   <owner>src/chrome/browser/preloading/preview/OWNERS</owner>
   <summary>
@@ -3719,7 +3719,7 @@
 
 <histogram
     name="PageLoad.InteractiveTiming.{NormalizedResponsivenessMetric}.{UserInteractionLatency}{PageLoadType}.Incognito"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>kjarosz@google.com</owner>
   <owner>polonium@google.com</owner>
   <summary>
@@ -4139,7 +4139,7 @@
 
 <histogram
     name="PageLoad.LayoutInstability.MaxCumulativeShiftScore.AfterBackForwardCacheRestore.SessionWindow.Gap1000ms.Max5000ms2.Incognito"
-    units="scorex10000" expires_after="2025-12-28">
+    units="scorex10000" expires_after="2026-03-01">
   <owner>kjarosz@google.com</owner>
   <owner>polonium@google.com</owner>
   <summary>
@@ -4237,7 +4237,7 @@
 </histogram>
 
 <histogram name="PageLoad.PageTiming.ForegroundDuration" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmcquade@chromium.org</owner>
   <owner>iclelland@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
@@ -4265,7 +4265,7 @@
 </histogram>
 
 <histogram name="PageLoad.PageTiming.NavigationToFirstForeground" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmcquade@chromium.org</owner>
   <owner>csharrison@chromium.org</owner>
   <summary>
@@ -4338,7 +4338,7 @@
 
 <histogram
     name="PageLoad.PaintTiming.NavigationToFirstContentfulPaint.Incognito"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>kjarosz@google.com</owner>
   <owner>polonium@google.com</owner>
   <summary>
@@ -4437,7 +4437,7 @@
 
 <histogram
     name="PageLoad.PaintTiming.NavigationToFirstPaint.BFCachePolyfillSecond.Incognito"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>kjarosz@google.com</owner>
   <owner>polonium@google.com</owner>
   <summary>
@@ -4646,7 +4646,7 @@
 
 <histogram
     name="PageLoad.PaintTiming.NavigationToLargestContentfulPaint2AtFirstOnHidden"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>lanwei@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/password/enums.xml b/tools/metrics/histograms/metadata/password/enums.xml
index 4de4ed1..d63e8b14 100644
--- a/tools/metrics/histograms/metadata/password/enums.xml
+++ b/tools/metrics/histograms/metadata/password/enums.xml
@@ -753,8 +753,8 @@
   <int value="8" label="Opened automatically / Offering a password to update"/>
   <int value="9" label="Opened manually / Confirming generated password saved"/>
   <int value="10"
-      label="Opened automatically / Offering to save unsynced passwords
-             locally"/>
+      label="(obsolete) Opened automatically / Offering to save unsynced
+             passwords locally"/>
   <int value="11"
       label="Opened automatically / Notification about compromised passwords"/>
   <int value="12"
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 629f496..7ee612a 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -542,18 +542,6 @@
 </histogram>
 
 <histogram
-    name="PasswordManager.AccountStorage.UnsyncedPasswordsFoundDuringSignOut"
-    units="passwords" expires_after="2026-01-18">
-  <owner>treib@chromium.org</owner>
-  <owner>mamir@chromium.org</owner>
-  <summary>
-    Records how many passwords in the account store were unsynced when the user
-    signed out of their Google Account. Recorded only in Win/Mac/Linux when a
-    user of the account-scoped password storage signs out.
-  </summary>
-</histogram>
-
-<histogram
     name="PasswordManager.AccountStorageUserStateDuration{UserSyncingType}"
     units="ms" expires_after="2026-01-18">
   <owner>mamir@chromium.org</owner>
@@ -717,7 +705,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationDatabase.Error"
-    enum="SqliteLoggedResultCode" expires_after="2025-12-28">
+    enum="SqliteLoggedResultCode" expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -743,7 +731,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AffiliationFetcher.FetchErrorCode"
-    enum="NetErrorCodes" expires_after="2025-12-28">
+    enum="NetErrorCodes" expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -847,7 +835,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ApplySyncChangesState"
-    enum="PasswordApplyIncrementalSyncChangesState" expires_after="2025-10-12">
+    enum="PasswordApplyIncrementalSyncChangesState" expires_after="2026-04-12">
   <owner>mamir@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -956,7 +944,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BiometricAvailabilityWin"
-    enum="BiometricAuthenticationStatusWin" expires_after="2025-12-28">
+    enum="BiometricAuthenticationStatusWin" expires_after="2026-03-01">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1002,7 +990,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.CheckedCredentials"
-    units="credentials" expires_after="2025-12-28">
+    units="credentials" expires_after="2026-03-01">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1028,7 +1016,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.InsecureCredentials.Count"
-    units="credentials" expires_after="2025-12-28">
+    units="credentials" expires_after="2026-03-01">
   <owner>eic@google.com</owner>
   <owner>noemies@google.com</owner>
   <summary>
@@ -1049,7 +1037,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.LeaksFound" units="credentials"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vasilii@chromium.org</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1061,7 +1049,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.PasswordCheckReferrer"
-    enum="PasswordCheckReferrer" expires_after="2025-12-28">
+    enum="PasswordCheckReferrer" expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1103,7 +1091,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.UserAction.IOS.General"
-    enum="PasswordCheckInteractionIOSWithoutContext" expires_after="2025-12-28">
+    enum="PasswordCheckInteractionIOSWithoutContext" expires_after="2026-03-01">
   <owner>eic@google.com</owner>
   <owner>noemies@google.com</owner>
   <summary>
@@ -1118,7 +1106,7 @@
 </histogram>
 
 <histogram name="PasswordManager.BulkCheck.UserAction.IOS{Context}"
-    enum="PasswordCheckInteractionIOS" expires_after="2025-12-28">
+    enum="PasswordCheckInteractionIOS" expires_after="2026-03-01">
   <owner>eic@google.com</owner>
   <owner>noemies@google.com</owner>
   <summary>
@@ -1499,7 +1487,7 @@
 </histogram>
 
 <histogram name="PasswordManager.DeleteUndecryptableLoginsReturnValue"
-    enum="DeleteCorruptedPasswordsResult" expires_after="2025-12-28">
+    enum="DeleteCorruptedPasswordsResult" expires_after="2026-03-01">
   <owner>vasilii@chromium.org</owner>
   <owner>kazinova@google.com</owner>
   <summary>
@@ -1703,7 +1691,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillingAutomationRate" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -1728,7 +1716,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FillingSuccessIOS" enum="BooleanSuccess"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vsemeniuk@google.com</owner>
   <summary>
@@ -1807,7 +1795,7 @@
 </histogram>
 
 <histogram name="PasswordManager.FormSubmissionsVsSavePrompts"
-    enum="SaveFlowStep" expires_after="2025-12-28">
+    enum="SaveFlowStep" expires_after="2026-03-01">
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2038,7 +2026,7 @@
 </histogram>
 
 <histogram name="PasswordManager.iOS.HandleFormSubmitEvent"
-    enum="HandleSubmittedFormStatus" expires_after="2025-12-28">
+    enum="HandleSubmittedFormStatus" expires_after="2026-03-01">
   <owner>vincb@google.com</owner>
   <owner>bling-transactions@google.com</owner>
   <summary>
@@ -2199,7 +2187,7 @@
 </histogram>
 
 <histogram name="PasswordManager.LeakDetection.LookupSingleLeakResponseResult"
-    enum="PasswordLeakLookupResponseResult" expires_after="2025-12-28">
+    enum="PasswordLeakLookupResponseResult" expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2316,7 +2304,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ManagePasswordsReferrer"
-    enum="ManagePasswordsReferrer" expires_after="2025-12-28">
+    enum="ManagePasswordsReferrer" expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2328,7 +2316,7 @@
 
 <histogram
     name="PasswordManager.ManualFallback.AcceptedSuggestion.FromRootPopup"
-    enum="BooleanRootPopupSuggestionAccepted" expires_after="2025-12-28">
+    enum="BooleanRootPopupSuggestionAccepted" expires_after="2026-03-01">
   <owner>brunobraga@google.com</owner>
   <owner>tchudakov@google.com</owner>
   <summary>
@@ -2340,7 +2328,7 @@
 
 <histogram
     name="PasswordManager.ManualFallback.AcceptedSuggestion.SearchInputUsed"
-    enum="BooleanSearchInputIsNotEmpty" expires_after="2025-12-28">
+    enum="BooleanSearchInputIsNotEmpty" expires_after="2026-03-01">
   <owner>vykochko@google.com</owner>
   <owner>brunobraga@google.com</owner>
   <summary>
@@ -2412,7 +2400,7 @@
 </histogram>
 
 <histogram name="PasswordManager.MediationRequired"
-    enum="CredentialManagerGetResult" expires_after="2025-12-28">
+    enum="CredentialManagerGetResult" expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2423,7 +2411,7 @@
 </histogram>
 
 <histogram name="PasswordManager.MediationSilent"
-    enum="CredentialManagerGetResult" expires_after="2025-12-31">
+    enum="CredentialManagerGetResult" expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2524,7 +2512,7 @@
 </histogram>
 
 <histogram name="PasswordManager.OsCryptAsync.GetInstanceTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -2601,7 +2589,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasskeysArrivedAfterAutofillDisplay"
-    enum="Boolean" expires_after="2025-12-31">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>kenrb@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
@@ -3084,7 +3072,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordManagementBubble.UserAction"
-    enum="PasswordManagementBubbleInteractions" expires_after="2025-12-28">
+    enum="PasswordManagementBubbleInteractions" expires_after="2026-03-01">
   <owner>mamir@chromium.org</owner>
   <owner>rgod@google.com</owner>
   <summary>
@@ -3277,7 +3265,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordsGrouping.Time" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3332,7 +3320,7 @@
 </histogram>
 
 <histogram name="PasswordManager.PasswordStore.InitTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3845,7 +3833,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ReuseCheck.ReusedPasswords" units="passwords"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3856,7 +3844,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ReuseCheck.Time" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -3881,7 +3869,7 @@
 
 <histogram
     name="PasswordManager.SavedGaiaPasswordHashCount2{SyncConsentStatus}"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>vsemeniuk@google.com</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3947,7 +3935,7 @@
 </histogram>
 
 <histogram name="PasswordManager.ServerPredictionsWaitDuration" units="ms"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>kenrb@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>
@@ -4017,7 +4005,7 @@
 </histogram>
 
 <histogram name="PasswordManager.SingleUsername.PasswordFormHadUsernameField"
-    enum="PasswordFormHadUsernameField" expires_after="2025-12-28">
+    enum="PasswordFormHadUsernameField" expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4049,7 +4037,7 @@
 </histogram>
 
 <histogram name="PasswordManager.StoreDecryptionResult"
-    enum="PasswordDecryptionResult" expires_after="2025-12-28">
+    enum="PasswordDecryptionResult" expires_after="2026-03-01">
   <owner>mamir@chromium.org</owner>
   <owner>kazinova@google.com</owner>
   <summary>
@@ -4210,7 +4198,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TimeBetweenStoreAndServer" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>battre@chromium.org</owner>
   <summary>
@@ -4221,7 +4209,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TimesReceivedFillDataForForm" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4232,7 +4220,7 @@
 </histogram>
 
 <histogram name="PasswordManager.TouchToFill.CredentialIndex" units="index"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ioanap@chromium.org</owner>
   <owner>friedrichh@chromium.org</owner>
   <summary>
@@ -4462,7 +4450,7 @@
 </histogram>
 
 <histogram name="PasswordManager.UPMUpdateSignInCredentialsSucces"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>izuzic@google.com</owner>
   <owner>ioanap@chromium.org</owner>
   <summary>
@@ -4508,14 +4496,14 @@
 </histogram>
 
 <histogram name="PasswordManager.WeakCheck.Time" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>The time it took to complete the passwords weak check.</summary>
 </histogram>
 
 <histogram name="PasswordManager.WeakCheck.WeakPasswords" units="passwords"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kazinova@google.com</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -4685,7 +4673,7 @@
 
 <histogram
     name="PasswordManager.{Store}PasswordNotes.CountCredentialsWithNonEmptyNotes2"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>derinel@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -4696,7 +4684,7 @@
 </histogram>
 
 <histogram name="PasswordManager.{Store}PasswordNotes.CountNotesPerCredential3"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>derinel@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -4915,7 +4903,7 @@
 </histogram>
 
 <histogram name="PasswordProtection.PasswordProtectionResponseOrErrorCode"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-12-28">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2026-03-01">
   <owner>nwokedi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/payment/histograms.xml b/tools/metrics/histograms/metadata/payment/histograms.xml
index cc899ef..250b7bb 100644
--- a/tools/metrics/histograms/metadata/payment/histograms.xml
+++ b/tools/metrics/histograms/metadata/payment/histograms.xml
@@ -71,7 +71,7 @@
 </histogram>
 
 <histogram name="PaymentRequest.HasEnrolledInstrument.CallAllowedByPref"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>smcgruer@chromium.org</owner>
   <owner>chrome-payments-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/performance_controls/histograms.xml b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
index ec831bdd..861e2c38 100644
--- a/tools/metrics/histograms/metadata/performance_controls/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
@@ -29,7 +29,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.BatterySaver.IPHOpenSettings"
-    enum="BooleanOpened" expires_after="2025-12-28">
+    enum="BooleanOpened" expires_after="2026-03-01">
   <owner>agale@chromium.org</owner>
   <owner>estalin@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
@@ -42,7 +42,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.BatterySaver.SettingsChangeMode"
-    enum="BatterySaverModeState" expires_after="2025-12-28">
+    enum="BatterySaverModeState" expires_after="2026-03-01">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -282,7 +282,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.BubbleAction"
-    enum="MemorySaverBubbleActionType" expires_after="2025-12-28">
+    enum="MemorySaverBubbleActionType" expires_after="2026-03-01">
   <owner>agale@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -294,7 +294,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.ChipState"
-    enum="MemorySaverChipState" expires_after="2025-12-28">
+    enum="MemorySaverChipState" expires_after="2026-03-01">
   <owner>agale@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -317,7 +317,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.IPHEnableMode"
-    enum="BooleanEnabled" expires_after="2025-12-28">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>agale@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -329,7 +329,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.SettingsChangeAggressiveness"
-    enum="MemorySaverModeAggressiveness" expires_after="2025-12-28">
+    enum="MemorySaverModeAggressiveness" expires_after="2026-03-01">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -340,7 +340,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.SettingsChangeExceptionList"
-    enum="MemorySaverModeExceptionListAction" expires_after="2025-12-28">
+    enum="MemorySaverModeExceptionListAction" expires_after="2026-03-01">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
@@ -352,7 +352,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.SettingsChangeMode"
-    enum="MemorySaverModeState" expires_after="2025-12-28">
+    enum="MemorySaverModeState" expires_after="2026-03-01">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/performance_manager/histograms.xml b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
index 07e4c54bd..6f71ade5 100644
--- a/tools/metrics/histograms/metadata/performance_manager/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
@@ -219,7 +219,7 @@
 </histogram>
 
 <histogram name="PerformanceManager.DiskStats.UserDataDirFreeSpacePercent"
-    units="%" expires_after="2025-12-28">
+    units="%" expires_after="2026-03-01">
   <owner>anthonyvd@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index db69b878..65ca554 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -699,7 +699,7 @@
 </histogram>
 
 <histogram name="Permissions.CrowdDeny.PreloadData.VersionAtAbuseCheckTime"
-    units="date" expires_after="2025-12-28">
+    units="date" expires_after="2026-03-01">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -895,7 +895,7 @@
 </histogram>
 
 <histogram name="Permissions.MissingOSLevelPermission.Action{PermissionTypes}"
-    enum="PermissionAction" expires_after="2025-12-28">
+    enum="PermissionAction" expires_after="2026-03-01">
   <owner>andypaicu@chromium.org</owner>
   <owner>engedy@chromium.org</owner>
   <owner>hkamila@chromium.org</owner>
@@ -1060,6 +1060,19 @@
   </summary>
 </histogram>
 
+<histogram name="Permissions.PredictionService.Timeout" enum="BooleanTimedOut"
+    expires_after="2025-12-01">
+  <owner>elklm@chromium.org</owner>
+  <owner>hempjudith@google.com</owner>
+  <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
+  <summary>
+    Recorded when the overall timeout for the prediction service is reached.
+    This indicates that the entire process of selecting a permission UI took
+    longer than the allowed time. This is not recorded when the request is
+    cancelled.
+  </summary>
+</histogram>
+
 <histogram name="Permissions.PredictionServiceSource.{PermissionType}"
     enum="PermissionPredictionSource" expires_after="2025-12-07">
   <owner>elklm@chromium.org</owner>
@@ -1094,7 +1107,7 @@
 
 <histogram
     name="Permissions.Prompt.Accepted.PriorIgnoreCount2{PermissionTypes}"
-    units="units" expires_after="2025-10-31">
+    units="units" expires_after="2026-03-01">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1171,7 +1184,7 @@
 </histogram>
 
 <histogram name="Permissions.Prompt.Accepted{PermissionRequestGesture}"
-    enum="PermissionRequestType" expires_after="2025-12-28">
+    enum="PermissionRequestType" expires_after="2026-03-01">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1223,7 +1236,7 @@
 </histogram>
 
 <histogram name="Permissions.Prompt.Denied{PermissionRequestGesture}"
-    enum="PermissionRequestType" expires_after="2025-12-28">
+    enum="PermissionRequestType" expires_after="2026-03-01">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1767,7 +1780,7 @@
 </histogram>
 
 <histogram name="Permissions.Request.SameOrigin.{FrameLevel}"
-    enum="PermissionType" expires_after="2025-12-28">
+    enum="PermissionType" expires_after="2026-03-01">
   <owner>elklm@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
@@ -1866,7 +1879,7 @@
 </histogram>
 
 <histogram name="Permissions.Usage.ElapsedTimeSinceGrant{PermissionTypes}"
-    units="seconds" expires_after="2025-12-28">
+    units="seconds" expires_after="2026-03-01">
   <owner>engedy@chromium.org</owner>
   <owner>src/components/permissions/PERMISSIONS_OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 178f9b9..3352b2b33 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -940,7 +940,7 @@
 </histogram>
 
 <histogram name="Platform.FlexBootMethod" enum="FlexBootMethod"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>justinoue@google.com</owner>
   <owner>chromeos-flex-eng@google.com</owner>
   <summary>
@@ -1102,7 +1102,7 @@
 </histogram>
 
 <histogram name="Platform.Fwupd.ActivateStatus" enum="FwupdReturnValue"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rishbhagr@google.com</owner>
   <owner>chromeos-fwupd@google.com</owner>
   <summary>
@@ -1112,7 +1112,7 @@
 </histogram>
 
 <histogram name="Platform.Fwupd.UpdateDuration" units="seconds"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rishabhagr@google.com</owner>
   <owner>chromeos-fwupd@google.com</owner>
   <summary>
@@ -1122,7 +1122,7 @@
 </histogram>
 
 <histogram name="Platform.Fwupd.UpdateStatus" enum="FwupdReturnValue"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rishabhagr@google.com</owner>
   <owner>chromeos-fwupd@google.com</owner>
   <summary>
@@ -2747,7 +2747,7 @@
 </histogram>
 
 <histogram name="Platform.TPM.VersionFingerprint" enum="TPMVersionFingerprint"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>apronin@chromium.org</owner>
   <owner>cros-hwsec+uma@google.com</owner>
   <summary>
@@ -2966,7 +2966,7 @@
 </histogram>
 
 <histogram name="Platform.WiFiDeviceCount" units="wifi devices"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>norvez@chromium.org</owner>
   <owner>cros-network-metrics@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index 508ee1bf..7f4edd7 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -462,7 +462,7 @@
 </histogram>
 
 <histogram name="Power.AdaptiveChargingMinutes.{ReportType}" units="minutes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dbasehore@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -595,7 +595,7 @@
 </histogram>
 
 <histogram name="Power.BacklightLevel{PrivacyScreenState}{PowerSource}"
-    units="%" expires_after="2025-12-28">
+    units="%" expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>mqg@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
@@ -619,7 +619,7 @@
 </histogram>
 
 <histogram name="Power.BatteryCapacity.{BatteryCapacityType}" units="mWh"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -629,7 +629,7 @@
 </histogram>
 
 <histogram name="Power.BatteryChargeHealth" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -724,7 +724,7 @@
 </histogram>
 
 <histogram name="Power.BatteryDischargeMode5{UsageScenario}{IntervalType}"
-    enum="BatteryDischargeMode" expires_after="2025-12-28">
+    enum="BatteryDischargeMode" expires_after="2026-03-01">
   <owner>etiennep@chromium.org</owner>
   <owner>olivierli@chromium.org</owner>
   <summary>
@@ -754,7 +754,7 @@
 </histogram>
 
 <histogram name="Power.BatteryDischargeRateMilliwatts6.TenMinutes"
-    units="milliwatts" expires_after="2025-12-28">
+    units="milliwatts" expires_after="2026-03-01">
   <owner>pmonette@chromium.org</owner>
   <owner>fdoray@chromium.org</owner>
   <summary>
@@ -855,7 +855,7 @@
 </histogram>
 
 <histogram name="Power.BatteryDischargeRateWhileSuspended" units="mW"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -885,7 +885,7 @@
 </histogram>
 
 <histogram name="Power.BatteryLife.Detail.{BatteryCapacityType}" units="minute"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -903,7 +903,7 @@
 </histogram>
 
 <histogram name="Power.BatteryLife.RollingAverage.{BatteryCapacityType}"
-    units="minute" expires_after="2025-12-28">
+    units="minute" expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -932,7 +932,7 @@
 </histogram>
 
 <histogram name="Power.BatteryLifeWhileSuspended.{BatteryCapacityType}"
-    units="hour" expires_after="2025-12-28">
+    units="hour" expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>chromeos-platform-power@google.com</owner>
   <summary>
@@ -1022,7 +1022,7 @@
 </histogram>
 
 <histogram name="Power.CpuTimeSecondsPerProcessType.{Visibility}"
-    enum="ProcessType2" expires_after="2025-12-28">
+    enum="ProcessType2" expires_after="2026-03-01">
   <owner>eseckler@chromium.org</owner>
   <owner>skyostil@chromium.org</owner>
   <owner>woa-performance@google.com</owner>
@@ -1508,7 +1508,7 @@
 </histogram>
 
 <histogram name="Power.KernelResumeTimeOnAC" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>mhiramat@google.com</owner>
   <owner>chromeos-platform-power@google.com</owner>
@@ -1535,7 +1535,7 @@
 </histogram>
 
 <histogram name="Power.KernelSuspendTimeOnAC" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>puthik@chromium.org</owner>
   <owner>mhiramat@google.com</owner>
   <owner>chromeos-platform-power@google.com</owner>
@@ -1565,7 +1565,7 @@
 </histogram>
 
 <histogram name="Power.KeyboardBacklightLevel" units="%"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>tbroch@chromium.org</owner>
   <summary>
     The level of the keyboard backlight as a percentage. Sampled every 30
@@ -1843,7 +1843,7 @@
 </histogram>
 
 <histogram name="Power.SuspendJourneyResult" enum="SuspendJourneyResult"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>eizan@chromium.org</owner>
   <owner>chromeos-power-team@google.com</owner>
   <summary>
@@ -1875,7 +1875,7 @@
 </histogram>
 
 <histogram name="Power.TimeInSuspendAtBoot" units="minutes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>tbroch@chromium.org</owner>
   <summary>
     Chrome OS time in minutes spent in suspend-to-RAM mode sampled at boot
@@ -1884,7 +1884,7 @@
 </histogram>
 
 <histogram name="Power.TimeInSuspendAtResume" units="minutes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>tbroch@chromium.org</owner>
   <summary>
     Chrome OS time in minutes spent in suspend-to-RAM mode sampled at resume.
diff --git a/tools/metrics/histograms/metadata/preloading/histograms.xml b/tools/metrics/histograms/metadata/preloading/histograms.xml
index 862c5eea..5d01203 100644
--- a/tools/metrics/histograms/metadata/preloading/histograms.xml
+++ b/tools/metrics/histograms/metadata/preloading/histograms.xml
@@ -209,7 +209,7 @@
 
 <histogram
     name="Preloading.Prefetch.PrefetchDataPipeTeeCloneFailed.{PrefetchDataPipeTeeStateLoadingOrSizeExceeded}"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>kenoss@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
@@ -226,7 +226,7 @@
 </histogram>
 
 <histogram name="Preloading.Prefetch.PrefetchDataPipeTeeDtorState"
-    enum="PrefetchDataPipeTeeState" expires_after="2025-12-28">
+    enum="PrefetchDataPipeTeeState" expires_after="2026-03-01">
   <owner>kenoss@chromium.org</owner>
   <owner>chrome-prerendering@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index d7b8182..b2372c1 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -263,7 +263,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterAdded" enum="PrinterProtocol"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bmgordon@chromium.org</owner>
   <owner>src/chromeos/printing/OWNERS</owner>
   <summary>
@@ -323,7 +323,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.PrinterSetupResult.PrintPreview"
-    enum="PrinterSetupResult" expires_after="2025-12-28">
+    enum="PrinterSetupResult" expires_after="2026-03-01">
   <owner>bmgordon@chromium.org</owner>
   <owner>cros-printing-dev@chromium.org</owner>
   <summary>
@@ -454,7 +454,7 @@
 </histogram>
 
 <histogram name="Printing.CUPS.ZeroconfPrinterSetupResult.PrintPreview"
-    enum="PrinterSetupResult" expires_after="2025-12-28">
+    enum="PrinterSetupResult" expires_after="2026-03-01">
   <owner>bmgordon@chromium.org</owner>
   <owner>cros-printing-dev@chromium.org</owner>
   <summary>
@@ -466,7 +466,7 @@
 </histogram>
 
 <histogram name="Printing.Oop.PrintResult" enum="PrintOopResult"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>awscreen@chromium.org</owner>
   <owner>thestig@chromium.org</owner>
   <summary>
@@ -578,7 +578,7 @@
 </histogram>
 
 <histogram name="PrintPreview.InitialDisplayTime.LongTimes" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gavinwill@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -602,7 +602,7 @@
 </histogram>
 
 <histogram name="PrintPreview.InitialDisplayTimeFirstPrint.LongTimes"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>gavinwill@google.com</owner>
   <owner>cros-device-enablement@google.com</owner>
   <summary>
@@ -649,7 +649,7 @@
 </histogram>
 
 <histogram name="PrintPreview.PrintDocumentType"
-    enum="PrintPreviewPrintDocumentTypeBuckets" expires_after="2025-12-28">
+    enum="PrintPreviewPrintDocumentTypeBuckets" expires_after="2026-03-01">
   <owner>rbpotter@chromium.org</owner>
   <owner>awscreen@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/privacy/histograms.xml b/tools/metrics/histograms/metadata/privacy/histograms.xml
index e2c8f4e..aceddf7 100644
--- a/tools/metrics/histograms/metadata/privacy/histograms.xml
+++ b/tools/metrics/histograms/metadata/privacy/histograms.xml
@@ -633,7 +633,7 @@
 </histogram>
 
 <histogram name="Privacy.PageInfo.SiteExceptionsScopeType"
-    enum="ContentSettingPatternScope" expires_after="2025-12-28">
+    enum="ContentSettingPatternScope" expires_after="2026-03-01">
   <owner>olesiamarukhno@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
   <summary>
@@ -668,7 +668,7 @@
 </histogram>
 
 <histogram name="Privacy.SiteExceptionsAdded.ContentSettingType"
-    enum="ContentType" expires_after="2025-12-28">
+    enum="ContentType" expires_after="2026-03-01">
   <owner>olesiamarukhno@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
   <summary>
@@ -678,7 +678,7 @@
 </histogram>
 
 <histogram name="Privacy.SiteExceptionsAdded.ScopeType"
-    enum="ContentSettingPatternScope" expires_after="2025-12-28">
+    enum="ContentSettingPatternScope" expires_after="2026-03-01">
   <owner>olesiamarukhno@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
   <summary>
@@ -1184,7 +1184,7 @@
 
 <histogram
     name="PrivacySandbox.Attestations.InitializationDuration.ComponentReadyFromApplicationStart"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1201,7 +1201,7 @@
 
 <histogram
     name="PrivacySandbox.Attestations.InitializationDuration.ComponentReadyFromApplicationStartWithInterruption"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1221,7 +1221,7 @@
 
 <histogram
     name="PrivacySandbox.Attestations.InitializationDuration.ComponentReadyFromBrowserWindowFirstPaint"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>shivanisha@chromium.org</owner>
   <owner>xiaochenzh@chromium.org</owner>
   <summary>
@@ -1682,7 +1682,7 @@
 
 <histogram
     name="PrivacySandbox.PrivateAggregation.Host.NumContributionMergeKeysInPipe{ApiAndDelay}"
-    units="contributions if merged" expires_after="2025-12-28">
+    units="contributions if merged" expires_after="2026-03-01">
   <owner>alexmt@chromium.org</owner>
   <owner>dmcardle@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/profile/histograms.xml b/tools/metrics/histograms/metadata/profile/histograms.xml
index 76e70ed..3e1daab 100644
--- a/tools/metrics/histograms/metadata/profile/histograms.xml
+++ b/tools/metrics/histograms/metadata/profile/histograms.xml
@@ -103,13 +103,13 @@
 </histogram>
 
 <histogram name="Profile.Avatar" enum="ProfileAvatar"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>The frequency of selection of each avatar.</summary>
 </histogram>
 
-<histogram name="Profile.BookmarksSize" units="MB" expires_after="2025-12-28">
+<histogram name="Profile.BookmarksSize" units="MB" expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>gab@chromium.org</owner>
   <summary>Size of the bookmarks database.</summary>
@@ -240,7 +240,7 @@
 </histogram>
 
 <histogram name="Profile.Guest.OTR.Lifetime" units="minutes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>arabm@google.com</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -262,7 +262,7 @@
 </histogram>
 
 <histogram name="Profile.Incognito.MainFrameNavigationsPerSession"
-    units="navigations" expires_after="2025-12-28">
+    units="navigations" expires_after="2026-03-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -274,7 +274,7 @@
 </histogram>
 
 <histogram name="Profile.Incognito.MovedToBackgroundAfterDuration"
-    units="minutes" expires_after="2025-12-28">
+    units="minutes" expires_after="2026-03-01">
   <owner>arabm@google.com</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -301,7 +301,7 @@
 </histogram>
 
 <histogram name="Profile.KeepAliveLeakAtShutdown" enum="ProfileKeepAliveOrigin"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>nicolaso@chromium.org</owner>
   <owner>cbe-eng@google.com</owner>
   <summary>
@@ -353,7 +353,7 @@
 </histogram>
 
 <histogram name="Profile.NetUserCount" enum="ProfileNetUserCount"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rogerta@chromium.org</owner>
   <summary>
     Counts of users added and deleted. Percentages are not meaningful. Please
@@ -362,7 +362,7 @@
 </histogram>
 
 <histogram name="Profile.NukeFromDisk.Result" enum="NukeProfileResult"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>nicolaso@chromium.org</owner>
   <owner>cbe-eng@google.com</owner>
   <summary>
@@ -379,7 +379,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfAccountsPerProfile" units="units"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -528,7 +528,7 @@
 </histogram>
 
 <histogram name="Profile.NumberOfSignedInProfiles" units="profiles"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -676,7 +676,7 @@
 </histogram>
 
 <histogram name="Profile.State.SyncEnabled{ProfileStateGroup}"
-    enum="BooleanEnabled" expires_after="2025-12-28">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -704,7 +704,7 @@
 </histogram>
 
 <histogram name="Profile.TotalSizeRecursive" units="MB"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>anthonyvd@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
   <summary>
@@ -745,7 +745,7 @@
 </histogram>
 
 <histogram name="Profile.ZombieProfileCount" units="profiles"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>nicolaso@chromium.org</owner>
   <owner>cbe-eng@google.com</owner>
   <summary>
@@ -935,7 +935,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.Shown" enum="ProfilePickerEntryPoint"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -999,7 +999,7 @@
 </histogram>
 
 <histogram name="ProfilePicker.UserAction" enum="ProfilePickerAction"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/quota/histograms.xml b/tools/metrics/histograms/metadata/quota/histograms.xml
index a929f61..bf1642e4 100644
--- a/tools/metrics/histograms/metadata/quota/histograms.xml
+++ b/tools/metrics/histograms/metadata/quota/histograms.xml
@@ -306,7 +306,7 @@
 </histogram>
 
 <histogram name="Quota.QuotaDatabaseError" enum="SqliteLoggedResultCode"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>Errors reported by SQLite while using the quota database.</summary>
diff --git a/tools/metrics/histograms/metadata/regional_capabilities/histograms.xml b/tools/metrics/histograms/metadata/regional_capabilities/histograms.xml
index 3acae9de..1703133 100644
--- a/tools/metrics/histograms/metadata/regional_capabilities/histograms.xml
+++ b/tools/metrics/histograms/metadata/regional_capabilities/histograms.xml
@@ -38,7 +38,7 @@
 </histogram>
 
 <histogram name="RegionalCapabilities.FallbackCountryMatching"
-    enum="CountryMatchingStatus" expires_after="2025-12-28">
+    enum="CountryMatchingStatus" expires_after="2026-03-01">
   <owner>dgn@chromium.org</owner>
   <owner>chrome-regionalcapabilities@google.com</owner>
   <summary>
@@ -53,7 +53,7 @@
 </histogram>
 
 <histogram name="RegionalCapabilities.FetchedCountryMatching"
-    enum="CountryMatchingStatus" expires_after="2025-12-28">
+    enum="CountryMatchingStatus" expires_after="2026-03-01">
   <owner>dgn@chromium.org</owner>
   <owner>chrome-regionalcapabilities@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml
index a760d0ce..518ff5e 100644
--- a/tools/metrics/histograms/metadata/renderer/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -355,7 +355,7 @@
 </histogram>
 
 <histogram name="Renderer.HungRendererDialog.UserAction"
-    enum="HungRendererDialogUserAction" expires_after="2025-12-28">
+    enum="HungRendererDialogUserAction" expires_after="2026-03-01">
   <owner>kerenzhu@chromium.org</owner>
   <owner>chrome-views-alerts@google.com</owner>
   <summary>
@@ -690,7 +690,7 @@
 </histogram>
 
 <histogram name="RendererScheduler.RendererMain.TaskOffCpuDuration" units="ms"
-    expires_after="2025-12-25">
+    expires_after="2026-03-01">
   <owner>anandrv@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
@@ -701,7 +701,7 @@
 </histogram>
 
 <histogram name="RendererScheduler.RendererMain.TaskOnCpuDuration" units="ms"
-    expires_after="2025-12-25">
+    expires_after="2026-03-01">
   <owner>anandrv@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
@@ -712,7 +712,7 @@
 </histogram>
 
 <histogram name="RendererScheduler.RendererMain.TaskOnCpuPercentage" units="%"
-    expires_after="2025-12-25">
+    expires_after="2026-03-01">
   <owner>anandrv@google.com</owner>
   <owner>clank-performance-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/renderer4/histograms.xml b/tools/metrics/histograms/metadata/renderer4/histograms.xml
index 6b0ccd2..7e4e5d0d 100644
--- a/tools/metrics/histograms/metadata/renderer4/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer4/histograms.xml
@@ -141,7 +141,7 @@
 </histogram>
 
 <histogram name="Renderer4.GpuRasterizationEnabled" enum="BooleanEnabled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jonross@chromium.org</owner>
   <owner>chrome-gpu-metric-alerts@chromium.org</owner>
   <summary>
@@ -262,7 +262,7 @@
 </histogram>
 
 <histogram name="Renderer4.ScrollingThread.{ScrollSourceDevice}"
-    enum="ScrollingThreadStatus" expires_after="2025-12-28">
+    enum="ScrollingThreadStatus" expires_after="2026-03-01">
   <owner>bokan@chromium.org</owner>
   <owner>input-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 694e8da..ff4ee71 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -281,7 +281,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.AsyncCheck.HasPostCommitInterstitialSkipped"
-    enum="BooleanSkipped" expires_after="2025-12-28">
+    enum="BooleanSkipped" expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -316,7 +316,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.BlockingPage.ThreatType" enum="SBThreatType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -524,7 +524,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.CheckUrl.UrlScheme" enum="SafeBrowsingUrlScheme"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -642,7 +642,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ClientSafeBrowsingReport.PersisterWriteResult"
-    enum="ClientReportPersisterWriteResult" expires_after="2025-12-28">
+    enum="ClientReportPersisterWriteResult" expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -844,7 +844,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.EsbDisabled.LastSecuritySensitiveEventType"
-    enum="SBMetricsCollectorEventType" expires_after="2025-12-28">
+    enum="SBMetricsCollectorEventType" expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -884,7 +884,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.EsbPromotionFlow.IphShown"
-    enum="SafeBrowsingReferralMethod" expires_after="2025-12-28">
+    enum="SafeBrowsingReferralMethod" expires_after="2026-03-01">
   <owner>awado@google.com</owner>
   <owner>chrome-safebrowsing-alerts@google.com</owner>
   <summary>
@@ -1796,7 +1796,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.Ineligible.{IneligibleReason}"
-    enum="BooleanIneligible" expires_after="2025-12-28">
+    enum="BooleanIneligible" expires_after="2026-03-01">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1847,7 +1847,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.HPRT.Network.Result.WhenEnteringBackoff"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-12-28">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2026-03-01">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2298,7 +2298,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.PakIntegrity.{PakFile}" enum="BooleanSuccess"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>drubery@chromium.org</owner>
   <owner>rsesek@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
@@ -2342,7 +2342,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.Pref.Daily.PasswordLeakToggle" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>awado@google.com</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2895,7 +2895,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.Request.Size{UserCategory}" units="bytes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -3430,7 +3430,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4Database.UpdateLatency" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>skrakowi@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -4110,7 +4110,7 @@
 </histogram>
 
 <histogram name="SafeBrowsingBinaryUploadRequest.DlpResult"
-    enum="BooleanSuccess" expires_after="2025-09-14">
+    enum="BooleanSuccess" expires_after="2026-09-14">
   <owner>domfc@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -4121,7 +4121,7 @@
 </histogram>
 
 <histogram name="SafeBrowsingBinaryUploadRequest.Duration" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -4132,7 +4132,7 @@
 </histogram>
 
 <histogram name="SafeBrowsingBinaryUploadRequest.MalwareResult"
-    enum="BooleanSuccess" expires_after="2025-12-28">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>drubery@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index e1d2726f..4d68207 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -70,7 +70,7 @@
 
 <histogram name="SBClientDownload.Android.DownloadProtectionOutcome"
     enum="SBClientDownloadAndroidDownloadProtectionOutcome"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>chlily@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -164,7 +164,7 @@
 </histogram>
 
 <histogram name="SBClientDownload.DownloadExtensions"
-    enum="SBClientDownloadExtensions" expires_after="2025-12-28">
+    enum="SBClientDownloadExtensions" expires_after="2026-03-01">
   <owner>vakh@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <owner>mattm@chromium.org</owner>
@@ -501,7 +501,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.Classifier.Event{RequestType}"
-    enum="SBPhishingClassifierEvent" expires_after="2025-12-28">
+    enum="SBPhishingClassifierEvent" expires_after="2026-03-01">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -675,7 +675,7 @@
 
 <histogram
     name="SBClientPhishing.IsOnDeviceModelAvailableAtInquiryTime{OnDeviceModelRequestType}"
-    enum="BooleanSuccess" expires_after="2025-12-30">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -869,7 +869,7 @@
 
 <histogram
     name="SBClientPhishing.OnDeviceModelHasSuccessfulResponse{OnDeviceModelRequestType}"
-    enum="BooleanSuccess" expires_after="2025-12-30">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -982,7 +982,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.OptimizationGuide.ModelFetchTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1004,7 +1004,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.PhishingDetectionDuration{RequestType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1101,7 +1101,7 @@
 </histogram>
 
 <histogram name="SBClientPhishing.RTLookupForceRequest"
-    enum="BooleanForceRequest" expires_after="2025-12-28">
+    enum="BooleanForceRequest" expires_after="2026-03-01">
   <owner>andysjlim@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml
index a348e4e..0014bbfa4 100644
--- a/tools/metrics/histograms/metadata/search/histograms.xml
+++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -1182,7 +1182,7 @@
 </histogram>
 
 <histogram name="Search.OsDefaultsChoice.LaunchChoiceScreenTapHandlingStatus"
-    enum="LaunchOsChoiceScreenTapHandlingStatus" expires_after="2025-12-28">
+    enum="LaunchOsChoiceScreenTapHandlingStatus" expires_after="2026-03-01">
   <owner>dgn@chromium.org</owner>
   <owner>triploblastic@google.com</owner>
   <owner>chrome-waffle-eng@google.com</owner>
@@ -1670,7 +1670,7 @@
 </histogram>
 
 <histogram name="Search.SearchProviderOverrideStatus"
-    enum="SearchProviderOverrideStatus" expires_after="2025-12-28">
+    enum="SearchProviderOverrideStatus" expires_after="2026-03-01">
   <owner>dgn@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index c67927d..16b910f 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -246,7 +246,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstMode.SettingChanged2"
-    enum="HttpsFirstModeSetting" expires_after="2025-12-28">
+    enum="HttpsFirstModeSetting" expires_after="2026-03-01">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -273,7 +273,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstMode.SettingEnabledAtStartup2"
-    enum="HttpsFirstModeSetting" expires_after="2025-12-28">
+    enum="HttpsFirstModeSetting" expires_after="2026-03-01">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -285,7 +285,7 @@
 
 <histogram
     name="Security.HttpsFirstModeWithEngagementHeuristic.AccumulatedHostCount"
-    units="hostnames" expires_after="2025-12-28">
+    units="hostnames" expires_after="2026-03-01">
   <owner>meacer@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -296,7 +296,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstModeWithEngagementHeuristic.Duration"
-    units="seconds" expires_after="2025-12-28">
+    units="seconds" expires_after="2026-03-01">
   <owner>meacer@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -307,7 +307,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstModeWithEngagementHeuristic.HostCount"
-    units="hostnames" expires_after="2025-12-28">
+    units="hostnames" expires_after="2026-03-01">
   <owner>meacer@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -331,7 +331,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstModeWithEngagementHeuristic.State"
-    enum="SiteEngagementHeuristicState" expires_after="2025-12-28">
+    enum="SiteEngagementHeuristicState" expires_after="2026-03-01">
   <owner>meacer@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -378,7 +378,7 @@
 </histogram>
 
 <histogram name="Security.PageEndReason{SafetyTip}" enum="PageEndReason"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -388,7 +388,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.AboutThisSiteInteraction"
-    enum="AboutThisSiteInteraction" expires_after="2025-12-28">
+    enum="AboutThisSiteInteraction" expires_after="2026-03-01">
   <owner>dullweber@chromium.org</owner>
   <owner>olesiamarukhno@chromium.org</owner>
   <summary>
@@ -521,7 +521,7 @@
 </histogram>
 
 <histogram name="Security.PrivateNetworkAccess.CheckResult"
-    enum="PrivateNetworkAccessCheckResult" expires_after="2025-12-28">
+    enum="PrivateNetworkAccessCheckResult" expires_after="2026-03-01">
   <owner>titouan@chromium.org</owner>
   <owner>clamy@chromium.org</owner>
   <owner>mkwst@chromium.org</owner>
@@ -567,7 +567,7 @@
 </histogram>
 
 <histogram name="Security.PrivateNetworkAccess.PrivateIpInferrable"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>titouan@chromium.org</owner>
   <owner>lyf@chromium.org</owner>
   <owner>clamy@chromium.org</owner>
@@ -582,7 +582,7 @@
 </histogram>
 
 <histogram name="Security.PrivateNetworkAccess.PrivateIpResolveMatch"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>titouan@chromium.org</owner>
   <owner>lyf@chromium.org</owner>
   <owner>clamy@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 04dc34a..96ae3b0 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -204,7 +204,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.CacheStorageInstalledScript.CachedMetadataSize"
-    units="bytes" expires_after="2025-12-28">
+    units="bytes" expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -282,7 +282,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.CorsExemptHeaderListSize" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
   <summary>
@@ -307,7 +307,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.CountUse.DedicatedWorker.WebFeature"
-    units="WebFeature" expires_after="2025-12-28">
+    units="WebFeature" expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1206,7 +1206,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.MaybeStartWorker.RunningStatus"
-    enum="EmbeddedWorkerStatus" expires_after="2025-12-31">
+    enum="EmbeddedWorkerStatus" expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1270,7 +1270,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.OnStarted.UpdatedFetchHandlerType"
-    enum="ServiceWorkerFetchHandlerType" expires_after="2025-12-28">
+    enum="ServiceWorkerFetchHandlerType" expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1289,7 +1289,7 @@
 
 <histogram
     name="ServiceWorker.OnStarted.UpdatedFetchHandlerTypeBySourceType_{SourceType}"
-    enum="ServiceWorkerFetchHandlerType" expires_after="2025-12-28">
+    enum="ServiceWorkerFetchHandlerType" expires_after="2026-03-01">
   <owner>yyanagisawa@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1415,7 +1415,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.RouterEvaluator.EvaluationTime"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>sisidovski@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -1464,7 +1464,7 @@
 </histogram>
 
 <histogram name="ServiceWorker.RouterEvaluator.SubresourceTotalEvaluationTime"
-    units="microseconds" expires_after="2025-12-28">
+    units="microseconds" expires_after="2026-03-01">
   <owner>suzukikeita@chromium.org</owner>
   <owner>chrome-worker@google.com</owner>
   <summary>
@@ -2161,7 +2161,7 @@
 
 <histogram
     name="ServiceWorkerCache.CacheStorage.{ServiceWorkerCacheProcessType}.{ProcessOps}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/session/histograms.xml b/tools/metrics/histograms/metadata/session/histograms.xml
index 1701df07..e33b0b4f 100644
--- a/tools/metrics/histograms/metadata/session/histograms.xml
+++ b/tools/metrics/histograms/metadata/session/histograms.xml
@@ -23,7 +23,7 @@
 <histograms>
 
 <histogram name="Session.Android.TabbedSessionContainedGoogleSearch"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>nafisabedin@google.com</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -79,7 +79,7 @@
 </histogram>
 
 <histogram name="Session.IsActive" enum="BooleanActive"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rogerm@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
   <summary>
@@ -98,7 +98,7 @@
 </histogram>
 
 <histogram name="Session.OpenedTabCounts" units="operations"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rohitrao@chromium.org</owner>
   <owner>marq@chromium.org</owner>
   <summary>
@@ -1209,7 +1209,7 @@
 </histogram>
 
 <histogram name="SessionRestore.TabCount{TabType}" units="tabs"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>joenotcharles@google.com</owner>
   <owner>catan-team@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index 8454c08..217d6df 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -285,7 +285,7 @@
 </histogram>
 
 <histogram name="Settings.FirstPartySets.State" enum="FirstPartySetsState"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>alimariam@google.com</owner>
   <owner>olesiamarukhno@google.com</owner>
   <owner>sauski@google.com</owner>
@@ -339,7 +339,7 @@
 </histogram>
 
 <histogram name="Settings.Homepage.LocationType" enum="HomepageLocationType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>bttk@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>wenyufu@chromium.org</owner>
@@ -433,7 +433,7 @@
 </histogram>
 
 <histogram name="Settings.PreloadStatus.OnStartup3" enum="PreloadPagesState"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rainhard@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -445,7 +445,7 @@
 </histogram>
 
 <histogram name="Settings.PrivacyElementInteractions"
-    enum="SettingsPrivacyElementInteractions" expires_after="2025-12-28">
+    enum="SettingsPrivacyElementInteractions" expires_after="2026-03-01">
   <owner>harrisonsean@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <owner>sauski@chromium.org</owner>
@@ -456,7 +456,7 @@
 </histogram>
 
 <histogram name="Settings.PrivacyGuide.EntryExit"
-    enum="SettingsPrivacyGuideInteractions" expires_after="2025-12-28">
+    enum="SettingsPrivacyGuideInteractions" expires_after="2026-03-01">
   <owner>harrisonsean@chromium.org</owner>
   <owner>rainhard@chromium.org</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -467,7 +467,7 @@
 </histogram>
 
 <histogram name="Settings.PrivacyGuide.FlowLength" units="steps"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rainhard@chromium.org</owner>
   <owner>aisulu@google.com</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -479,7 +479,7 @@
 </histogram>
 
 <histogram name="Settings.PrivacyGuide.NextNavigation"
-    enum="SettingsPrivacyGuideInteractions" expires_after="2025-12-28">
+    enum="SettingsPrivacyGuideInteractions" expires_after="2026-03-01">
   <owner>harrisonsean@chromium.org</owner>
   <owner>rainhard@chromium.org</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -502,7 +502,7 @@
 
 <histogram name="Settings.PrivacyGuide.StepsEligibleAndReached"
     enum="SettingsPrivacyGuideStepsEligibleAndReached"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rainhard@chromium.org</owner>
   <owner>aisulu@google.com</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -688,7 +688,7 @@
 </histogram>
 
 <histogram name="Settings.SafetyCheck.PasswordsResult2"
-    enum="SafetyCheckPasswordsStatus" expires_after="2025-12-28">
+    enum="SafetyCheckPasswordsStatus" expires_after="2026-03-01">
   <owner>rainhard@chromium.org</owner>
   <owner>msramek@chromium.org</owner>
   <summary>
@@ -829,7 +829,7 @@
 
 <histogram
     name="Settings.SafetyHub.AutorevokeUnusedSitePermissions.StateOnStartup"
-    enum="BooleanEnabled" expires_after="2025-12-28">
+    enum="BooleanEnabled" expires_after="2026-03-01">
   <owner>fsenra@google.com</owner>
   <owner>chrome-browser-privacy-team@google.com</owner>
   <summary>
@@ -1242,7 +1242,7 @@
 
 <histogram name="Settings.SafetyHub.NotificationPermissionsModule.Interactions"
     enum="SafetyCheckNotificationsModuleInteractions"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>aisulu@google.com</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -1254,7 +1254,7 @@
 </histogram>
 
 <histogram name="Settings.SafetyHub.NotificationPermissionsModule.ListCount"
-    units="suggestions" expires_after="2025-12-28">
+    units="suggestions" expires_after="2026-03-01">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>aisulu@google.com</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -1302,7 +1302,7 @@
 
 <histogram name="Settings.SafetyHub.UnusedSitePermissionsModule.Interactions"
     enum="SafetyCheckUnusedSitePermissionsModuleInteractions"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>aisulu@google.com</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -1314,7 +1314,7 @@
 </histogram>
 
 <histogram name="Settings.SafetyHub.UnusedSitePermissionsModule.ListCount"
-    units="suggestions" expires_after="2025-12-28">
+    units="suggestions" expires_after="2026-03-01">
   <owner>sideyilmaz@chromium.org</owner>
   <owner>aisulu@google.com</owner>
   <owner>chrome-privacy-controls@google.com</owner>
@@ -1449,7 +1449,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferenceClearedEncrypted"
-    enum="TrackedPreference" expires_after="2025-12-26">
+    enum="TrackedPreference" expires_after="2026-03-01">
   <owner>zackhan@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1579,7 +1579,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferenceUnchangedEncrypted"
-    enum="TrackedPreference" expires_after="2025-12-26">
+    enum="TrackedPreference" expires_after="2026-03-01">
   <owner>zackhan@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1590,7 +1590,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferenceUnchangedViaHmacFallback"
-    enum="TrackedPreference" expires_after="2025-12-26">
+    enum="TrackedPreference" expires_after="2026-03-01">
   <owner>zackhan@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1630,7 +1630,7 @@
 </histogram>
 
 <histogram name="Settings.TrackedPreferenceWantedResetEncrypted"
-    enum="TrackedPreference" expires_after="2025-12-26">
+    enum="TrackedPreference" expires_after="2026-03-01">
   <owner>zackhan@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -1652,7 +1652,7 @@
 </histogram>
 
 <histogram name="Settings.TrackingProtection.BlockAllThirdParty" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fmacintosh@google.com</owner>
   <owner>koilos@google.com</owner>
   <summary>
@@ -1663,7 +1663,7 @@
 </histogram>
 
 <histogram name="Settings.TrackingProtection.Enabled" enum="BooleanEnabled"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fmacintosh@google.com</owner>
   <owner>koilos@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sharing/histograms.xml b/tools/metrics/histograms/metadata/sharing/histograms.xml
index ec57549..ab34fda 100644
--- a/tools/metrics/histograms/metadata/sharing/histograms.xml
+++ b/tools/metrics/histograms/metadata/sharing/histograms.xml
@@ -326,7 +326,7 @@
 </histogram>
 
 <histogram name="Sharing.SendMessageUsingSync" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rushans@google.com</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -346,7 +346,7 @@
 </histogram>
 
 <histogram name="Sharing.SendTabToSelf.NotificationStatus"
-    enum="SendTabToSelfNotificationStatus" expires_after="2025-12-28">
+    enum="SendTabToSelfNotificationStatus" expires_after="2026-03-01">
   <owner>jeffreycohen@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
@@ -480,7 +480,7 @@
 </histogram>
 
 <histogram name="Sharing.{ShareSurface}.ShareContentType"
-    enum="SharingContentTypeAndroid" expires_after="2025-12-28">
+    enum="SharingContentTypeAndroid" expires_after="2026-03-01">
   <owner>wenyufu@chromium.org</owner>
   <owner>src/chrome/browser/share/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/enums.xml b/tools/metrics/histograms/metadata/signin/enums.xml
index 52cddae..e801cc9c 100644
--- a/tools/metrics/histograms/metadata/signin/enums.xml
+++ b/tools/metrics/histograms/metadata/signin/enums.xml
@@ -735,6 +735,10 @@
   <int value="44" label="Autofill Payments"/>
   <int value="45" label="Payments Access Token Fetcher"/>
   <int value="46" label="Save to Drive"/>
+  <int value="47" label="Fast Pair"/>
+  <int value="48" label="Edu Coexistence Login Handler"/>
+  <int value="49" label="Edu Account Login Handler"/>
+  <int value="50" label="Chromeos Family Link User Metrics provider"/>
 </enum>
 
 <!-- LINT.ThenChange(//components/signin/public/identity_manager/oauth_consumer_ids.h:OAuthConsumerId) -->
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index c29e852..d0f9bda 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -782,7 +782,7 @@
 </histogram>
 
 <histogram name="Signin.AndroidNumberOfDeviceAccounts" units="accounts"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>triploblastic@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -955,7 +955,7 @@
 
 <histogram
     name="Signin.BoundSessionCredentials.Covered{Type}RequestWasDeferred{Result}"
-    enum="BooleanWasDeferred" expires_after="2025-12-28">
+    enum="BooleanWasDeferred" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1036,7 +1036,7 @@
 </histogram>
 
 <histogram name="Signin.BoundSessionCredentials.SessionCountOnInit"
-    units="DBSC sessions" expires_after="2025-12-28">
+    units="DBSC sessions" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1108,7 +1108,7 @@
 
 <histogram
     name="Signin.BoundSessionCredentials.SessionTerminationDebugReportFetcherHttpResult"
-    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-12-28">
+    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1131,7 +1131,7 @@
 </histogram>
 
 <histogram name="Signin.BoundSessionCredentials.StorageReadError"
-    enum="BoundSessionParamsReadError" expires_after="2025-12-28">
+    enum="BoundSessionParamsReadError" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1144,7 +1144,7 @@
 </histogram>
 
 <histogram name="Signin.BoundSessionCredentials.StorageWriteError"
-    enum="BoundSessionParamsWriteError" expires_after="2025-12-28">
+    enum="BoundSessionParamsWriteError" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1172,7 +1172,7 @@
 </histogram>
 
 <histogram name="Signin.CctAccountMismatch" enum="CctAccountMismatchType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>samarchehade@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -1198,7 +1198,7 @@
 </histogram>
 
 <histogram name="Signin.ChromeSignoutConfirmationPrompt.{Variant}"
-    enum="ChromeSignoutConfirmationChoice" expires_after="2025-12-28">
+    enum="ChromeSignoutConfirmationChoice" expires_after="2026-03-01">
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -1235,7 +1235,7 @@
 
 <histogram
     name="Signin.CookieJar.SignedInCountWithPrimary{UnconsentedPrimaryAccountType}"
-    units="accounts" expires_after="2025-12-28">
+    units="accounts" expires_after="2026-03-01">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1451,7 +1451,7 @@
 </histogram>
 
 <histogram name="Signin.DiceTokenBindingOutcome" enum="DiceTokenBindingOutcome"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>msalama@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -1761,7 +1761,7 @@
 </histogram>
 
 <histogram name="Signin.Intercept.BubbleDismissReason{Type}"
-    enum="SigninInterceptionDismissReason" expires_after="2025-12-28">
+    enum="SigninInterceptionDismissReason" expires_after="2026-03-01">
   <owner>rsult@google.com</owner>
   <owner>droger@chromium.org</owner>
   <summary>
@@ -2176,7 +2176,7 @@
 </histogram>
 
 <histogram name="Signin.IOSNumberOfDeviceAccounts" units="accounts"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jlebel@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2260,7 +2260,7 @@
 </histogram>
 
 <histogram name="Signin.LoadedIdentities.Count" units="identities"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>jlebel@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2300,7 +2300,7 @@
 </histogram>
 
 <histogram name="Signin.LoadedIdentities.IdentityWithAuthErrorCount"
-    units="identities" expires_after="2025-12-28">
+    units="identities" expires_after="2026-03-01">
   <owner>jlebel@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2436,7 +2436,7 @@
 </histogram>
 
 <histogram name="Signin.OAuth2MintToken.Response" enum="OAuth2Response"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2453,7 +2453,7 @@
 
 <histogram
     name="Signin.OAuth2MintToken.{BindingState}FetchAuthError{TokenBindingAssertionValue}"
-    enum="GoogleServiceAuthError" expires_after="2025-12-28">
+    enum="GoogleServiceAuthError" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2479,7 +2479,7 @@
 </histogram>
 
 <histogram name="Signin.OAuth2MintToken.{BindingState}FetchEncryptionError"
-    enum="TokenBindingResponseEncryptionError" expires_after="2025-12-28">
+    enum="TokenBindingResponseEncryptionError" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -2548,7 +2548,7 @@
 </histogram>
 
 <histogram name="Signin.OAuthMultiloginResponseEncryptionError"
-    enum="TokenBindingResponseEncryptionError" expires_after="2025-12-28">
+    enum="TokenBindingResponseEncryptionError" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -2597,7 +2597,7 @@
 </histogram>
 
 <histogram name="Signin.PAMInitialize.PrimaryAccountPrefs"
-    enum="PAMInitializePrimaryAccountPrefs" expires_after="2025-12-28">
+    enum="PAMInitializePrimaryAccountPrefs" expires_after="2026-03-01">
   <owner>msarda@chromium.org</owner>
   <owner>droger@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -3183,7 +3183,7 @@
 </histogram>
 
 <histogram name="Signin.SigninPending.Resolution"
-    enum="PendingResolutionSource" expires_after="2025-12-28">
+    enum="PendingResolutionSource" expires_after="2026-03-01">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -3194,7 +3194,7 @@
 </histogram>
 
 <histogram name="Signin.SigninPending.ResolutionSource{Status}"
-    enum="SigninAccessPoint" expires_after="2025-12-28">
+    enum="SigninAccessPoint" expires_after="2026-03-01">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -3211,7 +3211,7 @@
 </histogram>
 
 <histogram name="Signin.SigninPending.ResolutionTime.{ResolutionType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -3465,7 +3465,7 @@
 </histogram>
 
 <histogram name="Signin.SyncErrorMessage{SyncErrorReason}"
-    enum="SyncErrorPromptUIAction" expires_after="2025-12-28">
+    enum="SyncErrorPromptUIAction" expires_after="2026-03-01">
   <owner>triploblastic@chromium.org</owner>
   <owner>bsazonov@chromium.org</owner>
   <summary>
@@ -3583,7 +3583,7 @@
 </histogram>
 
 <histogram name="Signin.SyncPaused.ResolutionTime.{ResolutionType}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>rsult@google.com</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -3656,7 +3656,7 @@
 </histogram>
 
 <histogram name="Signin.TokenBinding.BoundToTheSameKey"
-    enum="BooleanBoundToTheSameKey" expires_after="2025-12-28">
+    enum="BooleanBoundToTheSameKey" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
@@ -3669,7 +3669,7 @@
 </histogram>
 
 <histogram name="Signin.TokenBinding.GenerateAssertionResult"
-    enum="TokenBindingGenerateAssertionResult" expires_after="2025-12-28">
+    enum="TokenBindingGenerateAssertionResult" expires_after="2026-03-01">
   <owner>alexilin@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/simple/histograms.xml b/tools/metrics/histograms/metadata/simple/histograms.xml
index f4179f1d..b8d2ced1 100644
--- a/tools/metrics/histograms/metadata/simple/histograms.xml
+++ b/tools/metrics/histograms/metadata/simple/histograms.xml
@@ -78,7 +78,7 @@
 </histogram>
 
 <histogram name="SimpleCache.{CacheInstance}CreationToIndex" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>morlovich@chromium.org</owner>
   <owner>wanderview@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sql/histograms.xml b/tools/metrics/histograms/metadata/sql/histograms.xml
index 7dbc6ef..af3cfebb 100644
--- a/tools/metrics/histograms/metadata/sql/histograms.xml
+++ b/tools/metrics/histograms/metadata/sql/histograms.xml
@@ -258,7 +258,7 @@
 </histogram>
 
 <histogram name="Sql.Statement.{DatabaseTag}.VMSteps" units="count"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>estade@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
@@ -270,7 +270,7 @@
   <token key="DatabaseTag" variants="DatabaseTag"/>
 </histogram>
 
-<histogram name="Sql.vfs.SyncTime" units="ms" expires_after="2025-12-28">
+<histogram name="Sql.vfs.SyncTime" units="ms" expires_after="2026-03-01">
   <owner>etienneb@chromium.org</owner>
   <owner>estade@chromium.org</owner>
   <owner>chrome-catan@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/stability/histograms.xml b/tools/metrics/histograms/metadata/stability/histograms.xml
index 21ecaa3..33cf1849 100644
--- a/tools/metrics/histograms/metadata/stability/histograms.xml
+++ b/tools/metrics/histograms/metadata/stability/histograms.xml
@@ -84,7 +84,7 @@
 </histogram>
 
 <histogram name="ChildProcess.Launched.UtilityProcessHash"
-    enum="UtilityProcessNameHash" expires_after="2025-12-28">
+    enum="UtilityProcessNameHash" expires_after="2026-03-01">
   <owner>wfh@chromium.org</owner>
   <summary>
     Count of child utility process launches, bucketed by the hash of their
@@ -202,7 +202,7 @@
 </histogram>
 
 <histogram name="Stability.Android.RendererCrash" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>wnwen@chromium.org</owner>
   <summary>
     Counts renderer crashes including OOMs. Android only. Mirrors old stability
@@ -685,7 +685,7 @@
 </histogram>
 
 <histogram name="Stability.MobileSessionShutdownType2"
-    enum="MobileSessionShutdownType" expires_after="2025-12-28">
+    enum="MobileSessionShutdownType" expires_after="2026-03-01">
   <owner>justincohen@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/startup/histograms.xml b/tools/metrics/histograms/metadata/startup/histograms.xml
index 27881b1..b512978 100644
--- a/tools/metrics/histograms/metadata/startup/histograms.xml
+++ b/tools/metrics/histograms/metadata/startup/histograms.xml
@@ -516,7 +516,7 @@
 </histogram>
 
 <histogram name="Startup.Android.MainIntentIsColdStart" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>nafisabedin@google.com</owner>
   <owner>yfriedman@chromium.org</owner>
   <summary>
@@ -536,7 +536,7 @@
 </histogram>
 
 <histogram name="Startup.Android.PrivacySandbox.AdsNoticeCCTAppIDCheck"
-    enum="Boolean" expires_after="2025-12-28">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>jacobstanley@google.com</owner>
   <owner>koilos@google.com</owner>
   <summary>
@@ -588,7 +588,7 @@
 </histogram>
 
 <histogram name="Startup.BrowserMainRunnerImplInitializeLongTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>robliao@chromium.org</owner>
   <summary>
     The amount of time that elapsed during BrowserMainRunnerImpl::Initialize.
@@ -692,7 +692,7 @@
 </histogram>
 
 <histogram name="Startup.BrowserWindow.FirstPaint" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gab@chromium.org</owner>
   <owner>mblsha@yandex-team.ru</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index a093859e..0e15491 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -69,7 +69,7 @@
 </histogram>
 
 <histogram name="API.StorageAccess.AutograntViaFedCm"
-    enum="AutograntViaFedCmOutcome" expires_after="2025-12-28">
+    enum="AutograntViaFedCmOutcome" expires_after="2026-03-01">
   <owner>cfredric@chromium.org</owner>
   <owner>yigu@chromium.org</owner>
   <summary>
@@ -227,7 +227,7 @@
 </histogram>
 
 <histogram name="API.TopLevelStorageAccess.RequestStorageAccessFor2"
-    enum="RequestStorageResult" expires_after="2025-12-28">
+    enum="RequestStorageResult" expires_after="2026-03-01">
   <owner>cfredric@chromium.org</owner>
   <owner>mreichhoff@chromium.org</owner>
   <summary>
@@ -832,7 +832,7 @@
 </histogram>
 
 <histogram name="Storage.Blob.FileReaderLoader.FailureType2"
-    enum="FileReaderLoaderFailureType" expires_after="2025-12-28">
+    enum="FileReaderLoaderFailureType" expires_after="2026-03-01">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
@@ -846,7 +846,7 @@
 </histogram>
 
 <histogram name="Storage.Blob.FileReaderLoader.ReadError2" enum="NetErrorCodes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>estade@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/structured_metrics/histograms.xml b/tools/metrics/histograms/metadata/structured_metrics/histograms.xml
index e009726f..f456d62e 100644
--- a/tools/metrics/histograms/metadata/structured_metrics/histograms.xml
+++ b/tools/metrics/histograms/metadata/structured_metrics/histograms.xml
@@ -22,7 +22,7 @@
 </histogram>
 
 <histogram name="StructuredMetrics.ExternalMetricsDropped2.{Project}"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>andrewbregger@google.com</owner>
   <owner>troywang@google.com</owner>
   <owner>chromeos-data-eng@google.com</owner>
@@ -53,7 +53,7 @@
 </histogram>
 
 <histogram name="StructuredMetrics.ExternalMetricsProduced2.{Project}"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>andrewbregger@google.com</owner>
   <owner>troywang@google.com</owner>
   <owner>chromeos-data-eng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index a7684ed..e5f190c 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -618,7 +618,7 @@
 </histogram>
 
 <histogram name="Sync.ConfigureTime_{ConfigurationType}.{Result}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>treib@chromium.org</owner>
   <owner>src/components/sync/OWNERS</owner>
   <summary>
@@ -740,7 +740,7 @@
 </histogram>
 
 <histogram name="Sync.CustomSync3" enum="SyncDataTypes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>treib@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -1137,7 +1137,7 @@
 </histogram>
 
 <histogram name="Sync.EntitySizeOnCommit.Entity.WithMetadata{SyncDataType}"
-    units="bytes" expires_after="2025-12-28">
+    units="bytes" expires_after="2026-03-01">
   <owner>ankushkush@google.com</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -1279,7 +1279,7 @@
 </histogram>
 
 <histogram name="Sync.InitialState2" enum="SyncInitialState"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>treib@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -1354,7 +1354,7 @@
 </histogram>
 
 <histogram name="Sync.Local.ReadPlatformFileError" enum="PlatformFileError"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>igorruvinov@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <summary>
@@ -1479,7 +1479,7 @@
 </histogram>
 
 <histogram name="Sync.PassphraseType" enum="SyncPassphraseType"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>treib@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>The active sync passphrase type at sync startup.</summary>
@@ -1535,7 +1535,7 @@
 </histogram>
 
 <histogram name="Sync.PassphraseTypeUponNotMyBirthdayOrEncryptionObsolete"
-    enum="SyncPassphraseType" expires_after="2025-12-28">
+    enum="SyncPassphraseType" expires_after="2026-03-01">
   <owner>mastiz@chromium.org</owner>
   <owner>mmoskvitin@google.com</owner>
   <summary>
@@ -1920,7 +1920,7 @@
 </histogram>
 
 <histogram name="Sync.SharingMessage.CommitResult"
-    enum="SyncSharingMessageCommitErrorCode" expires_after="2025-12-28">
+    enum="SyncSharingMessageCommitErrorCode" expires_after="2026-03-01">
   <owner>rushans@google.com</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -2051,7 +2051,7 @@
 </histogram>
 
 <histogram name="Sync.SyncEverything2" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>treib@chromium.org</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
@@ -2247,7 +2247,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultErrorShownOnFirstTimeSync2" enum="Boolean"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 377a770..1a8f67f 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -249,7 +249,7 @@
 </histogram>
 
 <histogram name="Discarding.ReclaimArrivalLatency" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>kalutes@chromium.org</owner>
   <owner>kawasin@chromium.org</owner>
   <owner>vovoy@chromium.org</owner>
@@ -351,7 +351,7 @@
   <token key="TabContextMenuCommand" variants="TabContextMenuCommand"/>
 </histogram>
 
-<histogram name="Tab.Count.Guest" units="units" expires_after="2025-12-28">
+<histogram name="Tab.Count.Guest" units="units" expires_after="2026-03-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -367,7 +367,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tab.Count.Incognito" units="units" expires_after="2025-12-28">
+<histogram name="Tab.Count.Incognito" units="units" expires_after="2026-03-01">
   <owner>rhalavati@chromium.org</owner>
   <owner>chrome-incognito@google.com</owner>
   <summary>
@@ -718,7 +718,7 @@
 </histogram>
 
 <histogram name="Tab.PerceivedRestoreTime" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ckitagawa@chromium.org</owner>
   <owner>dtrainor@chromium.org</owner>
   <owner>yfriedman@chromium.org</owner>
@@ -732,7 +732,7 @@
 </histogram>
 
 <histogram name="Tab.Preview.TimeToStoreAfterTabSwitch" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dfried@chromium.org</owner>
   <owner>collinbaker@chromium.org</owner>
   <summary>
@@ -771,7 +771,7 @@
 </histogram>
 
 <histogram name="Tab.RendererTermination.AliveRenderersCount" units="renderers"
-    expires_after="2025-12-30">
+    expires_after="2026-03-01">
   <owner>justincohen@chromium.org</owner>
   <owner>bling-fundamentals@google.com</owner>
   <summary>
@@ -843,7 +843,7 @@
 </histogram>
 
 <histogram name="Tab.StatusWhenSwitchedBackToForeground" enum="TabStatus"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ckitagawa@chromium.org</owner>
   <owner>marq@chromium.org</owner>
   <summary>
@@ -1258,8 +1258,8 @@
 </histogram>
 
 <histogram name="TabGroups.Shared.LoadFromDiskResult"
-    enum="SharedTabGroupDataLoadFromDiskResult" expires_after="2025-10-10">
-  <owner>rushans@google.com</owner>
+    enum="SharedTabGroupDataLoadFromDiskResult" expires_after="2026-10-10">
+  <owner>shaktisahu@chromium.org</owner>
   <owner>chrome-multiplayer-eng@google.com</owner>
   <summary>
     Records the result of loading a SharedTabGroupData entry from disk. Recorded
@@ -1848,7 +1848,7 @@
 </histogram>
 
 <histogram name="TabGroups.TabsPerGroupCountAtStartup" units="tabs"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>gambard@chromium.org</owner>
   <owner>chromeleon@google.com</owner>
   <summary>[iOS] The number of tabs per group at cold launch.</summary>
@@ -2296,7 +2296,7 @@
 </histogram>
 
 <histogram name="Tabs.FreezeAndAppendPendingNavigationResult"
-    enum="BooleanSuccess" expires_after="2025-12-28">
+    enum="BooleanSuccess" expires_after="2026-03-01">
   <owner>ckitagawa@chromium.org</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -2813,7 +2813,7 @@
 </histogram>
 
 <histogram name="Tabs.SadTab.Feedback.Event" enum="SadTabEvent"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
@@ -2824,7 +2824,7 @@
 </histogram>
 
 <histogram name="Tabs.SadTab.Reload.Event" enum="SadTabEvent"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>sonnyrao@chromium.org</owner>
   <owner>jamescook@chromium.org</owner>
   <summary>
@@ -2960,7 +2960,7 @@
 </histogram>
 
 <histogram name="Tabs.Startup.TabCount2.{TabModelSelectorType}.DuplicateTabIds"
-    units="count" expires_after="2025-12-28">
+    units="count" expires_after="2026-03-01">
   <owner>wylieb@google.com</owner>
   <owner>clank-tab-dev@google.com</owner>
   <summary>
@@ -3079,7 +3079,7 @@
   </summary>
 </histogram>
 
-<histogram name="Tabs.TabCountPerLoad" units="tabs" expires_after="2025-12-28">
+<histogram name="Tabs.TabCountPerLoad" units="tabs" expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <owner>sbirch@google.com</owner>
@@ -3097,7 +3097,7 @@
 </histogram>
 
 <histogram name="Tabs.TabCountPerWindow" units="tabs"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
@@ -3742,7 +3742,7 @@
 </histogram>
 
 <histogram name="Tabs.Tasks.OrderValidOnStartup" enum="Boolean"
-    expires_after="2025-12-08">
+    expires_after="2026-03-01">
   <owner>ckitagawa@chromium.org</owner>
   <owner>clank-tab-dev@chromium.org</owner>
   <summary>
@@ -3805,7 +3805,7 @@
   <token key="BatteryState" variants="BatteryState"/>
 </histogram>
 
-<histogram name="Tabs.WindowWidth" units="DIPs" expires_after="2025-12-28">
+<histogram name="Tabs.WindowWidth" units="DIPs" expires_after="2026-03-01">
   <owner>collinbaker@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
@@ -3947,7 +3947,7 @@
 </histogram>
 
 <histogram name="TabStrip.TabCountOnPageLoad" units="tabs"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>yusufo@chromium.org</owner>
   <owner>wychen@chromium.org</owner>
   <summary>
@@ -3959,7 +3959,7 @@
 </histogram>
 
 <histogram name="TabStrip.TimeToCreateNewTabFromPress" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>robliao@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/toasts/histograms.xml b/tools/metrics/histograms/metadata/toasts/histograms.xml
index 9ae67b7e..c952a223c 100644
--- a/tools/metrics/histograms/metadata/toasts/histograms.xml
+++ b/tools/metrics/histograms/metadata/toasts/histograms.xml
@@ -32,7 +32,7 @@
 </histogram>
 
 <histogram name="Toast.TriggeredToShow" enum="ToastId"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>agale@chromium.org</owner>
   <owner>stluong@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/translate/histograms.xml b/tools/metrics/histograms/metadata/translate/histograms.xml
index beabe6a9..8cbf631f 100644
--- a/tools/metrics/histograms/metadata/translate/histograms.xml
+++ b/tools/metrics/histograms/metadata/translate/histograms.xml
@@ -176,7 +176,7 @@
 </histogram>
 
 <histogram name="Translate.CompactInfobar.Event" enum="TranslateCompactUIEvent"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>Various user actions performed in the translate infobar.</summary>
@@ -396,7 +396,7 @@
 </histogram>
 
 <histogram name="Translate.PageLoad.HrefHint.TriggerDecision"
-    enum="TranslateTriggerDecision" expires_after="2025-12-28">
+    enum="TranslateTriggerDecision" expires_after="2026-03-01">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -661,7 +661,7 @@
 </histogram>
 
 <histogram name="Translate.Translation.ShowErrorUI" enum="TranslateError"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -741,7 +741,7 @@
 </histogram>
 
 <histogram name="Translate.Translation.TimeToLoad" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -753,7 +753,7 @@
 </histogram>
 
 <histogram name="Translate.Translation.TimeToTranslate" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -778,7 +778,7 @@
 </histogram>
 
 <histogram name="Translate.UiInteraction.Event" enum="TranslateUIInteraction"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>megjablon@google.com</owner>
   <owner>chrome-language@google.com</owner>
   <summary>
@@ -792,7 +792,7 @@
 </histogram>
 
 <histogram name="TranslateModelService.LanguageDetectionModel.WasLoaded"
-    enum="BooleanLoaded" expires_after="2025-12-28">
+    enum="BooleanLoaded" expires_after="2026-03-01">
   <owner>mcrouse@chromium.org</owner>
   <owner>chrome-language@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ui/histograms.xml b/tools/metrics/histograms/metadata/ui/histograms.xml
index 023d9896e..b0034c2 100644
--- a/tools/metrics/histograms/metadata/ui/histograms.xml
+++ b/tools/metrics/histograms/metadata/ui/histograms.xml
@@ -223,7 +223,7 @@
 </histogram>
 
 <histogram name="ContextMenu.Shown{Type}" enum="BooleanPresent"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mpearson@chromium.org</owner>
   <owner>twellington@chromium.org</owner>
   <owner>clank-app-team@google.com</owner>
@@ -584,7 +584,7 @@
 </histogram>
 
 <histogram name="WebUI.Settings.PathVisited" enum="WebUISettingsPathHashes"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>dschuyler@chromium.org</owner>
   <owner>tbuckley@chromium.org</owner>
   <owner>bettes@chromium.org</owner>
@@ -787,14 +787,14 @@
 </histogram>
 
 <histogram name="WrenchMenu.MenuAction" enum="WrenchMenuAction"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ainslie@chromium.org</owner>
   <owner>edwardjung@chromium.org</owner>
   <summary>Number of times that each menu item is clicked.</summary>
 </histogram>
 
 <histogram name="WrenchMenu.TimeToAction.{Action}" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>ainslie@chromium.org</owner>
   <owner>edwardjung@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/update_engine/histograms.xml b/tools/metrics/histograms/metadata/update_engine/histograms.xml
index 2cc49d7..7552a81 100644
--- a/tools/metrics/histograms/metadata/update_engine/histograms.xml
+++ b/tools/metrics/histograms/metadata/update_engine/histograms.xml
@@ -224,7 +224,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.CertificateCheck.Download"
-    enum="UpdateEngineCertificateCheckStatus" expires_after="2025-12-31">
+    enum="UpdateEngineCertificateCheckStatus" expires_after="2026-03-01">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -268,7 +268,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Check.Reaction" enum="UpdateEngineCheckReaction"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -319,7 +319,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.Check.TargetVersion"
-    enum="UpdateEngineChromeOsVersionPrefix" expires_after="2025-12-31">
+    enum="UpdateEngineChromeOsVersionPrefix" expires_after="2026-03-01">
   <owner>mpolzer@google.com</owner>
   <owner>chromeos-commercial-remote-management@google.com</owner>
   <summary>
@@ -450,7 +450,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.FailedUpdateCount" units="count"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
@@ -547,7 +547,7 @@
 </histogram>
 
 <histogram name="UpdateEngine.SuccessfulUpdate.DownloadSourcesUsed"
-    enum="UpdateEngineDownloadSources" expires_after="2025-12-31">
+    enum="UpdateEngineDownloadSources" expires_after="2026-03-01">
   <owner>kimjae@chromium.org</owner>
   <owner>chromeos-core-services@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index cef9cf8e..75e775e 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -689,7 +689,7 @@
 </histogram>
 
 <histogram name="V8.GC.Cycle{Priority}.Full.Mark{Heap}" units="ms"
-    expires_after="M144">
+    expires_after="2026-03-01">
   <owner>omerkatz@chromium.org</owner>
   <owner>v8-memory-sheriffs@google.com</owner>
   <summary>
@@ -729,7 +729,7 @@
 </histogram>
 
 <histogram name="V8.GC.Cycle{Priority}.Full.Weak{Heap}" units="ms"
-    expires_after="M144">
+    expires_after="2026-03-01">
   <owner>omerkatz@chromium.org</owner>
   <owner>v8-memory-sheriffs@google.com</owner>
   <summary>
@@ -1345,7 +1345,7 @@
 </histogram>
 
 <histogram name="V8.GCIncrementalMarkingReason" enum="GarbageCollectionReason"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>mlippautz@chromium.org</owner>
   <owner>v8-memory-sheriffs@google.com</owner>
   <summary>Reason an incremental marking was started in V8.</summary>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml
index e5aab35..9821165 100644
--- a/tools/metrics/histograms/metadata/variations/histograms.xml
+++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -338,7 +338,7 @@
 </histogram>
 
 <histogram name="Variations.LoadSeedSignature" enum="VariationSeedSignature"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>asvitkine@chromium.org</owner>
   <owner>rkaplow@chromium.org</owner>
   <owner>src/base/metrics/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/web_apk/histograms.xml b/tools/metrics/histograms/metadata/web_apk/histograms.xml
index 8fc1ca12..7fa9525c 100644
--- a/tools/metrics/histograms/metadata/web_apk/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_apk/histograms.xml
@@ -196,7 +196,7 @@
 </histogram>
 
 <histogram name="WebApk.Session.TotalDuration3{WebApkDistributorType}"
-    units="ms" expires_after="2025-12-28">
+    units="ms" expires_after="2026-03-01">
   <owner>hartmanng@chromium.org</owner>
   <owner>src/chrome/android/webapk/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_audio/histograms.xml b/tools/metrics/histograms/metadata/web_audio/histograms.xml
index cbb57af..c666711 100644
--- a/tools/metrics/histograms/metadata/web_audio/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_audio/histograms.xml
@@ -87,7 +87,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.NumberOfChannels" units="units"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -98,7 +98,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.SampleRate384kHz" units="Hz"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -109,7 +109,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioBuffer.SampleRateRatio384kHz" units="units"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -121,7 +121,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.AudibleTime" units="s"
-    expires_after="2025-11-16">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -133,7 +133,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.ConcurrentAudioContexts" units="count"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -157,7 +157,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.DestroyedWithoutClose" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -171,7 +171,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.HardwareSampleRate" units="Hz"
-    expires_after="2025-12-07">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -208,7 +208,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContext.MaxChannelsAvailable" units="units"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -246,7 +246,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioContextOptions.sampleRate" units="Hz"
-    expires_after="2025-12-07">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -270,7 +270,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioDestination.CallbackBufferSize" units="units"
-    expires_after="2025-12-07">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -283,7 +283,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioDestination.HardwareBufferSize" units="units"
-    expires_after="2025-12-07">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -416,7 +416,7 @@
 </histogram>
 
 <histogram name="WebAudio.AudioNode.ProcessTimeRatio.{NodeTag}" units="%"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -454,7 +454,7 @@
 </histogram>
 
 <histogram name="WebAudio.Autoplay" enum="WebAudioAutoplayStatus"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -466,7 +466,7 @@
 </histogram>
 
 <histogram name="WebAudio.Autoplay.CrossOrigin" enum="WebAudioAutoplayStatus"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -488,7 +488,7 @@
 </histogram>
 
 <histogram name="WebAudio.BiquadFilter.Type" enum="BiquadFilterType"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -512,7 +512,7 @@
 </histogram>
 
 <histogram name="WebAudio.IIRFilterNode.Order" units="units"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
@@ -536,7 +536,7 @@
 </histogram>
 
 <histogram name="WebAudio.PannerNode.PanningModel" enum="PanningModelType"
-    expires_after="2025-12-01">
+    expires_after="2026-03-01">
   <owner>mjwilson@chromium.org</owner>
   <owner>hongchan@chromium.org</owner>
   <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index 68ef6ae..96414ef 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -1228,7 +1228,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.AddIceCandidate"
-    enum="AddIceCandidateResult" expires_after="2025-12-28">
+    enum="AddIceCandidateResult" expires_after="2026-03-01">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1487,7 +1487,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.RestrictedCandidates.MungeAllowed"
-    enum="Boolean" expires_after="2025-12-31">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <owner>tov@chromium.org</owner>
@@ -1549,7 +1549,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.SdpMunging.Outcome"
-    enum="SdpMungingOutcome" expires_after="2025-12-31">
+    enum="SdpMungingOutcome" expires_after="2026-03-01">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
@@ -1560,7 +1560,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.SdpMunging.SdpOutcome.{Outcome}"
-    enum="SdpMungingType" expires_after="2025-12-31">
+    enum="SdpMungingType" expires_after="2026-03-01">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index cbbd4507..6c7eb96a 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -708,7 +708,7 @@
 </histogram>
 
 <histogram name="WebApp.Engagement{Context}.{Container}"
-    enum="SiteEngagementServiceEngagementType" expires_after="2025-12-28">
+    enum="SiteEngagementServiceEngagementType" expires_after="2026-03-01">
   <owner>dmurph@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>
@@ -2727,7 +2727,7 @@
 </histogram>
 
 <histogram name="Webapp.WebAppUrlLoaderPrepareForLoadResult"
-    enum="WebAppUrlLoaderResult" expires_after="2025-12-28">
+    enum="WebAppUrlLoaderResult" expires_after="2026-03-01">
   <owner>dmurph@chromium.org</owner>
   <owner>pwa-team@google.com</owner>
   <summary>Records the result of WebAppUrlLoader::PrepareForLoad().</summary>
diff --git a/tools/metrics/histograms/metadata/webauthn/histograms.xml b/tools/metrics/histograms/metadata/webauthn/histograms.xml
index d747195..052dbf3 100644
--- a/tools/metrics/histograms/metadata/webauthn/histograms.xml
+++ b/tools/metrics/histograms/metadata/webauthn/histograms.xml
@@ -33,7 +33,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.Android.CredManConditionalRequest"
-    enum="CredManGetRequestEnum" expires_after="2025-12-28">
+    enum="CredManGetRequestEnum" expires_after="2026-03-01">
   <owner>derinel@google.com</owner>
   <owner>kenrb@chromium.org</owner>
   <summary>
@@ -43,7 +43,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.Android.CredManCreateRequest"
-    enum="CredManCreateRequestEnum" expires_after="2025-12-28">
+    enum="CredManCreateRequestEnum" expires_after="2026-03-01">
   <owner>derinel@google.com</owner>
   <owner>kenrb@chromium.org</owner>
   <summary>
@@ -113,7 +113,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.CableV2.TunnelEvent"
-    enum="WebAuthenticationCableV2TunnelEvent" expires_after="2025-12-31">
+    enum="WebAuthenticationCableV2TunnelEvent" expires_after="2026-03-01">
   <owner>agl@chromium.org</owner>
   <owner>martinkr@google.com</owner>
   <summary>
@@ -309,14 +309,14 @@
 </histogram>
 
 <histogram name="WebAuthentication.GetAssertion.Result"
-    enum="WebAuthenticationCredentialRequestResult" expires_after="2025-12-28">
+    enum="WebAuthenticationCredentialRequestResult" expires_after="2026-03-01">
   <owner>nsatragno@chromium.org</owner>
   <owner>chrome-webauthn@google.com</owner>
   <summary>Records the result of a get assertion request.</summary>
 </histogram>
 
 <histogram name="WebAuthentication.GetAssertionRequestTransport"
-    enum="WebAuthenticationFidoTransport" expires_after="2025-12-28">
+    enum="WebAuthenticationFidoTransport" expires_after="2026-03-01">
   <owner>kenrb@chromium.org</owner>
   <owner>martinkr@google.com</owner>
   <summary>
@@ -327,7 +327,7 @@
 </histogram>
 
 <histogram name="WebAuthentication.GetAssertionResponseTransport"
-    enum="WebAuthenticationFidoTransport" expires_after="2025-12-28">
+    enum="WebAuthenticationFidoTransport" expires_after="2026-03-01">
   <owner>kenrb@chromium.org</owner>
   <owner>martinkr@google.com</owner>
   <summary>
@@ -401,7 +401,7 @@
 
 <histogram
     name="WebAuthentication.MacOS.GetAssertion.LargeBlobSucceeded.{Operation}"
-    enum="Boolean" expires_after="2025-12-31">
+    enum="Boolean" expires_after="2026-03-01">
   <owner>kenrb@chromium.org</owner>
   <owner>nsatragno@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml
index f73db24..9e671c5c 100644
--- a/tools/metrics/histograms/metadata/windows/histograms.xml
+++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -166,7 +166,7 @@
 </histogram>
 
 <histogram name="Windows.InstallerDownloader.DestinationMatches" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>koretadaniel@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
@@ -176,7 +176,7 @@
 </histogram>
 
 <histogram name="Windows.InstallerDownloader.DownloadSucceed" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>koretadaniel@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
@@ -187,7 +187,7 @@
 </histogram>
 
 <histogram name="Windows.InstallerDownloader.InfobarShown" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>koretadaniel@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
@@ -198,7 +198,7 @@
 </histogram>
 
 <histogram name="Windows.InstallerDownloader.RequestAccepted" enum="Boolean"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>koretadaniel@chromium.org</owner>
   <owner>top-chrome-desktop-ui@google.com</owner>
   <summary>
@@ -235,7 +235,7 @@
 </histogram>
 
 <histogram name="Windows.OneDriveSyncState.{SyncedState}" enum="BooleanEnabled"
-    expires_after="2025-12-31">
+    expires_after="2026-03-01">
   <owner>koretadaniel@chromium.org</owner>
   <owner>iclelland@chromium.org</owner>
   <summary>
@@ -396,7 +396,7 @@
 </histogram>
 
 <histogram name="Windows.TimeInSelectFileDialog" units="ms"
-    expires_after="2025-12-28">
+    expires_after="2026-03-01">
   <owner>fdoray@chromium.org</owner>
   <owner>pmonette@chromium.org</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index c05e9cc..8f1ccb0 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -17,12 +17,12 @@
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/881ad50c05049ca13d4b34e4f92f4167de5ac52a/trace_processor_shell"
         },
         "mac_arm64": {
-            "hash": "efcaf0c731d241a3d5dca8acac662cad87c8ba66",
-            "full_remote_path": "perfetto-luci-artifacts/de0ede0cf3ffb20fec4108c0df17d0ee473bc4c2/mac-arm64/trace_processor_shell"
+            "hash": "441290c3f23d12c619d0bbe82c0ea88b02c10d56",
+            "full_remote_path": "perfetto-luci-artifacts/d17b40b3b5e36f3744f1d010fe3ba2d3c55559c0/mac-arm64/trace_processor_shell"
         },
         "linux": {
             "hash": "bcb0bf8bc8af7c097b0389189bbb3c6cd7d5fc3e",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/b4a0cf9ed523f19da6e5eaeeeb47126e8e64837c/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/9e99848ef108842c9c6f1fefe5bf8d4fd44c8496/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index 1e25d5b5..b2b9595 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -218,6 +218,7 @@
 crbug.com/815193 [ android ] rasterize_and_record_micro.top_25/file://static_top_25/wikipedia.html [ Skip ]
 crbug.com/873011 [ android-webview ] rasterize_and_record_micro.top_25/file://static_top_25/yahoonews.html [ Skip ]
 crbug.com/1228228 [ android-webview ] rasterize_and_record_micro.top_25/file://static_top_25/gmail.html [ Skip ]
+crbug.com/441684585 [ android-pixel-6-pro ] rasterize_and_record_micro.top_25/file://static_top_25/youtube.html [ Skip ]
 
 # Benchmark: speedometer2
 crbug.com/1452148 [ chromeos-board-eve ] speedometer2/Speedometer2 [ Skip ]
diff --git a/tools/rust/build_rust.py b/tools/rust/build_rust.py
index 983cf36..aa6dc4a 100755
--- a/tools/rust/build_rust.py
+++ b/tools/rust/build_rust.py
@@ -60,7 +60,10 @@
                    GitRevert, LLVM_DIR, IsGitAncestorToHead,
                    LLVM_BUILD_TOOLS_DIR, RunCommand)
 from update import (CHROMIUM_DIR, DownloadAndUnpack, EnsureDirExists,
-                    GetDefaultHostOs, RmTree, WriteStampFile, UpdatePackage)
+                    GetDefaultHostOs, RmTree, ReadStampFile, WriteStampFile,
+                    UpdatePackage, STAMP_FILENAME as LLVM_STAMP_FILENAME,
+                    FORCE_HEAD_REVISION_FILENAME as
+                    LLVM_FORCE_HEAD_REVISION_FILENAME)
 
 from update_rust import (RUST_REVISION, RUST_TOOLCHAIN_OUT_DIR,
                          STAGE0_JSON_SHA256, THIRD_PARTY_DIR, VERSION_SRC_PATH,
@@ -508,17 +511,33 @@
     return args
 
 
-def MakeVersionStamp(git_hash):
+def MakeVersionStamp(rust_hash, rust_force_head_revision,
+                     llvm_force_head_revision):
     # We must generate a version stamp that contains the full version of the
     # built Rust compiler:
     # * The version number returned from `rustc --version`.
-    # * The git hash.
-    # * The chromium revision name of the compiler build, which includes the
-    #   associated clang/llvm version.
+    # * The git hash of rust.
+    # * The chromium package version tag, which includes the
+    #   associated clang/llvm version as well as the rust subrevision.
     with open(RUST_SRC_VERSION_FILE_PATH) as version_file:
         rust_version = version_file.readline().rstrip()
-    return (f'rustc {rust_version} {git_hash}'
-            f' ({GetRustClangRevision()} chromium)\n')
+
+    # Compute the package version.
+    # If we're building from head we need to construct our own package version
+    # because it won't match the one in update.py
+    if rust_force_head_revision or llvm_force_head_revision:
+        if llvm_force_head_revision:
+            llvm_stamp_file = os.path.join(RUST_HOST_LLVM_BUILD_DIR, '..',
+                                           LLVM_FORCE_HEAD_REVISION_FILENAME)
+        else:
+            llvm_stamp_file = os.path.join(RUST_HOST_LLVM_BUILD_DIR,
+                                           LLVM_STAMP_FILENAME)
+        package_version = f'{rust_hash}-0-{ReadStampFile(llvm_stamp_file)}'
+    else:
+        package_version = GetRustClangRevision()
+
+    return (f'rustc {rust_version} {rust_hash}'
+            f' ({package_version} chromium)\n')
 
 
 def GetLatestRustCommit():
@@ -893,8 +912,10 @@
 
         xpy.run('install', xpy_args + [])
 
-        WriteStampFile(MakeVersionStamp(checkout_revision), VERSION_SRC_PATH,
-                       args.preserve_gcs_signature)
+        WriteStampFile(
+            MakeVersionStamp(checkout_revision, args.rust_force_head_revision,
+                             args.llvm_force_head_revision), VERSION_SRC_PATH,
+            args.preserve_gcs_signature)
 
     # The Rust stdlib deps are vendored to rust-src/library/vendor, and later
     # the x.py install process copies all subdirs of rust-src/library to the
diff --git a/tools/rust/update_rust.py b/tools/rust/update_rust.py
index 103de9d9..06cf6951 100755
--- a/tools/rust/update_rust.py
+++ b/tools/rust/update_rust.py
@@ -82,26 +82,38 @@
 
 
 def main():
-    parser = argparse.ArgumentParser(description='Update Rust package')
+    parser = argparse.ArgumentParser(
+        description='Update Rust package',
+        formatter_class=argparse.RawTextHelpFormatter)
     parser.add_argument(
-        '--print-rust-revision',
-        action='store_true',
-        help='Print Rust revision (without Clang revision) and '
-        'quit. Can be run outside of a Chromium checkout.')
+        '--print-revision',
+        choices=['rust', 'installed', 'validate'],
+        help='Print the rust revision then quit. Possible formats:\n'
+        '- rust: print only the expected rust revision (without clang).\n'
+        '  Can be run outside of a Chromium checkout.\n'
+        '- installed: print the installed package version (including both\n'
+        '  rust and clang revisions), without checking that it matches the\n'
+        '  expected version in this file.\n'
+        '- validate: print the expected package version, and ensure it\n'
+        '  matches the installed package.')
+    parser.add_argument('--output-dir', help='Where to extract the package.')
+    # TODO(crbug.com/407563488): Remove this argument once all uses are removed
     parser.add_argument('--print-package-version',
                         action='store_true',
-                        help='Print Rust package version (including both the '
-                        'Rust and Clang revisions) and quit.')
-    parser.add_argument('--output-dir', help='Where to extract the package.')
+                        help='Deprecated and will be removed in the future.\n'
+                        'Use `--print-revision validate` instead.')
     args = parser.parse_args()
 
-    if args.print_rust_revision:
+    if args.print_package_version:
+        args.print_revision = 'validate'
+
+    if args.print_revision == 'rust':
         print(f'{RUST_REVISION}-{RUST_SUB_REVISION}')
         return 0
-
-    if args.print_package_version:
+    elif args.print_revision:
         stamp_version = GetStampVersion()
-        if stamp_version != GetRustClangRevision():
+        if (args.print_revision == 'validate'
+                and stamp_version != GetRustClangRevision()):
             print(f'The expected Rust version is {GetRustClangRevision()} '
                   f'but the actual version is {stamp_version}')
             print('Did you run "gclient sync"?')
diff --git a/tools/traffic_annotation/scripts/auditor/auditor.py b/tools/traffic_annotation/scripts/auditor/auditor.py
index d1260c5..927c7d2 100755
--- a/tools/traffic_annotation/scripts/auditor/auditor.py
+++ b/tools/traffic_annotation/scripts/auditor/auditor.py
@@ -1819,7 +1819,6 @@
                                                  self.path_filters,
                                                  self.skip_compdb)
     errors = []
-
     errors.extend(self.auditor.parse_extractor_output(all_annotations))
 
     # If we already have errors from parsing annotations, report them. Otherwise
@@ -1875,6 +1874,9 @@
             'pyproto/chrome/browser/privacy/traffic_annotation_pb2.py'))
     return src_proto_mtime > build_proto_mtime
 
+def is_cog() -> bool:
+  """Returns true if the script is running inside a Cog workspace."""
+  return SRC_DIR.as_posix().startswith('/google/cog/cloud')
 
 if __name__ == "__main__":
   args_parser = argparse.ArgumentParser(
@@ -1940,6 +1942,12 @@
   args = args_parser.parse_args()
   build_path = Path(args.build_path)
 
+  # Check if in cog - if so, fail early.
+  if is_cog():
+    print("This script must not be run from cog workspaces.")
+    print("Note that running this script from Cider-G is not supported.")
+    sys.exit(1)
+
   print("Starting traffic annotation auditor. This may take a few minutes.")
   print("If you find a bug in this script, file bugs against the 'Enterprise>"
         "TrafficAnnotations' component and CC nicolaso@chromium.org.")
@@ -1947,7 +1955,6 @@
                          args.test_only, args.limit, args.annotations_file,
                          args.errors_file, args.skip_compdb,
                          args.skip_stale_build_check)
-
   try:
     sys.exit(auditor_ui.main())
   except extractor.SourceCodeParsingError:
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 09f7bc14..1d1841d1 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -242,7 +242,6 @@
  <item id="managed_acccount_signin_restrictions_secure_connect" added_in_milestone="97" content_hash_code="0119d88f" os_list="linux,windows,chromeos,android" file_path="components/policy/core/browser/signin/user_cloud_signin_restriction_policy_fetcher.cc" />
  <item id="ambient_photo_cache" added_in_milestone="98" content_hash_code="07dbf21e" os_list="chromeos" file_path="ash/ambient/ambient_photo_cache.cc" />
  <item id="ambient_photo_controller" added_in_milestone="98" content_hash_code="03284b8a" os_list="chromeos" file_path="ash/ambient/ambient_weather_controller.cc" />
- <item id="image_downloader" added_in_milestone="98" content_hash_code="05b52680" os_list="chromeos" file_path="ash/assistant/assistant_controller_impl.cc" />
  <item id="fast_pair_footprints_request" added_in_milestone="102" type="partial" second_id="oauth2_api_call_flow" content_hash_code="01d3d58d" os_list="chromeos" semantics_fields="1,2,3,4,5" policy_fields="-1,3,4" file_path="ash/quick_pair/repository/fast_pair/footprints_fetcher_impl.cc" />
  <item id="kiosk_app_icon" added_in_milestone="98" content_hash_code="04a3a6a4" os_list="chromeos" file_path="chrome/browser/ash/app_mode/web_app/kiosk_web_app_data.cc" />
  <item id="arc_auth_code_fetcher" added_in_milestone="98" content_hash_code="021af0fe" os_list="chromeos" file_path="chrome/browser/ash/arc/auth/arc_background_auth_code_fetcher.cc" />
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 5f7fd20..b33ea22b 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -57,7 +57,6 @@
       <annotation id="fwupd_firmware_update"/>
       <annotation id="gaia_reauth_token_fetcher"/>
       <annotation id="help_content_provider"/>
-      <annotation id="image_downloader"/>
       <annotation id="ime_url_downloader"/>
       <annotation id="kiosk_app_icon"/>
       <annotation id="launcher_item_suggest"/>
diff --git a/ui/android/junit/src/org/chromium/ui/util/MotionEventUtilsTest.java b/ui/android/junit/src/org/chromium/ui/util/MotionEventUtilsTest.java
index 44f4f19..d10c396 100644
--- a/ui/android/junit/src/org/chromium/ui/util/MotionEventUtilsTest.java
+++ b/ui/android/junit/src/org/chromium/ui/util/MotionEventUtilsTest.java
@@ -12,15 +12,13 @@
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.android.controller.ActivityController;
 
 import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.ui.base.TestActivity;
 
 /** Unit tests for {@link MotionEventUtils}. */
 @RunWith(BaseRobolectricTestRunner.class)
 public class MotionEventUtilsTest {
+
     @Test
     public void testIsPointerEvent() {
         assertTrue(
@@ -57,10 +55,6 @@
     }
 
     private MotionEvent createEventWithSourceAndToolType(int source, int toolType) {
-        ActivityController<TestActivity> activityController =
-                Robolectric.buildActivity(TestActivity.class);
-        activityController.setup();
-        TestActivity activity = activityController.get();
         MotionEvent.PointerProperties[] properties = new MotionEvent.PointerProperties[1];
         properties[0] = new MotionEvent.PointerProperties();
         properties[0].id = 0;
diff --git a/ui/events/devices/BUILD.gn b/ui/events/devices/BUILD.gn
index 765acaf..31e12b0 100644
--- a/ui/events/devices/BUILD.gn
+++ b/ui/events/devices/BUILD.gn
@@ -65,6 +65,7 @@
       "input_device_observer_ios.h",
       "input_device_observer_ios.mm",
     ]
+    frameworks = [ "GameController.framework" ]
   }
 
   defines = [ "EVENTS_DEVICES_IMPLEMENTATION" ]
diff --git a/ui/gfx/win/singleton_hwnd.cc b/ui/gfx/win/singleton_hwnd.cc
index bcb00a6..478d067 100644
--- a/ui/gfx/win/singleton_hwnd.cc
+++ b/ui/gfx/win/singleton_hwnd.cc
@@ -4,7 +4,7 @@
 
 #include "ui/gfx/win/singleton_hwnd.h"
 
-#include "base/memory/singleton.h"
+#include "base/no_destructor.h"
 #include "base/task/current_thread.h"
 #include "ui/gfx/win/singleton_hwnd_observer.h"
 
@@ -12,7 +12,8 @@
 
 // static
 SingletonHwnd* SingletonHwnd::GetInstance() {
-  return base::Singleton<SingletonHwnd>::get();
+  static base::NoDestructor<SingletonHwnd> s_hwnd;
+  return s_hwnd.get();
 }
 
 BOOL SingletonHwnd::ProcessWindowMessage(HWND window,
@@ -21,37 +22,29 @@
                                          LPARAM lparam,
                                          LRESULT& result,
                                          DWORD msg_map_id) {
-  if (!base::CurrentUIThread::IsSet()) {
-    // If there is no MessageLoop and SingletonHwnd is receiving messages, this
-    // means it is receiving messages via an external message pump such as COM
-    // uninitialization.
-    //
-    // It is unsafe to forward these messages as observers may depend on the
-    // existence of a MessageLoop to proceed.
-    return false;
+  // If there is no MessageLoop and SingletonHwnd is receiving messages, this
+  // means it is receiving messages via an external message pump such as COM
+  // uninitialization.
+  //
+  // It is unsafe to forward these messages as observers may depend on the
+  // existence of a MessageLoop to proceed.
+  if (base::CurrentUIThread::IsSet()) {
+    observer_list_.Notify(&SingletonHwndObserver::OnWndProc, window, message,
+                          wparam, lparam);
   }
-
-  observer_list_.Notify(&SingletonHwndObserver::OnWndProc, window, message,
-                        wparam, lparam);
   return false;
 }
 
 SingletonHwnd::SingletonHwnd() {
-  if (!base::CurrentUIThread::IsSet()) {
-    // Creating this window in (e.g.) a renderer inhibits shutdown on
-    // Windows. See http://crbug.com/230122 and http://crbug.com/236039.
-    return;
+  // Creating this window in (e.g.) a renderer inhibits Windows shutdown. See
+  // http://crbug.com/40312501 and http://crbug.com/40315446.
+  if (base::CurrentUIThread::IsSet()) {
+    WindowImpl::Init(NULL, Rect());
   }
-  WindowImpl::Init(NULL, Rect());
 }
 
 SingletonHwnd::~SingletonHwnd() {
-  // WindowImpl will clean up the hwnd value on WM_NCDESTROY.
-  if (hwnd())
-    DestroyWindow(hwnd());
-
-  // Tell all of our current observers to clean themselves up.
-  observer_list_.Notify(&SingletonHwndObserver::ClearWndProc);
+  NOTREACHED();  // Never destroyed.
 }
 
 void SingletonHwnd::AddObserver(SingletonHwndObserver* observer) {
diff --git a/ui/gfx/win/singleton_hwnd.h b/ui/gfx/win/singleton_hwnd.h
index 33e74e1..eceae7d 100644
--- a/ui/gfx/win/singleton_hwnd.h
+++ b/ui/gfx/win/singleton_hwnd.h
@@ -12,7 +12,8 @@
 #include "ui/gfx/win/window_impl.h"
 
 namespace base {
-template<typename T> struct DefaultSingletonTraits;
+template <typename T>
+class NoDestructor;
 }
 
 namespace gfx {
@@ -38,7 +39,7 @@
 
  private:
   friend class SingletonHwndObserver;
-  friend struct base::DefaultSingletonTraits<SingletonHwnd>;
+  friend class base::NoDestructor<SingletonHwnd>;
 
   SingletonHwnd();
   ~SingletonHwnd() override;
diff --git a/ui/gfx/win/singleton_hwnd_observer.cc b/ui/gfx/win/singleton_hwnd_observer.cc
index 229b98a..85d4db93 100644
--- a/ui/gfx/win/singleton_hwnd_observer.cc
+++ b/ui/gfx/win/singleton_hwnd_observer.cc
@@ -10,19 +10,12 @@
 
 SingletonHwndObserver::SingletonHwndObserver(const WndProc& wnd_proc)
     : wnd_proc_(wnd_proc) {
-  DCHECK(!wnd_proc.is_null());
+  CHECK(!wnd_proc.is_null());
   SingletonHwnd::GetInstance()->AddObserver(this);
 }
 
 SingletonHwndObserver::~SingletonHwndObserver() {
-  ClearWndProc();
-}
-
-void SingletonHwndObserver::ClearWndProc() {
-  if (!wnd_proc_.is_null()) {
-    SingletonHwnd::GetInstance()->RemoveObserver(this);
-    wnd_proc_.Reset();
-  }
+  SingletonHwnd::GetInstance()->RemoveObserver(this);
 }
 
 void SingletonHwndObserver::OnWndProc(HWND hwnd,
diff --git a/ui/gfx/win/singleton_hwnd_observer.h b/ui/gfx/win/singleton_hwnd_observer.h
index 2677d98..ca60139 100644
--- a/ui/gfx/win/singleton_hwnd_observer.h
+++ b/ui/gfx/win/singleton_hwnd_observer.h
@@ -14,8 +14,6 @@
 
 class SingletonHwnd;
 
-// Singleton lifetime management is tricky. This observer handles the correct
-// cleanup if either the SingletonHwnd or forwarded object is destroyed first.
 // Note that if you want to register a hot key on the SingletonHwnd, you need to
 // use a SingletonHwndHotKeyObserver instead for each hot key.
 class COMPONENT_EXPORT(GFX) SingletonHwndObserver {
@@ -32,7 +30,6 @@
  private:
   friend class SingletonHwnd;
 
-  void ClearWndProc();
   void OnWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
 
   WndProc wnd_proc_;
diff --git a/ui/linux/fallback_linux_ui.cc b/ui/linux/fallback_linux_ui.cc
index a6ec960..6c56538 100644
--- a/ui/linux/fallback_linux_ui.cc
+++ b/ui/linux/fallback_linux_ui.cc
@@ -7,6 +7,7 @@
 #include "base/notimplemented.h"
 #include "base/time/time.h"
 #include "ui/base/ime/linux/linux_input_method_context.h"
+#include "ui/base/ime/text_edit_commands.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/events/keycodes/dom/dom_keyboard_layout_map.h"
 #include "ui/gfx/font_render_params.h"
@@ -16,7 +17,6 @@
 #include "ui/linux/nav_button_provider.h"
 #include "ui/native_theme/native_theme.h"
 #include "ui/shell_dialogs/select_file_policy.h"
-#include "ui/views/controls/textfield/textfield.h"
 
 namespace ui {
 
@@ -95,7 +95,7 @@
 void FallbackLinuxUi::GetInactiveSelectionFgColor(SkColor* color) const {}
 
 base::TimeDelta FallbackLinuxUi::GetCursorBlinkInterval() const {
-  return views::Textfield::GetCaretBlinkInterval();
+  return NativeTheme::GetInstanceForNativeUi()->GetCaretBlinkInterval();
 }
 
 gfx::Image FallbackLinuxUi::GetIconForContentType(
diff --git a/ui/native_theme/BUILD.gn b/ui/native_theme/BUILD.gn
index 3a09571..3da69c8 100644
--- a/ui/native_theme/BUILD.gn
+++ b/ui/native_theme/BUILD.gn
@@ -23,53 +23,6 @@
     "overlay_scrollbar_constants.h",
   ]
 
-  if (is_android) {
-    sources += [
-      "native_theme_android.cc",
-      "native_theme_android.h",
-    ]
-  }
-
-  if (is_mac) {
-    frameworks = [
-      "Accessibility.framework",
-      "AppKit.framework",
-      "CoreGraphics.framework",
-      "MediaAccessibility.framework",
-    ]
-    sources += [
-      "caption_style_mac.mm",
-      "native_theme_mac.h",
-      "native_theme_mac.mm",
-      "scrollbar_animator_mac.cc",
-      "scrollbar_animator_mac.h",
-    ]
-  }
-
-  if (is_ios) {
-    sources += [
-      "native_theme_ios.h",
-      "native_theme_ios.mm",
-    ]
-  }
-
-  if (is_win) {
-    sources += [
-      "caption_style_win.cc",
-      "native_theme_win.cc",
-      "native_theme_win.h",
-    ]
-
-    libs = [ "uxtheme.lib" ]
-  }
-
-  if (use_aura || toolkit_views) {
-    sources += [
-      "native_theme_aura.cc",
-      "native_theme_aura.h",
-    ]
-  }
-
   defines = [ "IS_NATIVE_THEME_IMPL" ]
 
   public_deps = [
@@ -91,20 +44,62 @@
     "//ui/gfx/geometry",
     "//ui/resources",
   ]
+
+  if (is_android || is_ios) {
+    sources += [
+      "native_theme_mobile.cc",
+      "native_theme_mobile.h",
+    ]
+  }
+
+  if (is_mac) {
+    frameworks = [
+      "Accessibility.framework",
+      "AppKit.framework",
+      "CoreGraphics.framework",
+      "MediaAccessibility.framework",
+    ]
+    sources += [
+      "caption_style_mac.mm",
+      "native_theme_mac.h",
+      "native_theme_mac.mm",
+      "scrollbar_animator_mac.cc",
+      "scrollbar_animator_mac.h",
+    ]
+  }
+
+  if (is_win) {
+    sources += [
+      "caption_style_win.cc",
+      "native_theme_win.cc",
+      "native_theme_win.h",
+    ]
+
+    libs = [ "uxtheme.lib" ]
+  }
+
+  # Mac uses `NativeThemeAura` for the web instance. That class does not depend
+  # on any other Aura-specific code.
+  if (use_aura || is_mac) {
+    sources += [
+      "native_theme_aura.cc",
+      "native_theme_aura.h",
+    ]
+  }
 }
 
 source_set("test_support") {
   testonly = true
 
-  deps = [
-    ":native_theme",
-    "//base",
-  ]
-
   sources = [
     "test_native_theme.cc",
     "test_native_theme.h",
   ]
+
+  deps = [
+    ":native_theme",
+    "//base",
+  ]
 }
 
 test("native_theme_unittests") {
@@ -116,17 +111,6 @@
     "native_theme_unittest.cc",
   ]
 
-  if (use_aura) {
-    sources += [ "native_theme_aura_unittest.cc" ]
-  }
-
-  if (is_win) {
-    sources += [
-      "caption_style_win_unittest.cc",
-      "native_theme_win_unittest.cc",
-    ]
-  }
-
   deps = [
     ":native_theme",
     ":test_support",
@@ -147,4 +131,15 @@
     ]
     deps += [ "//ui/gfx:test_support" ]
   }
+
+  if (is_win) {
+    sources += [
+      "caption_style_win_unittest.cc",
+      "native_theme_win_unittest.cc",
+    ]
+  }
+
+  if (use_aura) {
+    sources += [ "native_theme_aura_unittest.cc" ]
+  }
 }
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc
index e761050..54f22e5 100644
--- a/ui/native_theme/native_theme.cc
+++ b/ui/native_theme/native_theme.cc
@@ -106,10 +106,6 @@
   return base_color;
 }
 
-SkColor4f NativeTheme::FocusRingColorForBaseColor(SkColor4f base_color) const {
-  return base_color;
-}
-
 float NativeTheme::GetBorderRadiusForPart(Part part,
                                           float width,
                                           float height) const {
@@ -252,16 +248,6 @@
   return forced_colors_;
 }
 
-NativeTheme::PlatformHighContrastColorScheme
-NativeTheme::GetPlatformHighContrastColorScheme() const {
-  if (!InForcedColorsMode()) {
-    return PlatformHighContrastColorScheme::kNone;
-  }
-  return (GetPreferredColorScheme() == PreferredColorScheme::kDark)
-             ? PlatformHighContrastColorScheme::kDark
-             : PlatformHighContrastColorScheme::kLight;
-}
-
 NativeTheme::PageColors NativeTheme::GetPageColors() const {
   return page_colors_;
 }
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h
index cbe76bb..6fa1314 100644
--- a/ui/native_theme/native_theme.h
+++ b/ui/native_theme/native_theme.h
@@ -147,19 +147,6 @@
     kMaxValue = kCustom,
   };
 
-  // IMPORTANT!
-  // This enum is reported in metrics. Do not reorder; add additional values at
-  // the end.
-  //
-  // This represents the OS-level high contrast theme. kNone unless the default
-  // system color scheme is kPlatformHighContrast.
-  enum class PlatformHighContrastColorScheme {
-    kNone = 0,
-    kDark = 1,
-    kLight = 2,
-    kMaxValue = kLight,
-  };
-
   // The color scheme used for painting the native controls.
   enum class ColorScheme {
     kDefault,
@@ -495,11 +482,6 @@
   // setting that triggers forced colors mode.
   bool InForcedColorsMode() const;
 
-  // Returns the PlatformHighContrastColorScheme used by the OS. Returns a value
-  // other than kNone only if the default system color scheme is
-  // kPlatformHighContrast.
-  PlatformHighContrastColorScheme GetPlatformHighContrastColorScheme() const;
-
   // Returns true when the NativeTheme uses a light-on-dark color scheme. If
   // you're considering using this function to choose between two hard-coded
   // colors, you probably shouldn't. Instead, use ColorProvider::GetColor().
@@ -593,9 +575,6 @@
   // pressed states.
   virtual SkColor GetSystemButtonPressedColor(SkColor base_color) const;
 
-  // Assign the focus-ring-appropriate alpha value to the provided base_color.
-  virtual SkColor4f FocusRingColorForBaseColor(SkColor4f base_color) const;
-
   float AdjustBorderWidthByZoom(float border_width, float zoom_level) const;
 
   float AdjustBorderRadiusByZoom(Part part,
diff --git a/ui/native_theme/native_theme_android.cc b/ui/native_theme/native_theme_android.cc
deleted file mode 100644
index 5f3696a..0000000
--- a/ui/native_theme/native_theme_android.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2012 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/native_theme/native_theme_android.h"
-
-#include "base/no_destructor.h"
-#include "base/notreached.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace ui {
-
-// static
-NativeTheme* NativeTheme::GetInstanceForWeb() {
-  return NativeThemeAndroid::instance();
-}
-
-NativeTheme* NativeTheme::GetInstanceForNativeUi() {
-  return NativeThemeAndroid::instance();
-}
-
-// static
-NativeThemeAndroid* NativeThemeAndroid::instance() {
-  static base::NoDestructor<NativeThemeAndroid> s_native_theme;
-  return s_native_theme.get();
-}
-
-gfx::Size NativeThemeAndroid::GetPartSize(Part part,
-                                          State state,
-                                          const ExtraParams& extra) const {
-  if (part == kCheckbox || part == kRadio) {
-    // Define the dimensions of radio buttons and checkboxes on Android. They
-    // are slightly bigger than the defaults in native_theme_base.cc, to make
-    // touch easier on small form factor devices.
-    static constexpr gfx::Size kCheckboxAndRadioSize(16, 16);
-    return kCheckboxAndRadioSize;
-  }
-  return NativeThemeBase::GetPartSize(part, state, extra);
-}
-
-void NativeThemeAndroid::AdjustCheckboxRadioRectForPadding(SkRect* rect) const {
-  // Take 1px for padding around the checkbox/radio button.
-  rect->setLTRB(static_cast<int>(rect->x()) + 1,
-                static_cast<int>(rect->y()) + 1,
-                static_cast<int>(rect->right()) - 1,
-                static_cast<int>(rect->bottom()) - 1);
-}
-
-SkColor NativeThemeAndroid::ControlsAccentColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedAccent;
-  } else if (state == kDisabled) {
-    color_id = kDisabledAccent;
-  } else {
-    color_id = kAccent;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeAndroid::ControlsSliderColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedSlider;
-  } else if (state == kDisabled) {
-    color_id = kDisabledSlider;
-  } else {
-    color_id = kSlider;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeAndroid::ControlsBorderColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedBorder;
-  } else if (state == kDisabled) {
-    color_id = kDisabledBorder;
-  } else {
-    color_id = kBorder;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeAndroid::ButtonBorderColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kButtonPressedBorder;
-  } else if (state == kDisabled) {
-    color_id = kButtonDisabledBorder;
-  } else {
-    color_id = kButtonBorder;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeAndroid::ControlsFillColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedFill;
-  } else if (state == kDisabled) {
-    color_id = kDisabledFill;
-  } else {
-    color_id = kFill;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeAndroid::ButtonFillColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kButtonPressedFill;
-  } else if (state == kDisabled) {
-    color_id = kButtonDisabledFill;
-  } else {
-    color_id = kButtonFill;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-NativeThemeAndroid::NativeThemeAndroid() = default;
-
-NativeThemeAndroid::~NativeThemeAndroid() = default;
-
-}  // namespace ui
diff --git a/ui/native_theme/native_theme_android.h b/ui/native_theme/native_theme_android.h
deleted file mode 100644
index ee7bcbc38..0000000
--- a/ui/native_theme/native_theme_android.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2012 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_NATIVE_THEME_NATIVE_THEME_ANDROID_H_
-#define UI_NATIVE_THEME_NATIVE_THEME_ANDROID_H_
-
-#include "base/no_destructor.h"
-#include "ui/native_theme/native_theme_base.h"
-
-namespace ui {
-
-// Android implementation of native theme support.
-class NativeThemeAndroid : public NativeThemeBase {
- public:
-  NativeThemeAndroid(const NativeThemeAndroid&) = delete;
-  NativeThemeAndroid& operator=(const NativeThemeAndroid&) = delete;
-
-  // NativeThemeBase:
-  gfx::Size GetPartSize(Part part,
-                        State state,
-                        const ExtraParams& extra) const override;
-
- protected:
-  friend class NativeTheme;
-  friend class base::NoDestructor<NativeThemeAndroid>;
-  static NativeThemeAndroid* instance();
-
-  // NativeThemeBase:
-  void AdjustCheckboxRadioRectForPadding(SkRect* rect) const override;
-  // TODO(crbug.com/40741411): Refine hover state behavior on available pointing
-  // devices.
-  SkColor ControlsAccentColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ControlsSliderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ButtonBorderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ButtonFillColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ControlsBorderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ControlsFillColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-
- private:
-  NativeThemeAndroid();
-  ~NativeThemeAndroid() override;
-};
-
-}  // namespace ui
-
-#endif  // UI_NATIVE_THEME_NATIVE_THEME_ANDROID_H_
diff --git a/ui/native_theme/native_theme_aura.cc b/ui/native_theme/native_theme_aura.cc
index 44db5f8..f7e0819 100644
--- a/ui/native_theme/native_theme_aura.cc
+++ b/ui/native_theme/native_theme_aura.cc
@@ -123,17 +123,6 @@
   return s_native_theme_for_web.get();
 }
 
-SkColor4f NativeThemeAura::FocusRingColorForBaseColor(
-    SkColor4f base_color) const {
-#if BUILDFLAG(IS_APPLE)
-  // On Mac OSX, the system Accent Color setting is darkened a bit
-  // for better contrast.
-  return SkColor4f(base_color.fR, base_color.fG, base_color.fB, 166 / 255.0f);
-#else
-  return base_color;
-#endif  // BUILDFLAG(IS_APPLE)
-}
-
 void NativeThemeAura::ConfigureWebInstance() {
   // Add the web native theme as an observer to stay in sync with color scheme
   // changes.
diff --git a/ui/native_theme/native_theme_aura.h b/ui/native_theme/native_theme_aura.h
index 8434f7f2..6e1a458 100644
--- a/ui/native_theme/native_theme_aura.h
+++ b/ui/native_theme/native_theme_aura.h
@@ -31,7 +31,6 @@
   static NativeThemeAura* web_instance();
 
   // Overridden from NativeTheme:
-  SkColor4f FocusRingColorForBaseColor(SkColor4f base_color) const override;
   void ConfigureWebInstance() override;
 
   // NativeThemeBase:
diff --git a/ui/native_theme/native_theme_base.h b/ui/native_theme/native_theme_base.h
index ea732b44..713c9275b 100644
--- a/ui/native_theme/native_theme_base.h
+++ b/ui/native_theme/native_theme_base.h
@@ -281,30 +281,27 @@
       State state,
       Part part) const;
 
-  virtual SkColor ControlsAccentColorForState(
+  SkColor ControlsAccentColorForState(
       State state,
       ColorScheme color_scheme,
       const ColorProvider* color_provider) const;
-  virtual SkColor ControlsSliderColorForState(
+  SkColor ControlsSliderColorForState(
       State state,
       ColorScheme color_scheme,
       const ColorProvider* color_provider) const;
-  virtual SkColor ButtonBorderColorForState(
+  SkColor ButtonBorderColorForState(State state,
+                                    ColorScheme color_scheme,
+                                    const ColorProvider* color_provider) const;
+  SkColor ButtonFillColorForState(State state,
+                                  ColorScheme color_scheme,
+                                  const ColorProvider* color_provider) const;
+  SkColor ControlsBorderColorForState(
       State state,
       ColorScheme color_scheme,
       const ColorProvider* color_provider) const;
-  virtual SkColor ButtonFillColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const;
-  virtual SkColor ControlsBorderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const;
-  virtual SkColor ControlsFillColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const;
+  SkColor ControlsFillColorForState(State state,
+                                    ColorScheme color_scheme,
+                                    const ColorProvider* color_provider) const;
   virtual float GetContrastRatioForState(State state, Part part) const;
   // Only scrollbar parts that change colors when hovered are supported.
   bool SupportedPartsForContrastingColor(Part part) const;
diff --git a/ui/native_theme/native_theme_ios.h b/ui/native_theme/native_theme_ios.h
deleted file mode 100644
index 420f74f1..0000000
--- a/ui/native_theme/native_theme_ios.h
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2023 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_NATIVE_THEME_NATIVE_THEME_IOS_H_
-#define UI_NATIVE_THEME_NATIVE_THEME_IOS_H_
-
-#include "base/no_destructor.h"
-#include "ui/native_theme/native_theme_base.h"
-
-namespace ui {
-
-// iOS implementation of native theme support.
-class NativeThemeIOS : public NativeThemeBase {
- public:
-  NativeThemeIOS(const NativeThemeIOS&) = delete;
-  NativeThemeIOS& operator=(const NativeThemeIOS&) = delete;
-
-  // NativeThemeBase:
-  gfx::Size GetPartSize(Part part,
-                        State state,
-                        const ExtraParams& extra) const override;
-
- protected:
-  friend class NativeTheme;
-  friend class base::NoDestructor<NativeThemeIOS>;
-  static NativeThemeIOS* instance();
-
-  // NativeThemeBase:
-  void AdjustCheckboxRadioRectForPadding(SkRect* rect) const override;
-  // TODO(crbug.com/40741411): Refine hover state behavior on available pointing
-  // devices.
-  SkColor ControlsAccentColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ControlsSliderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ButtonBorderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ButtonFillColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ControlsBorderColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-  SkColor ControlsFillColorForState(
-      State state,
-      ColorScheme color_scheme,
-      const ColorProvider* color_provider) const override;
-
- private:
-  NativeThemeIOS();
-  ~NativeThemeIOS() override;
-};
-
-}  // namespace ui
-
-#endif  // UI_NATIVE_THEME_NATIVE_THEME_IOS_H_
diff --git a/ui/native_theme/native_theme_ios.mm b/ui/native_theme/native_theme_ios.mm
deleted file mode 100644
index cd81d421..0000000
--- a/ui/native_theme/native_theme_ios.mm
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright 2023 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/native_theme/native_theme_ios.h"
-
-#include "base/no_destructor.h"
-#include "base/notreached.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace ui {
-
-namespace {
-// These are the default dimensions of radio buttons and checkboxes on Android.
-const int kCheckboxAndRadioWidth = 16;
-const int kCheckboxAndRadioHeight = 16;
-}  // namespace
-
-// static
-NativeTheme* NativeTheme::GetInstanceForWeb() {
-  return NativeThemeIOS::instance();
-}
-
-NativeTheme* NativeTheme::GetInstanceForNativeUi() {
-  NOTREACHED();
-}
-
-// static
-NativeThemeIOS* NativeThemeIOS::instance() {
-  static base::NoDestructor<NativeThemeIOS> s_native_theme;
-  return s_native_theme.get();
-}
-
-gfx::Size NativeThemeIOS::GetPartSize(Part part,
-                                      State state,
-                                      const ExtraParams& extra) const {
-  if (part == kCheckbox || part == kRadio) {
-    return gfx::Size(kCheckboxAndRadioWidth, kCheckboxAndRadioHeight);
-  }
-  return NativeThemeBase::GetPartSize(part, state, extra);
-}
-
-void NativeThemeIOS::AdjustCheckboxRadioRectForPadding(SkRect* rect) const {
-  // Take 1px for padding around the checkbox/radio button.
-  rect->setLTRB(static_cast<int>(rect->x()) + 1,
-                static_cast<int>(rect->y()) + 1,
-                static_cast<int>(rect->right()) - 1,
-                static_cast<int>(rect->bottom()) - 1);
-}
-
-SkColor NativeThemeIOS::ControlsAccentColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedAccent;
-  } else if (state == kDisabled) {
-    color_id = kDisabledAccent;
-  } else {
-    color_id = kAccent;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeIOS::ControlsSliderColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedSlider;
-  } else if (state == kDisabled) {
-    color_id = kDisabledSlider;
-  } else {
-    color_id = kSlider;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeIOS::ControlsBorderColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedBorder;
-  } else if (state == kDisabled) {
-    color_id = kDisabledBorder;
-  } else {
-    color_id = kBorder;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeIOS::ButtonBorderColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kButtonPressedBorder;
-  } else if (state == kDisabled) {
-    color_id = kButtonDisabledBorder;
-  } else {
-    color_id = kButtonBorder;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeIOS::ControlsFillColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kPressedFill;
-  } else if (state == kDisabled) {
-    color_id = kDisabledFill;
-  } else {
-    color_id = kFill;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-SkColor NativeThemeIOS::ButtonFillColorForState(
-    State state,
-    ColorScheme color_scheme,
-    const ColorProvider* color_provider) const {
-  ControlColorId color_id;
-  if (state == kPressed) {
-    color_id = kButtonPressedFill;
-  } else if (state == kDisabled) {
-    color_id = kButtonDisabledFill;
-  } else {
-    color_id = kButtonFill;
-  }
-  return GetControlColor(color_id, color_scheme, color_provider);
-}
-
-NativeThemeIOS::NativeThemeIOS() = default;
-
-NativeThemeIOS::~NativeThemeIOS() = default;
-
-}  // namespace ui
diff --git a/ui/native_theme/native_theme_mac_unittest.mm b/ui/native_theme/native_theme_mac_unittest.mm
index 6a97027..4785704 100644
--- a/ui/native_theme/native_theme_mac_unittest.mm
+++ b/ui/native_theme/native_theme_mac_unittest.mm
@@ -18,31 +18,6 @@
   ~TestNativeThemeMac() override = default;
 };
 
-TEST(NativeThemeMacTest, GetPlatformHighContrastColorScheme) {
-  using PrefScheme = NativeTheme::PreferredColorScheme;
-  using PrefContrast = NativeTheme::PreferredContrast;
-
-  constexpr NativeTheme::PlatformHighContrastColorScheme kNone =
-      NativeTheme::PlatformHighContrastColorScheme::kNone;
-
-  NativeTheme* native_theme = NativeTheme::GetInstanceForNativeUi();
-  ASSERT_TRUE(native_theme);
-
-  native_theme->SetPreferredContrast(PrefContrast::kNoPreference);
-  native_theme->set_preferred_color_scheme(PrefScheme::kDark);
-  EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
-
-  native_theme->set_preferred_color_scheme(PrefScheme::kLight);
-  EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
-
-  native_theme->SetPreferredContrast(PrefContrast::kMore);
-  native_theme->set_preferred_color_scheme(PrefScheme::kDark);
-  EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
-
-  native_theme->set_preferred_color_scheme(PrefScheme::kLight);
-  EXPECT_EQ(native_theme->GetPlatformHighContrastColorScheme(), kNone);
-}
-
 TEST(NativeThemeMacTest, ThumbSize) {
   EXPECT_EQ(gfx::Size(6.0, 18.0), NativeThemeMac::GetThumbMinSize(true, 1.0));
   EXPECT_EQ(gfx::Size(18.0, 6.0), NativeThemeMac::GetThumbMinSize(false, 1.0));
diff --git a/ui/native_theme/native_theme_mobile.cc b/ui/native_theme/native_theme_mobile.cc
new file mode 100644
index 0000000..995c062
--- /dev/null
+++ b/ui/native_theme/native_theme_mobile.cc
@@ -0,0 +1,52 @@
+// Copyright 2012 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/native_theme/native_theme_mobile.h"
+
+#include "base/no_destructor.h"
+#include "base/notreached.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace ui {
+
+// static
+NativeTheme* NativeTheme::GetInstanceForWeb() {
+  return NativeThemeMobile::instance();
+}
+
+NativeTheme* NativeTheme::GetInstanceForNativeUi() {
+  return NativeThemeMobile::instance();
+}
+
+// static
+NativeThemeMobile* NativeThemeMobile::instance() {
+  static base::NoDestructor<NativeThemeMobile> s_native_theme;
+  return s_native_theme.get();
+}
+
+gfx::Size NativeThemeMobile::GetPartSize(Part part,
+                                         State state,
+                                         const ExtraParams& extra) const {
+  if (part == kCheckbox || part == kRadio) {
+    // Radio buttons and checkboxes are slightly bigger than the defaults in
+    // `NativeThemeBase`, to make touch easier on small form factor devices.
+    static constexpr gfx::Size kCheckboxAndRadioSize(16, 16);
+    return kCheckboxAndRadioSize;
+  }
+  return NativeThemeBase::GetPartSize(part, state, extra);
+}
+
+void NativeThemeMobile::AdjustCheckboxRadioRectForPadding(SkRect* rect) const {
+  // Take 1px for padding around the checkbox/radio button.
+  rect->setLTRB(static_cast<int>(rect->x()) + 1,
+                static_cast<int>(rect->y()) + 1,
+                static_cast<int>(rect->right()) - 1,
+                static_cast<int>(rect->bottom()) - 1);
+}
+
+NativeThemeMobile::NativeThemeMobile() = default;
+
+NativeThemeMobile::~NativeThemeMobile() = default;
+
+}  // namespace ui
diff --git a/ui/native_theme/native_theme_mobile.h b/ui/native_theme/native_theme_mobile.h
new file mode 100644
index 0000000..5efa2f9
--- /dev/null
+++ b/ui/native_theme/native_theme_mobile.h
@@ -0,0 +1,39 @@
+// Copyright 2012 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_NATIVE_THEME_NATIVE_THEME_MOBILE_H_
+#define UI_NATIVE_THEME_NATIVE_THEME_MOBILE_H_
+
+#include "base/no_destructor.h"
+#include "ui/native_theme/native_theme_base.h"
+
+namespace ui {
+
+// Android implementation of native theme support.
+class NativeThemeMobile : public NativeThemeBase {
+ public:
+  NativeThemeMobile(const NativeThemeMobile&) = delete;
+  NativeThemeMobile& operator=(const NativeThemeMobile&) = delete;
+
+  // NativeThemeBase:
+  gfx::Size GetPartSize(Part part,
+                        State state,
+                        const ExtraParams& extra) const override;
+
+ protected:
+  friend class NativeTheme;
+  friend class base::NoDestructor<NativeThemeMobile>;
+  static NativeThemeMobile* instance();
+
+  // NativeThemeBase:
+  void AdjustCheckboxRadioRectForPadding(SkRect* rect) const override;
+
+ private:
+  NativeThemeMobile();
+  ~NativeThemeMobile() override;
+};
+
+}  // namespace ui
+
+#endif  // UI_NATIVE_THEME_NATIVE_THEME_MOBILE_H_
diff --git a/ui/native_theme/native_theme_win.cc b/ui/native_theme/native_theme_win.cc
index 0ca923fb..6fcc320 100644
--- a/ui/native_theme/native_theme_win.cc
+++ b/ui/native_theme/native_theme_win.cc
@@ -316,11 +316,24 @@
     ConfigureWebInstance();
   }
 
-#if BUILDFLAG(IS_WIN)
+  // Histogram high contrast state.
+  // NOTE: Reported in metrics; do not reorder, add additional values at end.
+  enum class HighContrastColorScheme {
+    kNone = 0,
+    kDark = 1,
+    kLight = 2,
+    kMaxValue = kLight,
+  };
+  auto color_scheme = HighContrastColorScheme::kNone;
+  if (InForcedColorsMode()) {
+    color_scheme =
+        (GetPreferredColorScheme() == NativeTheme::PreferredColorScheme::kDark)
+            ? HighContrastColorScheme::kDark
+            : HighContrastColorScheme::kLight;
+  }
   base::UmaHistogramEnumeration("Accessibility.WinHighContrastTheme",
-                                GetPlatformHighContrastColorScheme(),
-                                PlatformHighContrastColorScheme::kMaxValue);
-#endif
+                                color_scheme,
+                                HighContrastColorScheme::kMaxValue);
 }
 
 void NativeThemeWin::ConfigureWebInstance() {
diff --git a/ui/native_theme/native_theme_win_unittest.cc b/ui/native_theme/native_theme_win_unittest.cc
index 550bef9..8225a71e 100644
--- a/ui/native_theme/native_theme_win_unittest.cc
+++ b/ui/native_theme/native_theme_win_unittest.cc
@@ -87,28 +87,6 @@
   EXPECT_EQ(theme.CalculatePreferredContrast(), PrefContrast::kNoPreference);
 }
 
-TEST(NativeThemeWinTest, GetPlatformHighContrastColorScheme) {
-  using HCColorScheme = NativeTheme::PlatformHighContrastColorScheme;
-
-  TestNativeThemeWin theme;
-  theme.set_forced_colors(false);
-  theme.set_preferred_color_scheme(PrefScheme::kDark);
-  EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kNone);
-
-  theme.set_preferred_color_scheme(PrefScheme::kLight);
-  EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kNone);
-
-  theme.set_forced_colors(true);
-  theme.set_preferred_color_scheme(PrefScheme::kDark);
-  EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kDark);
-
-  theme.set_preferred_color_scheme(PrefScheme::kLight);
-  EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kLight);
-
-  theme.set_forced_colors(false);
-  EXPECT_EQ(theme.GetPlatformHighContrastColorScheme(), HCColorScheme::kNone);
-}
-
 TEST(NativeThemeWinTest, TestColorProviderKeyColorMode) {
   TestNativeThemeWin theme;
 
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index 8ac8b96..9d94262 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -126,6 +126,7 @@
   deps = [
     "//base",
     "//build/config/linux/libdrm",
+    "//components/viz/common:shared_image_format",
     "//gpu/vulkan:buildflags",
     "//ipc",
     "//media:media_buildflags",
@@ -222,6 +223,7 @@
   deps = [
     ":gbm",
     "//base/test:test_support",
+    "//components/viz/common:shared_image_format",
     "//skia",
     "//testing/gtest",
 
diff --git a/ui/ozone/platform/drm/gpu/DEPS b/ui/ozone/platform/drm/gpu/DEPS
index 313c9c2..55dac31a 100644
--- a/ui/ozone/platform/drm/gpu/DEPS
+++ b/ui/ozone/platform/drm/gpu/DEPS
@@ -8,3 +8,12 @@
   # TODO remove this once AFBC works for modesetting buffers.
   "+third_party/libdrm/src/include/drm/drm_fourcc.h",
 ]
+
+specific_include_rules = {
+  "mock_drm_modifiers_filter\.(cc|h)": [
+    "+components/viz/common/resources/shared_image_format.h",
+  ],
+  "hardware_display_controller.cc": [
+    "+components/viz/common/resources/shared_image_format_utils.h",
+  ],
+}
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
index 98e774d..1d8b54af 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller.cc
@@ -18,6 +18,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/trace_event/typed_macros.h"
+#include "components/viz/common/resources/shared_image_format_utils.h"
 #include "third_party/libdrm/src/include/drm/drm_fourcc.h"
 #include "third_party/perfetto/include/perfetto/tracing/traced_value.h"
 #include "third_party/skia/include/core/SkCanvas.h"
@@ -366,9 +367,9 @@
       crtc_controllers_[0]->GetFormatModifiers(fourcc_format);
 
   if (drm_modifiers_filter_) {
-    gfx::BufferFormat buffer_format =
-        GetBufferFormatFromFourCCFormat(fourcc_format);
-    modifiers = drm_modifiers_filter_->Filter(buffer_format, modifiers);
+    viz::SharedImageFormat si_format =
+        GetSharedImageFormatFromFourCCFormat(fourcc_format);
+    modifiers = drm_modifiers_filter_->Filter(si_format, modifiers);
   }
 
   for (size_t i = 1; i < crtc_controllers_.size(); ++i) {
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.cc b/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.cc
index f2a3eff..314e789 100644
--- a/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.cc
+++ b/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.cc
@@ -13,7 +13,7 @@
 MockDrmModifiersFilter::~MockDrmModifiersFilter() = default;
 
 std::vector<uint64_t> MockDrmModifiersFilter::Filter(
-    gfx::BufferFormat format,
+    viz::SharedImageFormat format,
     const std::vector<uint64_t>& modifiers) {
   std::vector<uint64_t> intersection;
   for (const auto& modifier : modifiers) {
diff --git a/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.h b/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.h
index 05f4e7e0..67dcf6e 100644
--- a/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.h
+++ b/ui/ozone/platform/drm/gpu/mock_drm_modifiers_filter.h
@@ -9,7 +9,7 @@
 #include <vector>
 
 #include "base/containers/flat_set.h"
-#include "ui/gfx/buffer_types.h"
+#include "components/viz/common/resources/shared_image_format.h"
 #include "ui/ozone/public/drm_modifiers_filter.h"
 
 namespace ui {
@@ -23,7 +23,7 @@
 
   ~MockDrmModifiersFilter() override;
 
-  std::vector<uint64_t> Filter(gfx::BufferFormat format,
+  std::vector<uint64_t> Filter(viz::SharedImageFormat format,
                                const std::vector<uint64_t>& modifiers) override;
 
  private:
diff --git a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
index be3b54e..6d93444 100644
--- a/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
+++ b/ui/ozone/platform/wayland/gpu/wayland_buffer_manager_gpu.cc
@@ -12,6 +12,7 @@
 #include "base/task/single_thread_task_runner.h"
 #include "base/trace_event/trace_event.h"
 #include "base/version.h"
+#include "components/viz/common/resources/shared_image_format_utils.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 #include "ui/gfx/geometry/rrect_f.h"
 #include "ui/gfx/linux/drm_util_linux.h"
@@ -351,7 +352,8 @@
   auto it = supported_buffer_formats_with_modifiers_.find(buffer_format);
   if (it != supported_buffer_formats_with_modifiers_.end()) {
     if (drm_modifiers_filter_) {
-      return drm_modifiers_filter_->Filter(buffer_format, it->second);
+      return drm_modifiers_filter_->Filter(
+          viz::GetSharedImageFormat(buffer_format), it->second);
     }
     return it->second;
   }
diff --git a/ui/ozone/platform/wayland/host/wayland_wp_color_manager.cc b/ui/ozone/platform/wayland/host/wayland_wp_color_manager.cc
index 5db7ef4..a03030238 100644
--- a/ui/ozone/platform/wayland/host/wayland_wp_color_manager.cc
+++ b/ui/ozone/platform/wayland/host/wayland_wp_color_manager.cc
@@ -19,7 +19,7 @@
 
 BASE_FEATURE(kWaylandWpColorManagerV1,
              "WaylandWpColorManagerV1",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 std::optional<wp_color_manager_v1_primaries> ColorSpaceToPrimaries(
     gfx::ColorSpace::PrimaryID primary_id) {
diff --git a/ui/ozone/platform/wayland/test/test_selection_device_manager.cc b/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
index 1c6e998..b221956 100644
--- a/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
+++ b/ui/ozone/platform/wayland/test/test_selection_device_manager.cc
@@ -90,7 +90,11 @@
       task_runner_(
           base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()})) {}
 
-TestSelectionSource::~TestSelectionSource() = default;
+TestSelectionSource::~TestSelectionSource() {
+  if (manager_) {
+    manager_->set_source(nullptr);
+  }
+}
 
 void TestSelectionSource::ReadData(const std::string& mime_type,
                                    ReadDataCallback callback) {
@@ -163,8 +167,10 @@
   auto* src = source ? GetUserDataAs<TestSelectionSource>(source) : nullptr;
   self->selection_serial_ = serial;
   self->delegate_->HandleSetSelection(src, serial);
-  if (self->manager_)
+  if (self->manager_) {
     self->manager_->set_source(src);
+    src->set_manager(self->manager_);
+  }
 }
 
 TestSelectionDeviceManager::TestSelectionDeviceManager(
diff --git a/ui/ozone/platform/wayland/test/test_selection_device_manager.h b/ui/ozone/platform/wayland/test/test_selection_device_manager.h
index dd15464..8970aaa 100644
--- a/ui/ozone/platform/wayland/test/test_selection_device_manager.h
+++ b/ui/ozone/platform/wayland/test/test_selection_device_manager.h
@@ -76,7 +76,7 @@
  private:
   const std::unique_ptr<Delegate> delegate_;
   raw_ptr<TestSelectionDevice> device_ = nullptr;
-  raw_ptr<TestSelectionSource, DanglingUntriaged> source_ = nullptr;
+  raw_ptr<TestSelectionSource> source_ = nullptr;
 };
 
 class TestSelectionOffer : public ServerObject {
@@ -132,6 +132,8 @@
   void OnDndAction(uint32_t action);
   void OnDndDropPerformed();
 
+  void set_manager(TestSelectionDeviceManager* manager) { manager_ = manager; }
+
   const std::vector<std::string>& mime_types() const { return mime_types_; }
 
   // Protocol object requests:
@@ -144,6 +146,7 @@
 
   std::vector<std::string> mime_types_;
   const scoped_refptr<base::SequencedTaskRunner> task_runner_;
+  raw_ptr<TestSelectionDeviceManager> manager_ = nullptr;
 };
 
 class TestSelectionDevice : public ServerObject {
diff --git a/ui/ozone/public/drm_modifiers_filter.h b/ui/ozone/public/drm_modifiers_filter.h
index ee7d875..c956b32 100644
--- a/ui/ozone/public/drm_modifiers_filter.h
+++ b/ui/ozone/public/drm_modifiers_filter.h
@@ -8,7 +8,10 @@
 #include <vector>
 
 #include "base/component_export.h"
-#include "ui/gfx/buffer_types.h"
+
+namespace viz {
+class SharedImageFormat;
+}  // namespace viz
 
 namespace ui {
 
@@ -29,7 +32,7 @@
   virtual ~DrmModifiersFilter() = default;
 
   virtual std::vector<uint64_t> Filter(
-      gfx::BufferFormat format,
+      viz::SharedImageFormat format,
       const std::vector<uint64_t>& modifiers) = 0;
 };
 
diff --git a/ui/qt/BUILD.gn b/ui/qt/BUILD.gn
index 1e39126..2b37cc66 100644
--- a/ui/qt/BUILD.gn
+++ b/ui/qt/BUILD.gn
@@ -142,6 +142,7 @@
   deps = [
     ":qt_interface",
     "//base",
+    "//cc/paint",
     "//printing/buildflags",
     "//ui/base/ime/linux",
     "//ui/color",
@@ -158,6 +159,8 @@
   }
 
   sources = [
+    "native_theme_qt.cc",
+    "native_theme_qt.h",
     "qt_ui.cc",
     "qt_ui.h",
   ]
diff --git a/ui/qt/DEPS b/ui/qt/DEPS
index 5d7b954..3705cde 100644
--- a/ui/qt/DEPS
+++ b/ui/qt/DEPS
@@ -1,5 +1,5 @@
 include_rules = [
-  "+cc/paint/paint_canvas.h",
+  "+cc/paint",
   "+chrome/browser/themes/theme_properties.h",
   "+printing",
   "+third_party/skia",
diff --git a/ui/qt/native_theme_qt.cc b/ui/qt/native_theme_qt.cc
new file mode 100644
index 0000000..42680cdd
--- /dev/null
+++ b/ui/qt/native_theme_qt.cc
@@ -0,0 +1,62 @@
+// Copyright 2025 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/qt/native_theme_qt.h"
+
+#include <cstdlib>
+#include <utility>
+
+#include "base/memory/raw_ptr.h"
+#include "cc/paint/paint_canvas.h"
+#include "cc/paint/paint_image.h"
+#include "third_party/skia/include/core/SkAlphaType.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColorType.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
+#include "ui/color/system_theme.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/native_theme/native_theme.h"
+#include "ui/native_theme/native_theme_aura.h"
+#include "ui/qt/qt_interface.h"
+
+namespace qt {
+
+NativeThemeQt::NativeThemeQt(QtInterface* shim)
+    : ui::NativeThemeAura(/*use_overlay_scrollbars=*/false,
+                          /*should_only_use_dark_colors=*/false,
+                          ui::SystemTheme::kQt),
+      shim_(shim) {}
+
+NativeThemeQt::~NativeThemeQt() = default;
+
+void NativeThemeQt::ThemeChanged(bool prefer_dark_theme) {
+  set_use_dark_colors(IsForcedDarkMode() || prefer_dark_theme);
+  set_preferred_color_scheme(CalculatePreferredColorScheme());
+
+  NotifyOnNativeThemeUpdated();
+}
+
+DISABLE_CFI_VCALL
+void NativeThemeQt::PaintFrameTopArea(
+    cc::PaintCanvas* canvas,
+    State state,
+    const gfx::Rect& rect,
+    const FrameTopAreaExtraParams& frame_top_area,
+    ColorScheme color_scheme) const {
+  auto image = shim_->DrawHeader(
+      rect.width(), rect.height(), frame_top_area.default_background_color,
+      frame_top_area.is_active ? ColorState::kNormal : ColorState::kInactive,
+      frame_top_area.use_custom_frame);
+  SkImageInfo image_info = SkImageInfo::Make(
+      image.width, image.height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
+  SkBitmap bitmap;
+  bitmap.installPixels(
+      image_info, image.data_argb.Take(), image_info.minRowBytes(),
+      [](void* data, void*) { free(data); }, nullptr);
+  bitmap.setImmutable();
+  canvas->drawImage(cc::PaintImage::CreateFromBitmap(std::move(bitmap)),
+                    rect.x(), rect.y());
+}
+
+}  // namespace qt
diff --git a/ui/qt/native_theme_qt.h b/ui/qt/native_theme_qt.h
new file mode 100644
index 0000000..2de5dcf
--- /dev/null
+++ b/ui/qt/native_theme_qt.h
@@ -0,0 +1,40 @@
+// Copyright 2025 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_QT_NATIVE_THEME_QT_H_
+#define UI_QT_NATIVE_THEME_QT_H_
+
+#include "base/memory/raw_ptr.h"
+#include "ui/native_theme/native_theme_aura.h"
+
+namespace qt {
+
+class QtInterface;
+
+class NativeThemeQt : public ui::NativeThemeAura {
+ public:
+  explicit NativeThemeQt(QtInterface* shim);
+  NativeThemeQt(const NativeThemeQt&) = delete;
+  NativeThemeQt& operator=(const NativeThemeQt&) = delete;
+  ~NativeThemeQt() override;
+
+  void ThemeChanged(bool prefer_dark_theme);
+
+ protected:
+  // ui::NativeThemeAura:
+  void PaintFrameTopArea(cc::PaintCanvas* canvas,
+                         State state,
+                         const gfx::Rect& rect,
+                         const FrameTopAreaExtraParams& frame_top_area,
+                         ColorScheme color_scheme) const override;
+
+ private:
+  // IMPORTANT NOTE: All members that use `shim_` must be decorated with
+  // `DISABLE_CFI_VCALL`.
+  raw_ptr<QtInterface> const shim_;
+};
+
+}  // namespace qt
+
+#endif  // UI_QT_NATIVE_THEME_QT_H_
diff --git a/ui/qt/qt_ui.cc b/ui/qt/qt_ui.cc
index ba332ce..e62c722 100644
--- a/ui/qt/qt_ui.cc
+++ b/ui/qt/qt_ui.cc
@@ -47,8 +47,7 @@
 #include "ui/linux/linux_ui.h"
 #include "ui/linux/linux_ui_delegate.h"
 #include "ui/linux/nav_button_provider.h"
-#include "ui/native_theme/native_theme_aura.h"
-#include "ui/native_theme/native_theme_base.h"
+#include "ui/qt/native_theme_qt.h"
 #include "ui/qt/qt_interface.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
 #include "ui/shell_dialogs/select_file_policy.h"
@@ -127,50 +126,6 @@
 
 }  // namespace
 
-class QtNativeTheme : public ui::NativeThemeAura {
- public:
-  explicit QtNativeTheme(QtInterface* shim)
-      : ui::NativeThemeAura(/*use_overlay_scrollbars=*/false,
-                            /*should_only_use_dark_colors=*/false,
-                            ui::SystemTheme::kQt),
-        shim_(shim) {}
-  QtNativeTheme(const QtNativeTheme&) = delete;
-  QtNativeTheme& operator=(const QtNativeTheme&) = delete;
-  ~QtNativeTheme() override = default;
-
-  void ThemeChanged(bool prefer_dark_theme) {
-    set_use_dark_colors(IsForcedDarkMode() || prefer_dark_theme);
-    set_preferred_color_scheme(CalculatePreferredColorScheme());
-
-    NotifyOnNativeThemeUpdated();
-  }
-
-  // ui::NativeTheme:
-  DISABLE_CFI_VCALL
-  void PaintFrameTopArea(cc::PaintCanvas* canvas,
-                         State state,
-                         const gfx::Rect& rect,
-                         const FrameTopAreaExtraParams& frame_top_area,
-                         ColorScheme color_scheme) const override {
-    auto image = shim_->DrawHeader(
-        rect.width(), rect.height(), frame_top_area.default_background_color,
-        frame_top_area.is_active ? ColorState::kNormal : ColorState::kInactive,
-        frame_top_area.use_custom_frame);
-    SkImageInfo image_info = SkImageInfo::Make(
-        image.width, image.height, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
-    SkBitmap bitmap;
-    bitmap.installPixels(
-        image_info, image.data_argb.Take(), image_info.minRowBytes(),
-        [](void* data, void*) { free(data); }, nullptr);
-    bitmap.setImmutable();
-    canvas->drawImage(cc::PaintImage::CreateFromBitmap(std::move(bitmap)),
-                      rect.x(), rect.y());
-  }
-
- private:
-  raw_ptr<QtInterface> const shim_;
-};
-
 QtUi::QtUi(ui::LinuxUi* fallback_linux_ui)
     : fallback_linux_ui_(fallback_linux_ui) {}
 
@@ -255,7 +210,7 @@
   cmd_line_ = CopyCmdLine(cmd_line);
   shim_.reset((reinterpret_cast<decltype(&CreateQtInterface)>(
       create_qt_interface)(this, &cmd_line_.argc, cmd_line_.argv.data())));
-  native_theme_ = std::make_unique<QtNativeTheme>(shim_.get());
+  native_theme_ = std::make_unique<NativeThemeQt>(shim_.get());
   ui::ColorProviderManager::Get().AppendColorProviderInitializer(
       base::BindRepeating(&QtUi::AddNativeColorMixer, base::Unretained(this)));
   ScaleFactorMaybeChangedImpl();
diff --git a/ui/qt/qt_ui.h b/ui/qt/qt_ui.h
index a73906e..3543fd1 100644
--- a/ui/qt/qt_ui.h
+++ b/ui/qt/qt_ui.h
@@ -23,7 +23,7 @@
 
 namespace qt {
 
-class QtNativeTheme;
+class NativeThemeQt;
 
 // Interface to QT desktop features.
 class QtUi : public ui::LinuxUiAndTheme, QtInterface::Delegate {
@@ -111,7 +111,7 @@
   std::optional<gfx::FontRenderParams> font_params_;
   std::unique_ptr<QtInterface> shim_;
 
-  std::unique_ptr<QtNativeTheme> native_theme_;
+  std::unique_ptr<NativeThemeQt> native_theme_;
 
   std::optional<SkColor> accent_color_;
 
diff --git a/ui/views/controls/button/label_button_unittest.cc b/ui/views/controls/button/label_button_unittest.cc
index e955351..e6b70c4 100644
--- a/ui/views/controls/button/label_button_unittest.cc
+++ b/ui/views/controls/button/label_button_unittest.cc
@@ -726,8 +726,6 @@
 // Ensure the label resets the enabled color after LabelButton::OnThemeChanged()
 // is invoked.
 TEST_F(LabelButtonTest, OnThemeChanged) {
-  ASSERT_NE(button()->GetNativeTheme()->GetPlatformHighContrastColorScheme(),
-            ui::NativeTheme::PlatformHighContrastColorScheme::kDark);
   ASSERT_NE(button()->label()->GetBackgroundColor(), SK_ColorBLACK);
   EXPECT_EQ(themed_normal_text_color_, button()->label()->GetEnabledColor());
 
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc
index 5002b5a..7f3c3a2 100644
--- a/ui/views/controls/textfield/textfield.cc
+++ b/ui/views/controls/textfield/textfield.cc
@@ -203,11 +203,6 @@
 }  // namespace
 
 // static
-base::TimeDelta Textfield::GetCaretBlinkInterval() {
-  return ui::NativeTheme::GetInstanceForNativeUi()->GetCaretBlinkInterval();
-}
-
-// static
 const gfx::FontList& Textfield::GetDefaultFontList() {
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
   return rb.GetFontListWithDelta(ui::kLabelFontSizeDelta);
@@ -3083,13 +3078,17 @@
 }
 
 bool Textfield::ShouldBlinkCursor() const {
-  return ShouldShowCursor() && !Textfield::GetCaretBlinkInterval().is_zero();
+  return ShouldShowCursor() && !ui::NativeTheme::GetInstanceForNativeUi()
+                                    ->GetCaretBlinkInterval()
+                                    .is_zero();
 }
 
 void Textfield::StartBlinkingCursor() {
   DCHECK(ShouldBlinkCursor());
-  cursor_blink_timer_.Start(FROM_HERE, Textfield::GetCaretBlinkInterval(), this,
-                            &Textfield::OnCursorBlinkTimerFired);
+  cursor_blink_timer_.Start(
+      FROM_HERE,
+      ui::NativeTheme::GetInstanceForNativeUi()->GetCaretBlinkInterval(), this,
+      &Textfield::OnCursorBlinkTimerFired);
 }
 
 void Textfield::StopBlinkingCursor() {
diff --git a/ui/views/controls/textfield/textfield.h b/ui/views/controls/textfield/textfield.h
index ba0b37c..516e0a0 100644
--- a/ui/views/controls/textfield/textfield.h
+++ b/ui/views/controls/textfield/textfield.h
@@ -110,9 +110,6 @@
   // Pair of |text_changed|, |cursor_changed|.
   using EditCommandResult = std::pair<bool, bool>;
 
-  // Returns the text cursor blink time, or 0 for no blinking.
-  static base::TimeDelta GetCaretBlinkInterval();
-
   // Returns the default FontList used by all textfields.
   static const gfx::FontList& GetDefaultFontList();
 
diff --git a/ui/views/view_unittest.cc b/ui/views/view_unittest.cc
index 76777c23..bf86ce3 100644
--- a/ui/views/view_unittest.cc
+++ b/ui/views/view_unittest.cc
@@ -55,7 +55,6 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/transform.h"
 #include "ui/native_theme/native_theme.h"
-#include "ui/native_theme/test_native_theme.h"
 #include "ui/strings/grit/ui_strings.h"
 #include "ui/views/background.h"
 #include "ui/views/controls/native/native_view_host.h"
@@ -6429,19 +6428,17 @@
   Widget::InitParams params = CreateParams(
       Widget::InitParams::CLIENT_OWNS_WIDGET, Widget::InitParams::TYPE_WINDOW);
   widget->Init(std::move(params));
+  EXPECT_TRUE(widget->GetNativeTheme());
 
   TestView* test_view_ptr =
       widget->GetRootView()->AddChildView(std::move(test_view));
-  EXPECT_TRUE(test_view_ptr->native_theme_);
   EXPECT_EQ(widget->GetNativeTheme(), test_view_ptr->native_theme_);
-  EXPECT_TRUE(test_view_child->native_theme_);
   EXPECT_EQ(widget->GetNativeTheme(), test_view_child->native_theme_);
 
   // Child view added after the widget hierarchy exists should also get the
   // notification.
   TestView* test_view_child_2 =
       test_view_ptr->AddChildView(std::make_unique<TestView>());
-  EXPECT_TRUE(test_view_child_2->native_theme_);
   EXPECT_EQ(widget->GetNativeTheme(), test_view_child_2->native_theme_);
 }
 
@@ -6498,23 +6495,6 @@
 }
 
 // See comment above test for details.
-class WidgetWithCustomTheme : public Widget {
- public:
-  explicit WidgetWithCustomTheme(ui::TestNativeTheme* theme) : theme_(theme) {}
-
-  WidgetWithCustomTheme(const WidgetWithCustomTheme&) = delete;
-  WidgetWithCustomTheme& operator=(const WidgetWithCustomTheme&) = delete;
-
-  ~WidgetWithCustomTheme() override = default;
-
-  // Widget:
-  const ui::NativeTheme* GetNativeTheme() const override { return theme_; }
-
- private:
-  raw_ptr<ui::TestNativeTheme> theme_;
-};
-
-// See comment above test for details.
 class ViewThatAddsViewInOnThemeChanged : public View {
   METADATA_HEADER(ViewThatAddsViewInOnThemeChanged, View)
 
@@ -6528,19 +6508,17 @@
 
   ~ViewThatAddsViewInOnThemeChanged() override = default;
 
-  bool on_native_theme_changed_called() const {
-    return on_native_theme_changed_called_;
-  }
+  bool on_theme_changed_called() const { return on_theme_changed_called_; }
 
   // View:
   void OnThemeChanged() override {
     View::OnThemeChanged();
-    on_native_theme_changed_called_ = true;
+    on_theme_changed_called_ = true;
     GetWidget()->GetRootView()->AddChildView(std::make_unique<View>());
   }
 
  private:
-  bool on_native_theme_changed_called_ = false;
+  bool on_theme_changed_called_ = false;
 };
 
 BEGIN_METADATA(ViewThatAddsViewInOnThemeChanged)
@@ -6560,22 +6538,16 @@
 // called before the layer hierarchy was updated. OnThemeChanged() should be
 // called after the layer hierarchy matches the view hierarchy.
 TEST_F(ViewTest, CrashOnAddFromFromOnThemeChanged) {
-  ui::TestNativeTheme theme;
-  auto widget = std::make_unique<WidgetWithCustomTheme>(&theme);
-  test::WidgetDestroyedWaiter waiter(widget.get());
+  auto widget = std::make_unique<Widget>();
   Widget::InitParams params = CreateParams(
       Widget::InitParams::CLIENT_OWNS_WIDGET, Widget::InitParams::TYPE_POPUP);
   params.bounds = gfx::Rect(50, 50, 350, 350);
   widget->Init(std::move(params));
 
   AddViewWithChildLayer(widget->GetRootView());
-  ViewThatAddsViewInOnThemeChanged* v = widget->GetRootView()->AddChildView(
+  const auto* const v = widget->GetRootView()->AddChildView(
       std::make_unique<ViewThatAddsViewInOnThemeChanged>());
-  EXPECT_TRUE(v->on_native_theme_changed_called());
-  // Initiate an explicit close and wait to ensure the |theme| outlives the
-  // |widget|.
-  widget->Close();
-  waiter.Wait();
+  EXPECT_TRUE(v->on_theme_changed_called());
 }
 
 // A View that removes its Layer when hidden.