diff --git a/DEPS b/DEPS
index 73a0586..5f81bdd8 100644
--- a/DEPS
+++ b/DEPS
@@ -310,19 +310,19 @@
   # 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': 'daac40a8c36b8511e43db0ede65732c6b67d1ad2',
+  'src_internal_revision': '79116fa67c8a1a0806af034eb2a9a7a3557607c0',
   # 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': 'c6413673d2d4d6e3a4837d3cecfe152243042415',
+  'skia_revision': '0577d064a86e401ad61ee1ea4203b97ce84cf50c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '160c55f1d4b89c8a9e249130838d9e729325b528',
+  'v8_revision': 'cf3e1f0da09e0b0f79590acafeca0ce554a4b16b',
   # 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': 'eb0d59973d21f845b5785563f5d56b8ebb617478',
+  'angle_revision': 'ecf11ecaea1a4ed9fd08180bc85f6f07dbc0e9b1',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -385,11 +385,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '693c3fa3c2b617718dbbe1abd2ef0fc0910380b6',
+  'catapult_revision': 'c9ccea1a729cb6952cabdb42c192b87a9a08ba3a',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': 'c7a1ed20f78b82abdad55681d847beb9b965a3eb',
+  'chromium_variations_revision': '6099a9750a5666fa63898f7d004b36783d28e64e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -405,7 +405,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': '614e1c8242dfa60a241368d72c31384c14afaba3',
+  'devtools_frontend_revision': '257cb6402543b90ddd45043d94242b1824238e48',
   # 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.
@@ -465,7 +465,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libavif
   # and whatever else without interference from each other.
-  'libavif_revision': 'd1c26facaf5a8a97919ceee06814d05d10e25622',
+  'libavif_revision': '3669d47e1f9f3ea5ab0e3a923b15fad185ac2209',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libavif
   # and whatever else without interference from each other.
@@ -477,7 +477,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
-  'nearby_revision': '94df1ffc4c00ff142d2f1f7c6c603f80d922bca4',
+  'nearby_revision': '8846f8b57e53276687955562f58d2bfdbf63b3a9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling securemessage
   # and whatever else without interference from each other.
@@ -845,12 +845,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'e3a3ec407403dece9002c87d4de7130e2ab877e4',
+    'ca072aadc88771c0536b5c9b92925967b0dae51c',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'c83dfcabbbce1956edf91dbdc1d863cb062e3fd5',
+    'url': Var('chromium_git') + '/website.git' + '@' + 'ca1c5b7a5c17baf0bda343ab5bb4e18c30c87c01',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1295,13 +1295,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4dac5d6b4b39a26d72698e701e59c47278d66fec',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '50b27a5308a405646b627691b48c55e007eb5418',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '616289d464d11fbcc8c8b063af4d2b6c372f5e14',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '69e043f071f8ff003d40c9fe6ca3f266087119a5',
     'condition': 'checkout_src_internal',
   },
 
@@ -2098,7 +2098,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'Hq35AnVhNtu2wY53wL3YoMZ9vU-3MjHraOSG48ylyfcC',
+        'version': 'TWnrL5QSAJ6Aeeojdx-f3F9vBA2yMVFecBsZ5UbmYwoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -2109,7 +2109,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'WQhQ1yvqxxJCvtF8U_Qzrf3v0JDR3sTnLhSlzgKuuMcC',
+        'version': 'KgIp37tDSV_n8owFLmJ1FeRFoEBheU46ACoddkuEARYC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS
index 0212e47..2c929e75 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -911,6 +911,10 @@
                   '|chrome/browser/ash/policy/status_collector/'\
                   '|components/policy/proto/record',
     },
+    'crosapi': {
+      'filepath': 'chromeos/crosapi/'\
+                  '|chrome/browser/ash/crosapi/',
+    },
     'crosapi_mojom': {
       'filepath': 'chromeos/crosapi/mojom/crosapi.mojom',
     },
@@ -2682,6 +2686,7 @@
               'wry+watch-creator@chromium.org',],
     'cros_commercial_policy': ['enterprise-policy-review@google.com'],
     'cros_reporting': ['cros-reporting-reviews@google.com'],
+    'crosapi': ['ffred+watch@chromium.org', 'tluk+watch@chromium.org'],
     'crosapi_mojom': ['elkurin+watch@chromium.org'],
     'crostini': ['crostini-ui@chromium.org'],
     'cups_printing': ['print-reviews+cups@chromium.org',
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java b/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java
index 570043d..b43b3f0 100644
--- a/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java
+++ b/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java
@@ -11,24 +11,40 @@
 import org.chromium.android_webview.common.Lifetime;
 import org.chromium.base.ThreadUtils;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Lifetime.Singleton
 public class ProfileStore {
+    private final Map<String, Profile> mProfiles = new HashMap<>();
+
+    private static ProfileStore sINSTANCE;
+
+    private ProfileStore() {}
+
+    public static ProfileStore getInstance() {
+        ThreadUtils.checkUiThread();
+        if (sINSTANCE == null) {
+            sINSTANCE = new ProfileStore();
+        }
+        return sINSTANCE;
+    }
+
     @NonNull
     public Profile getOrCreateProfile(@NonNull String name) {
         ThreadUtils.checkUiThread();
-        return new Profile(AwBrowserContext.getNamedContext(name, true));
+        return mProfiles.computeIfAbsent(name,
+                profileName -> new Profile(AwBrowserContext.getNamedContext(profileName, true)));
     }
 
     @Nullable
     public Profile getProfile(@NonNull String name) {
         ThreadUtils.checkUiThread();
-        AwBrowserContext browserContext = AwBrowserContext.getNamedContext(name, false);
-        if (browserContext != null) {
-            return new Profile(browserContext);
-        }
-        return null;
+        return mProfiles.computeIfAbsent(name, profileName -> {
+            AwBrowserContext browserContext = AwBrowserContext.getNamedContext(profileName, false);
+            return browserContext != null ? new Profile(browserContext) : null;
+        });
     }
 
     @NonNull
@@ -40,6 +56,12 @@
     @NonNull
     public boolean deleteProfile(@NonNull String name) {
         ThreadUtils.checkUiThread();
-        return AwBrowserContext.deleteNamedContext(name);
+        boolean deletionResult = AwBrowserContext.deleteNamedContext(name);
+        if (deletionResult) {
+            mProfiles.remove(name);
+        } else {
+            assert !mProfiles.containsKey(name);
+        }
+        return deletionResult;
     }
 }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java
index b37ba3f..4ee54c0e 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java
@@ -58,7 +58,7 @@
     @Override
     @NonNull
     public boolean deleteProfile(@NonNull String name) {
-        recordApiCall(ApiCall.DELETE_PROFILE_ASYNC);
+        recordApiCall(ApiCall.DELETE_PROFILE);
         return mImpl.deleteProfile(name);
     }
 }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
index d56b608..a263f24 100644
--- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
+++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
@@ -186,7 +186,7 @@
             ApiCall.GET_OR_CREATE_PROFILE,
             ApiCall.GET_PROFILE,
             ApiCall.GET_ALL_PROFILE_NAMES,
-            ApiCall.DELETE_PROFILE_ASYNC,
+            ApiCall.DELETE_PROFILE,
             ApiCall.GET_PROFILE_NAME,
             ApiCall.GET_PROFILE_COOKIE_MANAGER,
             ApiCall.GET_PROFILE_WEB_STORAGE,
@@ -289,7 +289,7 @@
         int GET_OR_CREATE_PROFILE = 84;
         int GET_PROFILE = 85;
         int GET_ALL_PROFILE_NAMES = 86;
-        int DELETE_PROFILE_ASYNC = 87;
+        int DELETE_PROFILE = 87;
         int GET_PROFILE_NAME = 88;
         int GET_PROFILE_COOKIE_MANAGER = 89;
         int GET_PROFILE_WEB_STORAGE = 90;
@@ -491,7 +491,7 @@
             synchronized (mAwInit.getLock()) {
                 if (mProfileStore == null) {
                     mProfileStore = BoundaryInterfaceReflectionUtil.createInvocationHandlerFor(
-                            new SupportLibProfileStore(new ProfileStore()));
+                            new SupportLibProfileStore(ProfileStore.getInstance()));
                 }
             }
             return mProfileStore;
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index d992345..12de18f 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1020,6 +1020,8 @@
     "rounded_display/rounded_display_host.h",
     "rounded_display/rounded_display_provider.cc",
     "rounded_display/rounded_display_provider.h",
+    "scalable_iph/scalable_iph_ash_notification_view.cc",
+    "scalable_iph/scalable_iph_ash_notification_view.h",
     "scalable_iph/wallpaper_ash_notification_view.cc",
     "scalable_iph/wallpaper_ash_notification_view.h",
     "scoped_animation_disabler.cc",
@@ -2845,6 +2847,7 @@
     "//chromeos/ash/components/peripheral_notification",
     "//chromeos/ash/components/phonehub",
     "//chromeos/ash/components/scalable_iph:buildflags",
+    "//chromeos/ash/components/scalable_iph:constants",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
     "//chromeos/ash/resources:resources_grit",
@@ -3317,6 +3320,7 @@
     "rounded_display/rounded_display_gutter_unittest.cc",
     "rounded_display/rounded_display_host_unittest.cc",
     "rounded_display/rounded_display_provider_unittest.cc",
+    "scalable_iph/scalable_iph_ash_notification_view_unittest.cc",
     "scalable_iph/wallpaper_ash_notification_view_unittest.cc",
     "screen_util_unittest.cc",
     "sensor_info/sensor_provider_unittest.cc",
@@ -3854,6 +3858,7 @@
     "//chromeos/ash/components/network:test_support",
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/components/phonehub:test_support",
+    "//chromeos/ash/components/scalable_iph:constants",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
     "//chromeos/ash/services/assistant:test_support",
diff --git a/ash/capture_mode/capture_label_view.cc b/ash/capture_mode/capture_label_view.cc
index e865b72..ecb3e24 100644
--- a/ash/capture_mode/capture_label_view.cc
+++ b/ash/capture_mode/capture_label_view.cc
@@ -180,9 +180,7 @@
 
   capture_mode_util::SetHighlightBorder(
       this, kCaptureLabelRadius,
-      chromeos::features::IsJellyrollEnabled()
-          ? views::HighlightBorder::Type::kHighlightBorderNoShadow
-          : views::HighlightBorder::Type::kHighlightBorder2);
+      views::HighlightBorder::Type::kHighlightBorderNoShadow);
 
   shadow_->SetRoundedCornerRadius(kCaptureLabelRadius);
 }
diff --git a/ash/capture_mode/capture_mode_bar_view.cc b/ash/capture_mode/capture_mode_bar_view.cc
index 308b4ee..f08d38db 100644
--- a/ash/capture_mode/capture_mode_bar_view.cc
+++ b/ash/capture_mode/capture_mode_bar_view.cc
@@ -102,9 +102,7 @@
 
   capture_mode_util::SetHighlightBorder(
       this, border_radius,
-      chromeos::features::IsJellyrollEnabled()
-          ? views::HighlightBorder::Type::kHighlightBorderOnShadow
-          : views::HighlightBorder::Type::kHighlightBorder2);
+      views::HighlightBorder::Type::kHighlightBorderOnShadow);
 
   shadow_->SetRoundedCornerRadius(border_radius);
 }
diff --git a/ash/capture_mode/capture_mode_settings_view.cc b/ash/capture_mode/capture_mode_settings_view.cc
index ffb8128..ca48931b 100644
--- a/ash/capture_mode/capture_mode_settings_view.cc
+++ b/ash/capture_mode/capture_mode_settings_view.cc
@@ -248,9 +248,7 @@
 
   capture_mode_util::SetHighlightBorder(
       this, kCornerRadius,
-      chromeos::features::IsJellyrollEnabled()
-          ? views::HighlightBorder::Type::kHighlightBorderOnShadow
-          : views::HighlightBorder::Type::kHighlightBorder1);
+      views::HighlightBorder::Type::kHighlightBorderOnShadow);
 
   shadow_->SetRoundedCornerRadius(kCornerRadius);
 }
diff --git a/ash/capture_mode/key_item_view.cc b/ash/capture_mode/key_item_view.cc
index 17f369b..291b5f3 100644
--- a/ash/capture_mode/key_item_view.cc
+++ b/ash/capture_mode/key_item_view.cc
@@ -55,9 +55,7 @@
 
   capture_mode_util::SetHighlightBorder(
       this, kKeyItemHeight / 2,
-      chromeos::features::IsJellyrollEnabled()
-          ? views::HighlightBorder::Type::kHighlightBorderOnShadow
-          : views::HighlightBorder::Type::kHighlightBorder1);
+      views::HighlightBorder::Type::kHighlightBorderOnShadow);
 
   shadow_->SetRoundedCornerRadius(kKeyItemHeight / 2);
 }
diff --git a/ash/capture_mode/recording_type_menu_view.cc b/ash/capture_mode/recording_type_menu_view.cc
index 1674208..f1dee10 100644
--- a/ash/capture_mode/recording_type_menu_view.cc
+++ b/ash/capture_mode/recording_type_menu_view.cc
@@ -75,9 +75,7 @@
 
   capture_mode_util::SetHighlightBorder(
       this, kCornerRadius,
-      chromeos::features::IsJellyrollEnabled()
-          ? views::HighlightBorder::Type::kHighlightBorderOnShadow
-          : views::HighlightBorder::Type::kHighlightBorder1);
+      views::HighlightBorder::Type::kHighlightBorderOnShadow);
 
   shadow_->SetRoundedCornerRadius(kCornerRadius);
 }
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h
index 9d0d382..f0f3c9f6 100644
--- a/ash/constants/ash_pref_names.h
+++ b/ash/constants/ash_pref_names.h
@@ -1815,6 +1815,26 @@
 inline constexpr char kFocusModeDoNotDisturb[] =
     "ash.focus_mode.do_not_disturb";
 
+// An integer pref that holds enum value of current demo mode configuration.
+// Values are defined by DemoSession::DemoModeConfig enum.
+inline constexpr char kDemoModeConfig[] = "demo_mode.config";
+
+// A string pref holding the value of the current country for demo sessions.
+inline constexpr char kDemoModeCountry[] = "demo_mode.country";
+
+// A string pref holding the value of the retailer name input for demo sessions.
+// This is now mostly called "retailer_name" in code other than in this pref and
+// in Omaha request attributes
+inline constexpr char kDemoModeRetailerId[] = "demo_mode.retailer_id";
+
+// A string pref holding the value of the store number input for demo sessions.
+// This is now mostly called "store_number" in code other than in this pref and
+// in Omaha request attributes
+inline constexpr char kDemoModeStoreId[] = "demo_mode.store_id";
+
+// A string pref holding the value of the default locale for demo sessions.
+inline constexpr char kDemoModeDefaultLocale[] = "demo_mode.default_locale";
+
 // NOTE: New prefs should start with the "ash." prefix. Existing prefs moved
 // into this file should not be renamed, since they may be synced.
 
diff --git a/ash/public/mojom/accelerator_configuration.mojom b/ash/public/mojom/accelerator_configuration.mojom
index 68f2a06..353f994b 100644
--- a/ash/public/mojom/accelerator_configuration.mojom
+++ b/ash/public/mojom/accelerator_configuration.mojom
@@ -39,4 +39,6 @@
   // but it's not necessarily an error. This state warns users of the downsides
   // of using a non-search accelerator.
   kNonSearchAcceleratorWarning = 11,
+  // Error - search + function key is not allowed.
+  kSearchWithFunctionKeyNotAllowed = 12,
 };
\ No newline at end of file
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
index 15d34c3..5199785 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
@@ -524,7 +524,7 @@
 
     if (pair_failure.has_value()) {
       NotifyInitializedError(pair_failure.value());
-    } else {
+    } else if (on_initialized_callback_) {
       is_initialized_ = true;
       RecordGattInitializationStep(
           FastPairGattConnectionSteps::kConnectionEstablished);
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc
index 1436d39..66750eb7 100644
--- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc
+++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc
@@ -1291,5 +1291,15 @@
   WritePersonalizedName(empty);
 }
 
+// Regression test for b/300596153
+TEST_F(FastPairGattServiceClientTest,
+       NoCrashWhenGattDiscoveryCompleteForServiceCalledTwice) {
+  SuccessfulGattConnectionSetUp();
+  NotifyGattDiscoveryCompleteForService(
+      ash::quick_pair::kFastPairBluetoothUuid);
+  NotifyGattDiscoveryCompleteForService(
+      ash::quick_pair::kFastPairBluetoothUuid);
+}
+
 }  // namespace quick_pair
 }  // namespace ash
diff --git a/ash/scalable_iph/DEPS b/ash/scalable_iph/DEPS
index ccf2762..1fb1129f3 100644
--- a/ash/scalable_iph/DEPS
+++ b/ash/scalable_iph/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
   "+chromeos/ash/components/scalable_iph/buildflags.h",
+  "+chromeos/ash/components/scalable_iph/scalable_iph_constants.h",
   "+chromeos/ash/grit/ash_resources.h",
 ]
diff --git a/ash/scalable_iph/scalable_iph_ash_notification_view.cc b/ash/scalable_iph/scalable_iph_ash_notification_view.cc
new file mode 100644
index 0000000..77cf9e00
--- /dev/null
+++ b/ash/scalable_iph/scalable_iph_ash_notification_view.cc
@@ -0,0 +1,49 @@
+// 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 "ash/scalable_iph/scalable_iph_ash_notification_view.h"
+
+#include "base/check.h"
+#include "chromeos/ash/components/scalable_iph/scalable_iph_constants.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/message_center/views/notification_header_view.h"
+
+namespace ash {
+
+ScalableIphAshNotificationView::ScalableIphAshNotificationView(
+    const message_center::Notification& notification,
+    bool shown_in_popup)
+    : AshNotificationView(notification, shown_in_popup) {
+  UpdateWithNotification(notification);
+}
+
+ScalableIphAshNotificationView::~ScalableIphAshNotificationView() = default;
+
+// static
+std::unique_ptr<message_center::MessageView>
+ScalableIphAshNotificationView::CreateView(
+    const message_center::Notification& notification,
+    bool shown_in_popup) {
+  return std::make_unique<ScalableIphAshNotificationView>(notification,
+                                                          shown_in_popup);
+}
+
+void ScalableIphAshNotificationView::UpdateWithNotification(
+    const message_center::Notification& notification) {
+  NotificationViewBase::UpdateWithNotification(notification);
+
+  auto* header = header_row();
+  CHECK(header);
+  header->SetSummaryText(scalable_iph::kNotificationSummaryText);
+}
+
+message_center::NotificationHeaderView*
+ScalableIphAshNotificationView::GetHeaderRowForTesting() {
+  return header_row();
+}
+
+BEGIN_METADATA(ScalableIphAshNotificationView, AshNotificationView)
+END_METADATA
+
+}  // namespace ash
diff --git a/ash/scalable_iph/scalable_iph_ash_notification_view.h b/ash/scalable_iph/scalable_iph_ash_notification_view.h
new file mode 100644
index 0000000..e7a32bd
--- /dev/null
+++ b/ash/scalable_iph/scalable_iph_ash_notification_view.h
@@ -0,0 +1,50 @@
+// 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 ASH_SCALABLE_IPH_SCALABLE_IPH_ASH_NOTIFICATION_VIEW_H_
+#define ASH_SCALABLE_IPH_SCALABLE_IPH_ASH_NOTIFICATION_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ash/system/message_center/ash_notification_view.h"
+
+namespace message_center {
+class MessageView;
+class Notification;
+class NotificationHeaderView;
+}  // namespace message_center
+
+namespace ash {
+
+// A customized notification view for scalable IPH that adds the summary text.
+class ASH_EXPORT ScalableIphAshNotificationView : public AshNotificationView {
+ public:
+  METADATA_HEADER(ScalableIphAshNotificationView);
+
+  ScalableIphAshNotificationView(
+      const message_center::Notification& notification,
+      bool shown_in_popup);
+  ScalableIphAshNotificationView(const ScalableIphAshNotificationView&) =
+      delete;
+  ScalableIphAshNotificationView& operator=(
+      const ScalableIphAshNotificationView&) = delete;
+  ~ScalableIphAshNotificationView() override;
+
+  // Creates a notification with a custom summary text.
+  static std::unique_ptr<message_center::MessageView> CreateView(
+      const message_center::Notification& notification,
+      bool shown_in_popup);
+
+  // AshNotificationView:
+  void UpdateWithNotification(
+      const message_center::Notification& notification) override;
+
+  message_center::NotificationHeaderView* GetHeaderRowForTesting();
+
+ private:
+  friend class ScalableIphAshNotificationViewTest;
+};
+
+}  // namespace ash
+
+#endif  // ASH_SCALABLE_IPH_SCALABLE_IPH_ASH_NOTIFICATION_VIEW_H_
diff --git a/ash/scalable_iph/scalable_iph_ash_notification_view_unittest.cc b/ash/scalable_iph/scalable_iph_ash_notification_view_unittest.cc
new file mode 100644
index 0000000..3ce005b8
--- /dev/null
+++ b/ash/scalable_iph/scalable_iph_ash_notification_view_unittest.cc
@@ -0,0 +1,52 @@
+// 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 "ash/scalable_iph/scalable_iph_ash_notification_view.h"
+
+#include "ash/constants/notifier_catalogs.h"
+#include "ash/system/message_center/ash_notification_view.h"
+#include "ash/test/ash_test_base.h"
+#include "chromeos/ash/components/scalable_iph/scalable_iph_constants.h"
+#include "ui/message_center/public/cpp/notification.h"
+#include "ui/message_center/public/cpp/notification_types.h"
+#include "ui/message_center/public/cpp/notifier_id.h"
+#include "ui/message_center/views/notification_header_view.h"
+#include "ui/views/controls/label.h"
+
+namespace ash {
+
+class ScalableIphAshNotificationViewTest : public AshTestBase {
+ public:
+  ScalableIphAshNotificationViewTest()
+      : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
+  ~ScalableIphAshNotificationViewTest() override = default;
+
+ protected:
+  message_center::Notification CreateNotification() {
+    message_center::RichNotificationData rich_notification_data;
+    return message_center::Notification(
+        message_center::NOTIFICATION_TYPE_SIMPLE, "notification_id",
+        u"test_title", u"test message", ui::ImageModel(),
+        /*display_source=*/std::u16string(), GURL(),
+        message_center::NotifierId(
+            message_center::NotifierType::SYSTEM_COMPONENT, "notifier_id",
+            NotificationCatalogName::kScalableIphNotification),
+        rich_notification_data, new message_center::NotificationDelegate());
+  }
+};
+
+TEST_F(ScalableIphAshNotificationViewTest, NotificationHasSummaryText) {
+  auto notification = CreateNotification();
+  auto message_view =
+      ScalableIphAshNotificationView::CreateView(notification,
+                                                 /*shown_in_popup=*/true);
+  auto* notification_view =
+      static_cast<ScalableIphAshNotificationView*>(message_view.get());
+  auto* header_row = notification_view->GetHeaderRowForTesting();
+  // Notification should have the expected summary text.
+  EXPECT_EQ(scalable_iph::kNotificationSummaryText,
+            header_row->summary_text_for_testing()->GetText());
+}
+
+}  // namespace ash
diff --git a/ash/scalable_iph/wallpaper_ash_notification_view.cc b/ash/scalable_iph/wallpaper_ash_notification_view.cc
index 456145f..4d94b670 100644
--- a/ash/scalable_iph/wallpaper_ash_notification_view.cc
+++ b/ash/scalable_iph/wallpaper_ash_notification_view.cc
@@ -5,6 +5,7 @@
 #include "ash/scalable_iph/wallpaper_ash_notification_view.h"
 
 #include "ash/public/cpp/rounded_image_view.h"
+#include "ash/scalable_iph/scalable_iph_ash_notification_view.h"
 #include "base/check.h"
 #include "base/notreached.h"
 #include "build/buildflag.h"
@@ -62,7 +63,7 @@
 WallpaperAshNotificationView::WallpaperAshNotificationView(
     const message_center::Notification& notification,
     bool shown_in_popup)
-    : AshNotificationView(notification, shown_in_popup) {
+    : ScalableIphAshNotificationView(notification, shown_in_popup) {
   UpdateWithNotification(notification);
 }
 
@@ -81,7 +82,7 @@
     const message_center::Notification& notification) {
   preview_ = nullptr;
 
-  NotificationViewBase::UpdateWithNotification(notification);
+  ScalableIphAshNotificationView::UpdateWithNotification(notification);
   CreatePreview();
 }
 
@@ -101,7 +102,7 @@
   }
 }
 
-BEGIN_METADATA(WallpaperAshNotificationView, AshNotificationView)
+BEGIN_METADATA(WallpaperAshNotificationView, ScalableIphAshNotificationView)
 END_METADATA
 
 }  // namespace ash
diff --git a/ash/scalable_iph/wallpaper_ash_notification_view.h b/ash/scalable_iph/wallpaper_ash_notification_view.h
index 2890c79..22451597 100644
--- a/ash/scalable_iph/wallpaper_ash_notification_view.h
+++ b/ash/scalable_iph/wallpaper_ash_notification_view.h
@@ -6,7 +6,7 @@
 #define ASH_SCALABLE_IPH_WALLPAPER_ASH_NOTIFICATION_VIEW_H_
 
 #include "ash/ash_export.h"
-#include "ash/system/message_center/ash_notification_view.h"
+#include "ash/scalable_iph/scalable_iph_ash_notification_view.h"
 #include "base/memory/raw_ptr.h"
 
 namespace message_center {
@@ -24,7 +24,8 @@
 
 // A customized notification view for scalable IPH that adjusts the notification
 // by showing four preview images for wallpaper.
-class ASH_EXPORT WallpaperAshNotificationView : public AshNotificationView {
+class ASH_EXPORT WallpaperAshNotificationView
+    : public ScalableIphAshNotificationView {
  public:
   METADATA_HEADER(WallpaperAshNotificationView);
 
diff --git a/ash/system/power/battery_notification.cc b/ash/system/power/battery_notification.cc
index 6241751..b5390036 100644
--- a/ash/system/power/battery_notification.cc
+++ b/ash/system/power/battery_notification.cc
@@ -219,6 +219,10 @@
             ->battery_saver_controller()
             ->ShowBatterySaverModeEnabledToast();
       }
+
+      // Dismiss notification from Message Center.
+      message_center::MessageCenter::Get()->RemoveNotification(
+          BatteryNotification::kNotificationId, false);
       break;
     }
     default:
diff --git a/ash/system/power/battery_notification_unittest.cc b/ash/system/power/battery_notification_unittest.cc
index 93219f7..e07f20d 100644
--- a/ash/system/power/battery_notification_unittest.cc
+++ b/ash/system/power/battery_notification_unittest.cc
@@ -93,7 +93,6 @@
   }
 
   void TestBatterySaverNotification(
-      const PowerStatus& status,
       const ExpectedNotificationValues& expected_values,
       PowerNotificationController::NotificationState notification_state,
       bool expected_bsm_state_after_click) {
@@ -122,6 +121,9 @@
     // NotificationState.
     notification->delegate()->Click(0, absl::nullopt);
 
+    // Test that notification is dismissed after button is pressed.
+    EXPECT_EQ(GetBatteryNotification(), nullptr);
+
     // Test Enable Toast on Button Click in Opt-In Branch.
     if (notification_state ==
         PowerNotificationController::NOTIFICATION_BSM_THRESHOLD_OPT_IN) {
@@ -281,7 +283,7 @@
 
   // Battery Saver should turn off when the button is clicked.
   TestBatterySaverNotification(
-      *PowerStatus::Get(), expected_values,
+      expected_values,
       PowerNotificationController::NOTIFICATION_BSM_ENABLING_AT_THRESHOLD,
       /*expected_bsm_state_after_click=*/false);
 }
@@ -303,7 +305,7 @@
 
   // Battery Saver should turn off when the button is clicked.
   TestBatterySaverNotification(
-      *PowerStatus::Get(), expected_values,
+      expected_values,
       PowerNotificationController::NOTIFICATION_BSM_ENABLING_AT_THRESHOLD,
       /*expected_bsm_state_after_click=*/false);
 }
@@ -324,7 +326,7 @@
 
   // Battery Saver should turn on when the button is clicked.
   TestBatterySaverNotification(
-      *PowerStatus::Get(), expected_values,
+      expected_values,
       PowerNotificationController::NOTIFICATION_BSM_THRESHOLD_OPT_IN,
       /*expected_bsm_state_after_click=*/true);
 }
@@ -347,7 +349,7 @@
 
   // Battery Saver should turn on when the button is clicked.
   TestBatterySaverNotification(
-      *PowerStatus::Get(), expected_values,
+      expected_values,
       PowerNotificationController::NOTIFICATION_BSM_THRESHOLD_OPT_IN,
       /*expected_bsm_state_after_click=*/true);
 }
diff --git a/ash/system/power/battery_saver_controller.cc b/ash/system/power/battery_saver_controller.cc
index 1b8d00fa..e0cc2c1 100644
--- a/ash/system/power/battery_saver_controller.cc
+++ b/ash/system/power/battery_saver_controller.cc
@@ -266,11 +266,18 @@
         PowerStatus::Get()->GetRoundedBatteryPercent() <=
         GetPowerNotificationController()->GetLowPowerPercentage();
 
-    // Only update the user_opt_status_ when we are at or below the threshold.
-    // This way, auto-enable kicks in from threshold+1% -> threshold% even if
-    // the user has BSM disabled (either manually or via restored local pref)
-    // beforehand.
-    if (reason == UpdateReason::kSettings && crossed_threshold) {
+    // For auto-enabled, only update the user_opt_status_ when we are at or
+    // below the threshold.This way, auto-enable kicks in from threshold+1% ->
+    // threshold% even if the user has BSM disabled (either manually or via
+    // restored local pref) beforehand.
+    // If we are in the opt-in branch, we should capture user intent at any
+    // threshold.
+    const bool should_capture_user_intent =
+        (crossed_threshold ||
+         features::kBatterySaverNotificationBehavior.Get() ==
+             features::kBSMOptIn);
+
+    if (reason == UpdateReason::kSettings && should_capture_user_intent) {
       // Whether user_opt_status_ is true or false when active is true or false
       // depends on the experiment arm we are in.
       SetUserOptStatus(features::kBatterySaverNotificationBehavior.Get() ==
diff --git a/ash/system/power/power_notification_controller.cc b/ash/system/power/power_notification_controller.cc
index da80f5c..ebbc38fb 100644
--- a/ash/system/power/power_notification_controller.cc
+++ b/ash/system/power/power_notification_controller.cc
@@ -297,12 +297,6 @@
           }
         }
 
-        // If the user manually turned on battery saver mode before we got to
-        // the threshold, then set the user's intention as wanting it enabled.
-        if (was_active) {
-          SetUserOptStatus(true);
-        }
-
         // Send Opt-In Notification at
         // `battery_saver_activation_charge_percent_` battery percentage or
         // update the notification state if we're on USB power.
diff --git a/ash/webui/scanning/resources/BUILD.gn b/ash/webui/scanning/resources/BUILD.gn
index d0cba3a..05a57f70 100644
--- a/ash/webui/scanning/resources/BUILD.gn
+++ b/ash/webui/scanning/resources/BUILD.gn
@@ -32,8 +32,8 @@
 
   web_component_files = [
     "action_toolbar.ts",
-    "color_mode_select.js",
-    "file_type_select.js",
+    "color_mode_select.ts",
+    "file_type_select.ts",
     "loading_page.ts",
     "multi_page_checkbox.js",
     "multi_page_scan.js",
diff --git a/ash/webui/scanning/resources/color_mode_select.html b/ash/webui/scanning/resources/color_mode_select.html
index f5000d8..6252f0e 100644
--- a/ash/webui/scanning/resources/color_mode_select.html
+++ b/ash/webui/scanning/resources/color_mode_select.html
@@ -10,7 +10,7 @@
       <template is="dom-repeat" items="[[options]]" as="colorMode">
         <option value="[[colorMode]]"
             selected$="[[isDefaultOption(colorMode)]]">
-          [[getColorModeString_(colorMode)]]
+          [[getColorModeAsString(colorMode)]]
         </option>
       </template>
     </select>
diff --git a/ash/webui/scanning/resources/color_mode_select.js b/ash/webui/scanning/resources/color_mode_select.ts
similarity index 71%
rename from ash/webui/scanning/resources/color_mode_select.js
rename to ash/webui/scanning/resources/color_mode_select.ts
index ce2b2b5c..e8a26ba 100644
--- a/ash/webui/scanning/resources/color_mode_select.js
+++ b/ash/webui/scanning/resources/color_mode_select.ts
@@ -6,7 +6,7 @@
 import './strings.m.js';
 
 import {assert} from 'chrome://resources/ash/common/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './color_mode_select.html.js';
@@ -22,41 +22,28 @@
  * 'color-mode-select' displays the available scanner color modes in a dropdown.
  */
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {I18nBehaviorInterface}
- * @implements {SelectBehaviorInterface}
- */
+// TODO(b/300484132): Replace mixinBehavior with mixin implementation once a
+// Mixin version of SelectBehavior is available.
 const ColorModeSelectElementBase =
-    mixinBehaviors([I18nBehavior, SelectBehavior], PolymerElement);
+    mixinBehaviors([I18nBehavior, SelectBehavior], PolymerElement) as
+    {new (): PolymerElement & I18nBehavior & SelectBehaviorInterface};
 
-/** @polymer */
 class ColorModeSelectElement extends ColorModeSelectElementBase {
   static get is() {
-    return 'color-mode-select';
+    return 'color-mode-select' as const;
   }
 
   static get template() {
     return getTemplate();
   }
 
-  /**
-   * @param {number} index
-   * @return {string}
-   */
-  getOptionAtIndex(index) {
+  getOptionAtIndex(index: number): string {
     assert(index < this.options.length);
 
     return this.options[index].toString();
   }
 
-  /**
-   * @param {!ColorMode} mojoColorMode
-   * @return {string}
-   * @private
-   */
-  getColorModeString_(mojoColorMode) {
+  getColorModeAsString(mojoColorMode: ColorMode): string {
     return getColorModeString(mojoColorMode);
   }
 
@@ -66,13 +53,15 @@
     });
   }
 
-  /**
-   * @param {!ColorMode} option
-   * @return {boolean}
-   */
-  isDefaultOption(option) {
+  isDefaultOption(option: ColorMode): boolean {
     return option === DEFAULT_COLOR_MODE;
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [ColorModeSelectElement.is]: ColorModeSelectElement;
+  }
+}
+
 customElements.define(ColorModeSelectElement.is, ColorModeSelectElement);
diff --git a/ash/webui/scanning/resources/file_type_select.js b/ash/webui/scanning/resources/file_type_select.js
deleted file mode 100644
index db3f530..0000000
--- a/ash/webui/scanning/resources/file_type_select.js
+++ /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.
-
-import './scan_settings_section.js';
-import './strings.m.js';
-
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-
-import {getTemplate} from './file_type_select.html.js';
-
-/**
- * @fileoverview
- * 'file-type-select' displays the available file types in a dropdown.
- */
-
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {I18nBehaviorInterface}
- */
-const FileTypeSelectElementBase =
-    mixinBehaviors([I18nBehavior], PolymerElement);
-
-/** @polymer */
-class FileTypeSelectElement extends FileTypeSelectElementBase {
-  static get is() {
-    return 'file-type-select';
-  }
-
-  static get template() {
-    return getTemplate();
-  }
-
-  static get properties() {
-    return {
-      /** @type {boolean} */
-      disabled: Boolean,
-
-      /** @type {string} */
-      selectedFileType: {
-        type: String,
-        notify: true,
-      },
-    };
-  }
-}
-
-customElements.define(FileTypeSelectElement.is, FileTypeSelectElement);
diff --git a/ash/webui/scanning/resources/file_type_select.ts b/ash/webui/scanning/resources/file_type_select.ts
new file mode 100644
index 0000000..44dcbe7
--- /dev/null
+++ b/ash/webui/scanning/resources/file_type_select.ts
@@ -0,0 +1,50 @@
+// 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.
+
+import './scan_settings_section.js';
+import './strings.m.js';
+
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './file_type_select.html.js';
+
+/**
+ * @fileoverview
+ * 'file-type-select' displays the available file types in a dropdown.
+ */
+
+const FileTypeSelectElementBase = I18nMixin(PolymerElement);
+
+class FileTypeSelectElement extends FileTypeSelectElementBase {
+  static get is() {
+    return 'file-type-select' as const;
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      disabled: Boolean,
+
+      selectedFileType: {
+        type: String,
+        notify: true,
+      },
+    };
+  }
+
+  disabled: boolean;
+  selectedFileType: string;
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    [FileTypeSelectElement.is]: FileTypeSelectElement;
+  }
+}
+
+customElements.define(FileTypeSelectElement.is, FileTypeSelectElement);
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
index 8f7fd8b5..45f3432 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
@@ -472,6 +472,16 @@
     return AcceleratorConfigResult::kShiftOnlyNotAllowed;
   }
 
+  // Case: A function key accelerator cannot have the meta key modifier.
+  if ((modifiers & ui::EF_COMMAND_DOWN) != 0 &&
+      ui::KeyboardCapability::IsFunctionKey(accelerator.key_code())) {
+    VLOG(1) << "Failed to validate accelerator: "
+            << accelerator.GetShortcutText() << " with error: "
+            << static_cast<int>(AcceleratorConfigResult::kKeyNotAllowed)
+            << ". Accelerator has meta key with Function key.";
+    return AcceleratorConfigResult::kSearchWithFunctionKeyNotAllowed;
+  }
+
   // No errors with the accelerator.
   return absl::nullopt;
 }
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
index 0b3103e..b2625f2 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -1571,6 +1571,17 @@
                           AcceleratorAction::kToggleMirrorMode,
                           top_row_accelerator, &result);
   EXPECT_EQ(mojom::AcceleratorConfigResult::kKeyNotAllowed, result->result);
+
+  // Search with Function key is not allowed.
+  const ui::Accelerator search_function_accelerator(ui::VKEY_F1,
+                                                    ui::EF_COMMAND_DOWN);
+  ash::shortcut_customization::mojom::
+      AcceleratorConfigurationProviderAsyncWaiter(provider_.get())
+          .AddAccelerator(mojom::AcceleratorSource::kAsh,
+                          AcceleratorAction::kToggleMirrorMode,
+                          search_function_accelerator, &result);
+  EXPECT_EQ(mojom::AcceleratorConfigResult::kSearchWithFunctionKeyNotAllowed,
+            result->result);
 }
 
 TEST_F(AcceleratorConfigurationProviderTest, AddAcceleratorExceedsMaximum) {
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc
index d81d070..b4c0d45 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc
@@ -415,8 +415,8 @@
            NonConfigurableAcceleratorDetails(
                {ui::Accelerator(ui::VKEY_OEM_PERIOD, ui::EF_CONTROL_DOWN)})},
           {NonConfigurableActions::kAmbientCaretBrowsing,
-           NonConfigurableAcceleratorDetails({ui::Accelerator(
-               ui::VKEY_7, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN)})},
+           NonConfigurableAcceleratorDetails(
+               {ui::Accelerator(ui::VKEY_F7, ui::EF_CONTROL_DOWN)})},
           {NonConfigurableActions::kBrowserAutoComplete,
            NonConfigurableAcceleratorDetails(
                {ui::Accelerator(ui::VKEY_RETURN, ui::EF_CONTROL_DOWN)})},
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts
index 4cb3445..69ea9e2 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts
@@ -385,6 +385,14 @@
         this.hasError = true;
         return;
       }
+      // Search with function keys are not allowed.
+      // TODO(b/286268215): localize string.
+      case AcceleratorConfigResult.kSearchWithFunctionKeyNotAllowed: {
+        this.statusMessage =
+            this.i18n('searchWithFunctionKeyNotAllowedStatusMessage');
+        this.hasError = true;
+        return;
+      }
       // Conflict with a locked accelerator.
       case AcceleratorConfigResult.kConflict:
       case AcceleratorConfigResult.kActionLocked: {
diff --git a/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc b/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
index 65b1145..3f37638 100644
--- a/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
+++ b/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
@@ -84,6 +84,8 @@
        IDS_SHORTCUT_CUSTOMIZATION_MISSING_MODIFIER_STATUS_MESSAGE},
       {"keyNotAllowedStatusMessage",
        IDS_SHORTCUT_CUSTOMIZATION_KEY_NOT_ALLOWED_STATUS_MESSAGE},
+      {"searchWithFunctionKeyNotAllowedStatusMessage",
+       IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE},
       {"warningSearchNotIncluded",
        IDS_SHORTCUT_CUSTOMIZATION_NON_SEARCH_SHORTCUT_WARNING},
       {"searchNoResults", IDS_SHORTCUT_CUSTOMIZATION_SEARCH_NO_RESULTS},
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index 64c6ef6c..e58d37e 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -595,6 +595,12 @@
   available_container_ids_.pop();
   Desk* new_desk = desks_.back().get();
 
+  // We should notify observers that the desk is added before possibly
+  // notifying observers that the name is set.
+  for (auto& observer : observers_) {
+    observer.OnDeskAdded(new_desk, /*from_undo=*/false);
+  }
+
   // The new desk should have an empty name when the user creates a desk with
   // a button. This is done to encourage them to rename their desks.
   const bool empty_name =
@@ -620,9 +626,6 @@
                                   base::NumberToString16(desks_.size())));
   }
 
-  for (auto& observer : observers_)
-    observer.OnDeskAdded(new_desk, /*from_undo=*/false);
-
   if (!is_first_ever_desk) {
     if (features::IsDeskButtonEnabled()) {
       PrefService* prefs =
diff --git a/ash/wm_mode/wm_mode_controller.cc b/ash/wm_mode/wm_mode_controller.cc
index f69a94a..1f952cd 100644
--- a/ash/wm_mode/wm_mode_controller.cc
+++ b/ash/wm_mode/wm_mode_controller.cc
@@ -219,11 +219,7 @@
 void WmModeController::OnDeskNameChanged(const Desk* desk,
                                          const std::u16string& new_name) {
   auto* desks_controller = DesksController::Get();
-  if (!pie_menu_view_ ||
-      pie_menu_view_->GetOrAddSubMenuForButton(kMoveToDeskButtonId)
-              ->button_count() != desks_controller->desks().size()) {
-    // Sometimes we received the desk-name change notification before the desk-
-    // addition notification. This has been reported in b/298726506.
+  if (!pie_menu_view_) {
     return;
   }
   const int index = desks_controller->GetDeskIndex(desk);
diff --git a/base/debug/dwarf_line_no.cc b/base/debug/dwarf_line_no.cc
index 2f12ea4..513b132f 100644
--- a/base/debug/dwarf_line_no.cc
+++ b/base/debug/dwarf_line_no.cc
@@ -1267,7 +1267,7 @@
 
 }  // namespace
 
-bool GetDwarfSourceLineNumber(void* pc,
+bool GetDwarfSourceLineNumber(const void* pc,
                               uintptr_t cu_offset,
                               char* out,
                               size_t out_size) {
@@ -1291,7 +1291,7 @@
   return true;
 }
 
-void GetDwarfCompileUnitOffsets(void* const* trace,
+void GetDwarfCompileUnitOffsets(const void* const* trace,
                                 uint64_t* cu_offsets,
                                 size_t num_frames) {
   // Ensure `cu_offsets` always has a known state.
diff --git a/base/debug/dwarf_line_no.h b/base/debug/dwarf_line_no.h
index 2a51aa8..dde7fbe 100644
--- a/base/debug/dwarf_line_no.h
+++ b/base/debug/dwarf_line_no.h
@@ -15,7 +15,7 @@
 //
 // Expects `trace` and `cu_offsets` to be `num_frames` in size. If a frame
 // cannot be found, the corresponding value stored in `cu_offsets` is 0.
-void GetDwarfCompileUnitOffsets(void* const* trace,
+void GetDwarfCompileUnitOffsets(const void* const* trace,
                                 uint64_t* cu_offsets,
                                 size_t num_frames);
 
@@ -29,7 +29,7 @@
 //   ../../base/debug/stack_trace_unittest.cc:120,16
 //
 // This means `pc` was from line 120, column 16, of stack_trace_unittest.cc.
-bool GetDwarfSourceLineNumber(void* pc,
+bool GetDwarfSourceLineNumber(const void* pc,
                               uint64_t cu_offsets,
                               char* out,
                               size_t out_size);
diff --git a/base/debug/stack_trace.h b/base/debug/stack_trace.h
index ef208def..a16c959 100644
--- a/base/debug/stack_trace.h
+++ b/base/debug/stack_trace.h
@@ -134,7 +134,7 @@
   void InitTrace(const _CONTEXT* context_record);
 #endif
 
-  void* trace_[kMaxTraces];
+  const void* trace_[kMaxTraces];
 
   // The number of valid frames in |trace_|.
   size_t count_;
@@ -145,7 +145,7 @@
 
 // Record a stack trace with up to |count| frames into |trace|. Returns the
 // number of frames read.
-BASE_EXPORT size_t CollectStackTrace(void** trace, size_t count);
+BASE_EXPORT size_t CollectStackTrace(const void** trace, size_t count);
 
 #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
 
diff --git a/base/debug/stack_trace_android.cc b/base/debug/stack_trace_android.cc
index 7e98002..3911830 100644
--- a/base/debug/stack_trace_android.cc
+++ b/base/debug/stack_trace_android.cc
@@ -75,7 +75,7 @@
   return (sigaction(SIGPIPE, &action, NULL) == 0);
 }
 
-size_t CollectStackTrace(void** trace, size_t count) {
+size_t CollectStackTrace(const void** trace, size_t count) {
   StackCrawlState state(reinterpret_cast<uintptr_t*>(trace), count);
   _Unwind_Backtrace(&TraceStackFrame, &state);
   return state.frame_count;
diff --git a/base/debug/stack_trace_fuchsia.cc b/base/debug/stack_trace_fuchsia.cc
index 1c55e93..543e475b 100644
--- a/base/debug/stack_trace_fuchsia.cc
+++ b/base/debug/stack_trace_fuchsia.cc
@@ -29,7 +29,7 @@
 namespace {
 
 struct BacktraceData {
-  void** trace_array;
+  const void** trace_array;
   size_t* count;
   size_t max;
 };
@@ -203,7 +203,7 @@
 
 // Returns true if |address| is contained by any of the memory regions
 // mapped for |module_entry|.
-bool ModuleContainsFrameAddress(void* address,
+bool ModuleContainsFrameAddress(const void* address,
                                 const SymbolMap::Module& module_entry) {
   for (size_t i = 0; i < module_entry.segment_count; ++i) {
     const SymbolMap::Segment& segment = module_entry.segments[i];
@@ -229,7 +229,7 @@
   return true;
 }
 
-size_t CollectStackTrace(void** trace, size_t count) {
+size_t CollectStackTrace(const void** trace, size_t count) {
   size_t frame_count = 0;
   BacktraceData data = {trace, &frame_count, count};
   _Unwind_Backtrace(&UnwindStore, &data);
diff --git a/base/debug/stack_trace_posix.cc b/base/debug/stack_trace_posix.cc
index d46701a..5fec90b3 100644
--- a/base/debug/stack_trace_posix.cc
+++ b/base/debug/stack_trace_posix.cc
@@ -163,7 +163,7 @@
 };
 
 #if defined(HAVE_BACKTRACE)
-void OutputPointer(void* pointer, BacktraceOutputHandler* handler) {
+void OutputPointer(const void* pointer, BacktraceOutputHandler* handler) {
   // This should be more than enough to store a 64-bit number in hex:
   // 16 hex digits + 1 for null-terminator.
   char buf[17] = { '\0' };
@@ -191,7 +191,7 @@
 }
 #endif  // defined(USE_SYMBOLIZE)
 
-void ProcessBacktrace(void* const* trace,
+void ProcessBacktrace(const void* const* trace,
                       size_t size,
                       const char* prefix_string,
                       BacktraceOutputHandler* handler) {
@@ -218,8 +218,8 @@
 
     // Subtract by one as return address of function may be in the next
     // function when a function is annotated as noreturn.
-    void* address = static_cast<char*>(trace[i]) - 1;
-    if (google::Symbolize(address, buf, sizeof(buf))) {
+    const void* address = static_cast<const char*>(trace[i]) - 1;
+    if (google::Symbolize(const_cast<void*>(address), buf, sizeof(buf))) {
       handler->HandleOutput(buf);
 #if BUILDFLAG(ENABLE_STACK_TRACE_LINE_NUMBERS)
       // Only output the source line number if the offset was found. Otherwise,
@@ -268,8 +268,8 @@
     }
     printed = true;
 #else   // defined(HAVE_DLADDR)
-    std::unique_ptr<char*, FreeDeleter> trace_symbols(
-        backtrace_symbols(trace, static_cast<int>(size)));
+    std::unique_ptr<char*, FreeDeleter> trace_symbols(backtrace_symbols(
+        const_cast<void* const*>(trace), static_cast<int>(size)));
     if (trace_symbols.get()) {
       for (size_t i = 0; i < size; ++i) {
         std::string trace_symbol = trace_symbols.get()[i];
@@ -1026,19 +1026,18 @@
 }
 #endif
 
-size_t CollectStackTrace(void** trace, size_t count) {
+size_t CollectStackTrace(const void** trace, size_t count) {
   // NOTE: This code MUST be async-signal safe (it's used by in-process
   // stack dumping signal handler). NO malloc or stdio is allowed here.
 
 #if defined(NO_UNWIND_TABLES) && BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
   // If we do not have unwind tables, then try tracing using frame pointers.
-  return base::debug::TraceStackFramePointers(const_cast<const void**>(trace),
-                                              count, 0);
+  return base::debug::TraceStackFramePointers(trace, count, 0);
 #elif defined(HAVE_BACKTRACE)
   // Though the backtrace API man page does not list any possible negative
   // return values, we take no chance.
   return base::saturated_cast<size_t>(
-      backtrace(trace, base::saturated_cast<int>(count)));
+      backtrace(const_cast<void**>(trace), base::saturated_cast<int>(count)));
 #else
   return 0;
 #endif
diff --git a/base/debug/stack_trace_win.cc b/base/debug/stack_trace_win.cc
index e7328d6..75bd006 100644
--- a/base/debug/stack_trace_win.cc
+++ b/base/debug/stack_trace_win.cc
@@ -324,9 +324,9 @@
   return InitializeSymbols();
 }
 
-NOINLINE size_t CollectStackTrace(void** trace, size_t count) {
+NOINLINE size_t CollectStackTrace(const void** trace, size_t count) {
   // When walking our own stack, use CaptureStackBackTrace().
-  return CaptureStackBackTrace(0, count, trace, NULL);
+  return CaptureStackBackTrace(0, count, const_cast<void**>(trace), NULL);
 }
 
 StackTrace::StackTrace(EXCEPTION_POINTERS* exception_pointers) {
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.cc b/base/sampling_heap_profiler/sampling_heap_profiler.cc
index f7b7be7..0e7d658 100644
--- a/base/sampling_heap_profiler/sampling_heap_profiler.cc
+++ b/base/sampling_heap_profiler/sampling_heap_profiler.cc
@@ -92,9 +92,8 @@
 
 // Checks whether unwinding from this function works.
 [[maybe_unused]] StackUnwinder CheckForDefaultUnwindTables() {
-  void* stack[kMaxStackEntries];
-  size_t frame_count = base::debug::CollectStackTrace(const_cast<void**>(stack),
-                                                      kMaxStackEntries);
+  const void* stack[kMaxStackEntries];
+  size_t frame_count = base::debug::CollectStackTrace(stack, kMaxStackEntries);
   // First frame is the current function and can be found without unwind tables.
   return frame_count > 1 ? StackUnwinder::kDefault
                          : StackUnwinder::kUnavailable;
@@ -186,9 +185,9 @@
   return UpdateAndGetThreadName(nullptr);
 }
 
-void** SamplingHeapProfiler::CaptureStackTrace(void** frames,
-                                               size_t max_entries,
-                                               size_t* count) {
+const void** SamplingHeapProfiler::CaptureStackTrace(const void** frames,
+                                                     size_t max_entries,
+                                                     size_t* count) {
   // Skip top frames as they correspond to the profiler itself.
   size_t skip_frames = 3;
   size_t frame_count = 0;
@@ -250,10 +249,10 @@
 
 void SamplingHeapProfiler::CaptureNativeStack(const char* context,
                                               Sample* sample) {
-  void* stack[kMaxStackEntries];
+  const void* stack[kMaxStackEntries];
   size_t frame_count;
   // One frame is reserved for the thread name.
-  void** first_frame =
+  const void** first_frame =
       CaptureStackTrace(stack, kMaxStackEntries - 1, &frame_count);
   DCHECK_LT(frame_count, kMaxStackEntries);
   sample->stack.assign(first_frame, first_frame + frame_count);
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.h b/base/sampling_heap_profiler/sampling_heap_profiler.h
index d0931a0a..e273a017 100644
--- a/base/sampling_heap_profiler/sampling_heap_profiler.h
+++ b/base/sampling_heap_profiler/sampling_heap_profiler.h
@@ -47,7 +47,7 @@
     // Name of the thread that made the sampled allocation.
     const char* thread_name = nullptr;
     // Call stack of PC addresses responsible for the allocation.
-    std::vector<void*> stack;
+    std::vector<const void*> stack;
 
     // Public for testing.
     Sample(size_t size, size_t total, uint32_t ordinal);
@@ -100,7 +100,9 @@
   // Captures up to |max_entries| stack frames using the buffer pointed by
   // |frames|. Puts the number of captured frames into the |count| output
   // parameters. Returns the pointer to the topmost frame.
-  void** CaptureStackTrace(void** frames, size_t max_entries, size_t* count);
+  const void** CaptureStackTrace(const void** frames,
+                                 size_t max_entries,
+                                 size_t* count);
 
   static void Init();
   static SamplingHeapProfiler* Get();
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 9e7463e1..e125b56e 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -370,10 +370,6 @@
       } else if ((is_posix && !is_chromeos && !is_nacl) || is_fuchsia) {
         # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it.
         # See also https://crbug.com/533294
-        if (current_os != "zos") {
-          cflags += [ "--param=ssp-buffer-size=4" ]
-        }
-
         # The x86 toolchain currently has problems with stack-protector.
         if (is_android && current_cpu == "x86") {
           cflags += [ "-fno-stack-protector" ]
diff --git a/build/fuchsia/test/ffx_emulator.py b/build/fuchsia/test/ffx_emulator.py
index 4ec1616f..b9feb1d 100644
--- a/build/fuchsia/test/ffx_emulator.py
+++ b/build/fuchsia/test/ffx_emulator.py
@@ -46,6 +46,7 @@
         else:
             self._node_name = 'fuchsia-emulator-' + str(random.randint(
                 1, 9999))
+        self._device_spec = args.device_spec
 
     def _everlasting(self) -> bool:
         return self._node_name == 'fuchsia-everlasting-emulator'
@@ -73,6 +74,8 @@
             emu_command.extend(['--net', 'user'])
         if self._everlasting():
             emu_command.extend(['--reuse-with-check'])
+        if self._device_spec:
+            emu_command.extend(['--device', self._device_spec])
 
         # TODO(https://fxbug.dev/99321): remove when ffx has native support
         # for starting emulator on arm64 host.
diff --git a/build/fuchsia/test/ffx_emulator_unittests.py b/build/fuchsia/test/ffx_emulator_unittests.py
index cc385b8..3c641ee6 100755
--- a/build/fuchsia/test/ffx_emulator_unittests.py
+++ b/build/fuchsia/test/ffx_emulator_unittests.py
@@ -6,6 +6,7 @@
 
 import argparse
 import unittest
+import unittest.mock as mock
 
 from ffx_emulator import FfxEmulator
 
@@ -25,7 +26,8 @@
                         'hardware_gpu': False,
                         'logs_dir': '.',
                         'with_network': False,
-                        'everlasting': True
+                        'everlasting': True,
+                        'device_spec': ''
                     }))._node_name, 'fuchsia-everlasting-emulator')
 
     def test_use_random_node_name(self) -> None:
@@ -41,9 +43,63 @@
                         'hardware_gpu': False,
                         'logs_dir': '.',
                         'with_network': False,
-                        'everlasting': False
+                        'everlasting': False,
+                        'device_spec': ''
                     }))._node_name, 'fuchsia-everlasting-emulator')
 
+    @mock.patch('ffx_emulator.run_ffx_command')
+    def test_use_none_device_spec(self, mock_ffx) -> None:
+        """FfxEmulator should use the default device spec if spec is None."""
+        FfxEmulator(
+            argparse.Namespace(
+                **{
+                    'product': None,
+                    'enable_graphics': False,
+                    'hardware_gpu': False,
+                    'logs_dir': '.',
+                    'with_network': False,
+                    'everlasting': False,
+                    'device_spec': None
+                })).__enter__()
+        self.assertIn(' '.join(['--net', 'user']),
+                      ' '.join(mock_ffx.call_args.kwargs['cmd']))
+        self.assertNotIn('--device', mock_ffx.call_args.kwargs['cmd'])
+
+    @mock.patch('ffx_emulator.run_ffx_command')
+    def test_use_empty_device_spec(self, mock_ffx) -> None:
+        """FfxEmulator should use the default device spec if spec is empty."""
+        FfxEmulator(
+            argparse.Namespace(
+                **{
+                    'product': None,
+                    'enable_graphics': False,
+                    'hardware_gpu': False,
+                    'logs_dir': '.',
+                    'with_network': False,
+                    'everlasting': False,
+                    'device_spec': ''
+                })).__enter__()
+        self.assertIn(' '.join(['--net', 'user']),
+                      ' '.join(mock_ffx.call_args.kwargs['cmd']))
+        self.assertNotIn('--device', mock_ffx.call_args.kwargs['cmd'])
+
+    @mock.patch('ffx_emulator.run_ffx_command')
+    def test_use_large_device_spec(self, mock_ffx) -> None:
+        """FfxEmulator should use large device spec."""
+        FfxEmulator(
+            argparse.Namespace(
+                **{
+                    'product': None,
+                    'enable_graphics': False,
+                    'hardware_gpu': False,
+                    'logs_dir': '.',
+                    'with_network': False,
+                    'everlasting': False,
+                    'device_spec': 'large'
+                })).__enter__()
+        self.assertIn(' '.join(['--device', 'large']),
+                      ' '.join(mock_ffx.call_args.kwargs['cmd']))
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/build/fuchsia/test/start_emulator.py b/build/fuchsia/test/start_emulator.py
index 03c86d3..a0adf47 100755
--- a/build/fuchsia/test/start_emulator.py
+++ b/build/fuchsia/test/start_emulator.py
@@ -46,6 +46,12 @@
     femu_args.add_argument('--everlasting',
                            action='store_true',
                            help='If the emulator should be long-living.')
+    femu_args.add_argument(
+        '--device-spec',
+        help='Configure the virtual device to use. They are usually defined in '
+        'the product-bundle/virtual_devices/manifest.json. If this flag is not '
+        'provided or is an empty string, ffx emu will decide the recommended '
+        'spec.')
 
 
 def create_emulator_from_args(
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
index d0d99f8..6f341ed 100644
--- a/cc/scheduler/scheduler.cc
+++ b/cc/scheduler/scheduler.cc
@@ -840,10 +840,6 @@
     TRACE_EVENT1("cc", "Scheduler::SetPauseRendering", "pause_rendering",
                  pause_rendering);
     state_machine_.SetPauseRendering(pause_rendering);
-    if (!pause_rendering && begin_frame_source_) {
-      // This is needed for BackToBackBeginFrameSource to resume pumping frames.
-      begin_frame_source_->DidFinishFrame(this);
-    }
   }
   ProcessScheduledActions();
 }
diff --git a/cc/scheduler/scheduler_settings.h b/cc/scheduler/scheduler_settings.h
index 0fb7766..edb7455a 100644
--- a/cc/scheduler/scheduler_settings.h
+++ b/cc/scheduler/scheduler_settings.h
@@ -53,9 +53,6 @@
   // they would be under the default settings.
   bool disable_frame_rate_limit = false;
 
-  // True if we are running a web test using threaded compositing.
-  bool is_threaded_web_test = false;
-
   std::unique_ptr<base::trace_event::ConvertableToTraceFormat> AsValue() const;
 };
 
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc
index 9ce733a..406cf4dd 100644
--- a/cc/scheduler/scheduler_state_machine.cc
+++ b/cc/scheduler/scheduler_state_machine.cc
@@ -1362,12 +1362,6 @@
   if (active_tree_needs_first_draw_)
     return true;
 
-  // When running web tests with threaded compositing, we service main frames at
-  // the maximum possible frame rate.
-  if (settings_.is_threaded_web_test && needs_begin_main_frame_) {
-    return true;
-  }
-
   if (!needs_redraw_)
     return false;
 
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc
index b0a0064..c0043ef2 100644
--- a/cc/trees/layer_tree_settings.cc
+++ b/cc/trees/layer_tree_settings.cc
@@ -29,7 +29,6 @@
   scheduler_settings.wait_for_all_pipeline_stages_before_draw =
       wait_for_all_pipeline_stages_before_draw;
   scheduler_settings.disable_frame_rate_limit = disable_frame_rate_limit;
-  scheduler_settings.is_threaded_web_test = is_threaded_web_test;
   return scheduler_settings;
 }
 
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index a47fbc8..e0732eb 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -223,9 +223,6 @@
   // TODO(crbug.com/1378251): not ready to be used by renderer cc instance yet.
   bool enable_shared_image_cache_for_gpu = false;
 
-  // True if we are running a web test using threaded compositing.
-  bool is_threaded_web_test = false;
-
   // Maximum size for buffers allocated for rendering when GPU compositing is
   // disabled. This size is equivalent to the max texture size in GPU mode.
   // This is an arbitrary limit here similar to what hardware might have.
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index f6faaf0..775207a 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -1542,6 +1542,7 @@
       "//chrome/browser/android/browserservices/intents:java",
       "//chrome/browser/android/browserservices/verification:java",
       "//chrome/browser/android/browserservices/verification:javatests",
+      "//chrome/browser/android/common:java",
       "//chrome/browser/android/crypto:java",
       "//chrome/browser/android/customtabs/branding:java",
       "//chrome/browser/android/httpclient:javatests",
diff --git a/chrome/android/expectations/ccflags.expected b/chrome/android/expectations/ccflags.expected
index ba9c6ef..aea1633 100644
--- a/chrome/android/expectations/ccflags.expected
+++ b/chrome/android/expectations/ccflags.expected
@@ -1,4 +1,4 @@
---param=ssp-buffer-size=4
+--param=ssp-buffer-size=8
 --target=arm-linux-androideabi21
 -DANDROID
 -DDYNAMIC_ANNOTATIONS_ENABLED=0
diff --git a/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml b/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml
index 15c71c3..b3901d6 100644
--- a/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml
+++ b/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml
@@ -104,7 +104,7 @@
         android:layout_toEndOf="@+id/tab_images"
         android:gravity="start"
         android:singleLine="true"
-        android:textAppearance="@style/TextAppearance.TextSmall" />
+        android:textAppearance="@style/TextAppearance.TextSmall.Secondary"/>
   </RelativeLayout>
 
 </org.chromium.chrome.features.tasks.SingleTabView>
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
index 4bb8c3c..eadb1fa 100644
--- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
+++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -21,7 +21,6 @@
 
 import android.content.pm.ActivityInfo;
 import android.graphics.Bitmap;
-import android.text.TextUtils;
 import android.util.Size;
 import android.view.View;
 
@@ -281,7 +280,7 @@
         // clang-format on
         StartSurfaceTestUtils.startMainActivityFromLauncher(mActivityTestRule);
         Assert.assertTrue(StartSurfaceConfiguration.isStartSurfaceFlagEnabled());
-        Assert.assertFalse(TextUtils.isEmpty(HomepageManager.getHomepageUri()));
+        Assert.assertFalse(HomepageManager.getHomepageGurl().isEmpty());
 
         TestThreadUtils.runOnUiThreadBlocking(
                 (Runnable) ()
@@ -332,7 +331,7 @@
         if (!BuildConfig.ENABLE_ASSERTS) return;
         StartSurfaceTestUtils.startMainActivityFromLauncher(mActivityTestRule);
         collector.checkThat(StartSurfaceConfiguration.isStartSurfaceFlagEnabled(), is(true));
-        collector.checkThat(TextUtils.isEmpty(HomepageManager.getHomepageUri()), is(false));
+        collector.checkThat(HomepageManager.getHomepageGurl().isEmpty(), is(false));
         Assert.assertFalse(
                 NativeLibraryLoadedStatus.getProviderForTesting().areNativeMethodsReady());
         ReturnToChromeUtil.shouldShowStartSurfaceAsTheHomePage(mActivityTestRule.getActivity());
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
index ef425c0..98cb688 100644
--- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
+++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
@@ -40,7 +40,6 @@
 import org.chromium.chrome.browser.feed.FeedSurfaceMediator;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.fullscreen.BrowserControlsManager;
-import org.chromium.chrome.browser.homepage.HomepageManager;
 import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController;
 import org.chromium.chrome.browser.init.ActivityLifecycleDispatcherImpl;
 import org.chromium.chrome.browser.init.ChromeActivityNativeDelegate;
@@ -77,15 +76,11 @@
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.components.prefs.PrefService;
 import org.chromium.components.search_engines.TemplateUrlService;
-import org.chromium.components.url_formatter.UrlFormatter;
-import org.chromium.components.url_formatter.UrlFormatterJni;
 import org.chromium.components.user_prefs.UserPrefs;
 import org.chromium.components.user_prefs.UserPrefsJni;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager;
-import org.chromium.url.GURL;
-import org.chromium.url.JUnitTestGURLs;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -201,13 +196,6 @@
                 .thenReturn(Mockito.mock(SigninManager.class));
         mJniMocker.mock(IdentityServicesProviderJni.TEST_HOOKS, identityServicesProviderJniMock);
 
-        // Set home page url.
-        GURL homePageGURL = JUnitTestGURLs.NTP_URL;
-        UrlFormatter.Natives urlFormatterJniMock = Mockito.mock(UrlFormatter.Natives.class);
-        when(urlFormatterJniMock.fixupUrl(HomepageManager.getHomepageUri()))
-                .thenReturn(homePageGURL);
-        mJniMocker.mock(UrlFormatterJni.TEST_HOOKS, urlFormatterJniMock);
-
         mJniMocker.mock(FaviconHelperJni.TEST_HOOKS, Mockito.mock(FaviconHelper.Natives.class));
         mJniMocker.mock(
                 FeedServiceBridgeJni.TEST_HOOKS, Mockito.mock(FeedServiceBridge.Natives.class));
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 911181a14a..67ee552 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
@@ -827,9 +827,8 @@
         mSectionHeaderModel.set(SectionHeaderListProperties.IS_LOGO_KEY,
                 !isGoogleSearchEngine && isSignedIn && suggestionsVisible);
         ViewVisibility indicatorState;
-        if (!isTabMode || ChromeFeatureList.sSurfacePolish.isEnabled() && isGoogleSearchEngine) {
-            // Gone when the following/for you tab switcher header is not shown or if feature flag
-            // surface polish is enabled and the DSE is Google.
+        if (!isTabMode) {
+            // Gone when the following/for you tab switcher header is not shown
             indicatorState = ViewVisibility.GONE;
         } else if (!isGoogleSearchEngine) {
             // Visible when Google is not the search engine (show logo).
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 68b76fa..c184da7d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -222,6 +222,7 @@
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.base.PageTransition;
 import org.chromium.ui.widget.Toast;
+import org.chromium.url.GURL;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -1441,14 +1442,16 @@
         long createInitialTabStartTime = SystemClock.elapsedRealtime();
         boolean shouldShowOverviewPageOnStart = shouldShowOverviewPageOnStart();
         if (!shouldShowOverviewPageOnStart) {
-            url = HomepageManager.getHomepageUri();
-            if (TextUtils.isEmpty(url)) {
+            GURL homepageGurl = HomepageManager.getHomepageGurl();
+            if (homepageGurl.isEmpty()) {
                 url = UrlConstants.NTP_URL;
             } else {
                 // Migrate legacy NTP URLs (chrome://newtab) to the newer format
                 // (chrome-native://newtab)
-                if (UrlUtilities.isNTPUrl(url)) {
+                if (UrlUtilities.isNTPUrl(homepageGurl)) {
                     url = UrlConstants.NTP_URL;
+                } else {
+                    url = homepageGurl.getSpec();
                 }
             }
             getTabCreator(false).launchUrl(url, TabLaunchType.FROM_STARTUP);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
index de87164..afd3a2ec 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -8,6 +8,7 @@
 import android.view.MotionEvent;
 import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
@@ -130,17 +131,21 @@
         Context context = host.getContext();
         if (ReturnToChromeUtil.isStartSurfaceRefactorEnabled(context)) {
             if (startSurfaceSupplier.hasValue() || tabSwitcherSupplier.hasValue()) {
-                createOverviewLayout(startSurfaceSupplier.get(), tabSwitcherSupplier.get(),
-                        browserControlsStateProvider, scrimCoordinator, tabSwitcherScrimAnchor);
+                createLayoutsForStartSurfaceAndTabSwitcher(startSurfaceSupplier.get(),
+                        tabSwitcherSupplier.get(), browserControlsStateProvider, scrimCoordinator,
+                        tabSwitcherScrimAnchor);
             }
         } else if (startSurfaceSupplier.hasValue()) {
-            createOverviewLayout(startSurfaceSupplier.get(), /*tabSwitcher=*/null,
-                    browserControlsStateProvider, scrimCoordinator, tabSwitcherScrimAnchor);
+            createLayoutsForStartSurfaceAndTabSwitcher(startSurfaceSupplier.get(),
+                    /*tabSwitcher=*/null, browserControlsStateProvider, scrimCoordinator,
+                    tabSwitcherScrimAnchor);
         }
     }
 
     /**
-     * Creates @{@link org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout}
+     * Creates {@link org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout}
+     * or ({@link org.chromium.chrome.features.start_surface.StartSurfaceHomeLayout} AND
+     * {@link org.chromium.chrome.features.tasks.tab_management.TabSwitcherLayout}).
      * @param startSurface An interface to talk to the Grid Tab Switcher when Start surface refactor
      *         is disabled.
      * @param tabSwitcher An interface to talk to the Grid Tab Switcher when Start surface refactor
@@ -150,7 +155,7 @@
      * @param scrimCoordinator scrim coordinator for GTS
      * @param tabSwitcherScrimAnchor scrim anchor view for GTS
      */
-    protected void createOverviewLayout(@Nullable StartSurface startSurface,
+    protected void createLayoutsForStartSurfaceAndTabSwitcher(@Nullable StartSurface startSurface,
             @Nullable TabSwitcher tabSwitcher,
             BrowserControlsStateProvider browserControlsStateProvider,
             ScrimCoordinator scrimCoordinator, ViewGroup tabSwitcherScrimAnchor) {
@@ -159,40 +164,128 @@
         boolean isRefactorEnabled =
                 ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext());
 
-        Context context = mHost.getContext();
-        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
-
         if (isRefactorEnabled) {
             assert tabSwitcher != null;
-            TabManagementDelegate tabManagementDelegate =
-                    TabManagementDelegateProvider.getDelegate();
-            assert tabManagementDelegate != null;
-
-            mTabSwitcherLayout = tabManagementDelegate.createTabSwitcherLayout(context, this, this,
-                    renderHost, browserControlsStateProvider, tabSwitcher, tabSwitcherScrimAnchor,
-                    scrimCoordinator);
+            createTabSwitcherLayout(tabSwitcher, browserControlsStateProvider, scrimCoordinator,
+                    tabSwitcherScrimAnchor);
 
             if (startSurface != null) {
-                mStartSurfaceHomeLayout = StartSurfaceDelegate.createStartSurfaceHomeLayout(
-                        context, this, renderHost, startSurface);
+                createStartSurfaceHomeLayout(startSurface);
             }
         } else {
             assert startSurface != null;
-            mOverviewLayout = StartSurfaceDelegate.createTabSwitcherAndStartSurfaceLayout(context,
-                    this, renderHost, browserControlsStateProvider, startSurface,
-                    tabSwitcherScrimAnchor, scrimCoordinator);
+            createTabSwitcherAndStartSurfaceLayout(startSurface, browserControlsStateProvider,
+                    scrimCoordinator, tabSwitcherScrimAnchor);
         }
+    }
+
+    /**
+     * Creates {@link org.chromium.chrome.features.tasks.tab_management.TabSwitcherLayout}
+     * @param tabSwitcher An interface to talk to the Grid Tab Switcher.
+     * @param browserControlsStateProvider The {@link BrowserControlsStateProvider} for top
+     *         controls.
+     * @param scrimCoordinator scrim coordinator for GTS
+     * @param tabSwitcherScrimAnchor scrim anchor view for GTS
+     */
+    protected void createTabSwitcherLayout(@NonNull TabSwitcher tabSwitcher,
+            BrowserControlsStateProvider browserControlsStateProvider,
+            ScrimCoordinator scrimCoordinator, ViewGroup tabSwitcherScrimAnchor) {
+        assert mTabSwitcherLayout == null;
+        boolean isRefactorEnabled =
+                ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext());
+        assert isRefactorEnabled;
+
+        Context context = mHost.getContext();
+        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
+
+        TabManagementDelegate tabManagementDelegate = TabManagementDelegateProvider.getDelegate();
+
+        mTabSwitcherLayout = tabManagementDelegate.createTabSwitcherLayout(context, this, this,
+                renderHost, browserControlsStateProvider, tabSwitcher, tabSwitcherScrimAnchor,
+                scrimCoordinator);
 
         if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mHost.getContext())) {
             mTabSwitcherFocusLayoutStateObserver = new LayoutStateObserver() {
                 @Override
                 public void onFinishedShowing(int layoutType) {
                     if (layoutType == LayoutType.TAB_SWITCHER) {
-                        if (isRefactorEnabled) {
-                            tabSwitcher.getTabListDelegate().requestFocusOnCurrentTab();
-                        } else {
-                            startSurface.getGridTabListDelegate().requestFocusOnCurrentTab();
-                        }
+                        tabSwitcher.getTabListDelegate().requestFocusOnCurrentTab();
+                    }
+                }
+            };
+            addObserver(mTabSwitcherFocusLayoutStateObserver);
+        }
+        if (mTabContentManagerSupplier.hasValue()) {
+            mTabSwitcherLayout.setTabContentManager(mTabContentManagerSupplier.get());
+        }
+        if (getTabModelSelector() != null) {
+            mTabSwitcherLayout.setTabModelSelector(
+                    getTabModelSelector(), mTabContentManagerSupplier.get());
+        }
+        if (mFinishNativeInitialization) {
+            mTabSwitcherLayout.onFinishNativeInitialization();
+        }
+    }
+
+    /**
+     * Creates {@link org.chromium.chrome.features.start_surface.StartSurfaceHomeLayout}.
+     * @param startSurface An interface to talk to the Grid Tab Switcher when Start surface refactor
+     *         is disabled.
+     */
+    protected void createStartSurfaceHomeLayout(@NonNull StartSurface startSurface) {
+        assert mStartSurfaceHomeLayout == null;
+        boolean isRefactorEnabled =
+                ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext());
+        assert isRefactorEnabled;
+
+        Context context = mHost.getContext();
+        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
+
+        mStartSurfaceHomeLayout = StartSurfaceDelegate.createStartSurfaceHomeLayout(
+                context, this, renderHost, startSurface);
+
+        if (mTabContentManagerSupplier.hasValue()) {
+            mStartSurfaceHomeLayout.setTabContentManager(mTabContentManagerSupplier.get());
+        }
+        if (getTabModelSelector() != null) {
+            mStartSurfaceHomeLayout.setTabModelSelector(
+                    getTabModelSelector(), mTabContentManagerSupplier.get());
+        }
+        if (mFinishNativeInitialization) {
+            mStartSurfaceHomeLayout.onFinishNativeInitialization();
+        }
+    }
+
+    /**
+     * Creates {@link org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout}
+     * @param startSurface An interface to talk to the Grid Tab Switcher when Start surface refactor
+     *         is disabled.
+     * @param browserControlsStateProvider The {@link BrowserControlsStateProvider} for top
+     *         controls.
+     * @param scrimCoordinator scrim coordinator for GTS
+     * @param tabSwitcherScrimAnchor scrim anchor view for GTS
+     */
+    protected void createTabSwitcherAndStartSurfaceLayout(@NonNull StartSurface startSurface,
+            BrowserControlsStateProvider browserControlsStateProvider,
+            ScrimCoordinator scrimCoordinator, ViewGroup tabSwitcherScrimAnchor) {
+        assert mOverviewLayout == null;
+        boolean isRefactorEnabled =
+                ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext());
+        assert !isRefactorEnabled;
+
+        Context context = mHost.getContext();
+        LayoutRenderHost renderHost = mHost.getLayoutRenderHost();
+
+        mOverviewLayout = StartSurfaceDelegate.createTabSwitcherAndStartSurfaceLayout(context, this,
+                renderHost, browserControlsStateProvider, startSurface, tabSwitcherScrimAnchor,
+                scrimCoordinator);
+
+        if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mHost.getContext())) {
+            mTabSwitcherFocusLayoutStateObserver = new LayoutStateObserver() {
+                @Override
+                public void onFinishedShowing(int layoutType) {
+                    if (layoutType == LayoutType.TAB_SWITCHER) {
+                        startSurface.getGridTabListDelegate().requestFocusOnCurrentTab();
                     }
                 }
             };
@@ -200,37 +293,15 @@
         }
 
         if (mTabContentManagerSupplier.hasValue()) {
-            if (mOverviewLayout != null) {
-                mOverviewLayout.setTabContentManager(mTabContentManagerSupplier.get());
-            }
-            if (mTabSwitcherLayout != null) {
-                mTabSwitcherLayout.setTabContentManager(mTabContentManagerSupplier.get());
-            }
-            if (mStartSurfaceHomeLayout != null) {
-                mStartSurfaceHomeLayout.setTabContentManager(mTabContentManagerSupplier.get());
-            }
+            mOverviewLayout.setTabContentManager(mTabContentManagerSupplier.get());
         }
 
         if (getTabModelSelector() != null) {
-            if (mOverviewLayout != null) {
-                mOverviewLayout.setTabModelSelector(
-                        getTabModelSelector(), mTabContentManagerSupplier.get());
-            }
-            if (mTabSwitcherLayout != null) {
-                mTabSwitcherLayout.setTabModelSelector(
-                        getTabModelSelector(), mTabContentManagerSupplier.get());
-            }
-            if (mStartSurfaceHomeLayout != null) {
-                mStartSurfaceHomeLayout.setTabModelSelector(
-                        getTabModelSelector(), mTabContentManagerSupplier.get());
-            }
+            mOverviewLayout.setTabModelSelector(
+                    getTabModelSelector(), mTabContentManagerSupplier.get());
         }
         if (mFinishNativeInitialization) {
-            if (mOverviewLayout != null) mOverviewLayout.onFinishNativeInitialization();
-            if (mTabSwitcherLayout != null) mTabSwitcherLayout.onFinishNativeInitialization();
-            if (mStartSurfaceHomeLayout != null) {
-                mStartSurfaceHomeLayout.onFinishNativeInitialization();
-            }
+            mOverviewLayout.onFinishNativeInitialization();
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
index 568ef23..638260e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -183,8 +183,9 @@
             try {
                 if (!mStartSurfaceSupplier.hasValue() && !mTabSwitcherSupplier.hasValue()) {
                     final ViewGroup containerView = mCreateStartSurfaceCallable.call();
-                    createOverviewLayout(mStartSurfaceSupplier.get(), mTabSwitcherSupplier.get(),
-                            mHost.getBrowserControlsManager(), mScrimCoordinator, containerView);
+                    createLayoutsForStartSurfaceAndTabSwitcher(mStartSurfaceSupplier.get(),
+                            mTabSwitcherSupplier.get(), mHost.getBrowserControlsManager(),
+                            mScrimCoordinator, containerView);
                     mThemeColorObserver =
                             (color, shouldAnimate) -> containerView.setBackgroundColor(color);
                     mTopUiThemeColorProvider = getTopUiThemeColorProvider().get();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
index e04c79ad..8ace138 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
@@ -14,7 +14,6 @@
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_CONTENTID_NAMESPACE;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_AUTO_RESUMPTION;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_OFF_THE_RECORD;
-import static org.chromium.chrome.browser.download.DownloadNotificationService.clearResumptionAttemptLeft;
 import static org.chromium.chrome.browser.notifications.NotificationConstants.EXTRA_NOTIFICATION_ID;
 
 import android.app.DownloadManager;
@@ -33,7 +32,6 @@
 import org.chromium.base.ContextUtils;
 import org.chromium.base.IntentUtils;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.init.BrowserParts;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
 import org.chromium.chrome.browser.init.EmptyBrowserParts;
@@ -101,9 +99,6 @@
         // Remove delayed stop of service until after native library is loaded.
         mHandler.removeCallbacks(mStopSelfRunnable);
 
-        // Since there is a user interaction, resumption is not needed, so clear any queued.
-        cancelQueuedResumptions();
-
         // Update notification appearance immediately in case it takes a while for native to load.
         updateNotification(intent);
 
@@ -112,14 +107,6 @@
     }
 
     /**
-     * Cancel any download resumption tasks and reset the number of resumption attempts available.
-     */
-    void cancelQueuedResumptions() {
-        // Reset number of attempts left if the action is triggered by user.
-        clearResumptionAttemptLeft();
-    }
-
-    /**
      * Immediately update notification appearance without changing stored notification state.
      * @param intent with information about the notification.
      */
@@ -188,8 +175,6 @@
      */
     @VisibleForTesting
     void loadNativeAndPropagateInteraction(final Intent intent) {
-        final boolean browserStarted =
-                BrowserStartupController.getInstance().isFullBrowserStarted();
         final ContentId id = getContentIdFromIntent(intent);
         final BrowserParts parts = new EmptyBrowserParts() {
             @Override
@@ -326,11 +311,6 @@
      * @return delegate for interactions with the entry
      */
     static DownloadServiceDelegate getServiceDelegate(ContentId id) {
-        if (LegacyHelpers.isLegacyDownload(id)
-                && !ChromeFeatureList.isEnabled(
-                        ChromeFeatureList.DOWNLOAD_OFFLINE_CONTENT_PROVIDER)) {
-            return DownloadManagerService.getDownloadManagerService();
-        }
         return OfflineContentAggregatorNotificationBridgeUiFactory.instance();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index 739a738..6d53fbf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -341,8 +341,6 @@
         if (!mActivityLaunched) {
             mMessageUiController = DownloadMessageUiControllerFactory.create(delegate);
 
-            DownloadNotificationService.clearResumptionAttemptLeft();
-
             DownloadManagerService.getDownloadManagerService().checkForExternallyRemovedDownloads(
                     ProfileKey.getLastUsedRegularProfileKey());
 
@@ -592,7 +590,6 @@
                 && isSupportedMimeType(downloadItem.getDownloadInfo().getMimeType());
         String id = downloadItem.getId();
         DownloadProgress progress = mDownloadProgressMap.get(id);
-        long bytesReceived = downloadItem.getDownloadInfo().getBytesReceived();
         if (progress == null) {
             if (!downloadItem.getDownloadInfo().isPaused()) {
                 long startTime = System.currentTimeMillis();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java
index 58005cc..d88d2e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.download;
 
 import static android.app.DownloadManager.ACTION_NOTIFICATION_CLICKED;
-import static android.app.DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS;
 
 import static org.chromium.chrome.browser.download.DownloadNotificationService.ACTION_DOWNLOAD_CANCEL;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.ACTION_DOWNLOAD_OPEN;
@@ -13,9 +12,7 @@
 import static org.chromium.chrome.browser.download.DownloadNotificationService.ACTION_DOWNLOAD_RESUME;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_CONTENTID_ID;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_CONTENTID_NAMESPACE;
-import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_FILE_PATH;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_OFF_THE_RECORD;
-import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_SUPPORTED_MIME_TYPE;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_NOTIFICATION_BUNDLE_ICON_ID;
 import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_OTR_PROFILE_ID;
 
@@ -30,10 +27,7 @@
 
 import androidx.core.app.NotificationCompat;
 
-import org.chromium.base.ContentUriUtils;
 import org.chromium.chrome.R;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.media.MediaViewerUtils;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
 import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory;
@@ -252,37 +246,8 @@
                     builder.setContentIntent(PendingIntentProvider.getActivity(
                             context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
                 } else if (downloadUpdate.getIsOpenable()) {
-                    Intent intent;
-                    if (LegacyHelpers.isLegacyDownload(downloadUpdate.getContentId())
-                            && !ChromeFeatureList.isEnabled(
-                                    ChromeFeatureList.DOWNLOAD_OFFLINE_CONTENT_PROVIDER)) {
-                        checkNotNull(downloadUpdate.getContentId());
-                        checkArgument(downloadUpdate.getSystemDownloadId() != -1
-                                || ContentUriUtils.isContentUri(downloadUpdate.getFilePath()));
-
-                        intent = new Intent(ACTION_NOTIFICATION_CLICKED);
-                        long[] idArray = {downloadUpdate.getSystemDownloadId()};
-                        intent.putExtra(EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, idArray);
-                        intent.putExtra(EXTRA_DOWNLOAD_FILE_PATH, downloadUpdate.getFilePath());
-                        intent.putExtra(EXTRA_IS_SUPPORTED_MIME_TYPE,
-                                downloadUpdate.getIsSupportedMimeType());
-                        intent.putExtra(
-                                EXTRA_IS_OFF_THE_RECORD, downloadUpdate.getIsOffTheRecord());
-                        intent.putExtra(EXTRA_OTR_PROFILE_ID,
-                                OTRProfileID.serialize(downloadUpdate.getOTRProfileID()));
-                        intent.putExtra(
-                                EXTRA_DOWNLOAD_CONTENTID_ID, downloadUpdate.getContentId().id);
-                        intent.putExtra(EXTRA_DOWNLOAD_CONTENTID_NAMESPACE,
-                                downloadUpdate.getContentId().namespace);
-                        intent.putExtra(NotificationConstants.EXTRA_NOTIFICATION_ID,
-                                downloadUpdate.getNotificationId());
-                        MediaViewerUtils.setOriginalUrlAndReferralExtraToIntent(intent,
-                                downloadUpdate.getOriginalUrl().getSpec(),
-                                downloadUpdate.getReferrer().getSpec());
-                    } else {
-                        intent = buildActionIntent(
-                                context, ACTION_DOWNLOAD_OPEN, downloadUpdate.getContentId(), null);
-                    }
+                    Intent intent = buildActionIntent(
+                            context, ACTION_DOWNLOAD_OPEN, downloadUpdate.getContentId(), null);
 
                     ComponentName component = new ComponentName(
                             context.getPackageName(), DownloadBroadcastManager.class.getName());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index b7312f2..385fccc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -94,9 +94,6 @@
 
     private static DownloadNotificationService sInstanceForTesting;
 
-    @VisibleForTesting
-    final List<ContentId> mDownloadsInProgress = new ArrayList<ContentId>();
-
     private NotificationManagerProxy mNotificationManager;
     private Bitmap mDownloadSuccessLargeIcon;
     private DownloadSharedPreferenceHelper mDownloadSharedPreferenceHelper;
@@ -134,36 +131,6 @@
     }
 
     /**
-     * @return Whether or not there are any current resumable downloads being tracked.  These
-     *         tracked downloads may not currently be showing notifications.
-     */
-    static boolean isTrackingResumableDownloads(Context context) {
-        List<DownloadSharedPreferenceEntry> entries =
-                DownloadSharedPreferenceHelper.getInstance().getEntries();
-        for (DownloadSharedPreferenceEntry entry : entries) {
-            if (canResumeDownload(context, entry)) return true;
-        }
-        return false;
-    }
-
-    /**
-     * Track in-progress downloads here.
-     * @param id The {@link ContentId} of the download that has been started and should be tracked.
-     */
-    private void startTrackingInProgressDownload(ContentId id) {
-        if (!mDownloadsInProgress.contains(id)) mDownloadsInProgress.add(id);
-    }
-
-    /**
-     * Stop tracking the download represented by {@code id}.
-     * @param id                  The {@link ContentId} of the download that has been paused or
-     *                            canceled and shouldn't be tracked.
-     */
-    private void stopTrackingInProgressDownload(ContentId id) {
-        mDownloadsInProgress.remove(id);
-    }
-
-    /**
      * Adds or updates an in-progress download notification.
      * @param id                      The {@link ContentId} of the download.
      * @param fileName                File name of the download.
@@ -259,8 +226,6 @@
                         canDownloadWhileMetered, fileName, true, isTransient));
         mDownloadForegroundServiceManager.updateDownloadStatus(
                 context, DownloadStatus.IN_PROGRESS, notificationId, notification);
-
-        startTrackingInProgressDownload(id);
     }
 
     private void cancelNotification(int notificationId) {
@@ -279,8 +244,6 @@
     public void cancelNotification(int notificationId, ContentId id) {
         cancelNotification(notificationId);
         mDownloadSharedPreferenceHelper.removeSharedPreferenceEntry(id);
-
-        stopTrackingInProgressDownload(id);
     }
 
     /**
@@ -346,7 +309,6 @@
         if (isAutoResumable || pendingState != PendingState.NOT_PENDING) {
             notifyDownloadPending(id, fileName, otrProfileID, canDownloadWhileMetered, isTransient,
                     icon, originalUrl, shouldPromoteOrigin, hasUserGesture, pendingState);
-            stopTrackingInProgressDownload(id);
             return;
         }
         int notificationId = entry == null ? getNotificationId(id) : entry.notificationId;
@@ -371,8 +333,6 @@
 
         mDownloadForegroundServiceManager.updateDownloadStatus(
                 context, DownloadStatus.PAUSED, notificationId, notification);
-
-        stopTrackingInProgressDownload(id);
     }
 
     /**
@@ -427,7 +387,6 @@
         updateNotification(notificationId, notification, id, null);
         mDownloadForegroundServiceManager.updateDownloadStatus(
                 context, DownloadStatus.COMPLETED, notificationId, notification);
-        stopTrackingInProgressDownload(id);
         return notificationId;
     }
 
@@ -471,8 +430,6 @@
         updateNotification(notificationId, notification, id, null);
         mDownloadForegroundServiceManager.updateDownloadStatus(
                 context, DownloadStatus.FAILED, notificationId, notification);
-
-        stopTrackingInProgressDownload(id);
     }
 
     private Bitmap getLargeNotificationIcon(Bitmap bitmap) {
@@ -593,30 +550,6 @@
         return newNotificationId;
     }
 
-    /**
-     * Helper method to update the remaining number of background resumption attempts left.
-     *
-     * @param numAutoResumptionAttemptLeft the number of auto resumption attempts left.
-     */
-    private static void updateResumptionAttemptLeft(int numAutoResumptionAttemptLeft) {
-        SharedPreferencesManager.getInstance().writeInt(
-                ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT,
-                numAutoResumptionAttemptLeft);
-    }
-
-    /** Helper method to get the remaining number of background resumption attempts left. */
-    private static int getResumptionAttemptLeft() {
-        return SharedPreferencesManager.getInstance().readInt(
-                ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT,
-                MAX_RESUMPTION_ATTEMPT_LEFT);
-    }
-
-    /** Helper method to clear the remaining number of background resumption attempts left. */
-    static void clearResumptionAttemptLeft() {
-        SharedPreferencesManager.getInstance().removeKey(
-                ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT);
-    }
-
     void onForegroundServiceTaskRemoved() {
         // If we've lost all Activities, cancel the off the record downloads.
         if (ApplicationStatus.isEveryActivityDestroyed()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
index 1e0ce823..8c65cb9c1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.homepage;
 
 import android.content.Context;
-import android.text.TextUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -125,50 +124,50 @@
      */
     public static boolean shouldCloseAppWithZeroTabs() {
         return HomepageManager.isHomepageEnabled()
-                && !UrlUtilities.isNTPUrl(HomepageManager.getHomepageUri());
+                && !UrlUtilities.isNTPUrl(HomepageManager.getHomepageGurl());
     }
 
     /**
-     * Get the current homepage URI string. If the homepage is disabled, return null; otherwise it
-     * will always return a non-empty string. In cases when the homepage is specifically set as
-     * empty, this function will fallback to return {@link UrlConstants.NTP_URL}. If the default
-     * search engine (DSE) isn't Google, may fallback to the DSE's new Tab URL.
+     * Get the current homepage URI. If the homepage is disabled, return an empty GURL; otherwise it
+     * will always return a non-empty GURL. In cases when the homepage is specifically set as
+     * empty, this function will fallback to return {@link ChromeUrlConstants.nativeNtpGurl()}.
+     * If the default search engine (DSE) isn't Google, may fallback to the DSE's new Tab URL.
      *
      * This function needs to be called on UI thread since Profile.getLastUsedRegularProfile() is
      * called.
      *
-     * This function checks different source to get the current homepage, which listed below
+     * This function checks different sources to get the current homepage, which is listed below
      * according to their priority:
      *
-     * <b>isManagedByPolicy > useChromeNTP > useDefaultUri > useCustomUri</b>
+     * <b>isManagedByPolicy > useChromeNTP > useDefaultGurl > useCustomGurl</b>
      *
-     * @return A non-empty homepage URI string, if homepage is enabled. Null otherwise.
+     * @return A non-empty GURL, if homepage is enabled. An empty GURL otherwise.
      *
      * @see HomepagePolicyManager#isHomepageManagedByPolicy()
      * @see #getPrefHomepageUseChromeNTP()
      * @see #getPrefHomepageUseDefaultUri()
      */
-    public static @Nullable String getHomepageUri() {
-        if (!isHomepageEnabled()) return null;
+    public static @Nullable GURL getHomepageGurl() {
+        if (!isHomepageEnabled()) return GURL.emptyGURL();
 
-        String homepageUri = getInstance().getHomepageUriIgnoringEnabledState().getSpec();
-        if (TextUtils.isEmpty(homepageUri)) {
-            homepageUri = UrlConstants.NTP_URL;
+        GURL homepageGurl = getInstance().getHomepageGurlIgnoringEnabledState();
+        if (homepageGurl.isEmpty()) {
+            homepageGurl = ChromeUrlConstants.nativeNtpGurl();
         }
 
         // We have to use Profile.getLastUsedRegularProfile() to get the last used regular Profile
         // before HomepageManager supports multiple Profiles. Thus, if DSE isn't Google, pressing
         // the home button may redirect to the DSE's new Tab URL, rather than showing an incognito
         // NTP.
-        return DseNewTabUrlManager.maybeGetOverrideUrl(homepageUri,
+        return DseNewTabUrlManager.maybeGetOverrideUrl(homepageGurl,
                 ProfileManager.isInitialized() ? Profile.getLastUsedRegularProfile() : null);
     }
 
     /**
-     * @return The default homepage URI if the homepage is partner provided or the new tab page
-     *         if the homepage button is force enabled via flag.
+     * @return A GURL for the default homepage URI if the homepage is partner provided, or the new
+     *         tab page if the homepage button is force enabled via flag.
      */
-    public static GURL getDefaultHomepageUri() {
+    public static GURL getDefaultHomepageGurl() {
         if (PartnerBrowserCustomizations.getInstance().isHomepageProviderAvailableAndEnabled()) {
             return PartnerBrowserCustomizations.getInstance().getHomePageUrl();
         }
@@ -204,28 +203,15 @@
      * @return Whether the current homepage is something other than the NTP.
      */
     public static boolean isHomepageNonNtp() {
-        String currentHomepage = getHomepageUri();
-        return !TextUtils.isEmpty(currentHomepage) && !UrlUtilities.isNTPUrl(currentHomepage);
-    }
-
-    /**
-     * Determines whether the homepage is set to something other than the NTP or empty/null. This is
-     * the same as {@link #isHomepageNonNtp()}, but uses {@link UrlUtilities#isCanonicalizedNTPUrl}
-     * instead of {@link UrlUtilities#isNTPUrl} to make it possible to use before native is loaded.
-     * Prefer {@link #isHomepageNonNtp()} if possible.
-     * @return Whether the current homepage is something other than the NTP.
-     */
-    public static boolean isHomepageNonNtpPreNative() {
-        String currentHomepage = getHomepageUri();
-        return !TextUtils.isEmpty(currentHomepage)
-                && !UrlUtilities.isCanonicalizedNTPUrl(currentHomepage);
+        GURL currentHomepage = getHomepageGurl();
+        return !currentHomepage.isEmpty() && !UrlUtilities.isNTPUrl(currentHomepage);
     }
 
     /**
      * Get homepage URI without checking if the homepage is enabled.
-     * @return Homepage URI based on policy and shared preference settings.
+     * @return Homepage GURL based on policy and shared preference settings.
      */
-    private @NonNull GURL getHomepageUriIgnoringEnabledState() {
+    private @NonNull GURL getHomepageGurlIgnoringEnabledState() {
         if (HomepagePolicyManager.isHomepageManagedByPolicy()) {
             return HomepagePolicyManager.getHomepageUrl();
         }
@@ -233,9 +219,9 @@
             return ChromeUrlConstants.nativeNtpGurl();
         }
         if (getPrefHomepageUseDefaultUri()) {
-            return getDefaultHomepageUri();
+            return getDefaultHomepageGurl();
         }
-        return getPrefHomepageCustomUri();
+        return getPrefHomepageCustomGurl();
     }
 
     /**
@@ -257,9 +243,9 @@
     }
 
     /**
-     * @return User specified homepage custom URI string.
+     * @return User specified homepage custom GURL.
      */
-    public GURL getPrefHomepageCustomUri() {
+    public GURL getPrefHomepageCustomGurl() {
         String homepageCustomGurlSerialized =
                 mSharedPreferencesManager.readString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, "");
         if (!homepageCustomGurlSerialized.equals("")) {
@@ -303,22 +289,22 @@
      * These shared preference values will reflect what homepage we are using.
      *
      * The priority of the input pref values during value checking:
-     * useChromeNTP > useDefaultUri > customUri
+     * useChromeNTP > useDefaultGurl > customGurl
      *
      * @param useChromeNtp True if homepage is set as Chrome's New tab page.
-     * @param useDefaultUri True if homepage is using default URI.
-     * @param customUri String value for user customized homepage URI.
+     * @param useDefaultGurl True if homepage is using default URI.
+     * @param customGurl A GURL for the user customized homepage URI.
      *
-     * @see #getHomepageUri()
+     * @see #getHomepageGurl()
      */
     public void setHomepagePreferences(
-            boolean useChromeNtp, boolean useDefaultUri, GURL customUri) {
+            boolean useChromeNtp, boolean useDefaultGurl, GURL customGurl) {
         boolean wasUseChromeNTP = getPrefHomepageUseChromeNTP();
         boolean wasUseDefaultUri = getPrefHomepageUseDefaultUri();
-        GURL oldCustomUri = getPrefHomepageCustomUri();
+        GURL oldCustomGurl = getPrefHomepageCustomGurl();
 
-        if (useChromeNtp == wasUseChromeNTP && useDefaultUri == wasUseDefaultUri
-                && oldCustomUri.equals(customUri)) {
+        if (useChromeNtp == wasUseChromeNTP && useDefaultGurl == wasUseDefaultUri
+                && oldCustomGurl.equals(customGurl)) {
             return;
         }
 
@@ -327,14 +313,14 @@
                     ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, useChromeNtp);
         }
 
-        if (wasUseDefaultUri != useDefaultUri) {
+        if (wasUseDefaultUri != useDefaultGurl) {
             mSharedPreferencesManager.writeBoolean(
-                    ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, useDefaultUri);
+                    ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, useDefaultGurl);
         }
 
-        if (!oldCustomUri.equals(customUri)) {
+        if (!oldCustomGurl.equals(customGurl)) {
             mSharedPreferencesManager.writeString(
-                    ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, customUri.serialize());
+                    ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, customGurl.serialize());
         }
 
         RecordUserAction.record("Settings.Homepage.LocationChanged_V2");
@@ -377,7 +363,7 @@
                     : HomepageLocationType.PARTNER_PROVIDED_OTHER;
         }
         // If user type NTP URI as their customized homepage, we'll record user is using NTP
-        return UrlUtilities.isNTPUrl(getPrefHomepageCustomUri())
+        return UrlUtilities.isNTPUrl(getPrefHomepageCustomGurl())
                 ? HomepageLocationType.USER_CUSTOMIZED_NTP
                 : HomepageLocationType.USER_CUSTOMIZED_OTHER;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
index b11c9d2..d6d7f0c2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
@@ -111,7 +111,7 @@
         if (!newHomepage.isValid()) {
             newHomepage = GURL.emptyGURL();
         }
-        boolean useDefaultUri = HomepageManager.getDefaultHomepageUri().equals(newHomepage);
+        boolean useDefaultUri = HomepageManager.getDefaultHomepageGurl().equals(newHomepage);
 
         mHomepageManager.setHomepagePreferences(setToUseNTP, useDefaultUri, newHomepage);
     }
@@ -124,17 +124,17 @@
             return HomepagePolicyManager.getHomepageUrl();
         }
 
-        GURL defaultUrl = HomepageManager.getDefaultHomepageUri();
-        GURL customUrl = mHomepageManager.getPrefHomepageCustomUri();
+        GURL defaultGurl = HomepageManager.getDefaultHomepageGurl();
+        GURL customGurl = mHomepageManager.getPrefHomepageCustomGurl();
         if (mHomepageManager.getPrefHomepageUseDefaultUri()) {
-            return UrlUtilities.isNTPUrl(defaultUrl) ? GURL.emptyGURL() : defaultUrl;
+            return UrlUtilities.isNTPUrl(defaultGurl) ? GURL.emptyGURL() : defaultGurl;
         }
 
-        if (customUrl.isEmpty() && !UrlUtilities.isNTPUrl(defaultUrl)) {
-            return defaultUrl;
+        if (customGurl.isEmpty() && !UrlUtilities.isNTPUrl(defaultGurl)) {
+            return defaultGurl;
         }
 
-        return customUrl;
+        return customGurl;
     }
 
     private PreferenceValues createPreferenceValuesForRadioGroup() {
@@ -149,7 +149,7 @@
         } else {
             shouldCheckNTP = mHomepageManager.getPrefHomepageUseChromeNTP()
                     || (mHomepageManager.getPrefHomepageUseDefaultUri()
-                            && UrlUtilities.isNTPUrl(HomepageManager.getDefaultHomepageUri()));
+                            && UrlUtilities.isNTPUrl(HomepageManager.getDefaultHomepageGurl()));
         }
 
         @HomepageOption
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 f6fdc2d..1b5fd972 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
@@ -115,6 +115,7 @@
 import org.chromium.ui.base.PhotoPickerListener;
 import org.chromium.ui.base.SelectFileDialog;
 import org.chromium.ui.base.WindowAndroid;
+import org.chromium.url.GURL;
 
 import java.io.File;
 import java.nio.charset.StandardCharsets;
@@ -176,8 +177,6 @@
      * Performs the shared class initialization.
      */
     protected void handlePreNativeInitialization() {
-        Context application = ContextUtils.getApplicationContext();
-
         // Initialize the AccountManagerFacade with the correct AccountManagerDelegate. Must be done
         // only once and before AccountManagerFacadeProvider.getInstance() is invoked.
         AccountManagerFacadeProvider.setInstance(
@@ -337,10 +336,10 @@
                         new Runnable() {
                             @Override
                             public void run() {
-                                String homepageUrl = HomepageManager.getHomepageUri();
+                                GURL homepageGurl = HomepageManager.getHomepageGurl();
                                 LaunchMetrics.recordHomePageLaunchMetrics(
                                         HomepageManager.isHomepageEnabled(),
-                                        UrlUtilities.isNTPUrl(homepageUrl), homepageUrl);
+                                        UrlUtilities.isNTPUrl(homepageGurl), homepageGurl);
                             }
                         });
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
index 40f30858..d420163 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
@@ -14,6 +14,7 @@
 import org.chromium.chrome.browser.webapps.WebappRegistry;
 import org.chromium.components.webapps.ShortcutSource;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.url.GURL;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -97,16 +98,15 @@
      * Records metrics about the state of the homepage on launch.
      * @param showHomeButton Whether the home button is shown.
      * @param homepageIsNtp Whether the homepage is set to the NTP.
-     * @param homepageUrl The value of the homepage URL.
+     * @param homepageUrl The homepage GURL.
      */
     public static void recordHomePageLaunchMetrics(
-            boolean showHomeButton, boolean homepageIsNtp, String homepageUrl) {
-        if (homepageUrl == null) {
-            homepageUrl = "";
-            assert !showHomeButton : "Homepage should be disabled for a null URL";
+            boolean showHomeButton, boolean homepageIsNtp, GURL homepageGurl) {
+        if (homepageGurl.isEmpty()) {
+            assert !showHomeButton : "Homepage should be disabled for an empty GURL";
         }
         LaunchMetricsJni.get().recordHomePageLaunchMetrics(
-                showHomeButton, homepageIsNtp, homepageUrl);
+                showHomeButton, homepageIsNtp, homepageGurl);
     }
 
     /**
@@ -134,6 +134,6 @@
         void recordLaunch(boolean isShortcut, String url, int source,
                 @DisplayMode.EnumType int displayMode, WebContents webContents);
         void recordHomePageLaunchMetrics(
-                boolean showHomeButton, boolean homepageIsNtp, String homepageUrl);
+                boolean showHomeButton, boolean homepageIsNtp, GURL homepageGurl);
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java
index 937f538d..ab52076a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java
@@ -198,7 +198,8 @@
     }
 
     private boolean shouldInterceptBackPress() {
-        return mPresenter != null && mPresenter.getDialogModel() != null;
+        return mPresenter != null && mPresenter.getDialogModel() != null
+                && mTabModalSuspendedToken == TokenHolder.INVALID_TOKEN;
     }
 
     private void handleTabChanged(Tab tab) {
@@ -244,5 +245,6 @@
         } else if (mTabModalSuspendedToken == TokenHolder.INVALID_TOKEN) {
             mTabModalSuspendedToken = mManager.suspendType(ModalDialogType.TAB);
         }
+        mHandleBackPressChangedSupplier.set(shouldInterceptBackPress());
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java b/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
index 69096472..711ac59 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
@@ -76,17 +76,17 @@
      * @param url The URL to check.
      * @param profile The instance of the current {@link Profile}.
      */
-    public static String maybeGetOverrideUrl(String url, Profile profile) {
+    public static GURL maybeGetOverrideUrl(GURL gurl, Profile profile) {
         if ((profile != null && profile.isOffTheRecord())
                 || !isNewTabSearchEngineUrlAndroidEnabled() || isDefaultSearchEngineGoogle()
-                || !UrlUtilities.isNTPUrl(url)) {
-            return url;
+                || !UrlUtilities.isNTPUrl(gurl)) {
+            return gurl;
         }
 
         TemplateUrlService templateUrlService =
                 profile != null ? TemplateUrlServiceFactory.getForProfile(profile) : null;
         String newTabUrl = getDSENewTabUrl(templateUrlService);
-        return newTabUrl != null ? newTabUrl : url;
+        return newTabUrl != null ? new GURL(newTabUrl) : gurl;
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
index a3f2b59..ddce672c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
@@ -82,6 +82,7 @@
 import org.chromium.content_public.common.ResourceRequestBody;
 import org.chromium.ui.base.DeviceFormFactor;
 import org.chromium.ui.base.PageTransition;
+import org.chromium.url.GURL;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -488,12 +489,11 @@
      */
     @VisibleForTesting
     public static boolean useChromeHomepage() {
-        String homePageUrl = HomepageManager.getHomepageUri();
+        GURL homePageGurl = HomepageManager.getHomepageGurl();
         return HomepageManager.isHomepageEnabled()
                 && ((HomepagePolicyManager.isInitializedWithNative()
                             || sSkipInitializationCheckForTesting)
-                        && (TextUtils.isEmpty(homePageUrl)
-                                || UrlUtilities.isCanonicalizedNTPUrl(homePageUrl)));
+                        && (homePageGurl.isEmpty() || UrlUtilities.isNTPUrl(homePageGurl)));
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index bb41ce5..5fe91f1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -12,7 +12,6 @@
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
 import android.os.Handler;
-import android.text.TextUtils;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnAttachStateChangeListener;
@@ -1744,9 +1743,12 @@
 
     @VisibleForTesting
     static String homepageUrl() {
-        String homePageUrl = HomepageManager.getHomepageUri();
-        if (TextUtils.isEmpty(homePageUrl)) homePageUrl = UrlConstants.NTP_URL;
-        return homePageUrl;
+        GURL homepageGurl = HomepageManager.getHomepageGurl();
+        if (homepageGurl.isEmpty()) {
+            return UrlConstants.NTP_URL;
+        } else {
+            return homepageGurl.getSpec();
+        }
     }
 
     private void registerTemplateUrlObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java
index 721f6da..17894122 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java
@@ -201,7 +201,7 @@
         boolean isNtpUrl = UrlUtilities.isCanonicalizedNTPUrl(url);
 
         boolean shouldBlockWithoutIntent = shouldBlockDrawForNtpOnColdStartWithoutIntent(
-                tabState, HomepageManager.isHomepageNonNtpPreNative(), singleUrlBarMode);
+                tabState, HomepageManager.isHomepageNonNtp(), singleUrlBarMode);
 
         if (shouldBlockDrawForNtpOnColdStartWithIntent(hasValidIntentUrl, isNtpUrl,
                     IncognitoTabLauncher.didCreateIntent(mIntentSupplier.get()),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
index 400784d..dd81e62e 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -104,7 +104,6 @@
             Features.getInstance().disable(ChromeFeatureList.OFFLINE_PAGES_DESCRIPTIVE_FAIL_STATUS);
         }
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            DownloadNotificationService.clearResumptionAttemptLeft();
             mDownloadNotificationService = new MockDownloadNotificationService();
             mDownloadForegroundServiceManager =
                     new DownloadForegroundServiceManagerTest.MockDownloadForegroundServiceManager();
@@ -116,7 +115,6 @@
 
     @After
     public void tearDown() {
-        DownloadNotificationService.clearResumptionAttemptLeft();
         SharedPreferencesManager.getInstance().removeKey(
                 ChromePreferenceKeys.DOWNLOAD_PENDING_DOWNLOAD_NOTIFICATIONS);
     }
@@ -136,7 +134,6 @@
         int notificationId1 = mDownloadNotificationService.getLastNotificationId();
         assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
 
         // Download is paused.
         mDownloadNotificationService.notifyDownloadPaused(ID1, "test", true /* isResumable*/,
@@ -146,7 +143,6 @@
         assertEquals(1, mDownloadNotificationService.getNotificationIds().size());
         assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
 
         // Download is again in-progress.
         mDownloadNotificationService.notifyDownloadProgress(ID1, "test",
@@ -157,7 +153,6 @@
         assertEquals(1, mDownloadNotificationService.getNotificationIds().size());
         assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
 
         // Download is successful.
         mDownloadNotificationService.notifyDownloadSuccessful(ID1, "", "test", 1L,
@@ -166,7 +161,6 @@
         assertEquals(1, mDownloadNotificationService.getNotificationIds().size());
         assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
     }
 
     @Test
@@ -184,7 +178,6 @@
         int notificationId1 = mDownloadNotificationService.getLastNotificationId();
         assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
 
         // Download is interrupted and now is pending.
         mDownloadNotificationService.notifyDownloadPaused(ID1, "test", true /* isResumable */,
@@ -193,7 +186,6 @@
         assertEquals(1, mDownloadNotificationService.getNotificationIds().size());
         assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
 
         // Download is cancelled.
         mDownloadNotificationService.notifyDownloadCanceled(ID1, false);
@@ -201,7 +193,6 @@
         assertEquals(0, mDownloadNotificationService.getNotificationIds().size());
         assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
     }
 
     @Test
@@ -219,7 +210,6 @@
         int notificationId1 = mDownloadNotificationService.getLastNotificationId();
         assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
 
         // Download is interrupted but because it is not resumable, fails.
         mDownloadNotificationService.notifyDownloadPaused(ID1, "test", false /* isResumable*/,
@@ -228,6 +218,5 @@
         assertEquals(1, mDownloadNotificationService.getNotificationIds().size());
         assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey(
                 notificationId1));
-        assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1));
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
index c7eae3c..5348f234 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
@@ -187,7 +187,8 @@
 
     private String getHomepageUrlOnUiThread() {
         AtomicReference<String> res = new AtomicReference<>();
-        TestThreadUtils.runOnUiThreadBlocking(() -> { res.set(HomepageManager.getHomepageUri()); });
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { res.set(HomepageManager.getHomepageGurl().getSpec()); });
         return res.get();
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java
index 18c7828d..512c9f9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java
@@ -22,16 +22,15 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.DoNotBatch;
 import org.chromium.base.test.util.Feature;
+import org.chromium.chrome.browser.common.ChromeUrlConstants;
 import org.chromium.chrome.browser.homepage.HomepageManager;
 import org.chromium.chrome.browser.homepage.HomepageTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsDelayedProvider;
 import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsProvider;
 import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.url.GURL;
-import org.chromium.url.JUnitTestGURLs;
 
 /**
  * Unit test suite for partner homepage.
@@ -51,7 +50,7 @@
 
     public static final String TAG = "PartnerHomepageUnitTest";
 
-    private static final GURL TEST_CUSTOM_HOMEPAGE_GURL = JUnitTestGURLs.EXAMPLE_URL;
+    private static final GURL TEST_CUSTOM_HOMEPAGE_GURL = new GURL("http://chrome.com");
 
     private HomepageManager mHomepageManager;
     private PartnerBrowserCustomizations mPartnerBrowserCustomizations;
@@ -174,7 +173,7 @@
         Assert.assertEquals(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI,
                 mPartnerBrowserCustomizations.getHomePageUrl().getSpec());
         Assert.assertFalse(HomepageManager.isHomepageEnabled());
-        Assert.assertNull(HomepageManager.getHomepageUri());
+        Assert.assertTrue(HomepageManager.getHomepageGurl().isEmpty());
     }
 
     /**
@@ -206,7 +205,7 @@
         Assert.assertEquals(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI,
                 mPartnerBrowserCustomizations.getHomePageUrl().getSpec());
         Assert.assertTrue(HomepageManager.isHomepageEnabled());
-        Assert.assertEquals(TEST_CUSTOM_HOMEPAGE_GURL.getSpec(), HomepageManager.getHomepageUri());
+        Assert.assertEquals(TEST_CUSTOM_HOMEPAGE_GURL, HomepageManager.getHomepageGurl());
     }
 
     /**
@@ -236,7 +235,7 @@
         Assert.assertFalse(mPartnerBrowserCustomizations.isHomepageProviderAvailableAndEnabled());
         Assert.assertNull(mPartnerBrowserCustomizations.getHomePageUrl());
         Assert.assertFalse(HomepageManager.isHomepageEnabled());
-        Assert.assertNull(HomepageManager.getHomepageUri());
+        Assert.assertTrue(HomepageManager.getHomepageGurl().isEmpty());
 
         mPartnerBrowserCustomizations.setOnInitializeAsyncFinished(mTestRule.getCallback(), 2000);
 
@@ -279,7 +278,7 @@
         Assert.assertFalse(mPartnerBrowserCustomizations.isHomepageProviderAvailableAndEnabled());
         Assert.assertNull(mPartnerBrowserCustomizations.getHomePageUrl());
         Assert.assertFalse(HomepageManager.isHomepageEnabled());
-        Assert.assertNull(HomepageManager.getHomepageUri());
+        Assert.assertTrue(HomepageManager.getHomepageGurl().isEmpty());
 
         mPartnerBrowserCustomizations.setOnInitializeAsyncFinished(mTestRule.getCallback(), 3000);
 
@@ -291,7 +290,7 @@
                 mPartnerBrowserCustomizations.getHomePageUrl().getSpec());
         Assert.assertTrue(HomepageManager.isHomepageEnabled());
         Assert.assertEquals(TestPartnerBrowserCustomizationsDelayedProvider.HOMEPAGE_URI,
-                HomepageManager.getHomepageUri());
+                HomepageManager.getHomepageGurl().getSpec());
     }
 
     /**
@@ -324,12 +323,12 @@
                 mPartnerBrowserCustomizations.getHomePageUrl().getSpec());
         Assert.assertTrue(HomepageManager.isHomepageEnabled());
         Assert.assertEquals(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI,
-                HomepageManager.getHomepageUri());
+                HomepageManager.getHomepageGurl().getSpec());
     }
 
     private void assertHomePageIsNtp() {
         // The home page should default to the NTP
         Assert.assertTrue(HomepageManager.isHomepageEnabled());
-        Assert.assertEquals(UrlConstants.NTP_URL, HomepageManager.getHomepageUri());
+        Assert.assertEquals(ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getHomepageGurl());
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java
index 7eae328..73cdb5f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java
@@ -6,8 +6,6 @@
 
 import static org.mockito.Mockito.doReturn;
 
-import androidx.test.filters.SmallTest;
-
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -35,7 +33,6 @@
 import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
-import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.embedder_support.util.UrlUtilities;
 import org.chromium.components.search_engines.TemplateUrl;
 import org.chromium.components.search_engines.TemplateUrlService;
@@ -129,7 +126,7 @@
     }
 
     @Test
-    public void testGetDefaultHomepageUriPreferenceKeysMigration() {
+    public void testGetDefaultHomepageGurlPreferenceKeysMigration() {
         Mockito.doNothing()
                 .when(mPartnerBrowserCustomizations)
                 .setPartnerHomepageListener(ArgumentMatchers.any());
@@ -142,7 +139,7 @@
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, null);
         Assert.assertEquals(
-                ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getDefaultHomepageUri());
+                ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getDefaultHomepageGurl());
 
         final GURL blueUrl = JUnitTestGURLs.BLUE_1;
         SharedPreferencesManager.getInstance().writeString(
@@ -150,7 +147,7 @@
                 blueUrl.getSpec());
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, null);
-        Assert.assertEquals(blueUrl, HomepageManager.getDefaultHomepageUri());
+        Assert.assertEquals(blueUrl, HomepageManager.getDefaultHomepageGurl());
 
         final GURL redUrl = JUnitTestGURLs.RED_1;
         final String serializedRedGurl = redUrl.serialize();
@@ -158,7 +155,7 @@
                 ChromePreferenceKeys.DEPRECATED_HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_URI, null);
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, serializedRedGurl);
-        Assert.assertEquals(redUrl, HomepageManager.getDefaultHomepageUri());
+        Assert.assertEquals(redUrl, HomepageManager.getDefaultHomepageGurl());
 
         final GURL url1 = JUnitTestGURLs.URL_1;
         final GURL url2 = JUnitTestGURLs.URL_2;
@@ -168,57 +165,55 @@
                 url1.getSpec());
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, serializedGurl2);
-        Assert.assertEquals(url2, HomepageManager.getDefaultHomepageUri());
+        Assert.assertEquals(url2, HomepageManager.getDefaultHomepageGurl());
     }
 
     @Test
-    public void testGetPrefHomepageCustomUriPreferenceKeysMigration() {
+    public void testGetPrefHomepageCustomGurlPreferenceKeysMigration() {
         HomepageManager homepageManager = HomepageManager.getInstance();
 
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, null);
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, null);
-        Assert.assertTrue(homepageManager.getPrefHomepageCustomUri().isEmpty());
+        Assert.assertTrue(homepageManager.getPrefHomepageCustomGurl().isEmpty());
 
         final GURL blueUrl = JUnitTestGURLs.BLUE_1;
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, blueUrl.getSpec());
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, null);
-        Assert.assertEquals(blueUrl, homepageManager.getPrefHomepageCustomUri());
+        Assert.assertEquals(blueUrl, homepageManager.getPrefHomepageCustomGurl());
 
         final GURL redUrl = JUnitTestGURLs.RED_1;
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, null);
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, redUrl.serialize());
-        Assert.assertEquals(redUrl, homepageManager.getPrefHomepageCustomUri());
+        Assert.assertEquals(redUrl, homepageManager.getPrefHomepageCustomGurl());
 
         final GURL url1 = JUnitTestGURLs.URL_1;
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, redUrl.serialize());
         SharedPreferencesManager.getInstance().writeString(
                 ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, url1.serialize());
-        Assert.assertEquals(url1, homepageManager.getPrefHomepageCustomUri());
+        Assert.assertEquals(url1, homepageManager.getPrefHomepageCustomGurl());
     }
 
     @Test
-    @SmallTest
     @EnableFeatures({ChromeFeatureList.NEW_TAB_SEARCH_ENGINE_URL_ANDROID})
     public void testOverrideNtpHomepage() {
         ShadowHomepagePolicyManager.sHomepageUrl = GURL.emptyGURL();
 
         Assert.assertNull(DseNewTabUrlManager.getDSENewTabUrl(null));
-        Assert.assertEquals(UrlConstants.NTP_URL, HomepageManager.getHomepageUri());
+        Assert.assertEquals(ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getHomepageGurl());
 
         TemplateUrlService templateUrlService = Mockito.mock(TemplateUrlService.class);
         initializeProfile(false, templateUrlService);
 
-        HomepageManager.getHomepageUri();
         Assert.assertEquals(JUnitTestGURLs.SEARCH_URL.getSpec(),
                 DseNewTabUrlManager.getDSENewTabUrl(templateUrlService));
-        Assert.assertEquals(JUnitTestGURLs.SEARCH_URL.getSpec(), HomepageManager.getHomepageUri());
+        Assert.assertEquals(JUnitTestGURLs.SEARCH_URL, HomepageManager.getHomepageGurl());
 
         ProfileManager.resetForTesting();
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java
index f141ae7..93586e30 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java
@@ -77,7 +77,7 @@
     private static final String ASSERT_MESSAGE_EDIT_TEXT =
             "EditText does not contains the expected homepage in test settings.";
     private static final String ASSERT_HOMEPAGE_MANAGER_SETTINGS =
-            "HomepageManager#getHomepageUri is different than test homepage settings.";
+            "HomepageManager#getHomepageGurl is different than test homepage settings.";
 
     private static final String ASSERT_HOMEPAGE_LOCATION_TYPE_MISMATCH =
             "HomepageLocationType is different than test settings.";
@@ -376,7 +376,8 @@
         Assert.assertEquals(ASSERT_MESSAGE_EDIT_TEXT, TEST_URL_BAR,
                 mCustomUriRadioButton.getPrimaryText().toString());
 
-        Assert.assertNull(ASSERT_HOMEPAGE_MANAGER_SETTINGS, HomepageManager.getHomepageUri());
+        Assert.assertTrue(
+                ASSERT_HOMEPAGE_MANAGER_SETTINGS, HomepageManager.getHomepageGurl().isEmpty());
     }
 
     /**
@@ -458,8 +459,8 @@
                 ASSERT_MESSAGE_RADIO_BUTTON_CUSTOMIZED_CHECK, mCustomUriRadioButton.isChecked());
         Assert.assertEquals(ASSERT_MESSAGE_EDIT_TEXT, TEST_URL_FOO,
                 mCustomUriRadioButton.getPrimaryText().toString());
-        Assert.assertEquals(
-                ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO, HomepageManager.getHomepageUri());
+        Assert.assertEquals(ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO,
+                HomepageManager.getHomepageGurl().getSpec());
         assertUserActionRecorded(false);
 
         // Check radio button to select NTP as homepage. Homepage is not changed yet at this time.
@@ -482,8 +483,8 @@
         // End the activity. The homepage should be the customized url, and the location counter
         // should stay at 0 as nothing is changed.
         finishSettingsActivity();
-        Assert.assertEquals(
-                ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO, HomepageManager.getHomepageUri());
+        Assert.assertEquals(ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO,
+                HomepageManager.getHomepageGurl().getSpec());
         assertUserActionRecorded(false);
     }
 
@@ -505,7 +506,7 @@
         Assert.assertEquals(
                 ASSERT_MESSAGE_EDIT_TEXT, "", mCustomUriRadioButton.getPrimaryText().toString());
         Assert.assertTrue(ASSERT_HOMEPAGE_MANAGER_SETTINGS,
-                UrlUtilities.isNTPUrl(HomepageManager.getHomepageUri()));
+                UrlUtilities.isNTPUrl(HomepageManager.getHomepageGurl()));
         assertUserActionRecorded(false);
 
         // Update the text box. To do this, request focus for customized radio button so that the
@@ -525,8 +526,8 @@
         mCustomUriRadioButton.setPrimaryText(TEST_URL_BAR);
         finishSettingsActivity();
 
-        Assert.assertEquals(
-                ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_BAR, HomepageManager.getHomepageUri());
+        Assert.assertEquals(ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_BAR,
+                HomepageManager.getHomepageGurl().getSpec());
         assertUserActionRecorded(true);
     }
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
index 1ddf81d..b3d957b 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
@@ -85,6 +85,7 @@
 import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.components.url_formatter.UrlFormatterJni;
 import org.chromium.ui.base.DeviceFormFactor;
+import org.chromium.url.GURL;
 import org.chromium.url.JUnitTestGURLs;
 
 /** Unit tests for {@link ReturnToChromeUtil} class. */
@@ -97,7 +98,7 @@
     /** Shadow for {@link HomepageManager}. */
     @Implements(HomepageManager.class)
     static class ShadowHomepageManager {
-        static String sHomepageUrl;
+        static GURL sHomepageGurl;
         static boolean sIsHomepageEnabled;
 
         @Implementation
@@ -106,8 +107,8 @@
         }
 
         @Implementation
-        public static String getHomepageUri() {
-            return sHomepageUrl;
+        public static GURL getHomepageGurl() {
+            return sHomepageGurl;
         }
     }
 
@@ -166,9 +167,9 @@
         ChromeFeatureList.sStartSurfaceAndroid.setForTesting(true);
 
         // HomepageManager:
-        ShadowHomepageManager.sHomepageUrl = UrlConstants.NTP_NON_NATIVE_URL;
+        ShadowHomepageManager.sHomepageGurl = UrlConstants.ntpGurl();
         ShadowHomepageManager.sIsHomepageEnabled = true;
-        Assert.assertEquals(UrlConstants.NTP_NON_NATIVE_URL, HomepageManager.getHomepageUri());
+        Assert.assertEquals(UrlConstants.ntpGurl(), HomepageManager.getHomepageGurl());
         Assert.assertTrue(HomepageManager.isHomepageEnabled());
 
         ShadowHomepagePolicyManager.sIsInitialized = true;
@@ -460,7 +461,7 @@
         Assert.assertTrue(ReturnToChromeUtil.isStartSurfaceEnabled(mContext));
 
         // Sets a customized homepage:
-        ShadowHomepageManager.sHomepageUrl = "foo.com";
+        ShadowHomepageManager.sHomepageGurl = new GURL("http://foo.com");
         Assert.assertFalse(ReturnToChromeUtil.useChromeHomepage());
 
         // Sets main intent from launcher:
@@ -483,7 +484,7 @@
         Assert.assertTrue(ReturnToChromeUtil.shouldShowOverviewPageOnStart(
                 mContext, intent, mTabModelSelector, mInactivityTracker, false /* isTablet */));
 
-        ShadowHomepageManager.sHomepageUrl = UrlConstants.NTP_NON_NATIVE_URL;
+        ShadowHomepageManager.sHomepageGurl = UrlConstants.ntpGurl();
         SharedPreferencesManager.getInstance().removeKey(
                 ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF);
     }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java
index 6388475..6e698c7 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java
@@ -13,8 +13,6 @@
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import android.text.TextUtils;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Rule;
@@ -30,6 +28,7 @@
 import org.chromium.base.supplier.Supplier;
 import org.chromium.base.test.BaseRobolectricTestRunner;
 import org.chromium.base.test.util.JniMocker;
+import org.chromium.chrome.browser.common.ChromeUrlConstants;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.homepage.HomepageManager;
@@ -41,11 +40,11 @@
 import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
-import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.feature_engagement.Tracker;
 import org.chromium.content_public.browser.LoadUrlParams;
 import org.chromium.ui.base.PageTransition;
+import org.chromium.url.GURL;
 
 /** Unit tests for ToolbarTabControllerImpl. */
 @RunWith(BaseRobolectricTestRunner.class)
@@ -191,12 +190,12 @@
     @Test
     public void openHomepage_loadsHomePage() {
         mToolbarTabController.openHomepage();
-        String homePageUrl = HomepageManager.getHomepageUri();
-        if (TextUtils.isEmpty(homePageUrl)) {
-            homePageUrl = UrlConstants.NTP_URL;
+        GURL homePageGurl = HomepageManager.getHomepageGurl();
+        if (homePageGurl.isEmpty()) {
+            homePageGurl = ChromeUrlConstants.nativeNtpGurl();
         }
         verify(mTab).loadUrl(argThat(new LoadUrlParamsMatcher(
-                new LoadUrlParams(homePageUrl, PageTransition.HOME_PAGE))));
+                new LoadUrlParams(homePageGurl, PageTransition.HOME_PAGE))));
     }
 
     @Test
diff --git a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java
index a0d46b3..c5e469d 100644
--- a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java
+++ b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java
@@ -29,7 +29,7 @@
      * Description is only relevant for the UI, language and voiceId are required
      * for the server request.
      */
-    class PlaybackVoice {
+    static class PlaybackVoice {
         private final String mLanguage;
         private final String mVoiceId;
         @Nullable
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni
index 087f1080..8e74334b 100644
--- a/chrome/android/trichrome.gni
+++ b/chrome/android/trichrome.gni
@@ -186,6 +186,9 @@
 # files. This is used to support SuperSize on Trichrome.
 template("write_ssargs_trichrome") {
   _extra_args = " --abi-filter ${invoker.abi_filter}"
+  if (defined(invoker.symbols_dir)) {
+    _extra_args += " --symbols-dir ${invoker.symbols_dir}"
+  }
 
   # Base names (i.e., no full path) are used because .ssargs files specifies
   # files using paths relative to itself. It is expected for |ssargs_path| to
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 43c6027..e2807df 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5091,6 +5091,16 @@
     {"mac-syscall-sandbox", flag_descriptions::kMacSyscallSandboxName,
      flag_descriptions::kMacSyscallSandboxDescription, kOsMac,
      FEATURE_VALUE_TYPE(features::kMacSyscallSandbox)},
+
+    {"mac-loopback-audio-for-cast",
+     flag_descriptions::kMacLoopbackAudioForCastName,
+     flag_descriptions::kMacLoopbackAudioForCastDescription, kOsMac,
+     FEATURE_VALUE_TYPE(media::kMacLoopbackAudioForCast)},
+
+    {"mac-loopback-audio-for-screen-share",
+     flag_descriptions::kMacLoopbackAudioForScreenShareName,
+     flag_descriptions::kMacLoopbackAudioForScreenShareDescription, kOsMac,
+     FEATURE_VALUE_TYPE(media::kMacLoopbackAudioForScreenShare)},
 #endif  // BUILDFLAG(IS_MAC)
 #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
     {"web-share", flag_descriptions::kWebShareName,
diff --git a/chrome/browser/android/metrics/launch_metrics.cc b/chrome/browser/android/metrics/launch_metrics.cc
index c9805171..87bff148 100644
--- a/chrome/browser/android/metrics/launch_metrics.cc
+++ b/chrome/browser/android/metrics/launch_metrics.cc
@@ -14,6 +14,7 @@
 #include "components/webapps/browser/banners/app_banner_settings_helper.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
+#include "url/android/gurl_android.h"
 #include "url/gurl.h"
 
 using base::android::JavaParamRef;
@@ -86,12 +87,11 @@
     JNIEnv* env,
     jboolean show_home_button,
     jboolean homepage_is_ntp,
-    const JavaParamRef<jstring>& jhomepage_url) {
-  GURL homepage_url(base::android::ConvertJavaStringToUTF8(env, jhomepage_url));
+    const JavaParamRef<jobject>& jhomepage_gurl) {
+  std::unique_ptr<GURL> homepage_gurl =
+      url::GURLAndroid::ToNativeGURL(env, jhomepage_gurl);
   PrefMetricsService::RecordHomePageLaunchMetrics(
-      show_home_button,
-      homepage_is_ntp,
-      homepage_url);
+      show_home_button, homepage_is_ntp, *homepage_gurl);
 }
 
 }  // namespace metrics
diff --git a/chrome/browser/android/webapk/fake_webapk_database_factory.cc b/chrome/browser/android/webapk/fake_webapk_database_factory.cc
index 7c4a5034..4573436 100644
--- a/chrome/browser/android/webapk/fake_webapk_database_factory.cc
+++ b/chrome/browser/android/webapk/fake_webapk_database_factory.cc
@@ -58,13 +58,13 @@
 }
 
 void FakeWebApkDatabaseFactory::WriteProtos(
-    const std::vector<std::unique_ptr<WebApkProto>>& protos) {
+    const std::vector<const WebApkProto*>& protos) {
   base::RunLoop run_loop;
 
   std::unique_ptr<syncer::ModelTypeStore::WriteBatch> write_batch =
       GetStore()->CreateWriteBatch();
 
-  for (const std::unique_ptr<WebApkProto>& proto : protos) {
+  for (const WebApkProto* proto : protos) {
     GURL manifest_id(proto->sync_data().manifest_id());
     DCHECK(!manifest_id.is_empty());
     DCHECK(manifest_id.is_valid());
@@ -85,10 +85,10 @@
 }
 
 void FakeWebApkDatabaseFactory::WriteRegistry(const Registry& registry) {
-  std::vector<std::unique_ptr<WebApkProto>> protos;
+  std::vector<const WebApkProto*> protos;
   for (const Registry::value_type& kv : registry) {
-    auto webapk = std::unique_ptr<WebApkProto>(kv.second.get());
-    protos.push_back(std::move(webapk));
+    const WebApkProto* webapk = kv.second.get();
+    protos.push_back(webapk);
   }
 
   WriteProtos(protos);
diff --git a/chrome/browser/android/webapk/fake_webapk_database_factory.h b/chrome/browser/android/webapk/fake_webapk_database_factory.h
index 8019502..2574867 100644
--- a/chrome/browser/android/webapk/fake_webapk_database_factory.h
+++ b/chrome/browser/android/webapk/fake_webapk_database_factory.h
@@ -30,7 +30,7 @@
 
   Registry ReadRegistry();
 
-  void WriteProtos(const std::vector<std::unique_ptr<WebApkProto>>& protos);
+  void WriteProtos(const std::vector<const WebApkProto*>& protos);
   void WriteRegistry(const Registry& registry);
 
  private:
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge.cc b/chrome/browser/android/webapk/webapk_sync_bridge.cc
index 09244c4..1ba1b3e 100644
--- a/chrome/browser/android/webapk/webapk_sync_bridge.cc
+++ b/chrome/browser/android/webapk/webapk_sync_bridge.cc
@@ -4,12 +4,24 @@
 
 #include "chrome/browser/android/webapk/webapk_sync_bridge.h"
 
+#include <memory>
+#include <vector>
+
 #include "base/logging.h"
+#include "chrome/browser/android/webapk/webapk_database.h"
+#include "chrome/browser/android/webapk/webapk_database_factory.h"
 #include "chrome/browser/android/webapk/webapk_helpers.h"
+#include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/common/channel_info.h"
 #include "components/sync/base/model_type.h"
 #include "components/sync/base/report_unrecoverable_error.h"
 #include "components/sync/model/client_tag_based_model_type_processor.h"
+#include "components/sync/model/metadata_batch.h"
+#include "components/sync/model/metadata_change_list.h"
+#include "components/sync/model/model_type_store.h"
+#include "components/sync/model/mutable_data_batch.h"
+#include "components/sync/protocol/web_app_specifics.pb.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
 namespace webapk {
@@ -26,19 +38,69 @@
   return entity_data;
 }
 
-WebApkSyncBridge::WebApkSyncBridge()
+namespace {
+
+const WebApkProto* GetAppById(const Registry& registry,
+                              const web_app::AppId& app_id) {
+  auto it = registry.find(app_id);
+  if (it != registry.end()) {
+    return it->second.get();
+  }
+
+  return nullptr;
+}
+
+}  // anonymous namespace
+
+WebApkSyncBridge::WebApkSyncBridge(
+    AbstractWebApkDatabaseFactory* database_factory,
+    base::OnceClosure on_initialized)
     : WebApkSyncBridge(
+          database_factory,
+          std::move(on_initialized),
           std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
               syncer::WEB_APPS,
               base::BindRepeating(&syncer::ReportUnrecoverableError,
                                   chrome::GetChannel()))) {}
 
 WebApkSyncBridge::WebApkSyncBridge(
+    AbstractWebApkDatabaseFactory* database_factory,
+    base::OnceClosure on_initialized,
     std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor)
-    : syncer::ModelTypeSyncBridge(std::move(change_processor)) {}
+    : syncer::ModelTypeSyncBridge(std::move(change_processor)) {
+  CHECK(database_factory);
+  database_ = std::make_unique<WebApkDatabase>(
+      database_factory,
+      base::BindRepeating(&WebApkSyncBridge::ReportErrorToChangeProcessor,
+                          base::Unretained(this)));
+
+  // TODO(hartmanng): we may need to query installed WebAPKs on the device here
+  // too.
+  database_->OpenDatabase(base::BindOnce(&WebApkSyncBridge::OnDatabaseOpened,
+                                         weak_ptr_factory_.GetWeakPtr(),
+                                         std::move(on_initialized)));
+}
 
 WebApkSyncBridge::~WebApkSyncBridge() = default;
 
+void WebApkSyncBridge::ReportErrorToChangeProcessor(
+    const syncer::ModelError& error) {
+  change_processor()->ReportError(error);
+}
+
+void WebApkSyncBridge::OnDatabaseOpened(
+    base::OnceClosure callback,
+    Registry registry,
+    std::unique_ptr<syncer::MetadataBatch> metadata_batch) {
+  DCHECK(database_->is_opened());
+
+  // Provide sync metadata to the processor _before_ any local changes occur.
+  change_processor()->ModelReadyToSync(std::move(metadata_batch));
+
+  registry_ = std::move(registry);
+  std::move(callback).Run();
+}
+
 std::unique_ptr<syncer::MetadataChangeList>
 WebApkSyncBridge::CreateMetadataChangeList() {
   return syncer::ModelTypeStore::WriteBatch::CreateMetadataChangeList();
@@ -61,11 +123,28 @@
 
 void WebApkSyncBridge::GetData(StorageKeyList storage_keys,
                                DataCallback callback) {
-  // TODO(hartmanng): implement
+  auto data_batch = std::make_unique<syncer::MutableDataBatch>();
+
+  for (const web_app::AppId& app_id : storage_keys) {
+    const WebApkProto* app = GetAppById(registry_, app_id);
+    if (app) {
+      data_batch->Put(app_id, CreateSyncEntityData(*app));
+    }
+  }
+
+  std::move(callback).Run(std::move(data_batch));
 }
 
 void WebApkSyncBridge::GetAllDataForDebugging(DataCallback callback) {
-  // TODO(hartmanng): implement
+  auto data_batch = std::make_unique<syncer::MutableDataBatch>();
+
+  for (const auto& appListing : registry_) {
+    const web_app::AppId app_id = appListing.first;
+    const WebApkProto& app = *appListing.second;
+    data_batch->Put(app_id, CreateSyncEntityData(app));
+  }
+
+  std::move(callback).Run(std::move(data_batch));
 }
 
 // GetClientTag and GetStorageKey must return the same thing for a given AppId
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge.h b/chrome/browser/android/webapk/webapk_sync_bridge.h
index f2a6e91..d9308e0d1 100644
--- a/chrome/browser/android/webapk/webapk_sync_bridge.h
+++ b/chrome/browser/android/webapk/webapk_sync_bridge.h
@@ -11,21 +11,19 @@
 #include "chrome/browser/android/webapk/webapk_database.h"
 #include "components/sync/model/entity_change.h"
 #include "components/sync/model/model_type_sync_bridge.h"
-
-namespace base {}
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace syncer {
+struct EntityData;
 class MetadataChangeList;
 class ModelError;
 class ModelTypeChangeProcessor;
 }  // namespace syncer
 
-namespace syncer {
-struct EntityData;
-}
-
 namespace webapk {
 
+class AbstractWebApkDatabaseFactory;
+
 // A unified sync and storage controller.
 //
 // While webapk::Registry is a read-only model, WebApkSyncBridge is a
@@ -39,9 +37,12 @@
 // ModelTypeChangeProcessor and WebApkDatabase (the storage).
 class WebApkSyncBridge : public syncer::ModelTypeSyncBridge {
  public:
-  WebApkSyncBridge();
+  WebApkSyncBridge(AbstractWebApkDatabaseFactory* database_factory,
+                   base::OnceClosure on_initialized);
   // Tests may inject mocks using this ctor.
-  explicit WebApkSyncBridge(
+  WebApkSyncBridge(
+      AbstractWebApkDatabaseFactory* database_factory,
+      base::OnceClosure on_initialized,
       std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor);
   WebApkSyncBridge(const WebApkSyncBridge&) = delete;
   WebApkSyncBridge& operator=(const WebApkSyncBridge&) = delete;
@@ -62,7 +63,13 @@
   std::string GetStorageKey(const syncer::EntityData& entity_data) override;
 
  private:
+  void OnDatabaseOpened(base::OnceClosure callback,
+                        Registry registry,
+                        std::unique_ptr<syncer::MetadataBatch> metadata_batch);
+  void ReportErrorToChangeProcessor(const syncer::ModelError& error);
+
   std::unique_ptr<WebApkDatabase> database_;
+  Registry registry_;
 
   base::WeakPtrFactory<WebApkSyncBridge> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc b/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc
index 8938bcc..a3f6d3a4 100644
--- a/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc
+++ b/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc
@@ -4,11 +4,63 @@
 
 #include "chrome/browser/android/webapk/webapk_sync_bridge.h"
 
+#include "base/containers/contains.h"
+#include "base/logging.h"
+#include "base/run_loop.h"
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "chrome/browser/android/webapk/fake_webapk_database_factory.h"
+#include "chrome/browser/android/webapk/webapk_database_factory.h"
+#include "chrome/browser/android/webapk/webapk_helpers.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "components/sync/model/data_batch.h"
 #include "components/sync/test/mock_model_type_change_processor.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+using testing::_;
 
 namespace webapk {
 
+bool IsBasicSyncDataEqual(const WebApkProto& expected_app,
+                          const syncer::EntityData& entity_data) {
+  if (!entity_data.specifics.has_web_apk()) {
+    return false;
+  }
+
+  const sync_pb::WebApkSpecifics& expected_app_specifics =
+      expected_app.sync_data();
+  const sync_pb::WebApkSpecifics& entity_specifics =
+      entity_data.specifics.web_apk();
+
+  return expected_app_specifics.manifest_id() ==
+             entity_specifics.manifest_id() &&
+         expected_app_specifics.start_url() == entity_specifics.start_url() &&
+         expected_app_specifics.name() == entity_specifics.name();
+}
+
+bool RegistryContainsSyncDataBatchChanges(
+    const Registry& registry,
+    std::unique_ptr<syncer::DataBatch> data_batch) {
+  if (!data_batch || !data_batch->HasNext()) {
+    return registry.empty();
+  }
+
+  while (data_batch->HasNext()) {
+    syncer::KeyAndData key_and_data = data_batch->Next();
+    auto web_app_iter = registry.find(key_and_data.first);
+    if (web_app_iter == registry.end()) {
+      LOG(ERROR) << "App not found in registry: " << key_and_data.first;
+      return false;
+    }
+
+    if (!IsBasicSyncDataEqual(*web_app_iter->second, *key_and_data.second)) {
+      return false;
+    }
+  }
+  return true;
+}
+
 std::unique_ptr<WebApkProto> CreateWebApkProto(const std::string& url) {
   std::unique_ptr<WebApkProto> web_apk = std::make_unique<WebApkProto>();
 
@@ -20,11 +72,18 @@
   return web_apk;
 }
 
+void InsertAppIntoRegistry(Registry* registry,
+                           std::unique_ptr<WebApkProto> app) {
+  web_app::AppId app_id =
+      GenerateAppIdFromManifestId(GURL(app->sync_data().manifest_id()));
+  ASSERT_FALSE(base::Contains(*registry, app_id));
+  registry->emplace(std::move(app_id), std::move(app));
+}
+
 class WebApkSyncBridgeTest : public ::testing::Test {
  public:
   void SetUp() override {
-    sync_bridge_ = std::make_unique<WebApkSyncBridge>(
-        mock_processor_.CreateForwardingProcessor());
+    database_factory_ = std::make_unique<FakeWebApkDatabaseFactory>();
 
     ON_CALL(mock_processor_, IsTrackingMetadata())
         .WillByDefault(testing::Return(true));
@@ -32,28 +91,96 @@
 
   void TearDown() override { DestroyManagers(); }
 
+  void InitSyncBridge() {
+    base::RunLoop loop;
+    sync_bridge_ = std::make_unique<WebApkSyncBridge>(
+        database_factory_.get(), loop.QuitClosure(),
+        mock_processor_.CreateForwardingProcessor());
+    loop.Run();
+  }
+
  protected:
   void DestroyManagers() {
     if (sync_bridge_) {
       sync_bridge_.reset();
     }
+    if (database_factory_) {
+      database_factory_.reset();
+    }
   }
 
   syncer::MockModelTypeChangeProcessor& processor() { return mock_processor_; }
+  FakeWebApkDatabaseFactory& database_factory() { return *database_factory_; }
 
   WebApkSyncBridge& sync_bridge() { return *sync_bridge_; }
 
  private:
   std::unique_ptr<WebApkSyncBridge> sync_bridge_;
+  std::unique_ptr<FakeWebApkDatabaseFactory> database_factory_;
 
   testing::NiceMock<syncer::MockModelTypeChangeProcessor> mock_processor_;
 };
 
+// Tests that the WebApkSyncBridge correctly reports data from the
+// WebApkDatabase.
+TEST_F(WebApkSyncBridgeTest, GetData) {
+  base::test::SingleThreadTaskEnvironment task_environment;
+
+  Registry registry;
+
+  std::unique_ptr<WebApkProto> synced_app1 =
+      CreateWebApkProto("https://example.com/app1/");
+  InsertAppIntoRegistry(&registry, std::move(synced_app1));
+
+  std::unique_ptr<WebApkProto> synced_app2 =
+      CreateWebApkProto("https://example.com/app2/");
+  InsertAppIntoRegistry(&registry, std::move(synced_app2));
+
+  database_factory().WriteRegistry(registry);
+
+  EXPECT_CALL(processor(), ModelReadyToSync(_)).Times(1);
+  InitSyncBridge();
+
+  {
+    WebApkSyncBridge::StorageKeyList storage_keys;
+    // Add an unknown key to test this is handled gracefully.
+    storage_keys.push_back("unknown");
+    for (const Registry::value_type& id_and_web_app : registry) {
+      storage_keys.push_back(id_and_web_app.first);
+    }
+
+    base::RunLoop run_loop;
+    sync_bridge().GetData(
+        std::move(storage_keys),
+        base::BindLambdaForTesting(
+            [&](std::unique_ptr<syncer::DataBatch> data_batch) {
+              EXPECT_TRUE(RegistryContainsSyncDataBatchChanges(
+                  registry, std::move(data_batch)));
+              run_loop.Quit();
+            }));
+    run_loop.Run();
+  }
+
+  {
+    base::RunLoop run_loop;
+    sync_bridge().GetAllDataForDebugging(base::BindLambdaForTesting(
+        [&](std::unique_ptr<syncer::DataBatch> data_batch) {
+          EXPECT_TRUE(RegistryContainsSyncDataBatchChanges(
+              registry, std::move(data_batch)));
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+}
+
 // Tests that the client & storage tags are correct for entity data.
 TEST_F(WebApkSyncBridgeTest, Identities) {
   // Should be kept up to date with
   // chrome/browser/web_applications/web_app_sync_bridge_unittest.cc's
   // WebAppSyncBridgeTest.Identities test.
+  base::test::SingleThreadTaskEnvironment task_environment;
+  InitSyncBridge();
+
   std::unique_ptr<WebApkProto> app = CreateWebApkProto("https://example.com/");
   std::unique_ptr<syncer::EntityData> entity_data = CreateSyncEntityData(*app);
 
diff --git a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc
index 143842a..5593a3dc 100644
--- a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc
+++ b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc
@@ -95,7 +95,8 @@
   source_lists.emplace_back(
       std::make_unique<DesktopMediaListAsh>(DesktopMediaList::Type::kScreen));
   const std::u16string display_name16 = base::UTF8ToUTF16(display_name);
-  DesktopMediaPicker::Params picker_params;
+  DesktopMediaPicker::Params picker_params{
+      DesktopMediaPicker::Params::RequestSource::kArcScreenCapture};
   picker_params.context = ash::Shell::GetRootWindowForDisplayId(
       display::Screen::GetScreen()->GetPrimaryDisplay().id());
   picker_params.modality = ui::ModalType::MODAL_TYPE_SYSTEM;
diff --git a/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc b/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc
index 1b1c266..8d1ab02 100644
--- a/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc
+++ b/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc
@@ -60,7 +60,7 @@
 // Helper method that performs different checks based on the user's board.
 AllowStatus BorealisTokenHardwareChecker::BoardSpecificChecks() const {
   if (BoardIn({"hatch-borealis", "puff-borealis", "zork-borealis",
-               "volteer-borealis", "aurora-borealis"})) {
+               "volteer-borealis"})) {
     if (HasNamedToken("dogfood", "MXlY+SFZ!2,P_k^02]hK",
                       "FbxB2mxNa/uqskX4X+NqHhAE6ebHeWC0u+Y+UlGEB/4=")) {
       return AllowStatus::kAllowed;
@@ -94,7 +94,7 @@
       return AllowStatus::kAllowed;
     }
     return AllowStatus::kHardwareChecksFailed;
-  } else if (BoardIn({"draco", "hades"})) {
+  } else if (BoardIn({"aurora"})) {
     return AllowStatus::kAllowed;
   } else if (BoardIn({"myst"})) {
     return AllowStatus::kAllowed;
diff --git a/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc b/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
index e281419..839242d 100644
--- a/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
+++ b/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
@@ -63,8 +63,8 @@
       AllowStatus::kHardwareChecksFailed);
 }
 
-TEST(BorealisTokenHardwareCheckerTest, Draco) {
-  EXPECT_EQ(check("draco", "", "", 0, ""), AllowStatus::kAllowed);
+TEST(BorealisTokenHardwareCheckerTest, Aurora) {
+  EXPECT_EQ(check("aurora", "", "", 0, ""), AllowStatus::kAllowed);
 }
 
 TEST(BorealisTokenHardwareCheckerTest, Myst) {
diff --git a/chrome/browser/ash/input_method/editor_event_sink.h b/chrome/browser/ash/input_method/editor_event_sink.h
index e6c4ae08..16e01358 100644
--- a/chrome/browser/ash/input_method/editor_event_sink.h
+++ b/chrome/browser/ash/input_method/editor_event_sink.h
@@ -19,7 +19,6 @@
   virtual void OnFocus(int context_id) = 0;
   virtual void OnBlur() = 0;
   virtual void OnActivateIme(std::string_view engine_id) = 0;
-  virtual void OnConsentActionReceived(ConsentAction consent_action) = 0;
   virtual void OnSurroundingTextChanged(const std::u16string& text,
                                         gfx::Range selection_range) = 0;
 };
diff --git a/chrome/browser/ash/input_method/editor_mediator.cc b/chrome/browser/ash/input_method/editor_mediator.cc
index 5e61c85..b0ea4dc 100644
--- a/chrome/browser/ash/input_method/editor_mediator.cc
+++ b/chrome/browser/ash/input_method/editor_mediator.cc
@@ -139,7 +139,7 @@
   }
 }
 
-void EditorMediator::OnConsentActionReceived(ConsentAction consent_action) {
+void EditorMediator::ProcessConsentAction(ConsentAction consent_action) {
   consent_store_->ProcessConsentAction(consent_action);
 }
 
diff --git a/chrome/browser/ash/input_method/editor_mediator.h b/chrome/browser/ash/input_method/editor_mediator.h
index 7e9156d..a191fad 100644
--- a/chrome/browser/ash/input_method/editor_mediator.h
+++ b/chrome/browser/ash/input_method/editor_mediator.h
@@ -72,8 +72,6 @@
   void OnSurroundingTextChanged(const std::u16string& text,
                                 gfx::Range selection_range) override;
 
-  void OnConsentActionReceived(ConsentAction consent_action) override;
-
   // EditorPanelManager::Delegate
   void OnPromoCardDeclined() override;
   void HandleTrigger() override;
@@ -85,6 +83,7 @@
 
   // EditorTextActuator::Delegate overrides
   void OnTextInserted() override;
+  void ProcessConsentAction(ConsentAction consent_action) override;
 
   // Checks if the feature should be visible.
   bool IsAllowedForUse();
diff --git a/chrome/browser/ash/input_method/editor_text_actuator.cc b/chrome/browser/ash/input_method/editor_text_actuator.cc
index ff9b994..5751f00 100644
--- a/chrome/browser/ash/input_method/editor_text_actuator.cc
+++ b/chrome/browser/ash/input_method/editor_text_actuator.cc
@@ -20,6 +20,14 @@
   delegate_->OnTextInserted();
 }
 
+void EditorTextActuator::ApproveConsent() {
+  delegate_->ProcessConsentAction(ConsentAction::kApproved);
+}
+
+void EditorTextActuator::DeclineConsent() {
+  delegate_->ProcessConsentAction(ConsentAction::kDeclined);
+}
+
 void EditorTextActuator::OnFocus(int context_id) {
   inserter_.OnFocus(context_id);
 }
diff --git a/chrome/browser/ash/input_method/editor_text_actuator.h b/chrome/browser/ash/input_method/editor_text_actuator.h
index c73daec..fab2ee6 100644
--- a/chrome/browser/ash/input_method/editor_text_actuator.h
+++ b/chrome/browser/ash/input_method/editor_text_actuator.h
@@ -7,6 +7,7 @@
 
 #include <string>
 
+#include "chrome/browser/ash/input_method/editor_consent_enums.h"
 #include "chrome/browser/ash/input_method/editor_text_inserter.h"
 #include "chromeos/ash/services/orca/public/mojom/orca_service.mojom.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
@@ -20,6 +21,7 @@
    public:
     virtual ~Delegate() = default;
     virtual void OnTextInserted() = 0;
+    virtual void ProcessConsentAction(ConsentAction consent_action) = 0;
   };
 
   EditorTextActuator(
@@ -29,6 +31,8 @@
 
   // orca::mojom::TextActuator overrides
   void InsertText(const std::string& text) override;
+  void ApproveConsent() override;
+  void DeclineConsent() override;
 
   void OnFocus(int context_id);
   void OnBlur();
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc
index 63701d4..fc81ab7 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc
@@ -4,10 +4,10 @@
 
 #include "chrome/browser/ash/login/demo_mode/demo_mode_dimensions.h"
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
 #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/common/pref_names.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "components/prefs/pref_service.h"
 
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc
index 7ef58e7..c7cf1eb 100644
--- a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc
@@ -4,11 +4,11 @@
 
 #include "chrome/browser/ash/login/demo_mode/demo_mode_dimensions.h"
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "base/metrics/field_trial.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/login/demo_mode/demo_mode_test_utils.h"
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc
index 8838688..a78721eb 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -7,6 +7,7 @@
 #include <algorithm>
 #include <utility>
 
+#include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
 #include "ash/public/cpp/locale_update_controller.h"
 #include "ash/public/cpp/wallpaper/wallpaper_controller.h"
@@ -45,7 +46,6 @@
 #include "chrome/browser/ui/ash/system_tray_client_impl.h"
 #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"
 #include "chrome/common/extensions/extension_constants.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/ash/components/install_attributes/install_attributes.h"
 #include "chromeos/ash/components/system/statistics_provider.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc
index 94a8c3b..75c8459e0 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ash/login/demo_mode/demo_session.h"
 
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/ash/login/login_manager_test.h"
 #include "chrome/browser/ash/login/test/device_state_mixin.h"
@@ -21,7 +22,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_list_observer.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_process_platform_part_test_api_chromeos.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/dbus/power/fake_power_manager_client.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
index c265e949..0fc5ea3 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
@@ -10,6 +10,7 @@
 #include <string>
 #include <utility>
 
+#include "ash/constants/ash_pref_names.h"
 #include "base/files/file_path.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
@@ -26,7 +27,6 @@
 #include "chrome/browser/ui/apps/chrome_app_delegate.h"
 #include "chrome/browser/ui/ash/test_wallpaper_controller.h"
 #include "chrome/browser/ui/ash/wallpaper_controller_client_impl.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_process_platform_part_test_api_chromeos.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
index 585ec9ec..36154d6 100644
--- a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
@@ -8,6 +8,7 @@
 
 #include "ash/components/arc/arc_util.h"
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
 #include "ash/public/cpp/login_accelerators.h"
 #include "base/command_line.h"
@@ -51,7 +52,6 @@
 #include "chrome/browser/ui/webui/ash/login/gaia_screen_handler.h"
 #include "chrome/browser/ui/webui/ash/login/network_screen_handler.h"
 #include "chrome/browser/ui/webui/ash/login/welcome_screen_handler.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/ash/components/dbus/shill/shill_service_client.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
index b2579130..fd233cc 100644
--- a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/components/arc/arc_util.h"
+#include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
 #include "base/barrier_closure.h"
 #include "base/command_line.h"
@@ -28,7 +29,6 @@
 #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h"
 #include "chrome/browser/ash/policy/enrollment/enrollment_status.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/ash/components/dbus/dbus_thread_manager.h"
 #include "chromeos/ash/components/install_attributes/install_attributes.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc
index fe4889d..ae10840 100644
--- a/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "ash/constants/ash_pref_names.h"
 #include "ash/constants/ash_switches.h"
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
@@ -23,7 +24,6 @@
 #include "chrome/browser/ash/settings/device_settings_service.h"
 #include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chromeos/ash/components/cryptohome/system_salt_getter.h"
diff --git a/chrome/browser/ash/login/screens/demo_preferences_screen.cc b/chrome/browser/ash/login/screens/demo_preferences_screen.cc
index afe83d1..303a7a22 100644
--- a/chrome/browser/ash/login/screens/demo_preferences_screen.cc
+++ b/chrome/browser/ash/login/screens/demo_preferences_screen.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ash/login/screens/demo_preferences_screen.h"
 
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "base/check_op.h"
 #include "base/memory/weak_ptr.h"
 #include "base/values.h"
@@ -14,7 +15,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/ui/webui/ash/login/demo_preferences_screen_handler.h"
 #include "chrome/browser/ui/webui/ash/login/welcome_screen_handler.h"
-#include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
 
 namespace ash {
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
index c70e840b..e5d508e 100644
--- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
+++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include "ash/constants/ash_features.h"
+#include "ash/constants/ash_pref_names.h"
 #include "base/environment.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
@@ -3854,9 +3855,10 @@
   scoped_stub_install_attributes_.Get()->SetDemoMode();
   scoped_feature_list_.InitAndEnableFeature(
       ash::features::kFeatureManagementFeatureAwareDeviceDemoMode);
-  scoped_local_state_.Get()->SetString(prefs::kDemoModeCountry, "CA");
-  scoped_local_state_.Get()->SetString(prefs::kDemoModeRetailerId, "retailer");
-  scoped_local_state_.Get()->SetString(prefs::kDemoModeStoreId, "1234");
+  scoped_local_state_.Get()->SetString(ash::prefs::kDemoModeCountry, "CA");
+  scoped_local_state_.Get()->SetString(ash::prefs::kDemoModeRetailerId,
+                                       "retailer");
+  scoped_local_state_.Get()->SetString(ash::prefs::kDemoModeStoreId, "1234");
 
   expected.set_country("CA");
   expected.set_retailer_name("retailer");
diff --git a/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc b/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc
index 309b905..bd8c665 100644
--- a/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc
+++ b/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc
@@ -11,6 +11,7 @@
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/functional/bind.h"
+#include "base/metrics/histogram_functions.h"
 #include "chrome/browser/ash/printing/printer_installation_manager.h"
 #include "chrome/browser/ash/printing/usb_printer_notification_controller.h"
 #include "chromeos/printing/ppd_provider.h"
@@ -182,6 +183,25 @@
   }
 
   auto it_ref = ppd_references_.find(printer.id());
+
+  // Notify metrics when necessary.
+  if (printer.ppd_reference().autoconf) {
+    // This setup attempt was performed via IPP Everywhere.
+    if (it_ref != ppd_references_.end()) {
+      // And there is a PPD file for this printer.
+      base::UmaHistogramEnumeration(
+          "Printing.CUPS.AutomaticIppSetupResultOfUsbPrinterWithPpd", result);
+    }
+  } else {
+    // This setup attempt was performed with PPD file.
+    if (printer.supports_ippusb()) {
+      // And the printer supports IPP-over-USB.
+      base::UmaHistogramEnumeration(
+          "Printing.CUPS.AutomaticPpdSetupResultOfUsbPrinterSupportingIpp",
+          result);
+    }
+  }
+
   if (it_ref != ppd_references_.end()) {
     // We have a PPD for this printer. We can try to use it if IPP Everywhere
     // setup failed.
diff --git a/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc b/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc
index 4fa821c6..7917421 100644
--- a/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc
+++ b/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc
@@ -16,6 +16,7 @@
 #include "ash/public/cpp/system/anchored_nudge_data.h"
 #include "ash/public/cpp/system/anchored_nudge_manager.h"
 #include "ash/root_window_controller.h"
+#include "ash/scalable_iph/scalable_iph_ash_notification_view.h"
 #include "ash/scalable_iph/wallpaper_ash_notification_view.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shelf/hotseat_widget.h"
@@ -91,6 +92,8 @@
 using scalable_iph::ActionType;
 
 constexpr char kNotificationSourceName[] = "ChromeOS";
+constexpr char kScalableIphNotificationType[] =
+    "scalable_iph_notification_type";
 constexpr char kWallpaperNotificationType[] = "wallpaper_notification_type";
 constexpr char kNotifierId[] = "scalable_iph";
 constexpr char kButtonIndex = 0;
@@ -157,17 +160,6 @@
   return params.image_type == NotificationImageType::kWallpaper;
 }
 
-message_center::NotificationType GetNotificationType(
-    const NotificationParams& params) {
-  switch (params.image_type) {
-    case NotificationImageType::kWallpaper:
-      return message_center::NOTIFICATION_TYPE_CUSTOM;
-    case NotificationImageType::kNoImage:
-      return message_center::NOTIFICATION_TYPE_SIMPLE;
-  }
-  NOTREACHED_NORETURN();
-}
-
 bool IsAppValidForProfile(Profile* profile, const std::string& app_id) {
   if (app_id == arc::kPlayStoreAppId &&
       !arc::IsArcPlayStoreEnabledForProfile(profile)) {
@@ -310,6 +302,10 @@
   app_list_controller_observer_.Observe(app_list_controller);
 
   MessageViewFactory::SetCustomNotificationViewFactory(
+      kScalableIphNotificationType,
+      base::BindRepeating(&ScalableIphAshNotificationView::CreateView));
+
+  MessageViewFactory::SetCustomNotificationViewFactory(
       kWallpaperNotificationType,
       base::BindRepeating(&WallpaperAshNotificationView::CreateWithPreview));
 
@@ -342,6 +338,8 @@
 ScalableIphDelegateImpl::~ScalableIphDelegateImpl() {
   // Remove the custom notification view factories.
   MessageViewFactory::ClearCustomNotificationViewFactory(
+      kScalableIphNotificationType);
+  MessageViewFactory::ClearCustomNotificationViewFactory(
       kWallpaperNotificationType);
 }
 
@@ -442,7 +440,7 @@
 
   std::unique_ptr<message_center::Notification> notification =
       ash::CreateSystemNotificationPtr(
-          GetNotificationType(params), params.notification_id,
+          message_center::NOTIFICATION_TYPE_CUSTOM, params.notification_id,
           base::UTF8ToUTF16(notification_title),
           base::UTF8ToUTF16(notification_text),
           base::UTF8ToUTF16(notification_source_name), GURL(), GetNotifierId(),
@@ -454,6 +452,8 @@
           message_center::SystemNotificationWarningLevel::NORMAL);
   if (IsWallpaperNotification(params)) {
     notification->set_custom_view_type(kWallpaperNotificationType);
+  } else {
+    notification->set_custom_view_type(kScalableIphNotificationType);
   }
   AddOrReplaceNotification(std::move(notification));
 }
@@ -785,9 +785,8 @@
       << "A bubble gets dismissed. Bubble id: " << bubble_id;
   if (bubble_id_ != bubble_id) {
     SCALABLE_IPH_LOG(GetLogger())
-        << "Bubble id " << bubble_id << " is an obsolete id.";
-    DCHECK(false) << "Callback for an obsolete bubble id gets called "
-                  << bubble_id;
+        << "Bubble id " << bubble_id
+        << " is an obsolete id. Current active bubble id is " << bubble_id_;
     return;
   }
   bubble_iph_session_.reset();
diff --git a/chrome/browser/autofill/mock_autofill_popup_controller.h b/chrome/browser/autofill/mock_autofill_popup_controller.h
index ced4dace..90ccde47 100644
--- a/chrome/browser/autofill/mock_autofill_popup_controller.h
+++ b/chrome/browser/autofill/mock_autofill_popup_controller.h
@@ -58,7 +58,6 @@
   // AutofillPopupController:
   MOCK_METHOD(void, OnSuggestionsChanged, (), (override));
   MOCK_METHOD(void, AcceptSuggestion, (int, base::TimeTicks), (override));
-  MOCK_METHOD(void, AcceptSuggestionWithoutThreshold, (int), (override));
   std::vector<Suggestion> GetSuggestions() const override {
     return suggestions_;
   }
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc
index e42c584..8130d88 100644
--- a/chrome/browser/bookmarks/android/bookmark_bridge.cc
+++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -216,7 +216,6 @@
   }
 
   page_image_service::mojom::Options options;
-  options.suggest_images = true;
   options.optimization_guide_images = true;
   image_service_->FetchImageFor(
       page_image_service::mojom::ClientId::Bookmarks,
diff --git a/chrome/browser/breadcrumbs/BUILD.gn b/chrome/browser/breadcrumbs/BUILD.gn
index 851c275e..820cfe0e 100644
--- a/chrome/browser/breadcrumbs/BUILD.gn
+++ b/chrome/browser/breadcrumbs/BUILD.gn
@@ -54,6 +54,7 @@
       ":breadcrumbs",
       "//chrome/test:test_support",
       "//components/breadcrumbs/core",
+      "//components/breadcrumbs/core:status",
     ]
 
     sources = [ "breadcrumb_manager_tab_helper_desktop_browsertest.cc" ]
diff --git a/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc b/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc
index ee43fdc..297f503 100644
--- a/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc
+++ b/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc
@@ -13,8 +13,8 @@
 #include "chrome/test/base/ui_test_utils.h"
 #include "components/breadcrumbs/core/breadcrumb_manager.h"
 #include "components/breadcrumbs/core/breadcrumb_manager_tab_helper.h"
+#include "components/breadcrumbs/core/breadcrumbs_status.h"
 #include "content/public/test/browser_test.h"
-#include "content/public/test/download_test_observer.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
 namespace {
@@ -52,6 +52,9 @@
     BreadcrumbManagerTabHelper::CreateForWebContents(
         browser()->tab_strip_model()->GetActiveWebContents());
   }
+
+ private:
+  breadcrumbs::ScopedEnableBreadcrumbsForTesting enable_breadcrumbs_;
 };
 
 // Tests download navigation.
@@ -106,6 +109,9 @@
   }
 
   net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS};
+
+ private:
+  breadcrumbs::ScopedEnableBreadcrumbsForTesting enable_breadcrumbs_;
 };
 
 // Broken authentication.
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index bb7be4e6..71051e1c 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5299,9 +5299,10 @@
   MaybeAddThrottle(MaybeCreateAboutThisSiteThrottleFor(handle), &throttles);
 #endif
 
-  if (profile && profile->GetPrefs() &&
-      profile->GetPrefs()->GetBoolean(
-          prefs::kPrivacySandboxRelatedWebsiteSetsEnabled) &&
+  auto* privacy_sandbox_settings =
+      PrivacySandboxSettingsFactory::GetForProfile(profile);
+  if (privacy_sandbox_settings &&
+      privacy_sandbox_settings->AreRelatedWebsiteSetsEnabled() &&
       base::FeatureList::IsEnabled(features::kFirstPartySets)) {
     MaybeAddThrottle(first_party_sets::FirstPartySetsNavigationThrottle::
                          MaybeCreateNavigationThrottle(handle),
diff --git a/chrome/browser/download/bubble/download_display_controller.cc b/chrome/browser/download/bubble/download_display_controller.cc
index b74271a9..c4b5b18a 100644
--- a/chrome/browser/download/bubble/download_display_controller.cc
+++ b/chrome/browser/download/bubble/download_display_controller.cc
@@ -30,6 +30,10 @@
 #include "components/offline_items_collection/core/offline_item.h"
 #include "components/offline_items_collection/core/offline_item_state.h"
 
+#if BUILDFLAG(IS_MAC)
+#include "chrome/browser/ui/fullscreen_util_mac.h"
+#endif
+
 namespace {
 
 using DownloadIconActive = DownloadDisplay::IconActive;
@@ -118,6 +122,18 @@
     BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
     will_show_details = browser_view && browser_view->IsImmersiveModeEnabled();
   }
+
+  // At this point, we are possibly in fullscreen. If we're in immersive
+  // fullscreen on macOS, it's OK to show the details bubble because the
+  // toolbar is either visible or it can be made visible. However, if we're
+  // in content/HTML fullscreen, the toolbar is not visible and we should not
+  // show the bubble. So, check our fullscreen state here and avoid showing
+  // the bubble if we're in content fullscreen.
+#if BUILDFLAG(IS_MAC)
+  will_show_details =
+      will_show_details && !fullscreen_utils::IsInContentFullscreen(browser_);
+#endif
+
   if (will_show_details) {
     display_->ShowDetails();
   }
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index 4841842a..5d32def 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -150,7 +150,8 @@
   DesktopMediaPickerController::DoneCallback callback = base::BindOnce(
       &DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults,
       this, origin, render_frame_host->GetGlobalId());
-  DesktopMediaPickerController::Params picker_params;
+  DesktopMediaPickerController::Params picker_params(
+      DesktopMediaPickerController::Params::RequestSource::kExtension);
   picker_params.web_contents = web_contents;
   picker_params.context = parent_window;
   picker_params.parent = parent_window;
diff --git a/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chrome/browser/extensions/api/management/management_api_browsertest.cc
index e7877539..38698785 100644
--- a/chrome/browser/extensions/api/management/management_api_browsertest.cc
+++ b/chrome/browser/extensions/api/management/management_api_browsertest.cc
@@ -264,15 +264,7 @@
 
 #endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
-// TODO(crbug.com/1446968): The service worker version is flaky.
-using ExtensionManagementApiBackgroundPageTest =
-    ExtensionManagementApiTestWithBackgroundType;
-
-INSTANTIATE_TEST_SUITE_P(BackgroundPage,
-                         ExtensionManagementApiBackgroundPageTest,
-                         ::testing::Values(ContextType::kPersistentBackground));
-
-IN_PROC_BROWSER_TEST_P(ExtensionManagementApiBackgroundPageTest,
+IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
                        SelfUninstall) {
   // Wait for the helper script to finish before loading the primary
   // extension. This ensures that the onUninstall event listener is
@@ -287,8 +279,7 @@
   ASSERT_TRUE(listener2.WaitUntilSatisfied());
 }
 
-// TODO(crbug.com/1446968): The service worker version is flaky.
-IN_PROC_BROWSER_TEST_P(ExtensionManagementApiBackgroundPageTest,
+IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType,
                        SelfUninstallNoPermissions) {
   // Wait for the helper script to finish before loading the primary
   // extension. This ensures that the onUninstall event listener is
diff --git a/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml b/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
index 1a1834a..483e954 100644
--- a/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
+++ b/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
@@ -31,14 +31,13 @@
         android:src="@drawable/ic_visibility_off_black"
         android:scaleType="centerInside"
         android:visibility="invisible"
+        android:layout_marginEnd="@dimen/feed_header_icon_margin"
         app:tint="@color/default_icon_color_disabled"
         tools:ignore="contentDescription" />
 
     <FrameLayout
-        android:id="@+id/header_content"
         android:layout_width="0dp"
         android:layout_height="wrap_content"
-        android:layout_marginStart="@dimen/feed_header_icon_margin"
         android:layout_weight="1">
 
       <com.google.android.material.tabs.TabLayout
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java
index 0882c98..95415fc 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java
@@ -12,7 +12,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -134,7 +133,6 @@
 
     private @Nullable SectionHeaderTabListener mTabListener;
     private ViewGroup mContent;
-    private FrameLayout mHeaderContent;
     private @Nullable View mOptionsPanel;
 
     private boolean mTextsEnabled;
@@ -197,7 +195,6 @@
         mLeadingStatusIndicator = findViewById(R.id.section_status_indicator);
         mTabLayout = findViewById(R.id.tab_list_view);
         mContent = findViewById(R.id.main_content);
-        mHeaderContent = findViewById(R.id.header_content);
 
         if (mTabLayout != null) {
             mTabListener = new SectionHeaderTabListener();
@@ -386,11 +383,6 @@
      */
     void setTabMode(boolean isTabMode) {
         if (mTabLayout != null) {
-            if (!isTabMode) {
-                MarginLayoutParams marginLayoutParams =
-                        (MarginLayoutParams) mHeaderContent.getLayoutParams();
-                marginLayoutParams.setMarginStart(0);
-            }
             mTitleView.setVisibility(isTabMode ? GONE : VISIBLE);
             mTabLayout.setVisibility(isTabMode ? VISIBLE : GONE);
         }
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java
index 1167097..34cd0e9 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java
@@ -14,6 +14,7 @@
 import org.chromium.chrome.browser.feed.R;
 import org.chromium.chrome.browser.feed.StreamKind;
 import org.chromium.chrome.browser.feed.v2.FeedUserActionType;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
@@ -138,9 +139,11 @@
      */
     public void showPostSuccessfulFollowHelp(String title, boolean isActive,
             @StreamKind int followFromFeed, @Nullable Tab tab, @Nullable GURL url) {
+        String feature = ChromeFeatureList.isEnabled(ChromeFeatureList.FEED_FOLLOW_UI_UPDATE)
+                ? FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE_WITH_UI_UPDATE
+                : FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE;
         if (TrackerFactory.getTrackerForProfile(Profile.getLastUsedRegularProfile())
-                        .shouldTriggerHelpUI(
-                                FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE)) {
+                        .shouldTriggerHelpUI(feature)) {
             if (followFromFeed == StreamKind.FOLLOWING) {
                 Runnable launchSnackbar = null;
                 if (isActive) {
@@ -149,7 +152,7 @@
                     launchSnackbar = () -> {
                         showPostSuccessfulSnackbar(title, followFromFeed, tab, url);
                     };
-                };
+                }
                 mWebFeedDialogCoordinator.initializeForInFollowingFollow(
                         mContext, launchSnackbar, title, isActive);
             } else {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 0301b4e5..6d3a09c 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5416,6 +5416,16 @@
     "expiry_milestone": 125
   },
   {
+    "name": "mac-loopback-audio-for-cast",
+    "owners": [ "mfoltz", "olka", "takumif"],
+    "expiry_milestone": 123
+  },
+  {
+    "name": "mac-loopback-audio-for-screen-share",
+    "owners": [ "mfoltz", "olka", "eladalon"],
+    "expiry_milestone": 123
+  },
+  {
     "name": "mac-syscall-sandbox",
     "owners": [ "rsesek@google.com" ],
     "expiry_milestone": 88
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 71e5d62..645f3cf 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -5186,6 +5186,16 @@
 const char kImmersiveFullscreenDescription[] =
     "Automatically hide and show the toolbar in fullscreen.";
 
+const char kMacLoopbackAudioForCastName[] =
+    "Mac System Audio Loopback for Cast";
+const char kMacLoopbackAudioForCastDescription[] =
+    "Enable system audio mirroring when casting a screen on macOS 13.0+.";
+
+const char kMacLoopbackAudioForScreenShareName[] =
+    "Mac System Audio Loopback for Screen Sharing";
+const char kMacLoopbackAudioForScreenShareDescription[] =
+    "Enable system audio sharing when screen sharing on macOS 13.0+.";
+
 const char kMacPWAsNotificationAttributionName[] =
     "Mac PWA notification attribution";
 const char kMacPWAsNotificationAttributionDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 08119b7b..8fef89b2 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -3008,6 +3008,12 @@
 extern const char kImmersiveFullscreenName[];
 extern const char kImmersiveFullscreenDescription[];
 
+extern const char kMacLoopbackAudioForCastName[];
+extern const char kMacLoopbackAudioForCastDescription[];
+
+extern const char kMacLoopbackAudioForScreenShareName[];
+extern const char kMacLoopbackAudioForScreenShareDescription[];
+
 extern const char kMacPWAsNotificationAttributionName[];
 extern const char kMacPWAsNotificationAttributionDescription[];
 
diff --git a/chrome/browser/history/history_browsertest.cc b/chrome/browser/history/history_browsertest.cc
index 562b993..6dde91f2 100644
--- a/chrome/browser/history/history_browsertest.cc
+++ b/chrome/browser/history/history_browsertest.cc
@@ -928,8 +928,15 @@
             base::Seconds(0));
 }
 
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
+#define MAYBE_ObserversCallBothOnURLVisitedForLocalVisits \
+  DISABLED_ObserversCallBothOnURLVisitedForLocalVisits
+#else
+#define MAYBE_ObserversCallBothOnURLVisitedForLocalVisits \
+  ObserversCallBothOnURLVisitedForLocalVisits
+#endif
 IN_PROC_BROWSER_TEST_F(HistoryBrowserTest,
-                       ObserversCallBothOnURLVisitedForLocalVisits) {
+                       MAYBE_ObserversCallBothOnURLVisitedForLocalVisits) {
   history::HistoryService* history_service =
       HistoryServiceFactory::GetForProfile(browser()->profile(),
                                            ServiceAccessType::EXPLICIT_ACCESS);
diff --git a/chrome/browser/media/router/mojo/media_router_desktop.cc b/chrome/browser/media/router/mojo/media_router_desktop.cc
index a0645c3..602e57ff 100644
--- a/chrome/browser/media/router/mojo/media_router_desktop.cc
+++ b/chrome/browser/media/router/mojo/media_router_desktop.cc
@@ -74,7 +74,8 @@
   DCHECK(web_contents);
 #endif
 
-  DesktopMediaPickerController::Params params;
+  DesktopMediaPickerController::Params params(
+      DesktopMediaPickerController::Params::RequestSource::kCast);
   // Value of `web_contents` comes from the UI, and typically corresponds to
   // the active tab.
   params.web_contents = web_contents;
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
index 5994fbb..adb71f4b 100644
--- a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
+++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -19,6 +19,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/media/webrtc/capture_policy_utils.h"
 #include "chrome/browser/media/webrtc/desktop_capture_devices_util.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h"
 #include "chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
@@ -74,13 +75,6 @@
 
 namespace {
 
-// Currently, loopback audio capture is only supported on Windows and ChromeOS.
-#if defined(USE_CRAS) || BUILDFLAG(IS_WIN)
-constexpr bool kIsLoopbackAudioSupported = true;
-#else
-constexpr bool kIsLoopbackAudioSupported = false;
-#endif
-
 // Helper to get title of the calling application shown in the screen capture
 // notification.
 std::u16string GetApplicationTitle(content::WebContents* web_contents,
@@ -165,7 +159,8 @@
   // tab/webcontents capture streams.
   const bool audio_supported =
       (media_id.type == content::DesktopMediaID::TYPE_SCREEN &&
-       kIsLoopbackAudioSupported) ||
+       DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+           DesktopMediaPicker::Params::RequestSource::kExtension)) ||
       media_id.type == content::DesktopMediaID::TYPE_WEB_CONTENTS;
 
   return audio_permitted && audio_requested && audio_supported;
@@ -281,7 +276,8 @@
   const bool capture_audio =
       pending_request->request.audio_type ==
           blink::mojom::MediaStreamType::GUM_DESKTOP_AUDIO_CAPTURE &&
-      kIsLoopbackAudioSupported;
+      DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+          DesktopMediaPicker::Params::RequestSource::kExtension);
 
 #if BUILDFLAG(IS_CHROMEOS)
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -573,7 +569,8 @@
       base::BindOnce(&DesktopCaptureAccessHandler::OnPickerDialogResults,
                      base::Unretained(this), web_contents->GetWeakPtr(),
                      pending_request.application_title);
-  DesktopMediaPicker::Params picker_params;
+  DesktopMediaPicker::Params picker_params(
+      DesktopMediaPicker::Params::RequestSource::kExtension);
   picker_params.web_contents = web_contents;
   gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow();
   picker_params.context = parent_window;
diff --git a/chrome/browser/media/webrtc/desktop_media_picker.cc b/chrome/browser/media/webrtc/desktop_media_picker.cc
index d944f09..800a3e1 100644
--- a/chrome/browser/media/webrtc/desktop_media_picker.cc
+++ b/chrome/browser/media/webrtc/desktop_media_picker.cc
@@ -6,7 +6,10 @@
 
 #include "chrome/browser/media/webrtc/desktop_media_picker.h"
 
-DesktopMediaPicker::Params::Params() = default;
+DesktopMediaPicker::Params::Params(RequestSource request_source)
+    : request_source(request_source) {}
+DesktopMediaPicker::Params::Params()
+    : DesktopMediaPicker::Params(RequestSource::kUnknown) {}
 DesktopMediaPicker::Params::Params(const Params&) = default;
 DesktopMediaPicker::Params& DesktopMediaPicker::Params::operator=(
     const Params&) = default;
diff --git a/chrome/browser/media/webrtc/desktop_media_picker.h b/chrome/browser/media/webrtc/desktop_media_picker.h
index 7db94cc..e21ef53 100644
--- a/chrome/browser/media/webrtc/desktop_media_picker.h
+++ b/chrome/browser/media/webrtc/desktop_media_picker.h
@@ -32,6 +32,17 @@
   using DoneCallback = base::OnceCallback<void(content::DesktopMediaID id)>;
 
   struct Params {
+    // Possible sources of the request.
+    enum class RequestSource {
+      kUnknown,
+      kCast,
+      kExtension,
+      kGetDisplayMedia,
+      kScreenshotDataCollector,
+      kArcScreenCapture,
+    };
+
+    explicit Params(RequestSource request_source);
     Params();
     Params(const Params&);
     Params& operator=(const Params&);
@@ -82,11 +93,10 @@
     // picker.
     blink::mojom::PreferredDisplaySurface preferred_display_surface =
         blink::mojom::PreferredDisplaySurface::NO_PREFERENCE;
-    // True if the source of the call is getDisplayMedia(), false if it's
-    // another source, like an extension or ARC. This is useful for UMA that
+    // Indicates the source of the request. This is useful for UMA that
     // track the result of the picker, because the behavior with the
     // Extension API is different, and could therefore lead to mismeasurement.
-    bool is_get_display_media_call = false;
+    RequestSource request_source = RequestSource::kUnknown;
   };
 
   // Creates a picker dialog/confirmation box depending on the value of
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller.cc b/chrome/browser/media/webrtc/desktop_media_picker_controller.cc
index 88ec1dc..eb6236d6 100644
--- a/chrome/browser/media/webrtc/desktop_media_picker_controller.cc
+++ b/chrome/browser/media/webrtc/desktop_media_picker_controller.cc
@@ -30,8 +30,13 @@
 #include "desktop_media_picker.h"
 #include "extensions/common/manifest.h"
 #include "extensions/common/switches.h"
+#include "media/base/media_switches.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if BUILDFLAG(IS_MAC)
+#include "base/mac/mac_util.h"
+#endif
+
 DesktopMediaPickerController::DesktopMediaPickerController(
     DesktopMediaPickerFactory* picker_factory)
     : picker_factory_(picker_factory
@@ -78,6 +83,25 @@
   OnPickerDialogResults(std::string(), content::DesktopMediaID());
 }
 
+// static
+bool DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+    Params::RequestSource request_sourcce) {
+#if BUILDFLAG(IS_WIN) || defined(USE_CRAS)
+  return true;
+#elif BUILDFLAG(IS_MAC)
+  // Only supported on macOS 13.0+.
+  if (base::mac::MacOSVersion() < 13'00'00) {
+    return false;
+  } else if (request_sourcce == Params::RequestSource::kCast) {
+    return base::FeatureList::IsEnabled(media::kMacLoopbackAudioForCast);
+  } else {
+    return base::FeatureList::IsEnabled(media::kMacLoopbackAudioForScreenShare);
+  }
+#else
+  return false;
+#endif  // BUILDFLAG(IS_WIN) || defined(USE_CRAS)
+}
+
 void DesktopMediaPickerController::OnInitialMediaListFound() {
   DCHECK(params_.select_only_screen);
   DCHECK(source_lists_.size() == 1);
@@ -85,15 +109,11 @@
   if (source_list->GetSourceCount() == 1) {
     // With only one possible source, the picker dialog is being bypassed. Apply
     // the default value of the "audio checkbox" here for desktop screen share.
-    // Only two platform configurations support desktop audio capture (i.e.,
-    // system-wide audio loopback) at this time.
     content::DesktopMediaID media_id = source_list->GetSource(0).id;
     DCHECK_EQ(media_id.type, content::DesktopMediaID::TYPE_SCREEN);
-#if defined(USE_CRAS) || BUILDFLAG(IS_WIN)
-    media_id.audio_share = params_.request_audio;
-#else
-    media_id.audio_share = false;
-#endif
+    media_id.audio_share =
+        params_.request_audio &&
+        IsSystemAudioCaptureSupported(params_.request_source);
     OnPickerDialogResults({}, media_id);
     return;
   }
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller.h b/chrome/browser/media/webrtc/desktop_media_picker_controller.h
index fc9813e..84ab144 100644
--- a/chrome/browser/media/webrtc/desktop_media_picker_controller.h
+++ b/chrome/browser/media/webrtc/desktop_media_picker_controller.h
@@ -48,6 +48,10 @@
       delete;
   ~DesktopMediaPickerController() override;
 
+  // Checks if system audio capture is supported on the current platform.
+  static bool IsSystemAudioCaptureSupported(
+      Params::RequestSource request_source);
+
   // Show the desktop picker dialog using the parameters specified by |params|,
   // with the possible selections restricted to those included in |sources|.  If
   // an error is detected synchronously, it is reported by returning an error
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc b/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
index ae71c50..3396bc91 100644
--- a/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
+++ b/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
@@ -91,7 +91,8 @@
   }
 
  protected:
-  DesktopMediaPickerController::Params picker_params_;
+  DesktopMediaPickerController::Params picker_params_{
+      DesktopMediaPickerController::Params::RequestSource::kUnknown};
   base::MockCallback<DesktopMediaPickerController::DoneCallback> done_;
   std::vector<DesktopMediaList::Type> source_types_{
       DesktopMediaList::Type::kScreen};
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc
index 4d894d5..a07bb4b 100644
--- a/chrome/browser/media/webrtc/display_media_access_handler.cc
+++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -343,7 +343,8 @@
   DesktopMediaPicker::DoneCallback done_callback =
       base::BindOnce(&DisplayMediaAccessHandler::OnDisplaySurfaceSelected,
                      base::Unretained(this), web_contents->GetWeakPtr());
-  DesktopMediaPicker::Params picker_params;
+  DesktopMediaPicker::Params picker_params(
+      DesktopMediaPicker::Params::RequestSource::kGetDisplayMedia);
   picker_params.web_contents = web_contents;
   gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow();
   picker_params.context = parent_window;
@@ -361,7 +362,6 @@
       (capture_level != AllowedScreenCaptureLevel::kUnrestricted);
   picker_params.preferred_display_surface =
       pending_request.request.preferred_display_surface;
-  picker_params.is_get_display_media_call = true;
   pending_request.picker->Show(picker_params, std::move(source_lists),
                                std::move(done_callback));
 }
diff --git a/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
index 4513162..aaa1690 100644
--- a/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
+++ b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
@@ -14,7 +14,8 @@
 
 FakeDesktopMediaPicker::FakeDesktopMediaPicker(
     FakeDesktopMediaPickerFactory::TestFlags* expectation)
-    : expectation_(expectation) {
+    : expectation_(expectation),
+      picker_params_(Params::RequestSource::kUnknown) {
   expectation_->picker_created = true;
 }
 FakeDesktopMediaPicker::~FakeDesktopMediaPicker() {
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java
index a1d9e4a..ff70494 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java
@@ -11,6 +11,7 @@
 /** Functions for getting the values of ReadAloud feature params. */
 public final class ReadAloudFeatures {
     private static final String API_KEY_OVERRIDE_PARAM_NAME = "api_key_override";
+    private static final String VOICES_OVERRIDE_PARAM_NAME = "voices_override";
 
     /** Returns the API key override feature param if present, or null otherwise. */
     @Nullable
@@ -19,4 +20,14 @@
                 ChromeFeatureList.READALOUD, API_KEY_OVERRIDE_PARAM_NAME);
         return apiKeyOverride.isEmpty() ? null : apiKeyOverride;
     }
+
+    /**
+     * Returns the voice list override param value in serialized form, or empty
+     * string if the param is absent. Value is a base64-encoded ListVoicesResponse
+     * binarypb.
+     */
+    public static String getVoicesParam() {
+        return ChromeFeatureList.getFieldTrialParamByFeature(
+                ChromeFeatureList.READALOUD, VOICES_OVERRIDE_PARAM_NAME);
+    }
 }
diff --git a/chrome/browser/resources/ash/settings/lazy_load.ts b/chrome/browser/resources/ash/settings/lazy_load.ts
index 2e6a91a..8853ef1 100644
--- a/chrome/browser/resources/ash/settings/lazy_load.ts
+++ b/chrome/browser/resources/ash/settings/lazy_load.ts
@@ -76,6 +76,7 @@
 import './guest_os/guest_os_shared_usb_devices.js';
 import './guest_os/guest_os_shared_usb_devices_add_dialog.js';
 import './keyboard_shortcut_banner/keyboard_shortcut_banner.js';
+import './nearby_share_page/nearby_share_subpage.js';
 import './os_apps_page/app_management_page/app_details_item.js';
 import './os_apps_page/app_management_page/app_item.js';
 import './os_apps_page/app_management_page/arc_detail_view.js';
@@ -174,6 +175,7 @@
 export {SettingsMultideviceTaskContinuationDisabledLinkElement} from './multidevice_page/multidevice_task_continuation_disabled_link.js';
 export {SettingsMultideviceTaskContinuationItemElement} from './multidevice_page/multidevice_task_continuation_item.js';
 export {SettingsMultideviceWifiSyncDisabledLinkElement} from './multidevice_page/multidevice_wifi_sync_disabled_link.js';
+export {SettingsNearbyShareSubpageElement} from './nearby_share_page/nearby_share_subpage.js';
 export {SettingsAudioAndCaptionsPageElement} from './os_a11y_page/audio_and_captions_page.js';
 export {BluetoothBrailleDisplayListener, BluetoothBrailleDisplayManager} from './os_a11y_page/bluetooth_braille_display_manager.js';
 export {BluetoothBrailleDisplayUiElement} from './os_a11y_page/bluetooth_braille_display_ui.js';
diff --git a/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts b/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts
index 9678a1e..20eb5b4 100644
--- a/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts
+++ b/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts
@@ -45,7 +45,7 @@
 const SettingsNearbyShareSubpageElementBase =
     DeepLinkingMixin(PrefsMixin(RouteObserverMixin(I18nMixin(PolymerElement))));
 
-class SettingsNearbyShareSubpageElement extends
+export class SettingsNearbyShareSubpageElement extends
     SettingsNearbyShareSubpageElementBase {
   static get is() {
     return 'settings-nearby-share-subpage' as const;
diff --git a/chrome/browser/resources/ash/settings/os_settings.ts b/chrome/browser/resources/ash/settings/os_settings.ts
index aed4aba..735ffa5 100644
--- a/chrome/browser/resources/ash/settings/os_settings.ts
+++ b/chrome/browser/resources/ash/settings/os_settings.ts
@@ -49,7 +49,6 @@
 import './multidevice_page/multidevice_page.js';
 import './nearby_share_page/nearby_share_high_visibility_page.js';
 import './nearby_share_page/nearby_share_receive_dialog.js';
-import './nearby_share_page/nearby_share_subpage.js';
 import './os_files_page/google_drive_subpage.js';
 import './os_apps_page/android_apps_subpage.js';
 import './os_apps_page/app_notifications_page/app_notifications_subpage.js';
@@ -87,7 +86,7 @@
 export {SettingsSliderElement} from '/shared/settings/controls/settings_slider.js';
 export {SettingsToggleButtonElement} from '/shared/settings/controls/settings_toggle_button.js';
 export {LifetimeBrowserProxy, LifetimeBrowserProxyImpl} from '/shared/settings/lifetime_browser_proxy.js';
-export {ProfileInfoBrowserProxy, ProfileInfoBrowserProxyImpl} from '/shared/settings/people_page/profile_info_browser_proxy.js';
+export {ProfileInfo, ProfileInfoBrowserProxy, ProfileInfoBrowserProxyImpl} from '/shared/settings/people_page/profile_info_browser_proxy.js';
 export {PageStatus, StatusAction, StoredAccount, SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from '/shared/settings/people_page/sync_browser_proxy.js';
 export {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from '/shared/settings/privacy_page/privacy_page_browser_proxy.js';
 export {AppManagementFileHandlingItemElement} from 'chrome://resources/cr_components/app_management/file_handling_item.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
index 7e2ab272..c55da62 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -10,6 +10,7 @@
 import {InstanceChecker} from '../../common/instance_checker.js';
 import {LocalStorage} from '../../common/local_storage.js';
 import {NavBraille} from '../common/braille/nav_braille.js';
+import {EarconId} from '../common/earcon_id.js';
 import {LocaleOutputHelper} from '../common/locale_output_helper.js';
 import {Msgs} from '../common/msgs.js';
 import {PanelCommand, PanelCommandType} from '../common/panel_command.js';
@@ -82,6 +83,8 @@
 
   /** @private */
   init_() {
+    this.earcons_.playEarcon(EarconId.CHROMEVOX_LOADING);
+
     // Export globals on ChromeVox.
     ChromeVox.braille = BrailleBackground.instance;
     // Read-only earcons.
@@ -367,6 +370,7 @@
    * @private
    */
   onIntroduceChromeVox_() {
+    this.earcons_.playEarcon(EarconId.CHROMEVOX_LOADED);
     ChromeVox.tts.speak(
         Msgs.getMsg('chromevox_intro'), QueueMode.QUEUE,
         new TtsSpeechProperties({doNotInterrupt: true}));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
index ba450102..dc5ff3d 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
@@ -98,6 +98,9 @@
      */
     this.buffers_ = {};
 
+    /** @private {!Object<string, AudioBufferSourceNode>} */
+    this.loops_ = {};
+
     /**
      * The source audio nodes for queued tick / tocks for progress.
      * Kept around so they can be canceled.
@@ -115,9 +118,6 @@
     /** @private {?number} The setInterval ID for progress sounds. */
     this.progressIntervalID_ = null;
 
-    /** @private {boolean} */
-    this.persistProgressTicks_ = false;
-
     /**
      * Maps a earcon name to the last source input audio for that
      * earcon.
@@ -144,10 +144,10 @@
     // These earcons are not tracked by the engine via their audio sources.
     switch (earcon) {
       case EarconId.CHROMEVOX_LOADED:
-        this.cancelProgressPersistent();
+        this.onChromeVoxLoaded();
         return;
       case EarconId.CHROMEVOX_LOADING:
-        this.startProgressPersistent();
+        this.onChromeVoxLoading();
         return;
       case EarconId.PAGE_FINISH_LOADING:
         this.cancelProgress();
@@ -198,7 +198,7 @@
         this.onTextField();
         break;
       case EarconId.INVALID_KEYPRESS:
-        this.onWrap();
+        this.onInvalidKeypress();
         break;
       case EarconId.LINK:
         this.onLink();
@@ -336,6 +336,7 @@
    * @param {{pitch: (number | undefined),
    *          time: (number | undefined),
    *          gain: (number | undefined),
+   *          loop: (boolean | undefined),
    *          pan: (number | undefined),
    *          reverb: (number | undefined)}=} opt_properties
    *     An object where you can override the default pitch, gain, pan,
@@ -346,10 +347,14 @@
   play(sound, opt_properties = {}) {
     const source = this.context_.createBufferSource();
     source.buffer = this.buffers_[sound];
+    if (opt_properties.loop) {
+      this.loops_[sound] = source;
+    }
 
     const pitch = opt_properties.pitch ?? this.defaultPitch;
     // Changes the playback rate of the sample – which also changes the pitch.
     source.playbackRate.value = this.multiplierFor_(pitch);
+    source.loop = opt_properties.loop ?? false;
 
     const destination = this.createCommonFilters(opt_properties);
     source.connect(destination);
@@ -365,6 +370,19 @@
     return source;
   }
 
+  /**
+   * Stops the loop of the specified sound file, if one exists.
+   * @param {string} sound The name of the sound file.
+   */
+  stopLoop(sound) {
+    if (!this.loops_[sound]) {
+      return;
+    }
+
+    this.loops_[sound].stop();
+    delete this.loops_[sound];
+  }
+
   /** Play the static sound. */
   onStatic() {
     this.play(WavSoundFile.STATIC, {gain: this.staticVolume});
@@ -473,6 +491,11 @@
     this.play(OggSoundFile.SELECTION_REVERSE);
   }
 
+  /** Play the invalid keypress sound. */
+  onInvalidKeypress() {
+    this.play(OggSoundFile.INVALID_KEYPRESS);
+  }
+
   onNoPointerAnchor() {
     this.play(WavSoundFile.STATIC, {gain: this.clickVolume * 0.2});
     const freq1 = this.frequencyFor_(Note.A_FLAT4);
@@ -574,92 +597,6 @@
     envelopeNode.connect(destination);
   }
 
-  /**
-   * Play a sweep over a bunch of notes in a scale, with an echo,
-   * for the ChromeVox on or off sounds.
-   *
-   * @param {boolean} reverse Whether to play in the reverse direction.
-   */
-  onChromeVoxSweep(reverse) {
-    const pitches = [
-      Note.C2,
-      Note.D3,
-      Note.G3,
-      Note.C3,
-      Note.D4,
-      Note.G4,
-      Note.C4,
-      Note.D5,
-      Note.G5,
-    ];
-
-    if (reverse) {
-      pitches.reverse();
-    }
-
-    const attack = 0.015;
-    const dur = pitches.length * this.sweepDelay;
-
-    const destination = this.createCommonFilters({reverb: 2.0});
-    for (let k = 0; k < this.sweepEchoCount; k++) {
-      const envelopeNode = this.context_.createGain();
-      const startTime = this.context_.currentTime + this.sweepEchoDelay * k;
-      const sweepGain = Math.pow(0.3, k);
-      const overtones = 2;
-      let overtoneGain = sweepGain;
-      for (let i = 0; i < overtones; i++) {
-        const osc = this.context_.createOscillator();
-        osc.start(startTime);
-        osc.stop(startTime + dur);
-
-        const gainNode = this.context_.createGain();
-        osc.connect(gainNode);
-        gainNode.connect(envelopeNode);
-
-        for (let j = 0; j < pitches.length; j++) {
-          let freqDecay;
-          if (reverse) {
-            freqDecay = Math.pow(0.75, pitches.length - j);
-          } else {
-            freqDecay = Math.pow(0.75, j);
-          }
-          const gain = overtoneGain * freqDecay;
-          const pitch = pitches[j] + this.sweepPitch;
-          const freq = (i + 1) * this.frequencyFor_(pitch);
-          if (j === 0) {
-            osc.frequency.setValueAtTime(freq, startTime);
-            gainNode.gain.setValueAtTime(gain, startTime);
-          } else {
-            osc.frequency.exponentialRampToValueAtTime(
-                freq, startTime + j * this.sweepDelay);
-            gainNode.gain.linearRampToValueAtTime(
-                gain, startTime + j * this.sweepDelay);
-          }
-          osc.frequency.setValueAtTime(
-              freq, startTime + j * this.sweepDelay + this.sweepDelay - attack);
-        }
-
-        overtoneGain *= 0.1 + 0.2 * k;
-      }
-
-      envelopeNode.gain.setValueAtTime(0, startTime);
-      envelopeNode.gain.linearRampToValueAtTime(1, startTime + this.sweepDelay);
-      envelopeNode.gain.setValueAtTime(1, startTime + dur - attack * 2);
-      envelopeNode.gain.linearRampToValueAtTime(0, startTime + dur);
-      envelopeNode.connect(destination);
-    }
-  }
-
-  /** Play the "ChromeVox On" sound. */
-  onChromeVoxOn() {
-    this.onChromeVoxSweep(false);
-  }
-
-  /** Play the "ChromeVox Off" sound. */
-  onChromeVoxOff() {
-    this.onChromeVoxSweep(true);
-  }
-
   /** Play an alert sound. */
   onAlert() {
     const freq1 = this.frequencyFor_(this.alertPitch - 2);
@@ -761,10 +698,6 @@
    * explicitly canceled.
    */
   startProgress() {
-    if (this.persistProgressTicks_) {
-      return;
-    }
-
     if (this.progressIntervalID_) {
       this.cancelProgress();
     }
@@ -779,9 +712,6 @@
 
   /** Stop playing any tick / tock progress sounds. */
   cancelProgress() {
-    if (this.persistProgressTicks_) {
-      return;
-    }
     if (!this.progressIntervalID_) {
       return;
     }
@@ -795,28 +725,18 @@
     this.progressIntervalID_ = null;
   }
 
-  /**
-   * Similar to the non-persistent variant above, but does not allow for
-   * cancellation by other calls to startProgress*.
-   */
-  startProgressPersistent() {
-    if (this.persistProgressTicks_) {
-      return;
-    }
-    this.startProgress();
-    this.persistProgressTicks_ = true;
+  /** Plays sound indicating ChromeVox is loading. */
+  onChromeVoxLoading() {
+    this.play(OggSoundFile.CHROMEVOX_LOADING, {loop: true});
   }
 
   /**
-   * Similar to the non-persistent variant above, but does not allow for
-   * cancellation by other calls to cancelProgress*.
+   * Plays the sound indicating ChromeVox has loaded, and cancels the ChromeVox
+   * loading sound.
    */
-  cancelProgressPersistent() {
-    if (!this.persistProgressTicks_) {
-      return;
-    }
-    this.persistProgressTicks_ = false;
-    this.cancelProgress();
+  onChromeVoxLoaded() {
+    this.stopLoop(OggSoundFile.CHROMEVOX_LOADING);
+    this.play(OggSoundFile.CHROMEVOX_LOADED);
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
index 2ddb384..7a90e49 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
@@ -6,6 +6,7 @@
  * @fileoverview ChromeVox keyboard handler.
  */
 import {KeyCode} from '../../common/key_code.js';
+import {EarconId} from '../common/earcon_id.js';
 import {EventSourceType} from '../common/event_source_type.js';
 import {ChromeVoxKbHandler} from '../common/keyboard_handler.js';
 import {Msgs} from '../common/msgs.js';
@@ -110,6 +111,8 @@
       evt.preventDefault();
       evt.stopPropagation();
       this.eatenKeyDowns_.add(evt.keyCode);
+    } else {
+      ChromeVox.earcons.playEarcon(EarconId.INVALID_KEYPRESS);
     }
     return false;
   }
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
index 8986a10..eff44be9 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
@@ -39,8 +39,8 @@
   .layout {
     display: grid;
     grid-gap: var(--gap-size) var(--gap-size);
-    grid-template-columns: repeat(2, 1fr);
-    grid-template-rows: repeat(2, 1fr);
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+    grid-template-rows: repeat(2, minmax(0, 1fr));
     padding: 0 16px 16px;
   }
 
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
index 8407454..683a8ae 100644
--- a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
+++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
@@ -5,6 +5,7 @@
     border-radius: var(--ntp-module-item-border-radius);
     color: var(--color-new-tab-page-primary-foreground);
     display: inline-block;
+    min-width: 0;
     width: 100%;
   }
 
@@ -200,7 +201,7 @@
   }
 
   :host([has-discount]) #title{
-    margin-bottom: 0px;
+    margin-bottom: 0;
   }
 
   :host([has-discount][large-format]) #title{
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.html b/chrome/browser/resources/new_tab_page/realbox/realbox.html
index d0dccb9a..a311440 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox.html
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox.html
@@ -244,7 +244,7 @@
       had-secondary-side="{{hadSecondarySide}}"
       has-secondary-side="{{hasSecondarySide}}"
       on-match-focusin="onMatchFocusin_"
-      on-match-remove="onMatchRemove_" on-header-focusin="onHeaderFocusin_"
+      on-header-focusin="onHeaderFocusin_"
       hidden$="[[!dropdownIsVisible]]">
   </cr-realbox-dropdown>
 </div>
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.ts b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
index 2ef4137..9fb6d263 100644
--- a/chrome/browser/resources/new_tab_page/realbox/realbox.ts
+++ b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
@@ -635,16 +635,6 @@
     });
   }
 
-  /**
-   * @param e Event containing index of the match that was removed.
-   */
-  private onMatchRemove_(e: CustomEvent<number>) {
-    const index = e.detail;
-    const match = this.result_!.matches[index];
-    assert(match);
-    this.pageHandler_.deleteAutocompleteMatch(index, match.destinationUrl);
-  }
-
   private onVoiceSearchClick_() {
     this.dispatchEvent(new Event('open-voice-search'));
   }
diff --git a/chrome/browser/resources/omnibox/omnibox_output.ts b/chrome/browser/resources/omnibox/omnibox_output.ts
index e89a3e2f..debc99f 100644
--- a/chrome/browser/resources/omnibox/omnibox_output.ts
+++ b/chrome/browser/resources/omnibox/omnibox_output.ts
@@ -4,7 +4,7 @@
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
 
-import {ACMatchClassification, AutocompleteAdditionalInfo, AutocompleteMatch, OmniboxResponse} from './omnibox.mojom-webui.js';
+import {ACMatchClassification, AutocompleteMatch, DictionaryEntry, OmniboxResponse} from './omnibox.mojom-webui.js';
 import {OmniboxElement} from './omnibox_element.js';
 import {DisplayInputs, OmniboxInput} from './omnibox_input.js';
 // @ts-ignore:next-line
@@ -622,8 +622,8 @@
   }
 }
 
-class OutputAdditionalInfoProperty extends OutputProperty {
-  constructor(value: AutocompleteAdditionalInfo[]) {
+class OutputDictionaryProperty extends OutputProperty {
+  constructor(value: DictionaryEntry[]) {
     super(value.map(({key, value}) => `${key}: ${value}`).join('\n'));
 
     const container = document.createElement('div');
@@ -639,7 +639,7 @@
 
     const link = document.createElement('a');
     link.download = 'AdditionalInfo.json';
-    link.href = OutputAdditionalInfoProperty.createDownloadLink(value);
+    link.href = OutputDictionaryProperty.createDownloadLink(value);
     container.appendChild(link);
 
     this.appendChild(container);
@@ -647,8 +647,7 @@
     return this;
   }
 
-  private static createDownloadLink(value: AutocompleteAdditionalInfo[]):
-      string {
+  private static createDownloadLink(value: DictionaryEntry[]): string {
     const obj = value.reduce((obj: Record<string, string>, {key, value}) => {
       obj[key] = value;
       return obj;
@@ -875,9 +874,13 @@
       'pedal-id', false, 'Pedal ID\nThe ID of attached Pedal, or zero if none.',
       match => new OutputTextProperty(String(match.pedalId))),
   new Column(
+      ['Scoring Signals'], '', 'scoring-signals', false,
+      'Scoring Signals\nSignals used by the ML Model to score suggestions.',
+      match => new OutputDictionaryProperty(match.scoringSignals)),
+  new Column(
       ['Additional Info'], '', 'additional-info', true,
       'Additional Info\nProvider-specific information about the result.',
-      match => new OutputAdditionalInfoProperty(match.additionalInfo)),
+      match => new OutputDictionaryProperty(match.additionalInfo)),
 ];
 
 customElements.define('omnibox-output', OmniboxOutput);
@@ -899,7 +902,7 @@
 customElements.define(
     'output-json-property', OutputJsonProperty, {extends: 'td'});
 customElements.define(
-    'output-additional-info-property', OutputAdditionalInfoProperty,
+    'output-additional-info-property', OutputDictionaryProperty,
     {extends: 'td'});
 customElements.define(
     'output-url-property', OutputUrlProperty, {extends: 'td'});
diff --git a/chrome/browser/resources/omnibox/omnibox_output_column_widths.css b/chrome/browser/resources/omnibox/omnibox_output_column_widths.css
index 279607f..ce66e914 100644
--- a/chrome/browser/resources/omnibox/omnibox_output_column_widths.css
+++ b/chrome/browser/resources/omnibox/omnibox_output_column_widths.css
@@ -34,8 +34,8 @@
   width: 120%;
 }
 
-.header-additional-info,
-.header-additional-properties {
+.header-scoring-signals,
+.header-additional-info {
   width: 240%;
 }
 
diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html
index e630a5cd..9364aa4 100644
--- a/chrome/browser/resources/settings/icons.html
+++ b/chrome/browser/resources/settings/icons.html
@@ -98,6 +98,11 @@
         <path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-400H160v400Zm278-58L296-440l58-58 84 84 168-168 58 58-226 226Zm-278 58v-480 480Z"></path>
       </g>
 
+      <!-- Forward GM3 icon -->
+      <g id="forward" viewBox="0 -960 960 960">
+        <path d="m640-280-57-56 184-184-184-184 57-56 240 240-240 240ZM80-200v-160q0-83 58.5-141.5T280-560h247L383-704l57-56 240 240-240 240-57-56 144-144H280q-50 0-85 35t-35 85v160H80Z"></path>
+      </g>
+
       <!-- Cookies Settings SVG -->
       <g id="block"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"></path></g>
 
diff --git a/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html b/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html
index 5f545c6..a930306 100644
--- a/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html
+++ b/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html
@@ -16,7 +16,7 @@
         pref="{{prefs.enable_do_not_track}}"
         on-settings-boolean-control-change="onToggleChange_"
         sub-label="$i18n{trackingProtectionDoNotTrackToggleSubLabel}"
-        icon="settings:visibility-off"
+        icon="settings:forward"
         no-set-pref>
       </settings-toggle-button>
     </template>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts
index 68478ef..a9778d6 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts
@@ -515,7 +515,7 @@
         await PageImageServiceBrowserProxy.getInstance()
             .handler.getPageImageUrl(
                 PageImageServiceClientId.Bookmarks, url,
-                {suggestImages: true, optimizationGuideImages: true});
+                {suggestImages: false, optimizationGuideImages: true});
     this.activeImageServiceRequestCount_--;
 
     if (result) {
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc b/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc
index 9e5f6fd..8739b23a 100644
--- a/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc
+++ b/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc
@@ -131,11 +131,9 @@
       PredictionStatus expected_status,
       absl::optional<std::vector<std::string>> expected_labels,
       const ClassificationResult& actual_result) {
-    ASSERT_EQ(expected_status, actual_result.status);
+    EXPECT_EQ(actual_result.status, expected_status);
     if (expected_labels.has_value()) {
-      ASSERT_EQ(expected_labels.value().size(),
-                actual_result.ordered_labels.size());
-      ASSERT_EQ(expected_labels.value(), actual_result.ordered_labels);
+      EXPECT_EQ(actual_result.ordered_labels, expected_labels.value());
     }
     std::move(closure).Run();
   }
@@ -251,6 +249,18 @@
       std::vector<std::string>(1, kLegacyNegativeLabel));
 }
 
+TEST_F(SegmentationPlatformServiceFactoryTest, TestResumeHeavyUserModel) {
+  InitServiceAndCacheResults(kResumeHeavyUserKey);
+
+  PredictionOptions prediction_options;
+
+  ExpectGetClassificationResult(
+      kResumeHeavyUserKey, prediction_options, nullptr,
+      /*expected_status=*/PredictionStatus::kSucceeded,
+      /*expected_labels=*/
+      std::vector<std::string>(1, kLegacyNegativeLabel));
+}
+
 TEST_F(SegmentationPlatformServiceFactoryTest, TestDeviceSwitcherModel) {
   InitService();
 
@@ -305,6 +315,18 @@
       std::vector<std::string>{kLegacyNegativeLabel});
 }
 
+TEST_F(SegmentationPlatformServiceFactoryTest, TestIntentionalUserModel) {
+  InitServiceAndCacheResults(segmentation_platform::kIntentionalUserKey);
+
+  segmentation_platform::PredictionOptions prediction_options;
+
+  ExpectGetClassificationResult(
+      segmentation_platform::kIntentionalUserKey, prediction_options, nullptr,
+      /*expected_status=*/segmentation_platform::PredictionStatus::kSucceeded,
+      /*expected_labels=*/
+      std::vector<std::string>(1, kLegacyNegativeLabel));
+}
+
 #endif  // BUILDFLAG(IS_ANDROID)
 
 }  // namespace segmentation_platform
diff --git a/chrome/browser/support_tool/screenshot_data_collector.cc b/chrome/browser/support_tool/screenshot_data_collector.cc
index 2fb86ed..5cca5b272 100644
--- a/chrome/browser/support_tool/screenshot_data_collector.cc
+++ b/chrome/browser/support_tool/screenshot_data_collector.cc
@@ -155,7 +155,9 @@
   DesktopMediaPickerController::DoneCallback callback =
       base::BindOnce(&ScreenshotDataCollector::OnSourceSelected,
                      weak_ptr_factory_.GetWeakPtr());
-  DesktopMediaPickerController::Params picker_params;
+  DesktopMediaPickerController::Params picker_params(
+      DesktopMediaPickerController::Params::RequestSource::
+          kScreenshotDataCollector);
   picker_params.web_contents = web_contents;
   picker_params.context = parent_window;
   picker_params.parent = parent_window;
diff --git a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
index ccc805e..1f98a831 100644
--- a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
+++ b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
@@ -133,13 +133,8 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& obj,
     jint list_index) {
-  if (base::FeatureList::IsEnabled(
-          features::kAutofillKeyboardAccessoryAcceptanceDelayThreshold)) {
     controller_->AcceptSuggestion(list_index, base::TimeTicks::Now());
-  } else {
-    controller_->AcceptSuggestionWithoutThreshold(list_index);
   }
-}
 
 void AutofillKeyboardAccessoryView::DeletionRequested(
     JNIEnv* env,
diff --git a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc
index 8362cfe..fba86fb 100644
--- a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc
+++ b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc
@@ -137,13 +137,6 @@
   }
 }
 
-void AutofillKeyboardAccessoryAdapter::AcceptSuggestionWithoutThreshold(
-    int index) {
-  if (controller_) {
-    controller_->AcceptSuggestionWithoutThreshold(OffsetIndexFor(index));
-  }
-}
-
 int AutofillKeyboardAccessoryAdapter::GetLineCount() const {
   return controller_ ? controller_->GetLineCount() : 0;
 }
diff --git a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h
index 7cd9e4f2..5ef47f3 100644
--- a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h
+++ b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h
@@ -93,7 +93,6 @@
   // AutofillPopupController:
   // Hidden: void OnSuggestionsChanged() override;
   void AcceptSuggestion(int index, base::TimeTicks event_time) override;
-  void AcceptSuggestionWithoutThreshold(int index) override;
   int GetLineCount() const override;
   const autofill::Suggestion& GetSuggestionAt(int row) const override;
   std::u16string GetSuggestionMainTextAt(int row) const override;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller.h b/chrome/browser/ui/autofill/autofill_popup_controller.h
index 2d363f4..9a99ec98 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller.h
+++ b/chrome/browser/ui/autofill/autofill_popup_controller.h
@@ -34,11 +34,6 @@
   // (crbug.com/1279268).
   virtual void AcceptSuggestion(int index, base::TimeTicks event_time) = 0;
 
-  // Accepts the suggestion at `index` without requiring a minimum show
-  // threshold. This should only be used in cases in which user intent is
-  // certain (e.g. the keyboard accessory).
-  virtual void AcceptSuggestionWithoutThreshold(int index) = 0;
-
   // Removes the suggestion at the given index.
   virtual bool RemoveSuggestion(int index) = 0;
 
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
index 544ea6a..8f82a9b 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -372,10 +372,6 @@
     return;
   }
 
-  AcceptSuggestionWithoutThreshold(index);
-}
-
-void AutofillPopupControllerImpl::AcceptSuggestionWithoutThreshold(int index) {
   if (static_cast<size_t>(index) >= suggestions_.size()) {
     // Prevents crashes from crbug.com/521133. It seems that in rare cases or
     // races the suggestions_ and the user-selected index may be out of sync.
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.h b/chrome/browser/ui/autofill/autofill_popup_controller_impl.h
index 051242e7..569e2c3 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.h
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.h
@@ -166,7 +166,6 @@
   void OnSuggestionsChanged() override;
   void SelectSuggestion(absl::optional<size_t> index) override;
   void AcceptSuggestion(int index, base::TimeTicks event_time) override;
-  void AcceptSuggestionWithoutThreshold(int index) override;
   bool RemoveSuggestion(int list_index) override;
   int GetLineCount() const override;
   const Suggestion& GetSuggestionAt(int row) const override;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
index cfc0c23..15cba0e 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
@@ -184,7 +184,6 @@
 
   // Making protected functions public for testing
   using AutofillPopupControllerImpl::AcceptSuggestion;
-  using AutofillPopupControllerImpl::AcceptSuggestionWithoutThreshold;
   using AutofillPopupControllerImpl::element_bounds;
   using AutofillPopupControllerImpl::FireControlsChangedEvent;
   using AutofillPopupControllerImpl::GetLineCount;
@@ -640,9 +639,8 @@
   EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(0);
 
   // The following should not crash:
-  popup_controller()
-      .AcceptSuggestion(                             /*index=*/
-                        1, base::TimeTicks::Now());  // Out of bounds!
+  popup_controller().AcceptSuggestion(
+      /*index=*/1, base::TimeTicks::Now());  // Out of bounds!
 }
 
 TEST_F(AutofillPopupControllerUnitTest, AcceptSuggestionRespectsTimeout) {
@@ -663,17 +661,6 @@
       "Autofill.Popup.AcceptanceDelayThresholdNotMet", 2);
 }
 
-TEST_F(AutofillPopupControllerUnitTest, AcceptSuggestionWithoutThreshold) {
-  base::HistogramTester histogram_tester;
-  ShowSuggestions({PopupItemId::kAddressEntry});
-
-  // Calls are accepted immediately.
-  EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1);
-  popup_controller().AcceptSuggestionWithoutThreshold(0);
-  histogram_tester.ExpectTotalCount(
-      "Autofill.Popup.AcceptanceDelayThresholdNotMet", 0);
-}
-
 TEST_F(AutofillPopupControllerUnitTest,
        AcceptSuggestionTimeoutIsUpdatedOnPopupMove) {
   base::HistogramTester histogram_tester;
@@ -731,7 +718,8 @@
               Run(_, _,
                   password_manager::metrics_util::
                       PasswordMigrationWarningTriggers::kKeyboardAcessoryBar));
-  popup_controller().AcceptSuggestionWithoutThreshold(0);
+  popup_controller().AcceptSuggestion(
+      0, base::TimeTicks::Now() + base::Milliseconds(500));
 }
 
 TEST_F(AutofillPopupControllerUnitTest,
@@ -744,7 +732,8 @@
   // Calls are accepted immediately.
   EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1);
   EXPECT_CALL(show_pwd_migration_warning_callback_, Run);
-  popup_controller().AcceptSuggestionWithoutThreshold(0);
+  popup_controller().AcceptSuggestion(
+      0, base::TimeTicks::Now() + base::Milliseconds(500));
 }
 
 TEST_F(AutofillPopupControllerUnitTest,
@@ -758,7 +747,8 @@
   // Calls are accepted immediately.
   EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1);
   EXPECT_CALL(show_pwd_migration_warning_callback_, Run).Times(0);
-  popup_controller().AcceptSuggestionWithoutThreshold(0);
+  popup_controller().AcceptSuggestion(
+      0, base::TimeTicks::Now() + base::Milliseconds(500));
 }
 
 TEST_F(AutofillPopupControllerUnitTest, AcceptAddressNoPwdWarningAndroid) {
@@ -770,7 +760,8 @@
   // Calls are accepted immediately.
   EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1);
   EXPECT_CALL(show_pwd_migration_warning_callback_, Run).Times(0);
-  popup_controller().AcceptSuggestionWithoutThreshold(0);
+  popup_controller().AcceptSuggestion(
+      0, base::TimeTicks::Now() + base::Milliseconds(500));
 }
 #endif
 
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
index aaf5289..e44caf1 100644
--- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
@@ -210,11 +210,11 @@
 
   is_user_gesture_ = false;
 
-  bool should_show_icon_only = options.notification_has_been_shown;
-  if (should_show_icon_only)
-    HideBubbleAndClearTimestamp(/*should_show_icon=*/true);
-  else
+  if (options.show_notification_automatically) {
     Show();
+  } else {
+    HideBubbleAndClearTimestamp(/*should_show_icon=*/true);
+  }
 }
 
 void OfferNotificationBubbleControllerImpl::ReshowBubble() {
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
index a61b1ae..3944ae40 100644
--- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
+++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
@@ -85,7 +85,9 @@
   void ShowBubble(const AutofillOfferData* offer,
                   bool expand_notification_icon = false) {
     controller()->ShowOfferNotificationIfApplicable(
-        offer, &card_, {.expand_notification_icon = expand_notification_icon});
+        offer, &card_,
+        {.expand_notification_icon = expand_notification_icon,
+         .show_notification_automatically = true});
   }
 
   void CloseBubble(PaymentsBubbleClosedReason closed_reason =
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
index 1890364..1f751ab 100644
--- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
+++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
@@ -746,9 +746,11 @@
   const std::string domain_url = "www.merchantsite1.com";
   const GURL with_offer_url = GetUrl(domain_url, "/product1");
   const GURL without_offer_url = GetUrl(domain_url, "/product2");
+  const GURL with_merchant_wide_offer_url = GetUrl(domain_url, "/product3");
   const std::string detail = "Discount description detail";
   const std::string discount_code = "freelisting-discount-code";
-  const int64_t discount_id = 123;
+  const int64_t non_merchant_wide_discount_id = 123;
+  const int64_t merchant_wide_discount_id = 456;
   const double expiry_time_sec =
       (AutofillClock::Now() + base::Days(2)).ToDoubleT();
 
@@ -756,22 +758,24 @@
       commerce::ShoppingServiceFactory::GetForBrowserContext(
           browser()->profile()));
   mock_shopping_service->SetIsDiscountEligibleToShowOnNavigation(true);
-  // Expect to call this once on every navigation, this test is navigated 3
+  // Expect to call this once on every navigation, this test is navigated 4
   // times.
   EXPECT_CALL(*mock_shopping_service, IsDiscountEligibleToShowOnNavigation)
-      .Times(3);
-  EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls).Times(3);
+      .Times(4);
+  EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls).Times(4);
 
   NavigateToAndWaitForForm(GetUrl(domain_url, "/"));
   EXPECT_FALSE(IsIconVisible());
   EXPECT_FALSE(GetOfferNotificationBubbleViews());
 
-  // Simulate FreeListingOffer for a product page on the `domain_url`.
+  // Simulate non-merchant-wide FreeListingOffer for a product page on the
+  // `with_offer_url`.
   mock_shopping_service->SetResponseForGetDiscountInfoForUrls(
       {{with_offer_url,
         {commerce::CreateValidDiscountInfo(
             detail, /*terms_and_conditions=*/"",
-            /*value_in_text=*/"$10 off", discount_code, discount_id,
+            /*value_in_text=*/"$10 off", discount_code,
+            non_merchant_wide_discount_id,
             /*is_merchant_wide=*/false, expiry_time_sec)}}});
 
   NavigateToAndWaitForForm(with_offer_url);
@@ -796,6 +800,20 @@
   NavigateToAndWaitForForm(without_offer_url);
   EXPECT_FALSE(IsIconVisible());
   EXPECT_FALSE(GetOfferNotificationBubbleViews());
+
+  // Simulate merchant-wide FreeListingOffer for a product page on the
+  // `with_merchant_wide_offer_url`.
+  mock_shopping_service->SetResponseForGetDiscountInfoForUrls(
+      {{with_merchant_wide_offer_url,
+        {commerce::CreateValidDiscountInfo(
+            detail, /*terms_and_conditions=*/"",
+            /*value_in_text=*/"$10 off", discount_code,
+            merchant_wide_discount_id,
+            /*is_merchant_wide=*/true, expiry_time_sec)}}});
+
+  NavigateToAndWaitForForm(with_merchant_wide_offer_url);
+  EXPECT_TRUE(IsIconVisible());
+  EXPECT_FALSE(GetOfferNotificationBubbleViews());
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -874,9 +892,14 @@
 IN_PROC_BROWSER_TEST_P(
     OfferNotificationBubbleViewsWithDiscountOnChromeHistoryClusterTest,
     ShowShoppingServiceFreeListingOffer_WhenNavigatedFromChromeHistoryCluster) {
-  const std::string domain_url = "www.merchantsite1.com";
-  const GURL with_offer_url = GetUrl(
-      domain_url, "/first?utm_source=chrome-history-cluster-with-discount");
+  const std::string non_merchant_wide_domain_url = "www.merchantsite1.com";
+  const std::string merchant_wide_domain_url = "www.merchantsite2.com";
+  const GURL with_non_merchant_wide_offer_url =
+      GetUrl(non_merchant_wide_domain_url,
+             "/first?utm_source=chrome-history-cluster-with-discount");
+  const GURL with_merchant_wide_offer_url =
+      GetUrl(merchant_wide_domain_url,
+             "/first?utm_source=chrome-history-cluster-with-discount");
   const std::string detail = "Discount description detail";
   const std::string discount_code = "freelisting-discount-code";
   const int64_t discount_id = 123;
@@ -887,22 +910,26 @@
       commerce::ShoppingServiceFactory::GetForBrowserContext(
           browser()->profile()));
   mock_shopping_service->SetIsDiscountEligibleToShowOnNavigation(true);
-  // Simulate FreeListingOffer for a product page on the `domain_url`.
+  // Simulate FreeListingOffer for a product page on the
+  // `non_merchant_wide_domain_url`.
   mock_shopping_service->SetResponseForGetDiscountInfoForUrls(
-      {{with_offer_url,
+      {{with_non_merchant_wide_offer_url,
         {commerce::CreateValidDiscountInfo(
             detail, /*terms_and_conditions=*/"",
             /*value_in_text=*/"$10 off", discount_code, discount_id,
             /*is_merchant_wide=*/false, expiry_time_sec)}}});
 
-  EXPECT_CALL(*mock_shopping_service, IsDiscountEligibleToShowOnNavigation);
-  EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls);
+  // Expect to call this once on every navigation, this test is navigated 2
+  // times.
+  EXPECT_CALL(*mock_shopping_service, IsDiscountEligibleToShowOnNavigation)
+      .Times(2);
+  EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls).Times(2);
 
   SetUpGPayPromoCodeOfferDataWithDomains(
       {GetUrl("www.merchantsite1.com", "/"),
        GetUrl("www.merchantsite2.com", "/")});
   ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN});
-  NavigateToAndWaitForForm(with_offer_url);
+  NavigateToAndWaitForForm(with_non_merchant_wide_offer_url);
   ASSERT_TRUE(WaitForObservedEvent());
   EXPECT_TRUE(IsIconVisible());
   EXPECT_TRUE(GetOfferNotificationBubbleViews());
@@ -924,6 +951,19 @@
   auto promo_code_styled_label =
       GetOfferNotificationBubbleViews()->promo_code_label_;
   EXPECT_FALSE(promo_code_styled_label);
+
+  // Simulate merchant-wide FreeListingOffer for a product page on the
+  // `merchant_wide_domain_url`.
+  mock_shopping_service->SetResponseForGetDiscountInfoForUrls(
+      {{with_merchant_wide_offer_url,
+        {commerce::CreateValidDiscountInfo(
+            detail, /*terms_and_conditions=*/"",
+            /*value_in_text=*/"$10 off", discount_code, discount_id,
+            /*is_merchant_wide=*/true, expiry_time_sec)}}});
+
+  NavigateToAndWaitForForm(with_merchant_wide_offer_url);
+  EXPECT_TRUE(IsIconVisible());
+  EXPECT_TRUE(GetOfferNotificationBubbleViews());
 }
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc
index daa8aea..84dd42c 100644
--- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc
+++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc
@@ -80,8 +80,7 @@
         views::test::AnyWidgetTestPasskey{},
         OfferNotificationBubbleViews::kViewClassName);
 
-    autofill_client->UpdateOfferNotification(
-        &offer, {.notification_has_been_shown = true});
+    autofill_client->UpdateOfferNotification(&offer, {});
     OfferNotificationBubbleControllerImpl* controller = GetController();
     EXPECT_TRUE(controller);
     // Ensure the window is active before reshowing the bubble.
diff --git a/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
index e168630..8aede38 100644
--- a/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
+++ b/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
@@ -269,7 +269,6 @@
 TEST_F(PopupViewViewsTest, ShowHideTest) {
   CreateAndShowView({PopupItemId::kAutocompleteEntry});
   EXPECT_CALL(controller(), AcceptSuggestion).Times(0);
-  EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0);
   view().Hide();
 }
 
@@ -422,7 +421,6 @@
   CreateAndShowView();
 
   EXPECT_CALL(controller(), AcceptSuggestion).Times(0);
-  EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0);
 
   gfx::Point inside_point(GetRowViewAt(0).x() + 1, GetRowViewAt(0).y() + 1);
   ui::MouseEvent click_mouse_event(
@@ -639,7 +637,6 @@
 TEST_F(PopupViewViewsTestKeyboard, FillOnEnter) {
   SelectFirstSuggestion();
   EXPECT_CALL(controller(), AcceptSuggestion(0, _));
-  EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0);
   SimulateKeyPress(ui::VKEY_RETURN);
 }
 
@@ -647,7 +644,6 @@
 TEST_F(PopupViewViewsTestKeyboard, FillOnTabPressed) {
   SelectFirstSuggestion();
   EXPECT_CALL(controller(), AcceptSuggestion(0, _));
-  EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0);
   SimulateKeyPress(ui::VKEY_TAB);
 }
 
@@ -656,7 +652,6 @@
 TEST_F(PopupViewViewsTestKeyboard, NoFillOnTabPressedWithModifiers) {
   SelectFirstSuggestion();
   EXPECT_CALL(controller(), AcceptSuggestion(0, _)).Times(0);
-  EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0);
   SimulateKeyPress(ui::VKEY_TAB, /*shift_modifier_pressed=*/false,
                    /*non_shift_modifier_pressed=*/true);
 }
@@ -676,7 +671,6 @@
   // Because the selected line is PopupItemId::kAutofillOptions, we expect that
   // the tab key does not trigger anything.
   EXPECT_CALL(controller(), AcceptSuggestion).Times(0);
-  EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0);
   SimulateKeyPress(ui::VKEY_TAB);
 }
 
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
index 7188fad0..29190eb8 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
+++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -2239,21 +2239,12 @@
 }
 
 bool BookmarkBarView::UpdateOtherAndManagedButtonsVisibility() {
-  bool update_other;
-  if (base::FeatureList::IsEnabled(features::kPowerBookmarksSidePanel)) {
-    update_other = !other_bookmarks_button_->GetVisible();
-    if (update_other) {
-      other_bookmarks_button_->SetVisible(true);
-      UpdateBookmarksSeparatorVisibility();
-    }
-  } else {
-    bool has_other_children =
-        !bookmark_model_->other_node()->children().empty();
-    update_other = has_other_children != other_bookmarks_button_->GetVisible();
-    if (update_other) {
-      other_bookmarks_button_->SetVisible(has_other_children);
-      UpdateBookmarksSeparatorVisibility();
-    }
+  bool has_other_children = !bookmark_model_->other_node()->children().empty();
+  bool update_other =
+      has_other_children != other_bookmarks_button_->GetVisible();
+  if (update_other) {
+    other_bookmarks_button_->SetVisible(has_other_children);
+    UpdateBookmarksSeparatorVisibility();
   }
 
   bool show_managed = !managed_->managed_node()->children().empty() &&
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
index 5e845e5..70446dc 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -17,6 +17,7 @@
 #include "build/chromeos_buildflags.h"
 #include "chrome/browser/media/webrtc/desktop_capture_devices_util.h"
 #include "chrome/browser/media/webrtc/desktop_media_list.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h"
 #include "chrome/browser/media/webrtc/desktop_media_picker_manager.h"
 #include "chrome/browser/media/webrtc/desktop_media_picker_utils.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -64,6 +65,7 @@
 #endif
 
 using content::DesktopMediaID;
+using RequestSource = DesktopMediaPicker::Params::RequestSource;
 
 enum class DesktopMediaPickerDialogView::DialogType : int {
   kStandard = 0,
@@ -187,13 +189,13 @@
 
 std::u16string GetLabelForAudioCheckbox(DesktopMediaList::Type type,
                                         bool local_audio_suppression,
-                                        bool is_get_display_media_call) {
+                                        RequestSource request_source) {
   switch (type) {
     case DesktopMediaList::Type::kScreen: {
       bool show_warning = local_audio_suppression &&
                           base::FeatureList::IsEnabled(
                               kWarnUserOfSystemWideLocalAudioSuppression);
-      if (is_get_display_media_call &&
+      if (request_source == RequestSource::kGetDisplayMedia &&
           !base::FeatureList::IsEnabled(
               ::kSuppressLocalAudioPlaybackForSystemAudio)) {
         // Suppression blocked by killswitch, so no need to show a warning.
@@ -322,7 +324,8 @@
 bool DesktopMediaPickerDialogView::AudioSupported(DesktopMediaList::Type type) {
   switch (type) {
     case DesktopMediaList::Type::kScreen:
-      return DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform;
+      return DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+          request_source_);
     case DesktopMediaList::Type::kWindow:
       return false;
     case DesktopMediaList::Type::kWebContents:
@@ -363,7 +366,7 @@
     DesktopMediaPickerViews* parent,
     std::vector<std::unique_ptr<DesktopMediaList>> source_lists)
     : web_contents_(params.web_contents),
-      is_get_display_media_call_(params.is_get_display_media_call),
+      request_source_(params.request_source),
       app_name_(params.app_name),
       audio_requested_(params.request_audio),
       suppress_local_audio_playback_(params.suppress_local_audio_playback),
@@ -611,7 +614,7 @@
     AddChildView(std::move(panes.front().second));
   }
 
-  if (is_get_display_media_call_) {
+  if (request_source_ == RequestSource::kGetDisplayMedia) {
     description_label_->SetText(
         l10n_util::GetStringUTF16(IDS_DISPLAY_MEDIA_PICKER_TEXT));
   } else {
@@ -801,8 +804,7 @@
   // If we need the audio checkbox build and add it now.
   std::unique_ptr<views::Checkbox> audio_share_checkbox =
       std::make_unique<views::Checkbox>(GetLabelForAudioCheckbox(
-          category.type, suppress_local_audio_playback_,
-          is_get_display_media_call_));
+          category.type, suppress_local_audio_playback_, request_source_));
   audio_share_checkbox->SetVisible(true);
   audio_share_checkbox->SetChecked(category.audio_checked);
   audio_share_checkbox->SetMultiLine(true);
@@ -835,7 +837,8 @@
     const DisplaySurfaceCategory& category) const {
   if (!category.audio_offered) {
     return l10n_util::GetStringUTF16(
-        DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform
+        DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+            request_source_)
             ? IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_HINT_TAB_OR_SCREEN
             : IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_HINT_TAB);
   }
@@ -845,7 +848,7 @@
       bool show_warning = suppress_local_audio_playback_ &&
                           base::FeatureList::IsEnabled(
                               kWarnUserOfSystemWideLocalAudioSuppression);
-      if (is_get_display_media_call_ &&
+      if (request_source_ == RequestSource::kGetDisplayMedia &&
           !base::FeatureList::IsEnabled(
               ::kSuppressLocalAudioPlaybackForSystemAudio)) {
         // Suppression blocked by killswitch, so no need to show a warning.
@@ -983,7 +986,7 @@
 }
 
 std::u16string DesktopMediaPickerDialogView::GetWindowTitle() const {
-  if (is_get_display_media_call_) {
+  if (request_source_ == RequestSource::kGetDisplayMedia) {
     return l10n_util::GetStringFUTF16(IDS_DISPLAY_MEDIA_PICKER_TITLE,
                                       app_name_);
   }
@@ -1032,8 +1035,7 @@
       (audio_share_checkbox_ && audio_share_checkbox_->GetVisible() &&
        audio_share_checkbox_->GetChecked()) ||
       IsAudioSharingApprovedByUser();
-
-  if (is_get_display_media_call_) {
+  if (request_source_ == RequestSource::kGetDisplayMedia) {
     RecordUmaSelection(dialog_type_, capturer_global_id_, source,
                        GetSelectedSourceListType(), dialog_open_time_);
   }
@@ -1047,7 +1049,7 @@
 }
 
 bool DesktopMediaPickerDialogView::Cancel() {
-  if (is_get_display_media_call_) {
+  if (request_source_ == RequestSource::kGetDisplayMedia) {
     RecordUmaCancellation(dialog_type_, dialog_open_time_);
   }
   RecordSourceCountsUma();
@@ -1144,13 +1146,11 @@
 BEGIN_METADATA(DesktopMediaPickerDialogView, views::DialogDelegateView)
 END_METADATA
 
-constexpr bool DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform;
-
 DesktopMediaPickerViews::DesktopMediaPickerViews() : dialog_(nullptr) {}
 
 DesktopMediaPickerViews::~DesktopMediaPickerViews() {
   if (dialog_) {
-    if (is_get_display_media_call_) {
+    if (request_source_ == RequestSource::kGetDisplayMedia) {
       dialog_->RecordUmaDismissal();
     }
     dialog_->DetachParent();
@@ -1164,7 +1164,7 @@
     DoneCallback done_callback) {
   DesktopMediaPickerManager::Get()->OnShowDialog();
 
-  is_get_display_media_call_ = params.is_get_display_media_call;
+  request_source_ = params.request_source;
   callback_ = std::move(done_callback);
   dialog_ =
       new DesktopMediaPickerDialogView(params, this, std::move(source_lists));
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h
index 3421ac0..2fd859ed 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h
@@ -105,7 +105,7 @@
     raw_ptr<DesktopMediaPaneView> pane = nullptr;
   };
 
-  static bool AudioSupported(DesktopMediaList::Type type);
+  bool AudioSupported(DesktopMediaList::Type type);
 
   void ConfigureUIForNewPane(int index);
   void StoreAudioCheckboxState();
@@ -156,7 +156,7 @@
 
   const raw_ptr<content::WebContents, AcrossTasksDanglingUntriaged>
       web_contents_;
-  const bool is_get_display_media_call_;
+  const DesktopMediaPicker::Params::RequestSource request_source_;
   const std::u16string app_name_;
   const bool audio_requested_;
   const bool suppress_local_audio_playback_;  // Effective only if audio shared.
@@ -189,12 +189,6 @@
 // DesktopMediaPicker.
 class DesktopMediaPickerViews : public DesktopMediaPicker {
  public:
-#if BUILDFLAG(IS_WIN) || defined(USE_CRAS)
-  static constexpr bool kScreenAudioShareSupportedOnPlatform = true;
-#else
-  static constexpr bool kScreenAudioShareSupportedOnPlatform = false;
-#endif
-
   DesktopMediaPickerViews();
   DesktopMediaPickerViews(const DesktopMediaPickerViews&) = delete;
   DesktopMediaPickerViews& operator=(const DesktopMediaPickerViews&) = delete;
@@ -216,7 +210,7 @@
 
   DoneCallback callback_;
 
-  bool is_get_display_media_call_ = false;
+  Params::RequestSource request_source_;
 
   // The |dialog_| is owned by the corresponding views::Widget instance.
   // When DesktopMediaPickerViews is destroyed the |dialog_| is destroyed
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc
index 9d65c2a..8c9cf35e 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc
@@ -52,7 +52,8 @@
     for (const auto& source : sources)
       source_lists.push_back(static_cast<FakeDesktopMediaList*>(source.get()));
 
-    DesktopMediaPicker::Params picker_params;
+    DesktopMediaPicker::Params picker_params{
+        DesktopMediaPicker::Params::RequestSource::kUnknown};
     picker_params.web_contents = web_contents;
     picker_params.context = native_window;
     picker_params.app_name = u"app_name";
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc
index 0ad501f..96ddad2f 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc
@@ -40,7 +40,7 @@
 
 bool DesktopMediaPickerViewsTestApi::AudioSupported(
     DesktopMediaList::Type type) const {
-  return DesktopMediaPickerDialogView::AudioSupported(type);
+  return picker_->dialog_->AudioSupported(type);
 }
 
 void DesktopMediaPickerViewsTestApi::FocusAudioShareControl() {
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc
index 904d872..50cb594 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc
@@ -16,6 +16,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/single_thread_task_runner.h"
 #include "build/build_config.h"
+#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h"
 #include "chrome/browser/media/webrtc/desktop_media_picker_manager.h"
 #include "chrome/browser/media/webrtc/fake_desktop_media_list.h"
 #include "chrome/browser/ui/views/desktop_capture/desktop_media_list_controller.h"
@@ -187,7 +188,8 @@
                                          "DesktopMediaPickerDialogView");
 
     const std::u16string kAppName = u"foo";
-    DesktopMediaPicker::Params picker_params;
+    DesktopMediaPicker::Params picker_params{
+        DesktopMediaPicker::Params::RequestSource::kUnknown};
     picker_params.context = test_helper_.GetContext();
     picker_params.app_name = kAppName;
     picker_params.target_name = kAppName;
@@ -402,7 +404,8 @@
 // when GetAudioShareCheckbox() returns false.
 TEST_P(DesktopMediaPickerViewsTest, AudioCheckboxVisibility) {
   test_api_.SelectTabForSourceType(DesktopMediaList::Type::kScreen);
-  EXPECT_EQ(DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform,
+  EXPECT_EQ(DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+                DesktopMediaPicker::Params::RequestSource::kGetDisplayMedia),
             test_api_.HasAudioShareControl());
 
   test_api_.SelectTabForSourceType(DesktopMediaList::Type::kWindow);
@@ -619,7 +622,8 @@
   test_api_.SelectTabForSourceType(DesktopMediaList::Type::kScreen);
 
   // System audio checkbox shown to the user iff the platform supports it.
-  EXPECT_EQ(DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform,
+  EXPECT_EQ(DesktopMediaPickerController::IsSystemAudioCaptureSupported(
+                DesktopMediaPicker::Params::RequestSource::kGetDisplayMedia),
             test_api_.HasAudioShareControl());
 }
 
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc
index a047218..dc983f3 100644
--- a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc
+++ b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc
@@ -41,7 +41,8 @@
     picker_views_ = std::make_unique<DesktopMediaPickerViews>();
 
     const std::u16string kAppName = u"foo";
-    DesktopMediaPicker::Params picker_params;
+    DesktopMediaPicker::Params picker_params{
+        DesktopMediaPicker::Params::RequestSource::kUnknown};
     picker_params.context = test_helper_.GetContext();
     picker_params.app_name = kAppName;
     picker_params.target_name = kAppName;
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
index 9bdf0f4..b4901a68 100644
--- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
+++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
@@ -73,6 +73,10 @@
 #include "chromeos/components/kiosk/kiosk_utils.h"
 #endif
 
+#if BUILDFLAG(IS_MAC)
+#include "chrome/browser/ui/fullscreen_util_mac.h"
+#endif
+
 namespace {
 
 using offline_items_collection::ContentId;
@@ -327,6 +331,20 @@
 }
 
 bool DownloadToolbarButtonView::IsFullscreenWithParentViewHidden() const {
+#if BUILDFLAG(IS_MAC)
+  if (fullscreen_utils::IsInContentFullscreen(browser_)) {
+    return true;
+  }
+#endif
+
+  // If immersive fullscreen, check if top chrome is visible.
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_);
+  if (browser_view && browser_view->GetLocationBarView() &&
+      browser_view->IsImmersiveModeEnabled()) {
+    return !browser_view->immersive_mode_controller()->IsRevealed();
+  }
+
+  // Handle the remaining fullscreen case.
   return browser_->window() && browser_->window()->IsFullscreen() &&
          !browser_->window()->IsToolbarVisible();
 }
diff --git a/chrome/browser/ui/views/editor_menu/BUILD.gn b/chrome/browser/ui/views/editor_menu/BUILD.gn
index 3ce94089..576784c 100644
--- a/chrome/browser/ui/views/editor_menu/BUILD.gn
+++ b/chrome/browser/ui/views/editor_menu/BUILD.gn
@@ -19,6 +19,7 @@
 
   deps = [
     "//base",
+    "//chrome/browser/ui/views/editor_menu/vector_icons",
     "//components/vector_icons",
     "//ui/aura",
     "//ui/events",
diff --git a/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc b/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc
index a4803eb..d4782ce 100644
--- a/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc
+++ b/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc
@@ -45,10 +45,12 @@
 
 PresetTextQueries GetPresetTextQueries(
     const std::vector<EditorPanelPresetTextQueryPtr>& preset_text_queries) {
+  // TODO(b/295059934): Use EditorPanelPresetTextQueryPtrs to get the actual
+  // query categories.
   PresetTextQueries queries;
   for (const auto& query : preset_text_queries) {
     queries.emplace_back(query->text_query_id, base::UTF8ToUTF16(query->name),
-                         PresetQueryCategory(query->category));
+                         PresetQueryCategory::kUnknown);
   }
   return queries;
 }
diff --git a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc
index aec9d1b..d9d2df75 100644
--- a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc
+++ b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc
@@ -11,6 +11,7 @@
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/ui/views/editor_menu/editor_menu_view_delegate.h"
 #include "components/vector_icons/vector_icons.h"
+#include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/models/image_model.h"
 #include "ui/chromeos/styles/cros_tokens_color_mappings.h"
@@ -21,11 +22,14 @@
 #include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
+#include "ui/views/controls/focus_ring.h"
+#include "ui/views/controls/highlight_path_generator.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/flex_layout_view.h"
 #include "ui/views/view.h"
 #include "ui/views/view_class_properties.h"
+#include "ui/views/view_utils.h"
 #include "ui/views/widget/widget.h"
 
 namespace chromeos::editor_menu {
@@ -41,12 +45,61 @@
 constexpr int kButtonSizeDip = 32;
 constexpr int kBorderThicknessDip = 1;
 
+class EditorMenuTextfield : public views::Textfield {
+ public:
+  METADATA_HEADER(EditorMenuTextfield);
+  EditorMenuTextfield() : views::Textfield() {
+    // TODO(b/300857651): Add a custom hover effect which covers the whole
+    // textfield container view. For now, just disable the default hover effect
+    // since it looks strange to only partially cover the textfield container.
+    RemoveHoverEffect();
+  }
+  EditorMenuTextfield(const EditorMenuTextfield&) = delete;
+  EditorMenuTextfield& operator=(const EditorMenuTextfield&) = delete;
+  ~EditorMenuTextfield() override = default;
+
+  void OnFocus() override {
+    views::Textfield::OnFocus();
+    NotifyTextfieldFocusChanged();
+  }
+
+  void OnBlur() override {
+    views::Textfield::OnBlur();
+    NotifyTextfieldFocusChanged();
+  }
+
+ private:
+  void NotifyTextfieldFocusChanged() {
+    auto* textfield_container =
+        views::AsViewClass<EditorMenuTextfieldView>(parent());
+    CHECK(textfield_container);
+    textfield_container->OnTextfieldFocusChanged();
+  }
+};
+
+BEGIN_METADATA(EditorMenuTextfield, views::Textfield)
+END_METADATA
+
 }  // namespace
 
 EditorMenuTextfieldView::EditorMenuTextfieldView(
     EditorMenuViewDelegate* delegate)
     : delegate_(delegate) {
   CHECK(delegate_);
+
+  // Install a focus ring to show when `textfield_` is focused. This focus ring
+  // is installed on the EditorMenuTextfieldView so that it surrounds the
+  // overall textfield container.
+  views::FocusRing::Install(this);
+  views::FocusRing::Get(this)->SetHasFocusPredicate(
+      base::BindRepeating([](const View* view) {
+        const auto* v = views::AsViewClass<EditorMenuTextfieldView>(view);
+        CHECK(v);
+        return v->textfield_ && v->textfield_->HasFocus();
+      }));
+  views::FocusRing::Get(this)->SetOutsetFocusRingDisabled(true);
+  views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(),
+                                                kBackgroundRadiusDip);
 }
 
 EditorMenuTextfieldView::~EditorMenuTextfieldView() = default;
@@ -82,6 +135,14 @@
   return true;
 }
 
+void EditorMenuTextfieldView::OnTextfieldFocusChanged() {
+  // The focus ring should be shown when the underlying `textfield_` is focused.
+  // Schedule a repaint to update its visibility if needed.
+  if (views::FocusRing::Get(this)) {
+    views::FocusRing::Get(this)->SchedulePaint();
+  }
+}
+
 void EditorMenuTextfieldView::InitLayout() {
   SetBackground(views::CreateThemedRoundedRectBackground(
       static_cast<ui::ColorId>(cros_tokens::kCrosSysSystemBaseElevated),
@@ -95,7 +156,7 @@
   layout->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kCenter);
 
-  textfield_ = AddChildView(std::make_unique<views::Textfield>());
+  textfield_ = AddChildView(std::make_unique<EditorMenuTextfield>());
   textfield_->SetAccessibleName(kContainerTitle);
   textfield_->set_controller(this);
   textfield_->SetBorder(views::NullBorder());
diff --git a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h
index e4b28e1..654df69 100644
--- a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h
+++ b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h
@@ -53,6 +53,8 @@
   bool HandleKeyEvent(views::Textfield* sender,
                       const ui::KeyEvent& key_event) override;
 
+  void OnTextfieldFocusChanged();
+
  private:
   void InitLayout();
   void OnTextfieldArrowButtonPressed();
diff --git a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc
index fbd4eb1b6..fb03a5f 100644
--- a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc
+++ b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc
@@ -6,6 +6,7 @@
 
 #include <string_view>
 
+#include "chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h"
 #include "components/vector_icons/vector_icons.h"
 #include "ui/gfx/vector_icon_types.h"
 
@@ -21,10 +22,16 @@
   switch (category) {
     case PresetQueryCategory::kUnknown:
       return vector_icons::kKeyboardIcon;
-    case PresetQueryCategory::kPlaceholder:
-      return vector_icons::kContentCopyIcon;
-    case PresetQueryCategory::kAnotherPlaceholder:
-      return vector_icons::kContentPasteIcon;
+    case PresetQueryCategory::kShorten:
+      return kEditorMenuShortenIcon;
+    case PresetQueryCategory::kElaborate:
+      return kEditorMenuElaborateIcon;
+    case PresetQueryCategory::kRephrase:
+      return kEditorMenuRephraseIcon;
+    case PresetQueryCategory::kFormalize:
+      return kEditorMenuFormalizeIcon;
+    case PresetQueryCategory::kEmojify:
+      return kEditorMenuEmojifyIcon;
   }
 }
 
diff --git a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h
index 243e9684..039c58f9 100644
--- a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h
+++ b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h
@@ -17,8 +17,11 @@
 // Categories of preset text prompts to be shown on editor menu chips.
 enum class PresetQueryCategory {
   kUnknown = 0,
-  kPlaceholder,
-  kAnotherPlaceholder,
+  kShorten,
+  kElaborate,
+  kRephrase,
+  kFormalize,
+  kEmojify,
 };
 
 struct PresetTextQuery {
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/BUILD.gn b/chrome/browser/ui/views/editor_menu/vector_icons/BUILD.gn
new file mode 100644
index 0000000..68f0bd5
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/BUILD.gn
@@ -0,0 +1,28 @@
+# 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.
+
+import("//components/vector_icons/vector_icons.gni")
+
+aggregate_vector_icons("editor_menu_vector_icons") {
+  icon_directory = "."
+
+  sources = [
+    "editor_menu_elaborate.icon",
+    "editor_menu_emojify.icon",
+    "editor_menu_formalize.icon",
+    "editor_menu_rephrase.icon",
+    "editor_menu_shorten.icon",
+  ]
+}
+
+source_set("vector_icons") {
+  sources = get_target_outputs(":editor_menu_vector_icons")
+
+  deps = [
+    ":editor_menu_vector_icons",
+    "//base",
+    "//skia",
+    "//ui/gfx",
+  ]
+}
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_elaborate.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_elaborate.icon
new file mode 100644
index 0000000..3f39c5d
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_elaborate.icon
@@ -0,0 +1,32 @@
+// 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, 3.89f, 18.31f,
+R_V_LINE_TO, -1.73f,
+R_H_LINE_TO, 12.23f,
+R_V_LINE_TO, 1.73f,
+CLOSE,
+MOVE_TO, 10, 15.08f,
+R_LINE_TO, -3.13f, -3.13f,
+R_LINE_TO, 1.17f, -1.17f,
+R_LINE_TO, 1.14f, 1.15f,
+V_LINE_TO, 8.08f,
+LINE_TO, 8.04f, 9.22f,
+LINE_TO, 6.87f, 8.06f,
+LINE_TO, 10, 4.93f,
+R_LINE_TO, 3.13f, 3.13f,
+R_LINE_TO, -1.17f, 1.17f,
+R_LINE_TO, -1.14f, -1.14f,
+R_V_LINE_TO, 3.84f,
+R_LINE_TO, 1.14f, -1.14f,
+R_LINE_TO, 1.17f, 1.17f,
+CLOSE,
+MOVE_TO, 3.89f, 3.42f,
+R_V_LINE_TO, -1.73f,
+R_H_LINE_TO, 12.23f,
+R_V_LINE_TO, 1.73f,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_emojify.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_emojify.icon
new file mode 100644
index 0000000..41563e2
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_emojify.icon
@@ -0,0 +1,64 @@
+// 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, 12.71f, 9.29f,
+R_CUBIC_TO, 0.36f, 0, 0.67f, -0.13f, 0.92f, -0.38f,
+CUBIC_TO_SHORTHAND, 14, 8.36f, 14, 8,
+R_CUBIC_TO, 0, -0.36f, -0.12f, -0.66f, -0.37f, -0.91f,
+R_ARC_TO, 1.24f, 1.24f, 0, 0, 0, -0.91f, -0.37f,
+R_CUBIC_TO, -0.36f, 0, -0.66f, 0.13f, -0.91f, 0.38f,
+R_CUBIC_TO, -0.25f, 0.25f, -0.37f, 0.56f, -0.37f, 0.91f,
+R_CUBIC_TO, 0, 0.36f, 0.13f, 0.66f, 0.38f, 0.91f,
+R_CUBIC_TO, 0.25f, 0.25f, 0.55f, 0.38f, 0.91f, 0.38f,
+CLOSE,
+R_MOVE_TO, -5.42f, 0,
+R_CUBIC_TO, 0.36f, 0, 0.66f, -0.13f, 0.91f, -0.38f,
+R_CUBIC_TO, 0.25f, -0.25f, 0.37f, -0.56f, 0.37f, -0.91f,
+R_CUBIC_TO, 0, -0.35f, -0.12f, -0.66f, -0.37f, -0.91f,
+R_CUBIC_TO, -0.25f, -0.25f, -0.55f, -0.37f, -0.91f, -0.37f,
+R_CUBIC_TO, -0.36f, 0, -0.66f, 0.13f, -0.91f, 0.38f,
+CUBIC_TO_SHORTHAND, 6, 7.64f, 6, 8,
+R_CUBIC_TO, 0, 0.36f, 0.13f, 0.66f, 0.38f, 0.91f,
+R_CUBIC_TO, 0.25f, 0.25f, 0.56f, 0.38f, 0.91f, 0.38f,
+CLOSE,
+MOVE_TO, 10, 14,
+R_CUBIC_TO, 0.85f, 0, 1.63f, -0.22f, 2.33f, -0.66f,
+R_ARC_TO, 4.61f, 4.61f, 0, 0, 0, 1.66f, -1.79f,
+H_LINE_TO, 6.02f,
+R_CUBIC_TO, 0.4f, 0.75f, 0.95f, 1.35f, 1.66f, 1.79f,
+R_CUBIC_TO, 0.7f, 0.44f, 1.48f, 0.66f, 2.33f, 0.66f,
+CLOSE,
+R_MOVE_TO, 0, 4.17f,
+R_ARC_TO, 7.96f, 7.96f, 0, 0, 1, -3.17f, -0.64f,
+R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, -2.61f, -1.75f,
+R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, -1.75f, -2.61f,
+R_ARC_TO, 7.97f, 7.97f, 0, 0, 1, -0.64f, -3.18f,
+R_CUBIC_TO, 0, -1.12f, 0.21f, -2.18f, 0.64f, -3.17f,
+R_ARC_TO, 8.29f, 8.29f, 0, 0, 1, 1.75f, -2.6f,
+R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, 2.61f, -1.75f,
+R_ARC_TO, 7.97f, 7.97f, 0, 0, 1, 3.18f, -0.64f,
+R_CUBIC_TO, 1.13f, 0, 2.18f, 0.21f, 3.17f, 0.64f,
+R_ARC_TO, 8.29f, 8.29f, 0, 0, 1, 2.6f, 1.75f,
+R_ARC_TO, 8.26f, 8.26f, 0, 0, 1, 1.75f, 2.6f,
+R_CUBIC_TO, 0.43f, 0.99f, 0.64f, 2.05f, 0.64f, 3.17f,
+R_ARC_TO, 7.96f, 7.96f, 0, 0, 1, -0.64f, 3.17f,
+R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, -1.75f, 2.61f,
+R_ARC_TO, 8.26f, 8.26f, 0, 0, 1, -2.6f, 1.75f,
+R_ARC_TO, 7.93f, 7.93f, 0, 0, 1, -3.17f, 0.64f,
+CLOSE,
+MOVE_TO, 10, 10,
+CLOSE,
+R_MOVE_TO, 0, 6.44f,
+R_CUBIC_TO, 1.79f, 0, 3.31f, -0.63f, 4.56f, -1.88f,
+CUBIC_TO_SHORTHAND, 16.44f, 11.79f, 16.44f, 10,
+R_CUBIC_TO, 0, -1.78f, -0.63f, -3.3f, -1.88f, -4.56f,
+CUBIC_TO, 13.31f, 4.19f, 11.79f, 3.56f, 10, 3.56f,
+R_CUBIC_TO, -1.78f, 0, -3.3f, 0.63f, -4.56f, 1.88f,
+CUBIC_TO, 4.19f, 6.7f, 3.56f, 8.22f, 3.56f, 10,
+R_CUBIC_TO, 0, 1.79f, 0.63f, 3.31f, 1.88f, 4.56f,
+CUBIC_TO_SHORTHAND, 8.22f, 16.44f, 10, 16.44f,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_formalize.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_formalize.icon
new file mode 100644
index 0000000..e6b6631c
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_formalize.icon
@@ -0,0 +1,41 @@
+// 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, 3.56f, 17.18f,
+R_CUBIC_TO, -0.48f, 0, -0.89f, -0.17f, -1.22f, -0.5f,
+R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, -0.5f, -1.22f,
+V_LINE_TO, 6.57f,
+R_CUBIC_TO, 0, -0.48f, 0.17f, -0.89f, 0.5f, -1.22f,
+R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, 1.22f, -0.51f,
+R_H_LINE_TO, 3.29f,
+V_LINE_TO, 3.42f,
+R_CUBIC_TO, 0, -0.48f, 0.17f, -0.89f, 0.51f, -1.22f,
+R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, 1.23f, -0.5f,
+R_H_LINE_TO, 2.85f,
+R_CUBIC_TO, 0.48f, 0, 0.89f, 0.17f, 1.22f, 0.51f,
+R_CUBIC_TO, 0.34f, 0.34f, 0.5f, 0.74f, 0.5f, 1.22f,
+R_V_LINE_TO, 1.42f,
+R_H_LINE_TO, 3.29f,
+R_CUBIC_TO, 0.48f, 0, 0.89f, 0.17f, 1.22f, 0.51f,
+R_CUBIC_TO, 0.34f, 0.34f, 0.5f, 0.75f, 0.5f, 1.22f,
+R_V_LINE_TO, 8.88f,
+R_CUBIC_TO, 0, 0.48f, -0.17f, 0.89f, -0.5f, 1.22f,
+R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, -1.22f, 0.5f,
+CLOSE,
+R_MOVE_TO, 0, -1.73f,
+H_LINE_TO, 16.44f,
+V_LINE_TO, 6.57f,
+H_LINE_TO, 3.56f,
+CLOSE,
+MOVE_TO, 8.57f, 4.84f,
+R_H_LINE_TO, 2.85f,
+V_LINE_TO, 3.43f,
+H_LINE_TO, 8.57f,
+CLOSE,
+MOVE_TO, 3.56f, 15.46f,
+V_LINE_TO, 6.57f,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_rephrase.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_rephrase.icon
new file mode 100644
index 0000000..1095b39
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_rephrase.icon
@@ -0,0 +1,54 @@
+// 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, 7.5f, 5.16f,
+LINE_TO, 5.84f, 3.5f,
+R_LINE_TO, 1.66f, -1.66f,
+LINE_TO, 9.16f, 3.5f,
+LINE_TO, 7.5f, 5.16f,
+CLOSE,
+R_MOVE_TO, 9, 9.5f,
+LINE_TO, 14.84f, 13,
+R_LINE_TO, 1.66f, -1.66f,
+LINE_TO, 18.17f, 13,
+R_LINE_TO, -1.66f, 1.67f,
+CLOSE,
+MOVE_TO, 4.44f, 18.05f,
+R_LINE_TO, -2.48f, -2.5f,
+R_ARC_TO, 0.82f, 0.82f, 0, 0, 1, -0.26f, -0.6f,
+R_CUBIC_TO, 0, -0.23f, 0.09f, -0.43f, 0.27f, -0.61f,
+R_LINE_TO, 7.06f, -7.06f,
+R_ARC_TO, 2.52f, 2.52f, 0, 0, 1, 1.85f, -0.77f,
+R_CUBIC_TO, 0.73f, 0, 1.35f, 0.26f, 1.86f, 0.77f,
+R_CUBIC_TO, 0.51f, 0.51f, 0.77f, 1.13f, 0.77f, 1.86f,
+R_ARC_TO, 2.52f, 2.52f, 0, 0, 1, -0.77f, 1.86f,
+R_LINE_TO, -7.06f, 7.06f,
+R_ARC_TO, 0.86f, 0.86f, 0, 0, 1, -0.62f, 0.27f,
+R_ARC_TO, 0.84f, 0.84f, 0, 0, 1, -0.61f, -0.26f,
+CLOSE,
+R_MOVE_TO, 11.08f, -9.99f,
+R_ARC_TO, 3.44f, 3.44f, 0, 0, 0, -1.04f, -2.52f,
+R_ARC_TO, 3.44f, 3.44f, 0, 0, 0, -2.52f, -1.04f,
+R_CUBIC_TO, 0.99f, 0, 1.83f, -0.35f, 2.53f, -1.04f,
+R_CUBIC_TO, 0.7f, -0.69f, 1.05f, -1.54f, 1.05f, -2.53f,
+R_CUBIC_TO, 0, 0.99f, 0.35f, 1.84f, 1.04f, 2.53f,
+R_CUBIC_TO, 0.7f, 0.7f, 1.54f, 1.04f, 2.53f, 1.04f,
+R_CUBIC_TO, -0.99f, 0, -1.84f, 0.35f, -2.53f, 1.05f,
+R_ARC_TO, 3.44f, 3.44f, 0, 0, 0, -1.04f, 2.53f,
+CLOSE,
+R_MOVE_TO, -5.56f, 3.26f,
+R_LINE_TO, -0.32f, -0.32f,
+R_LINE_TO, -0.32f, -0.32f,
+R_LINE_TO, -0.32f, -0.32f,
+R_LINE_TO, -0.32f, -0.32f,
+R_LINE_TO, 0.64f, 0.64f,
+R_LINE_TO, 0.63f, 0.64f,
+CLOSE,
+R_MOVE_TO, -4.9f, 4.9f,
+R_LINE_TO, 4.9f, -4.9f,
+R_LINE_TO, -1.27f, -1.28f,
+R_LINE_TO, -4.9f, 4.9f,
+R_LINE_TO, 1.28f, 1.27f,
+CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_shorten.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_shorten.icon
new file mode 100644
index 0000000..be97b2e
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_shorten.icon
@@ -0,0 +1,37 @@
+// 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, 9.18f, 18.16f,
+V_LINE_TO, 16.06f,
+LINE_TO, 7.99f, 17.25f,
+R_LINE_TO, -1.17f, -1.18f,
+LINE_TO, 10, 12.89f,
+R_LINE_TO, 3.18f, 3.18f,
+R_LINE_TO, -1.17f, 1.18f,
+R_LINE_TO, -1.19f, -1.2f,
+R_V_LINE_TO, 2.11f,
+CLOSE,
+MOVE_TO, 4, 11.93f,
+R_V_LINE_TO, -1.5f,
+R_H_LINE_TO, 12,
+R_V_LINE_TO, 1.5f,
+CLOSE,
+R_MOVE_TO, 0, -2.5f,
+R_V_LINE_TO, -1.5f,
+R_H_LINE_TO, 12,
+R_V_LINE_TO, 1.5f,
+CLOSE,
+R_MOVE_TO, 6, -2.47f,
+LINE_TO, 6.82f, 3.77f,
+R_LINE_TO, 1.17f, -1.18f,
+R_LINE_TO, 1.19f, 1.21f,
+V_LINE_TO, 1.7f,
+R_H_LINE_TO, 1.65f,
+R_V_LINE_TO, 2.11f,
+R_LINE_TO, 1.19f, -1.21f,
+R_LINE_TO, 1.17f, 1.18f,
+CLOSE,
+R_MOVE_TO, 0, 0,
+CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.cc.template b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.cc.template
new file mode 100644
index 0000000..4c33981
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.cc.template
@@ -0,0 +1,17 @@
+// 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.
+
+// vector_icons.cc.template is used to generate vector_icons.cc. Edit the former
+// rather than the latter.
+
+#include "chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h"
+
+#include "components/vector_icons/cc_macros.h"
+#include "ui/gfx/animation/tween.h"
+#include "ui/gfx/vector_icon_types.h"
+
+#define DECLARE_VECTOR_COMMAND(x) using gfx::x;
+DECLARE_VECTOR_COMMANDS
+
+TEMPLATE_PLACEHOLDER
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h.template b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h.template
new file mode 100644
index 0000000..b6010ec7
--- /dev/null
+++ b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h.template
@@ -0,0 +1,22 @@
+// 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.
+
+// vector_icons.h.template is used to generate vector_icons.h. Edit the former
+// rather than the latter.
+
+#ifndef CHROME_BROWSER_UI_VIEWS_EDITOR_MENU_VECTOR_ICONS_VECTOR_ICONS_H_
+#define CHROME_BROWSER_UI_VIEWS_EDITOR_MENU_VECTOR_ICONS_VECTOR_ICONS_H_
+
+namespace gfx {
+struct VectorIcon;
+}
+
+#define VECTOR_ICON_TEMPLATE_H(icon_name) \
+extern const gfx::VectorIcon icon_name;
+
+TEMPLATE_PLACEHOLDER
+
+#undef VECTOR_ICON_TEMPLATE_H
+
+#endif  // CHROME_BROWSER_UI_VIEWS_EDITOR_MENU_VECTOR_ICONS_VECTOR_ICONS_H_
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc
index e72087c2..905c02b7 100644
--- a/chrome/browser/ui/webauthn/sheet_models.cc
+++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -1527,7 +1527,7 @@
   }
 
   const absl::optional<std::u16string>& phone_name =
-      dialog_model->GetPrioritySyncedPhoneName();
+      dialog_model->GetPriorityPhoneName();
   if (phone_name) {
     primary_passkeys_label_ =
         l10n_util::GetStringFUTF16(IDS_WEBAUTHN_FROM_PHONE_LABEL, *phone_name);
diff --git a/chrome/browser/ui/webauthn/sheet_models_unittest.cc b/chrome/browser/ui/webauthn/sheet_models_unittest.cc
index e399c107..07842e7 100644
--- a/chrome/browser/ui/webauthn/sheet_models_unittest.cc
+++ b/chrome/browser/ui/webauthn/sheet_models_unittest.cc
@@ -28,9 +28,9 @@
 
   MOCK_METHOD(base::span<const Mechanism>, mechanisms, (), (const));
   MOCK_METHOD(absl::optional<std::u16string>,
-              GetPrioritySyncedPhoneName,
+              GetPriorityPhoneName,
               (),
-              (const));
+              (const override));
 };
 
 class TestAuthenticatorSheetModel : public AuthenticatorSheetModelBase {
@@ -114,7 +114,7 @@
 TEST_F(AuthenticatorMultiSourcePickerSheetModelTest, GPMPasskeysOnly) {
   MockDialogModel dialog_model;
   std::vector<Mechanism> mechanisms;
-  EXPECT_CALL(dialog_model, GetPrioritySyncedPhoneName)
+  EXPECT_CALL(dialog_model, GetPriorityPhoneName)
       .WillRepeatedly(testing::Return(kPhoneName));
   mechanisms.emplace_back(
       Mechanism::Credential({device::AuthenticatorType::kPhone, {0}}),
@@ -139,7 +139,7 @@
 TEST_F(AuthenticatorMultiSourcePickerSheetModelTest, GPMAndLocalPasskeys) {
   MockDialogModel dialog_model;
   std::vector<Mechanism> mechanisms;
-  EXPECT_CALL(dialog_model, GetPrioritySyncedPhoneName)
+  EXPECT_CALL(dialog_model, GetPriorityPhoneName)
       .WillRepeatedly(testing::Return(kPhoneName));
   mechanisms.emplace_back(
       Mechanism::Credential({device::AuthenticatorType::kPhone, {0}}),
diff --git a/chrome/browser/ui/webui/omnibox/omnibox.mojom b/chrome/browser/ui/webui/omnibox/omnibox.mojom
index cb07fbb..cb9e3f8 100644
--- a/chrome/browser/ui/webui/omnibox/omnibox.mojom
+++ b/chrome/browser/ui/webui/omnibox/omnibox.mojom
@@ -11,7 +11,7 @@
   int32 style;
 };
 
-struct AutocompleteAdditionalInfo {
+struct DictionaryEntry {
   string key;
   string value;
 };
@@ -44,7 +44,8 @@
   int32 duplicates;
   bool from_previous;
   int32 pedal_id;
-  array<AutocompleteAdditionalInfo> additional_info;
+  array<DictionaryEntry> scoring_signals;
+  array<DictionaryEntry> additional_info;
 };
 
 struct AutocompleteResultsForProvider {
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
index f8bb799..77b1ae89e 100644
--- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
+++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
@@ -26,6 +26,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/search.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/ui/webui/omnibox/omnibox.mojom-forward.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/history/core/browser/url_database.h"
@@ -110,15 +111,160 @@
 };
 
 template <>
-struct TypeConverter<std::vector<mojom::AutocompleteAdditionalInfoPtr>,
+struct TypeConverter<std::vector<mojom::DictionaryEntryPtr>,
+                     AutocompleteMatch::ScoringSignals> {
+  static std::vector<mojom::DictionaryEntryPtr> Convert(
+      const AutocompleteMatch::ScoringSignals input) {
+    std::vector<mojom::DictionaryEntryPtr> array;
+
+    if (input.has_typed_count()) {
+      auto item = mojom::DictionaryEntry::New(
+          "typed count", base::NumberToString(input.typed_count()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_visit_count()) {
+      auto item = mojom::DictionaryEntry::New(
+          "visit count", base::NumberToString(input.visit_count()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_elapsed_time_last_visit_secs()) {
+      auto item = mojom::DictionaryEntry::New(
+          "elapsed time since last visit (s)",
+          base::NumberToString(input.elapsed_time_last_visit_secs()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_shortcut_visit_count()) {
+      auto item = mojom::DictionaryEntry::New(
+          "shortcut visit count",
+          base::NumberToString(input.shortcut_visit_count()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_shortest_shortcut_len()) {
+      auto item = mojom::DictionaryEntry::New(
+          "shortest shortcut length",
+          base::NumberToString(input.shortest_shortcut_len()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_elapsed_time_last_shortcut_visit_sec()) {
+      auto item = mojom::DictionaryEntry::New(
+          "elapsed time since last shortcut visit (s)",
+          base::NumberToString(input.elapsed_time_last_shortcut_visit_sec()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_num_bookmarks_of_url()) {
+      auto item = mojom::DictionaryEntry::New(
+          "num bookmarks of url",
+          base::NumberToString(input.num_bookmarks_of_url()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_first_bookmark_title_match_position()) {
+      auto item = mojom::DictionaryEntry::New(
+          "first bookmark title match position",
+          base::NumberToString(input.first_bookmark_title_match_position()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_total_bookmark_title_match_length()) {
+      auto item = mojom::DictionaryEntry::New(
+          "total bookmark title match length",
+          base::NumberToString(input.total_bookmark_title_match_length()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_num_input_terms_matched_by_bookmark_title()) {
+      auto item = mojom::DictionaryEntry::New(
+          "num input terms matched by bookmark title",
+          base::NumberToString(
+              input.num_input_terms_matched_by_bookmark_title()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_first_url_match_position()) {
+      auto item = mojom::DictionaryEntry::New(
+          "first url match position",
+          base::NumberToString(input.first_url_match_position()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_total_url_match_length()) {
+      auto item = mojom::DictionaryEntry::New(
+          "total url match length",
+          base::NumberToString(input.total_url_match_length()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_host_match_at_word_boundary()) {
+      auto item = mojom::DictionaryEntry::New(
+          "host match at word boundary",
+          base::NumberToString(input.host_match_at_word_boundary()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_total_host_match_length()) {
+      auto item = mojom::DictionaryEntry::New(
+          "total host match length",
+          base::NumberToString(input.total_host_match_length()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_total_path_match_length()) {
+      auto item = mojom::DictionaryEntry::New(
+          "total path match length",
+          base::NumberToString(input.total_path_match_length()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_total_query_or_ref_match_length()) {
+      auto item = mojom::DictionaryEntry::New(
+          "total query or ref match length",
+          base::NumberToString(input.total_query_or_ref_match_length()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_total_title_match_length()) {
+      auto item = mojom::DictionaryEntry::New(
+          "total title match length",
+          base::NumberToString(input.total_title_match_length()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_has_non_scheme_www_match()) {
+      auto item = mojom::DictionaryEntry::New(
+          "has non-scheme www match",
+          base::NumberToString(input.has_non_scheme_www_match()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_num_input_terms_matched_by_title()) {
+      auto item = mojom::DictionaryEntry::New(
+          "num input terms matched by title",
+          base::NumberToString(input.num_input_terms_matched_by_title()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_num_input_terms_matched_by_url()) {
+      auto item = mojom::DictionaryEntry::New(
+          "num input terms matched by url",
+          base::NumberToString(input.num_input_terms_matched_by_url()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_length_of_url()) {
+      auto item = mojom::DictionaryEntry::New(
+          "length of url", base::NumberToString(input.length_of_url()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_site_engagement()) {
+      auto item = mojom::DictionaryEntry::New(
+          "site engagement", base::NumberToString(input.site_engagement()));
+      array.push_back(std::move(item));
+    }
+    if (input.has_allowed_to_be_default_match()) {
+      auto item = mojom::DictionaryEntry::New(
+          "allowed to be default",
+          base::NumberToString(input.allowed_to_be_default_match()));
+      array.push_back(std::move(item));
+    }
+    return array;
+  }
+};
+
+template <>
+struct TypeConverter<std::vector<mojom::DictionaryEntryPtr>,
                      AutocompleteMatch::AdditionalInfo> {
-  static std::vector<mojom::AutocompleteAdditionalInfoPtr> Convert(
+  static std::vector<mojom::DictionaryEntryPtr> Convert(
       const AutocompleteMatch::AdditionalInfo& input) {
-    std::vector<mojom::AutocompleteAdditionalInfoPtr> array(input.size());
+    std::vector<mojom::DictionaryEntryPtr> array(input.size());
     size_t index = 0;
     for (auto i = input.begin(); i != input.end(); ++i, index++) {
-      mojom::AutocompleteAdditionalInfoPtr item(
-          mojom::AutocompleteAdditionalInfo::New());
+      mojom::DictionaryEntryPtr item(mojom::DictionaryEntry::New());
       item->key = i->first;
       item->value = i->second;
       array[index] = std::move(item);
@@ -184,8 +330,13 @@
     const auto* pedal = OmniboxPedal::FromAction(input.GetActionAt(0u));
     result->pedal_id =
         pedal == nullptr ? 0 : static_cast<int32_t>(pedal->PedalId());
+    if (input.scoring_signals.has_value()) {
+      result->scoring_signals =
+          mojo::ConvertTo<std::vector<mojom::DictionaryEntryPtr>>(
+              input.scoring_signals.value());
+    }
     result->additional_info =
-        mojo::ConvertTo<std::vector<mojom::AutocompleteAdditionalInfoPtr>>(
+        mojo::ConvertTo<std::vector<mojom::DictionaryEntryPtr>>(
             input.additional_info);
     return result;
   }
diff --git a/chrome/browser/ui/webui/settings/ash/device_section.cc b/chrome/browser/ui/webui/settings/ash/device_section.cc
index 9a6e659..398e0551 100644
--- a/chrome/browser/ui/webui/settings/ash/device_section.cc
+++ b/chrome/browser/ui/webui/settings/ash/device_section.cc
@@ -968,17 +968,32 @@
                              CupsPrintersManager* printers_manager,
                              PrefService* pref_service)
     : OsSettingsSection(profile, search_tag_registry),
-      power_subsection_(profile, search_tag_registry, pref_service),
+      power_subsection_(
+          !ash::features::IsOsSettingsRevampWayfindingEnabled()
+              ? absl::make_optional<PowerSection>(profile,
+                                                  search_tag_registry,
+                                                  pref_service)
+              : absl::nullopt),
       printing_subsection_(
           ash::features::IsOsSettingsRevampWayfindingEnabled()
               ? absl::make_optional<PrintingSection>(profile,
                                                      search_tag_registry,
                                                      printers_manager)
               : absl::nullopt),
-      storage_subsection_(profile, search_tag_registry) {
+      storage_subsection_(
+          !ash::features::IsOsSettingsRevampWayfindingEnabled()
+              ? absl::make_optional<StorageSection>(profile,
+                                                    search_tag_registry)
+              : absl::nullopt) {
   CHECK(profile);
   CHECK(search_tag_registry);
   CHECK(pref_service);
+  if (ash::features::IsOsSettingsRevampWayfindingEnabled()) {
+    CHECK(printing_subsection_);
+  } else {
+    CHECK(power_subsection_);
+    CHECK(storage_subsection_);
+  }
 
   SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate();
   updater.AddSearchTags(GetDeviceSearchConcepts());
@@ -1074,11 +1089,10 @@
   AddDeviceAudioStrings(html_source);
 
   if (ash::features::IsOsSettingsRevampWayfindingEnabled()) {
-    CHECK(printing_subsection_);
     printing_subsection_->AddLoadTimeData(html_source);
   } else {
-    power_subsection_.AddLoadTimeData(html_source);
-    storage_subsection_.AddLoadTimeData(html_source);
+    power_subsection_->AddLoadTimeData(html_source);
+    storage_subsection_->AddLoadTimeData(html_source);
   }
 }
 
@@ -1089,11 +1103,10 @@
   web_ui->AddMessageHandler(std::make_unique<StylusHandler>());
 
   if (ash::features::IsOsSettingsRevampWayfindingEnabled()) {
-    CHECK(printing_subsection_);
     printing_subsection_->AddHandlers(web_ui);
   } else {
-    power_subsection_.AddHandlers(web_ui);
-    storage_subsection_.AddHandlers(web_ui);
+    power_subsection_->AddHandlers(web_ui);
+    storage_subsection_->AddHandlers(web_ui);
   }
 }
 
@@ -1306,14 +1319,13 @@
 
   if (ash::features::IsOsSettingsRevampWayfindingEnabled()) {
     // Printing.
-    CHECK(printing_subsection_);
     printing_subsection_->RegisterHierarchy(generator);
   } else {
     // Power.
-    power_subsection_.RegisterHierarchy(generator);
+    power_subsection_->RegisterHierarchy(generator);
 
     // Storage.
-    storage_subsection_.RegisterHierarchy(generator);
+    storage_subsection_->RegisterHierarchy(generator);
   }
 
   // Audio.
diff --git a/chrome/browser/ui/webui/settings/ash/device_section.h b/chrome/browser/ui/webui/settings/ash/device_section.h
index e0ae389..da79c77b 100644
--- a/chrome/browser/ui/webui/settings/ash/device_section.h
+++ b/chrome/browser/ui/webui/settings/ash/device_section.h
@@ -88,9 +88,9 @@
   system::PointerDeviceObserver pointer_device_observer_;
   mojo::Remote<crosapi::mojom::CrosDisplayConfigController>
       cros_display_config_;
-  PowerSection power_subsection_;
+  absl::optional<PowerSection> power_subsection_;
   absl::optional<PrintingSection> printing_subsection_;
-  StorageSection storage_subsection_;
+  absl::optional<StorageSection> storage_subsection_;
   mojo::AssociatedReceiver<crosapi::mojom::CrosDisplayConfigObserver>
       cros_display_config_observer_receiver_{this};
 };
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
index 624a278..55103b3d 100644
--- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
@@ -379,9 +379,13 @@
   base::UmaHistogramExactLinear(string_constants::kFontScaleHistogramName,
                                 GetNormalizedFontScale(font_scale),
                                 maximum_font_scale_logging + 1);
-  ReadAnythingFont font =
-      font_map_.at(prefs->GetString(prefs::kAccessibilityReadAnythingFontName));
-  base::UmaHistogramEnumeration(string_constants::kFontNameHistogramName, font);
+  std::string font_name =
+      prefs->GetString(prefs::kAccessibilityReadAnythingFontName);
+  if (font_map_.find(font_name) != font_map_.end()) {
+    ReadAnythingFont font = font_map_.at(font_name);
+    base::UmaHistogramEnumeration(string_constants::kFontNameHistogramName,
+                                  font);
+  }
   read_anything::mojom::Colors color =
       static_cast<read_anything::mojom::Colors>(
           prefs->GetInteger(prefs::kAccessibilityReadAnythingColorInfo));
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
index 416b3d277..ff2568d 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -42,6 +42,7 @@
 #include "device/fido/features.h"
 #include "device/fido/fido_authenticator.h"
 #include "device/fido/fido_constants.h"
+#include "device/fido/fido_request_handler_base.h"
 #include "device/fido/fido_transport_protocol.h"
 #include "device/fido/fido_types.h"
 #include "device/fido/pin.h"
@@ -489,6 +490,21 @@
         }
         return;
       }
+      if (transport_availability_.has_platform_authenticator_credential ==
+          device::FidoRequestHandlerBase::RecognizedCredential::
+              kNoRecognizedCredential) {
+        // If there are no local matches but there are phone passkeys, jump to
+        // the phone from sync.
+        for (auto& mechanism : mechanisms_) {
+          const auto& type = mechanism.type;
+          if (absl::holds_alternative<Mechanism::Credential>(type) &&
+              absl::get<Mechanism::Credential>(type)->source ==
+                  device::AuthenticatorType::kPhone) {
+            SetCurrentStep(Step::kPhoneConfirmationSheet);
+            return;
+          }
+        }
+      }
     }
     // If a request only includes mechanisms that can be serviced by the Windows
     // API and local credentials, there is no point showing Chrome UI as an
@@ -1050,7 +1066,7 @@
            : AuthenticatorTransport::kInternal}));
   ephemeral_state_.creds_.clear();
   if (source == device::AuthenticatorType::kPhone) {
-    ContactPrioritySyncedPhone();
+    ContactPriorityPhone();
   } else {
     HideDialogAndDispatchToPlatformAuthenticator(source);
   }
@@ -1074,13 +1090,7 @@
 }
 
 void AuthenticatorRequestDialogModel::ContactPriorityPhone() {
-  for (auto& mechanism : mechanisms_) {
-    if (absl::holds_alternative<Mechanism::Phone>(mechanism.type)) {
-      mechanism.callback.Run();
-      return;
-    }
-  }
-  NOTREACHED();
+  ContactPhone(paired_phones_[*priority_phone_index_]->name);
 }
 
 void AuthenticatorRequestDialogModel::ContactPhoneForTesting(
@@ -1092,12 +1102,11 @@
 }
 
 absl::optional<std::u16string>
-AuthenticatorRequestDialogModel::GetPrioritySyncedPhoneName() const {
-  absl::optional<int> phone_index = GetPrioritySyncedPhoneIndex();
-  if (!phone_index) {
+AuthenticatorRequestDialogModel::GetPriorityPhoneName() const {
+  if (!priority_phone_index_) {
     return absl::nullopt;
   }
-  return base::UTF8ToUTF16(paired_phones_[*phone_index]->name);
+  return base::UTF8ToUTF16(paired_phones_[*priority_phone_index_]->name);
 }
 
 void AuthenticatorRequestDialogModel::StartTransportFlowForTesting(
@@ -1462,12 +1471,6 @@
       device::AuthenticatorType::kICloudKeychain);
 }
 
-void AuthenticatorRequestDialogModel::ContactPrioritySyncedPhone() {
-  // TODO(crbug.com/1453259): Dispatch to Windows instead if it handles
-  // hybrid.
-  ContactPhone(paired_phones_[*GetPrioritySyncedPhoneIndex()]->name);
-}
-
 void AuthenticatorRequestDialogModel::ContactPhone(const std::string& name) {
 #if BUILDFLAG(IS_MAC)
   if (transport_availability()->ble_access_denied) {
@@ -1524,11 +1527,16 @@
   auto* web_contents = GetWebContents();
   if (web_contents && render_frame_host) {
     std::vector<password_manager::PasskeyCredential> credentials;
-    absl::optional<std::u16string> priority_phone =
-        GetPrioritySyncedPhoneName();
+    absl::optional<size_t> priority_phone_index =
+        GetIndexOfMostRecentlyUsedPhoneFromSync();
+    absl::optional<std::u16string> priority_phone_name;
+    if (priority_phone_index) {
+      priority_phone_name =
+          base::UTF8ToUTF16(paired_phones_[*priority_phone_index]->name);
+    }
     for (const auto& credential : ephemeral_state_.creds_) {
       if (credential.source == device::AuthenticatorType::kPhone &&
-          !priority_phone) {
+          !priority_phone_index) {
         continue;
       }
       password_manager::PasskeyCredential& passkey = credentials.emplace_back(
@@ -1542,7 +1550,7 @@
               credential.user.display_name.value_or("")));
       if (credential.source == device::AuthenticatorType::kPhone) {
         passkey.set_authenticator_label(l10n_util::GetStringFUTF16(
-            IDS_PASSWORD_MANAGER_PASSKEY_FROM_PHONE, *priority_phone));
+            IDS_PASSWORD_MANAGER_PASSKEY_FROM_PHONE, *priority_phone_name));
       }
     }
     bool offer_passkey_from_another_device;
@@ -1616,7 +1624,8 @@
 }
 
 absl::optional<size_t>
-AuthenticatorRequestDialogModel::GetPrioritySyncedPhoneIndex() const {
+AuthenticatorRequestDialogModel::GetIndexOfMostRecentlyUsedPhoneFromSync()
+    const {
   // Try finding the most recently used phone from sync.
   absl::optional<std::vector<uint8_t>> last_used_pairing =
       RetrieveLastUsedPairing(content::RenderFrameHost::FromID(frame_host_id_));
@@ -1680,14 +1689,10 @@
   const bool is_new_get_assertion_ui =
       is_get_assertion &&
       base::FeatureList::IsEnabled(device::kWebAuthnNewPasskeyUI);
-  absl::optional<std::u16string> priority_phone_name;
-  absl::optional<size_t> priority_phone_index = GetPrioritySyncedPhoneIndex();
-  if (priority_phone_index) {
-    priority_phone_name =
-        base::UTF8ToUTF16(paired_phones_[*priority_phone_index]->name);
-  }
+  priority_phone_index_ = GetIndexOfMostRecentlyUsedPhoneFromSync();
+  absl::optional<std::u16string> priority_phone_name = GetPriorityPhoneName();
   bool list_phone_passkeys =
-      is_new_get_assertion_ui && priority_phone_index &&
+      is_new_get_assertion_ui && priority_phone_index_ &&
       base::FeatureList::IsEnabled(device::kWebAuthnListSyncedPasskeys);
   bool specific_phones_listed = false;
   if (is_new_get_assertion_ui && !use_conditional_mediation_) {
@@ -1833,6 +1838,7 @@
         paired_phones_.size() == 1 && !use_conditional_mediation_ &&
         transport_availability_.is_only_hybrid_or_internal;
     if (skip_to_phone_confirmation) {
+      priority_phone_index_ = 0;
       pending_step_ = Step::kPhoneConfirmationSheet;
     }
   }
@@ -1952,8 +1958,6 @@
       }
     }
 
-    // TODO(crbug.com/1459273): implement skipping to the relevant authenticator
-    // for certain Windows requests.
     // For all other cases, go to the multi source passkey picker.
     return absl::nullopt;
   }
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h
index ea740af18..9a7eb33 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model.h
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -538,8 +538,10 @@
     return ephemeral_state_.priority_mechanism_index_;
   }
 
-  // Contacts the "priority" paired phone. This is only valid to call when there
-  // is a single phone paired.
+  // Contacts the "priority" paired phone. This is the phone from sync if there
+  // are a priori discovered GPM passkeys, or the first phone on the list
+  // otherwise.
+  // Only valid to call if |GetPriorityPhoneName()| returns a value.
   void ContactPriorityPhone();
 
   // ContactPhoneForTesting triggers a contact for a phone with the given name.
@@ -547,10 +549,10 @@
   // user-visible mechanisms and use the callbacks therein.
   void ContactPhoneForTesting(const std::string& name);
 
-  // Returns the name of the phone from sync that will be dispatched to when a
-  // user selects a Mechanism::Credential corresponding to a phone credential,
-  // or absl::nullopt if there isn't one.
-  virtual absl::optional<std::u16string> GetPrioritySyncedPhoneName() const;
+  // Returns the name of the "priority" paired phone. This is the phone from
+  // sync if there are a priori discovered GPM passkeys, or the first phone on
+  // the list otherwise.
+  virtual absl::optional<std::u16string> GetPriorityPhoneName() const;
 
   // StartTransportFlowForTesting moves the UI to focus on the given transport.
   // UI should use |mechanisms()| to enumerate the user-visible mechanisms and
@@ -730,10 +732,6 @@
 
   void StartICloudKeychain();
 
-  // Contacts the "priority" paired phone from sync. At least one sync phone
-  // must be available to call this.
-  void ContactPrioritySyncedPhone();
-
   // Contacts a paired phone. The phone is specified by name.
   void ContactPhone(const std::string& name);
   void ContactPhoneAfterOffTheRecordInterstitial(std::string name);
@@ -747,7 +745,7 @@
 
   // Returns the index (into `paired_phones_`) of a phone that has been paired
   // through Chrome Sync, or absl::nullopt if there isn't one.
-  absl::optional<size_t> GetPrioritySyncedPhoneIndex() const;
+  absl::optional<size_t> GetIndexOfMostRecentlyUsedPhoneFromSync() const;
 
   // SortRecognizedCredentials sorts
   // `transport_availability_.recognized_credentials` into username order.
@@ -852,6 +850,10 @@
   // QR-based pairing. The entries are sorted by name.
   std::vector<std::unique_ptr<device::cablev2::Pairing>> paired_phones_;
 
+  // priority_phone_index_ contains an index in `paired_phones_` for the phone
+  // that should be dispatched to by default, if any.
+  absl::optional<size_t> priority_phone_index_;
+
   // paired_phones_contacted_ is the same length as |paired_phones_| and
   // contains true whenever the corresponding phone as already been contacted.
   std::vector<bool> paired_phones_contacted_;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
index 34d84035..e8da782 100644
--- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
+++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -939,7 +939,7 @@
       {L,
        ga,
        {usb, cable, internal},
-       {one_phone_cred, two_cred},
+       {one_phone_cred, two_cred, has_plat, empty_al},
        {psync("a")},
        {c(cred1), c(cred2), c(phonecred1), add},
        mss},
@@ -947,7 +947,7 @@
       {L,
        ga,
        {usb, cable, internal},
-       {two_cred},
+       {two_cred, has_plat, empty_al},
        {psync("a")},
        {c(cred1), c(cred2), add},
        mss},
@@ -959,7 +959,7 @@
       {L,
        ga,
        {usb, internal},
-       {two_cred},
+       {two_cred, has_plat, empty_al},
        {psync("a")},
        {c(cred1), c(cred2), t(usb)},
        mss},
@@ -967,11 +967,20 @@
       {L,
        ga,
        {usb, cable, internal},
-       {two_phone_cred},
+       {two_phone_cred, empty_al},
        {psync("a")},
        {c(phonecred1), c(phonecred2), add},
        mss},
-      // Single internal credential.
+      // Single internal credential with empty allow list.
+      {L,
+       ga,
+       {usb, cable, internal},
+       {one_cred, has_plat, empty_al},
+       {psync("a")},
+       {c(cred1), add},
+       hero,
+     },
+      // Single internal credential with non-empty allow list.
       {L,
        ga,
        {usb, cable, internal},
@@ -992,6 +1001,14 @@
        {psync("a")},
        {c(phonecred1), add},
        hero},
+      // Single phone credential with non-empty allow list.
+      {L,
+       ga,
+       {usb, cable, internal},
+       {one_phone_cred},
+       {psync("a")},
+       {c(phonecred1), add},
+       pconf},
 
 #if BUILDFLAG(IS_MAC)
       // Even with iCloud Keychain present, we shouldn't jump to it without
@@ -1019,41 +1036,42 @@
 
   Test kListSyncedPasskeysTests_Windows_NoWinHybrid[]{
       // Mix of phone and internal credentials, but no USB/NFC.
-      // This should not offer dispatching directly to the Windows API.
+      // This should jump to Windows, as there is a match with the local
+      // authenticator.
       {L,
        ga,
        {cable},
-       {one_phone_cred, two_cred, has_winapi, only_hybrid_or_internal},
+       {one_phone_cred, two_cred, has_winapi, only_hybrid_or_internal,
+        has_plat},
        {psync("a")},
        {c(wincred1), c(wincred2), c(phonecred1), add},
-       mss},
-      // Mix of phone, internal credentials, and USB/NFC.
+       plat_ui},
+      // Mix of phone, internal credentials, and USB/NFC (empty allow list).
       // This should offer dispatching to the Windows API for USB/NFC.
       {L,
        ga,
        {cable},
-       {one_phone_cred, two_cred, has_winapi},
+       {one_phone_cred, two_cred, has_winapi, empty_al, has_plat},
        {psync("a")},
        {c(wincred1), c(wincred2), c(phonecred1), add, winapi},
        mss},
-      // Phone credentials and unknown Windows Hello credential status.
-      // This should offer dispatching to the Windows API for Windows Hello.
+      // Phone credentials and unknown Windows Hello credential status. This
+      // should offer dispatching to the Windows API for Windows Hello.
       {L,
        ga,
        {cable},
-       {two_phone_cred, has_winapi, maybe_plat, only_hybrid_or_internal},
+       {two_phone_cred, has_winapi, maybe_plat, empty_al},
        {psync("a")},
        {c(phonecred1), c(phonecred2), winapi, add},
        mss},
   };
 
   Test kListSyncedPasskeysTests_Windows_WinHybrid[]{
-      // Mix of phone and internal credentials, no USB/NFC.
-      // This should offer dispatching directly to the Windows API for hybrid.
+      // Mix of phone and internal credentials (empty allow list).
       {L,
        ga,
        {cable},
-       {one_phone_cred, two_cred, has_winapi, only_hybrid_or_internal},
+       {one_phone_cred, two_cred, has_winapi, empty_al, has_plat},
        {psync("a")},
        {c(wincred1), c(wincred2), c(phonecred1), winapi},
        mss},
@@ -1062,7 +1080,7 @@
       {L,
        ga,
        {},
-       {two_cred, has_winapi, only_internal},
+       {two_cred, has_winapi, only_internal, has_plat},
        {},
        {c(wincred1), c(wincred2)},
        plat_ui},
@@ -2135,7 +2153,11 @@
 }
 #endif  // BUILDFLAG(IS_WIN)
 
-TEST_F(AuthenticatorRequestDialogModelTest, ContactPriorityPhone) {
+// Tests that if the user does not have a phone from sync, Chrome offers a phone
+// confirmation screen for an allow-list request when there is a single
+// previously paired phone, no local matches, and only hybrid or internal
+// credentials in the allow-list.
+TEST_F(AuthenticatorRequestDialogModelTest, ContactPriorityPhone_NoSync) {
   AuthenticatorRequestDialogModel model(main_rfh());
   std::vector<std::unique_ptr<device::cablev2::Pairing>> phones;
   phones.emplace_back(GetPairingFromQR());
@@ -2146,13 +2168,54 @@
   transports_info.is_ble_powered = true;
   transports_info.request_type = device::FidoRequestType::kGetAssertion;
   transports_info.available_transports = {AuthenticatorTransport::kHybrid};
+  transports_info.is_only_hybrid_or_internal = true;
+  transports_info.has_platform_authenticator_credential = device::
+      FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential;
+  transports_info.has_icloud_keychain_credential = device::
+      FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential;
   model.StartFlow(std::move(transports_info),
                   /*is_conditional_mediation=*/false);
+  EXPECT_EQ(model.current_step(), Step::kPhoneConfirmationSheet);
+  EXPECT_EQ(model.GetPriorityPhoneName(), u"Phone from QR");
   model.ContactPriorityPhone();
   EXPECT_EQ(model.current_step(), Step::kCableActivate);
   EXPECT_EQ(model.selected_phone_name(), "Phone from QR");
 }
 
+// Tests that if the user has a phone from sync, Chrome offers a phone
+// confirmation screen for an allow-list request when there is a phone passkey
+// match and no local matches.
+TEST_F(AuthenticatorRequestDialogModelTest, ContactPriorityPhone_WithSync) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitWithFeatures(
+      {device::kWebAuthnNewPasskeyUI, device::kWebAuthnListSyncedPasskeys},
+      /*disabled_features=*/{});
+  AuthenticatorRequestDialogModel model(main_rfh());
+  std::vector<std::unique_ptr<device::cablev2::Pairing>> phones;
+  phones.emplace_back(GetPairingFromQR());
+  phones.emplace_back(GetPairingFromSync());
+  model.set_cable_transport_info(/*extension_is_v2=*/absl::nullopt,
+                                 std::move(phones), base::DoNothing(),
+                                 absl::nullopt);
+  TransportAvailabilityInfo transports_info;
+  transports_info.recognized_credentials = {kPhoneCred1, kPhoneCred2};
+  transports_info.is_ble_powered = true;
+  transports_info.request_type = device::FidoRequestType::kGetAssertion;
+  transports_info.available_transports = {AuthenticatorTransport::kHybrid};
+  transports_info.is_only_hybrid_or_internal = true;
+  transports_info.has_platform_authenticator_credential = device::
+      FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential;
+  transports_info.has_icloud_keychain_credential = device::
+      FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential;
+  model.StartFlow(std::move(transports_info),
+                  /*is_conditional_mediation=*/false);
+  EXPECT_EQ(model.current_step(), Step::kPhoneConfirmationSheet);
+  EXPECT_EQ(model.GetPriorityPhoneName(), u"Phone from sync");
+  model.ContactPriorityPhone();
+  EXPECT_EQ(model.current_step(), Step::kCableActivate);
+  EXPECT_EQ(model.selected_phone_name(), "Phone from sync");
+}
+
 #if BUILDFLAG(IS_MAC)
 TEST_F(AuthenticatorRequestDialogModelTest, BluetoothPermissionPrompt) {
   // When BLE permission is denied on macOS, we should jump to the sheet that
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
index 35711a76..d51ea37 100644
--- a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
+++ b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
@@ -281,7 +281,8 @@
     EXPECT_EQ(webauthn_entry.icon, "globeIcon");
 
     // Click the credential.
-    popup_controller->AcceptSuggestionWithoutThreshold(suggestion_index);
+    popup_controller->AcceptSuggestion(
+        suggestion_index, base::TimeTicks::Now() + base::Milliseconds(500));
     std::string result;
     ASSERT_TRUE(message_queue.WaitForMessage(&result));
     EXPECT_EQ(result, "\"webauthn: OK\"");
@@ -483,7 +484,8 @@
   EXPECT_EQ(webauthn_entry.icon, "globeIcon");
 
   // Click the credential.
-  popup_controller->AcceptSuggestionWithoutThreshold(suggestion_index);
+  popup_controller->AcceptSuggestion(
+      suggestion_index, base::TimeTicks::Now() + base::Milliseconds(500));
   std::string result;
   ASSERT_TRUE(message_queue.WaitForMessage(&result));
   EXPECT_EQ(result, "\"webauthn: OK\"");
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm b/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
index 86a30d2..59b884a 100644
--- a/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
+++ b/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
@@ -6,6 +6,7 @@
 #include <vector>
 
 #include "base/test/bind.h"
+#include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/password_manager/chrome_webauthn_credentials_delegate.h"
 #include "chrome/browser/ssl/cert_verifier_browser_test.h"
@@ -138,7 +139,8 @@
   EXPECT_EQ(webauthn_entry.icon, "globeIcon");
 
   // Click the credential.
-  popup_controller->AcceptSuggestionWithoutThreshold(suggestion_index);
+  popup_controller->AcceptSuggestion(
+      suggestion_index, base::TimeTicks::Now() + base::Milliseconds(500));
   std::string result;
   ASSERT_TRUE(message_queue.WaitForMessage(&result));
   EXPECT_EQ(result, "\"webauthn: OK\"");
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 66b32dc6..61273e53 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1695124764-b8bc62d1a1bb8493e3b1226eac028dd53544bee5.profdata
+chrome-linux-main-1695146254-1453778f23e8cc61f2e2ff3cd53a003631108ac8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index d6393a958..60c147c 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1695138714-010c65f556150f89111aac92b04bb49fd13aac22.profdata
+chrome-mac-arm-main-1695160752-511354aba562e9cb20f3d69dd7fba2279f49aa4f.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 8127995..840ebd8 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1695124764-9b65fc72248c57df170dda400002b4d48f919755.profdata
+chrome-mac-main-1695146254-6639f0b7ece6a6279924caf2cc9252a61d157731.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index aa40ad1..bd2df8b4 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1695124764-b95a52aa7b2b5eebaf22b04b73361d20e05341ac.profdata
+chrome-win-arm64-main-1695146254-95ed5d34cf7ae5e23400128949cb020cfdb3299c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 34a8f15..569c31d 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1695135599-944e76e4ffa4a7df551c1a8bf403d2c5653e0589.profdata
+chrome-win32-main-1695146254-3f7c6b213f23487ba5cd35c1aa9e814f0e9719e3.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 998fc92..8a7a523 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1695135599-7a94a50c1a04035a10c4c1cde51c962534613870.profdata
+chrome-win64-main-1695146254-6a8dc60b962db46e7c112c0e0078935059786f1e.profdata
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 8c20de9..09a619c2 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -2645,26 +2645,6 @@
     "hardware.same_origin_tab_capture_allowed_by_origins";
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-// An integer pref that holds enum value of current demo mode configuration.
-// Values are defined by DemoSession::DemoModeConfig enum.
-inline constexpr char kDemoModeConfig[] = "demo_mode.config";
-
-// A string pref holding the value of the current country for demo sessions.
-inline constexpr char kDemoModeCountry[] = "demo_mode.country";
-
-// A string pref holding the value of the retailer name input for demo sessions.
-// This is now mostly called "retailer_name" in code other than in this pref and
-// in Omaha request attributes
-inline constexpr char kDemoModeRetailerId[] = "demo_mode.retailer_id";
-
-// A string pref holding the value of the store number input for demo sessions.
-// This is now mostly called "store_number" in code other than in this pref and
-// in Omaha request attributes
-inline constexpr char kDemoModeStoreId[] = "demo_mode.store_id";
-
-// A string pref holding the value of the default locale for demo sessions.
-inline constexpr char kDemoModeDefaultLocale[] = "demo_mode.default_locale";
-
 // Dictionary for transient storage of settings that should go into device
 // settings storage before owner has been assigned.
 inline constexpr char kDeviceSettingsCache[] = "signed_settings_cache";
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc
index 3d1f1c8..13a5a18 100644
--- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc
+++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc
@@ -86,6 +86,7 @@
   }
   return std::make_pair(kCborDecoderNoError, std::move(cbor));
 }
+
 }  // namespace
 
 QuickStartDecoder::QuickStartDecoder(
@@ -97,33 +98,240 @@
 
 QuickStartDecoder::~QuickStartDecoder() = default;
 
-void QuickStartDecoder::DoDecodeGetAssertionResponse(
+void QuickStartDecoder::DecodeBootstrapConfigurations(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeBootstrapConfigurationsCallback callback) {
+  if (!data.has_value()) {
+    std::move(callback).Run(nullptr,
+                            mojom::QuickStartDecoderError::kEmptyMessage);
+    return;
+  }
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (!result.has_value()) {
+    std::move(callback).Run(nullptr, result.error());
+    return;
+  }
+  if (!result.value()->is_bootstrap_configurations()) {
+    std::move(callback).Run(
+        nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    return;
+  }
+
+  std::move(callback).Run(
+      result.value()->get_bootstrap_configurations().Clone(), absl::nullopt);
+}
+
+void QuickStartDecoder::DecodeWifiCredentialsResponse(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeWifiCredentialsResponseCallback callback) {
+  if (!data.has_value()) {
+    quick_start_metrics::RecordWifiTransferResult(
+        /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
+            WifiTransferResultFailureReason::kEmptyResponseBytes);
+    std::move(callback).Run(nullptr,
+                            mojom::QuickStartDecoderError::kEmptyMessage);
+    return;
+  }
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (!result.has_value()) {
+    if (result.error() == mojom::QuickStartDecoderError::kUnableToReadAsJSON) {
+      quick_start_metrics::RecordWifiTransferResult(
+          /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
+              WifiTransferResultFailureReason::kUnableToReadAsJSON);
+    }
+    if (result.error() == mojom::QuickStartDecoderError::kUnknownPayload) {
+      quick_start_metrics::RecordWifiTransferResult(
+          /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
+              WifiTransferResultFailureReason::kWifiNetworkInformationNotFound);
+    }
+    std::move(callback).Run(nullptr, result.error());
+    return;
+  }
+  if (!result.value()->is_wifi_credentials()) {
+    std::move(callback).Run(
+        nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    return;
+  }
+
+  std::move(callback).Run(result.value()->get_wifi_credentials().Clone(),
+                          absl::nullopt);
+}
+
+void QuickStartDecoder::DecodeUserVerificationRequested(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeUserVerificationRequestedCallback callback) {
+  if (!data.has_value()) {
+    std::move(callback).Run(nullptr,
+                            mojom::QuickStartDecoderError::kEmptyMessage);
+    return;
+  }
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (!result.has_value()) {
+    std::move(callback).Run(nullptr, result.error());
+    return;
+  }
+  if (!result.value()->is_user_verification_requested()) {
+    std::move(callback).Run(
+        nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    return;
+  }
+
+  std::move(callback).Run(
+      result.value()->get_user_verification_requested().Clone(), absl::nullopt);
+}
+
+void QuickStartDecoder::DecodeUserVerificationResult(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeUserVerificationResultCallback callback) {
+  if (!data.has_value()) {
+    std::move(callback).Run(nullptr,
+                            mojom::QuickStartDecoderError::kEmptyMessage);
+    return;
+  }
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (!result.has_value()) {
+    std::move(callback).Run(nullptr, result.error());
+    return;
+  }
+  if (!result.value()->is_user_verification_response()) {
+    std::move(callback).Run(
+        nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    return;
+  }
+
+  std::move(callback).Run(
+      result.value()->get_user_verification_response().Clone(), absl::nullopt);
+}
+
+void QuickStartDecoder::DecodeGetAssertionResponse(
     const absl::optional<std::vector<uint8_t>>& data,
     DecodeGetAssertionResponseCallback callback) {
   if (!data.has_value()) {
+    std::move(callback).Run(nullptr,
+                            mojom::QuickStartDecoderError::kEmptyMessage);
+    return;
+  }
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (!result.has_value()) {
+    std::move(callback).Run(nullptr, result.error());
+    return;
+  }
+  if (!result.value()->is_fido_assertion_response()) {
+    std::move(callback).Run(
+        nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    return;
+  }
+
+  std::move(callback).Run(result.value()->get_fido_assertion_response().Clone(),
+                          absl::nullopt);
+}
+
+void QuickStartDecoder::DecodeNotifySourceOfUpdateResponse(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeNotifySourceOfUpdateResponseCallback callback) {
+  if (!data.has_value()) {
+    std::move(callback).Run(nullptr,
+                            mojom::QuickStartDecoderError::kEmptyMessage);
+    return;
+  }
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (!result.has_value()) {
+    std::move(callback).Run(nullptr, result.error());
+    return;
+  }
+  if (!result.value()->is_notify_source_of_update_response()) {
+    std::move(callback).Run(
+        nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    return;
+  }
+
+  std::move(callback).Run(
+      result.value()->get_notify_source_of_update_response().Clone(),
+      absl::nullopt);
+}
+
+void QuickStartDecoder::DecodeQuickStartMessage(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeQuickStartMessageCallback callback) {
+  if (!data.has_value()) {
     LOG(ERROR) << "No response bytes received.";
     std::move(callback).Run(nullptr,
                             mojom::QuickStartDecoderError::kEmptyMessage);
     return;
   }
 
-  absl::optional<std::vector<uint8_t>> parsed_response_bytes =
-      ExtractFidoDataFromJsonResponse(data.value());
-  if (!parsed_response_bytes.has_value()) {
-    LOG(ERROR) << "Failed to extract Fido data from JSON response.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kUnableToReadAsJSON);
-    return;
+  auto result = DoDecodeQuickStartMessage(data.value());
+  if (result.has_value()) {
+    std::move(callback).Run(std::move(result.value()), absl::nullopt);
+  } else {
+    std::move(callback).Run(nullptr, result.error());
+  }
+}
+
+base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+QuickStartDecoder::DoDecodeQuickStartMessage(const std::vector<uint8_t>& data) {
+  QuickStartMessage::ReadResult read_result =
+      QuickStartMessage::ReadMessage(data);
+  if (!read_result.has_value()) {
+    switch (read_result.error()) {
+      case QuickStartMessage::ReadError::INVALID_JSON:
+        return base::unexpected(
+            mojom::QuickStartDecoderError::kUnableToReadAsJSON);
+      case QuickStartMessage::ReadError::MISSING_MESSAGE_PAYLOAD:
+        return base::unexpected(mojom::QuickStartDecoderError::kUnknownPayload);
+      case QuickStartMessage::ReadError::BASE64_DESERIALIZATION_FAILURE:
+        return base::unexpected(
+            mojom::QuickStartDecoderError::kUnableToReadAsBase64);
+      case QuickStartMessage::ReadError::UNEXPECTED_MESSAGE_TYPE:
+        return base::unexpected(
+            mojom::QuickStartDecoderError::kUnexpectedMessageType);
+    }
   }
 
-  std::vector<unsigned char>& response_bytes = parsed_response_bytes.value();
+  base::Value::Dict* payload = read_result.value()->GetPayload();
+  QuickStartMessageType type = read_result.value()->get_type();
+  switch (type) {
+    case QuickStartMessageType::kSecondDeviceAuthPayload:
+      return DecodeSecondDeviceAuthPayload(*payload);
+    case QuickStartMessageType::kBootstrapOptions:
+      NOTIMPLEMENTED();
+      break;
+    case QuickStartMessageType::kBootstrapConfigurations:
+      return DecodeBootstrapConfigurations(*payload);
+    case QuickStartMessageType::kQuickStartPayload:
+      return DecodeQuickStartPayload(*payload);
+  }
+  return base::unexpected(mojom::QuickStartDecoderError::kEmptyMessage);
+}
+
+base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+QuickStartDecoder::DecodeSecondDeviceAuthPayload(
+    const base::Value::Dict& payload) {
+  const std::string* fido_message = payload.FindString(kFidoMessageKey);
+  if (!fido_message) {
+    LOG(ERROR) << "fidoMessage cannot be found within secondDeviceAuthPayload.";
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+  }
+
+  std::string base64_decoded_fido_message;
+
+  if (!base::Base64Decode(*fido_message, &base64_decoded_fido_message,
+                          base::Base64DecodePolicy::kForgiving)) {
+    LOG(ERROR) << "Failed to decode fidoMessage as a Base64 String";
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+  }
+
+  auto response_bytes = std::vector<unsigned char>(
+      base64_decoded_fido_message.begin(), base64_decoded_fido_message.end());
+
   if (response_bytes.size() < kExpectedResponseSize) {
     LOG(ERROR) << "GetAssertionResponse requires a status code byte and "
                   "response bytes. Data in size: "
                << response_bytes.size();
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
   uint8_t ctap_status = response_bytes[0];
   base::span<const uint8_t> cbor_bytes(response_bytes);
@@ -131,23 +339,20 @@
   if (ctap_status != kCtapDeviceResponseSuccess) {
     LOG(ERROR) << "Ctap Device Response Status Code is not Success(0x00). Got: "
                << ctap_status;
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
   std::pair<int, absl::optional<cbor::Value>> decoded_values =
       CborDecodeGetAssertionResponse(cbor_bytes);
   if (decoded_values.first != kCborDecoderNoError) {
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
   if (!decoded_values.second || !decoded_values.second->is_map()) {
     LOG(ERROR) << "The CBOR decoded response values needs to be a valid CBOR "
                   "Value Map.";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   const cbor::Value::MapValue& response_map = decoded_values.second->GetMap();
@@ -167,9 +372,8 @@
 
   if (credential_id.empty()) {
     LOG(ERROR) << "credential_id is empty in FIDO Message";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   // According to FIDO CTAP2 GetAssertionResponse, authData is stored at CBOR
@@ -183,9 +387,8 @@
 
   if (auth_data.empty()) {
     LOG(ERROR) << "auth_data is empty in FIDO Message";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   // According to FIDO CTAP2 GetAssertionResponse, signature is stored at CBOR
@@ -199,9 +402,8 @@
 
   if (signature.empty()) {
     LOG(ERROR) << "signature is empty in FIDO Message";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   // According to FIDO CTAP2 GetAssertionResponse, user is stored at CBOR index
@@ -219,230 +421,104 @@
 
   if (email.empty()) {
     LOG(ERROR) << "email is empty in FIDO Message";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
-  std::move(callback).Run(mojom::FidoAssertionResponse::New(
-                              email, credential_id, auth_data, signature),
-                          absl::nullopt);
+  return mojom::QuickStartMessage::NewFidoAssertionResponse(
+      mojom::FidoAssertionResponse::New(email, credential_id, auth_data,
+                                        signature));
 }
 
-void QuickStartDecoder::DoDecodeBootstrapConfigurations(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeBootstrapConfigurationsCallback callback) {
-  if (!data.has_value()) {
-    LOG(ERROR) << "No response bytes received.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kEmptyMessage);
-    return;
+base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+QuickStartDecoder::DecodeQuickStartPayload(const base::Value::Dict& payload) {
+  // user verification requested
+  absl::optional<bool> is_awaiting_user_verification;
+  if ((is_awaiting_user_verification =
+           payload.FindBool(kAwaitingUserVerificationKey))) {
+    return mojom::QuickStartMessage::NewUserVerificationRequested(
+        mojom::UserVerificationRequested::New(
+            is_awaiting_user_verification.value()));
+  }
+  // user verification response
+  absl::optional<int> user_verification_result_code;
+  if ((user_verification_result_code =
+           payload.FindInt(kUserVerificationResultKey))) {
+    mojom::UserVerificationResult user_verification_result =
+        static_cast<mojom::UserVerificationResult>(
+            user_verification_result_code.value());
+
+    if (!mojom::IsKnownEnumValue(user_verification_result)) {
+      LOG(ERROR) << "User Verification Result is an unknown status code";
+      return base::unexpected(
+          mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+    }
+
+    absl::optional<bool> is_first_user_verification =
+        payload.FindBool(kIsFirstUserVerificationKey);
+    if (!is_first_user_verification.has_value()) {
+      LOG(ERROR) << "Message does not contain key is_first_user_verification";
+      return base::unexpected(
+          mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+    }
+    return mojom::QuickStartMessage::NewUserVerificationResponse(
+        mojom::UserVerificationResponse::New(
+            user_verification_result, is_first_user_verification.value()));
   }
 
-  QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage(
-      data.value(), QuickStartMessageType::kBootstrapConfigurations);
-
-  if (!read_result.has_value()) {
-    LOG(ERROR) << "Bootstrap Configurations decoder failed";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+  // wifi credentials
+  const base::Value::Dict* wifi_network_information = nullptr;
+  if ((wifi_network_information =
+           payload.FindDict(kWifiNetworkInformationKey))) {
+    return DecodeWifiCredentials(*wifi_network_information);
   }
 
-  base::Value::Dict* device_details =
-      read_result.value()->GetPayload()->FindDict(kDeviceDetailsKey);
-  if (!device_details) {
-    LOG(ERROR)
-        << "DeviceDetails cannot be found within BootstrapConfigurations.";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
+  // notify source of update response
+  absl::optional<bool> notify_source_of_update_ack_received;
+  if ((notify_source_of_update_ack_received =
+           payload.FindBool(kNotifySourceOfUpdateAckKey))) {
+    return mojom::QuickStartMessage::NewNotifySourceOfUpdateResponse(
+        mojom::NotifySourceOfUpdateResponse::New(
+            notify_source_of_update_ack_received.value()));
   }
-  std::string* cryptauth_device_id_ptr =
-      device_details->FindString(kCryptauthDeviceIdKey);
-  if (!cryptauth_device_id_ptr) {
-    LOG(WARNING)
-        << "CryptauthDeviceId for the Android Device could not be found.";
-    std::move(callback).Run(
-        mojom::BootstrapConfigurations::New(/*cryptauth_device_id=*/""),
-        absl::nullopt);
-    return;
-  }
-  std::move(callback).Run(
-      mojom::BootstrapConfigurations::New(*cryptauth_device_id_ptr),
-      absl::nullopt);
+
+  LOG(ERROR) << "Unknown QuickStartPayload";
+  return base::unexpected(mojom::QuickStartDecoderError::kUnknownPayload);
 }
 
-void QuickStartDecoder::DecodeBootstrapConfigurations(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeBootstrapConfigurationsCallback callback) {
-  DoDecodeBootstrapConfigurations(data, std::move(callback));
-}
-
-void QuickStartDecoder::DecodeWifiCredentialsResponse(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeWifiCredentialsResponseCallback callback) {
-  DoDecodeWifiCredentialsResponse(data, std::move(callback));
-}
-
-void QuickStartDecoder::DecodeUserVerificationRequested(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeUserVerificationRequestedCallback callback) {
-  if (!data.has_value()) {
-    LOG(ERROR) << "No response bytes received.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kEmptyMessage);
-    return;
-  }
-
-  QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage(
-      data.value(), QuickStartMessageType::kQuickStartPayload);
-  if (!read_result.has_value()) {
-    LOG(ERROR)
-        << "Failed to read UserVerificationRequested as QuickStartMessage";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kUnableToReadAsJSON);
-    return;
-  }
-
-  absl::optional<bool> is_awaiting_user_verification =
-      read_result.value()->GetPayload()->FindBool(kAwaitingUserVerificationKey);
-  if (!is_awaiting_user_verification.has_value()) {
-    LOG(ERROR) << "UserVerificationRequested message does not include "
-                  "await_user_verification";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
-  }
-
-  std::move(callback).Run(mojom::UserVerificationRequested::New(
-                              is_awaiting_user_verification.value()),
-                          absl::nullopt);
-}
-
-void QuickStartDecoder::DecodeUserVerificationResult(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeUserVerificationResultCallback callback) {
-  if (!data.has_value()) {
-    LOG(ERROR) << "No response bytes received.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kEmptyMessage);
-    return;
-  }
-
-  QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage(
-      data.value(), QuickStartMessageType::kQuickStartPayload);
-
-  if (!read_result.has_value()) {
-    LOG(ERROR) << "Failed to read UserVerificationResult as QuickStartMessage";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kUnableToReadAsJSON);
-    return;
-  }
-
-  absl::optional<int> user_verification_result_code =
-      read_result.value()->GetPayload()->FindInt(kUserVerificationResultKey);
-
-  if (!user_verification_result_code.has_value()) {
-    LOG(ERROR) << "User Verification Result was not include in verification "
-                  "result message";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
-  }
-
-  mojom::UserVerificationResult user_verification_result =
-      static_cast<mojom::UserVerificationResult>(
-          user_verification_result_code.value());
-
-  if (!mojom::IsKnownEnumValue(user_verification_result)) {
-    LOG(ERROR) << "User Verification Result is an unknown status code";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
-  }
-
-  absl::optional<bool> is_first_user_verification =
-      read_result.value()->GetPayload()->FindBool(kIsFirstUserVerificationKey);
-  if (!is_first_user_verification.has_value()) {
-    LOG(ERROR) << "Message does not contain key is_first_user_verification";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
-  }
-
-  std::move(callback).Run(
-      mojom::UserVerificationResponse::New(user_verification_result,
-                                           is_first_user_verification.value()),
-      absl::nullopt);
-}
-
-void QuickStartDecoder::DoDecodeWifiCredentialsResponse(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeWifiCredentialsResponseCallback callback) {
-  if (!data.has_value()) {
-    LOG(ERROR) << "No response bytes received.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kEmptyMessage);
-    return;
-  }
-
-  QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage(
-      data.value(), QuickStartMessageType::kQuickStartPayload);
-
-  if (!read_result.has_value()) {
-    LOG(ERROR) << "Message cannot be parsed as a JSON Dictionary.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kUnableToReadAsJSON);
-    quick_start_metrics::RecordWifiTransferResult(
-        /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
-            WifiTransferResultFailureReason::kUnableToReadAsJSON);
-    return;
-  }
-
-  base::Value::Dict* wifi_network_information =
-      read_result.value()->GetPayload()->FindDict(kWifiNetworkInformationKey);
-  if (!wifi_network_information) {
-    LOG(ERROR) << "Wifi Network information not present in payload";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    quick_start_metrics::RecordWifiTransferResult(
-        /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
-            WifiTransferResultFailureReason::kWifiNetworkInformationNotFound);
-    return;
-  }
-
-  std::string* ssid = wifi_network_information->FindString(kWifiNetworkSsidKey);
+base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+QuickStartDecoder::DecodeWifiCredentials(
+    const base::Value::Dict& wifi_network_information) {
+  const std::string* ssid =
+      wifi_network_information.FindString(kWifiNetworkSsidKey);
   if (!ssid) {
     LOG(ERROR) << "SSID cannot be found within WifiCredentialsResponse.";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::kSsidNotFound);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   if (ssid->length() == 0) {
     LOG(ERROR) << "SSID has a length of 0.";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::kEmptySsid);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
-  std::string* security_type_string =
-      wifi_network_information->FindString(kWifiNetworkSecurityTypeKey);
+  const std::string* security_type_string =
+      wifi_network_information.FindString(kWifiNetworkSecurityTypeKey);
   if (!security_type_string) {
     LOG(ERROR)
         << "Security Type cannot be found within WifiCredentialsResponse";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::kSecurityTypeNotFound);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   absl::optional<mojom::WifiSecurityType> maybe_security_type =
@@ -450,42 +526,39 @@
 
   if (!maybe_security_type.has_value()) {
     LOG(ERROR) << "Security type was not a valid value.";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::kInvalidSecurityType);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   mojom::WifiSecurityType security_type = maybe_security_type.value();
 
   // Password may not be included in payload for passwordless, open networks.
   absl::optional<std::string> password = absl::nullopt;
-  std::string* password_ptr =
-      wifi_network_information->FindString(kWifiNetworkPasswordKey);
+  const std::string* password_ptr =
+      wifi_network_information.FindString(kWifiNetworkPasswordKey);
 
   if (password_ptr && security_type == mojom::WifiSecurityType::kOpen) {
     LOG(ERROR) << "Password is found but network security type is open.";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::kPasswordFoundAndOpenNetwork);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   if (!password_ptr && security_type != mojom::WifiSecurityType::kOpen) {
     LOG(ERROR) << "Password cannot be found within WifiCredentialsResponse but "
                   "network is not open. wifi_security_type: "
                << security_type;
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::
                 kPasswordNotFoundAndNotOpenNetwork);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
   if (password_ptr) {
@@ -493,106 +566,42 @@
   }
 
   absl::optional<bool> is_hidden =
-      wifi_network_information->FindBool(kWifiNetworkIsHiddenKey);
+      wifi_network_information.FindBool(kWifiNetworkIsHiddenKey);
   if (!is_hidden.has_value()) {
     LOG(ERROR)
         << "Wifi Hide Status cannot be found within WifiCredentialsResponse";
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
     quick_start_metrics::RecordWifiTransferResult(
         /*succeeded=*/false, /*failure_reason=*/quick_start_metrics::
             WifiTransferResultFailureReason::kWifiHideStatusNotFound);
-    return;
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
 
-  std::move(callback).Run(
+  return mojom::QuickStartMessage::NewWifiCredentials(
       mojom::WifiCredentials::New(*ssid, security_type, is_hidden.value(),
-                                  password),
-      absl::nullopt);
+                                  password));
 }
 
-void QuickStartDecoder::DecodeGetAssertionResponse(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeGetAssertionResponseCallback callback) {
-  DoDecodeGetAssertionResponse(std::move(data), std::move(callback));
-}
-
-absl::optional<std::vector<uint8_t>>
-QuickStartDecoder::ExtractFidoDataFromJsonResponse(
-    const std::vector<uint8_t>& data) {
-  QuickStartMessage::ReadResult read_result =
-      ash::quick_start::QuickStartMessage::ReadMessage(
-          data, QuickStartMessageType::kSecondDeviceAuthPayload);
-
-  if (!read_result.has_value()) {
-    LOG(ERROR) << "MessagePayload cannot be parsed as a JSON Dictionary.";
-    return absl::nullopt;
+base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+QuickStartDecoder::DecodeBootstrapConfigurations(
+    const base::Value::Dict& payload) {
+  const base::Value::Dict* device_details = payload.FindDict(kDeviceDetailsKey);
+  if (!device_details) {
+    LOG(ERROR)
+        << "DeviceDetails cannot be found within BootstrapConfigurations.";
+    return base::unexpected(
+        mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
   }
-
-  base::Value::Dict* second_device_auth_payload =
-      read_result.value()->GetPayload();
-  if (!second_device_auth_payload) {
-    LOG(ERROR) << "secondDeviceAuthPayload cannot be found within Message.";
-    return absl::nullopt;
+  const std::string* cryptauth_device_id_ptr =
+      device_details->FindString(kCryptauthDeviceIdKey);
+  if (!cryptauth_device_id_ptr) {
+    LOG(WARNING)
+        << "CryptauthDeviceId for the Android Device could not be found.";
+    return mojom::QuickStartMessage::NewBootstrapConfigurations(
+        mojom::BootstrapConfigurations::New(/*cryptauth_device_id=*/""));
   }
-
-  std::string* fido_message =
-      second_device_auth_payload->FindString(kFidoMessageKey);
-  if (!fido_message) {
-    LOG(ERROR) << "fidoMessage cannot be found within secondDeviceAuthPayload.";
-    return absl::nullopt;
-  }
-
-  std::string base64_decoded_fido_message;
-
-  if (!base::Base64Decode(*fido_message, &base64_decoded_fido_message,
-                          base::Base64DecodePolicy::kForgiving)) {
-    LOG(ERROR) << "Failed to decode fidoMessage as a Base64 String";
-    return absl::nullopt;
-  }
-
-  return std::vector<uint8_t>(base64_decoded_fido_message.begin(),
-                              base64_decoded_fido_message.end());
-}
-
-void QuickStartDecoder::DecodeNotifySourceOfUpdateResponse(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeNotifySourceOfUpdateResponseCallback callback) {
-  DoDecodeNotifySourceOfUpdateResponse(data, std::move(callback));
-}
-
-void QuickStartDecoder::DoDecodeNotifySourceOfUpdateResponse(
-    const absl::optional<std::vector<uint8_t>>& data,
-    DecodeNotifySourceOfUpdateResponseCallback callback) {
-  if (!data.has_value()) {
-    LOG(ERROR) << "No response bytes received.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kEmptyMessage);
-    return;
-  }
-
-  QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage(
-      data.value(), QuickStartMessageType::kQuickStartPayload);
-
-  if (!read_result.has_value()) {
-    LOG(ERROR) << "Notify Source of Update message cannot be parsed as a JSON "
-                  "Dictionary.";
-    std::move(callback).Run(nullptr,
-                            mojom::QuickStartDecoderError::kUnableToReadAsJSON);
-    return;
-  }
-
-  absl::optional<bool> ack_received =
-      read_result.value()->GetPayload()->FindBool(kNotifySourceOfUpdateAckKey);
-  if (!ack_received.has_value()) {
-    std::move(callback).Run(
-        nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
-    return;
-  }
-
-  std::move(callback).Run(
-      mojom::NotifySourceOfUpdateResponse::New(ack_received.value()),
-      absl::nullopt);
+  return mojom::QuickStartMessage::NewBootstrapConfigurations(
+      mojom::BootstrapConfigurations::New(*cryptauth_device_id_ptr));
 }
 
 }  // namespace ash::quick_start
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h
index 455675e..50368ea0 100644
--- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h
+++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h
@@ -7,6 +7,8 @@
 
 #include <vector>
 
+#include "base/types/expected.h"
+#include "base/values.h"
 #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom.h"
 #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom-forward.h"
 #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom.h"
@@ -53,6 +55,10 @@
   void DecodeUserVerificationRequested(
       const absl::optional<std::vector<uint8_t>>& data,
       DecodeUserVerificationRequestedCallback callback) override;
+
+  void DecodeQuickStartMessage(
+      const absl::optional<std::vector<uint8_t>>& data,
+      DecodeQuickStartMessageCallback callback) override;
   // mojom::QuickStartDecoder:
 
  private:
@@ -66,11 +72,18 @@
   void DoDecodeWifiCredentialsResponse(
       const absl::optional<std::vector<uint8_t>>& data,
       DecodeWifiCredentialsResponseCallback callback);
-  absl::optional<std::vector<uint8_t>> ExtractFidoDataFromJsonResponse(
-      const std::vector<uint8_t>& data);
-  void DoDecodeNotifySourceOfUpdateResponse(
-      const absl::optional<std::vector<uint8_t>>& data,
-      DecodeNotifySourceOfUpdateResponseCallback callback);
+
+  base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+  DoDecodeQuickStartMessage(const std::vector<uint8_t>& data);
+  base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+  DecodeSecondDeviceAuthPayload(const base::Value::Dict& payload);
+  base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+  DecodeBootstrapConfigurations(const base::Value::Dict& payload);
+  base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+  DecodeQuickStartPayload(const base::Value::Dict& payload);
+  base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError>
+  DecodeWifiCredentials(const base::Value::Dict& wifi_network_information);
+
   mojo::Receiver<mojom::QuickStartDecoder> receiver_;
 };
 
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc
index b7faf94..ff51409 100644
--- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc
+++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc
@@ -112,22 +112,21 @@
   }
 
   void DoDecodeGetAssertionResponse(
-      const std::vector<uint8_t>& data,
+      const absl::optional<std::vector<uint8_t>>& data,
       QuickStartDecoder::DecodeGetAssertionResponseCallback callback) {
-    return decoder_->DoDecodeGetAssertionResponse(data, std::move(callback));
+    decoder_->DecodeGetAssertionResponse(data, std::move(callback));
   }
 
   void DoDecodeBootstrapConfigurations(
-      const std::vector<uint8_t>& data,
+      const absl::optional<std::vector<uint8_t>>& data,
       QuickStartDecoder::DecodeBootstrapConfigurationsCallback callback) {
-    return decoder_->DoDecodeBootstrapConfigurations(data, std::move(callback));
+    decoder_->DecodeBootstrapConfigurations(data, std::move(callback));
   }
 
   void DoDecodeWifiCredentialsResponse(
-      QuickStartMessage* message,
+      const absl::optional<std::vector<uint8_t>>& data,
       QuickStartDecoder::DecodeWifiCredentialsResponseCallback callback) {
-    return decoder_->DoDecodeWifiCredentialsResponse(
-        ConvertMessageToBytes(message), std::move(callback));
+    decoder_->DecodeWifiCredentialsResponse(data, std::move(callback));
   }
 
   void DoDecodeNotifySourceOfUpdateResponse(
@@ -137,11 +136,6 @@
                                                  std::move(callback));
   }
 
-  absl::optional<std::vector<uint8_t>> ExtractFidoDataFromJsonResponse(
-      const std::vector<uint8_t>& data) {
-    return decoder_->ExtractFidoDataFromJsonResponse(data);
-  }
-
   QuickStartDecoder* decoder() const { return decoder_.get(); }
 
  protected:
@@ -242,6 +236,34 @@
             mojom::QuickStartDecoderError::kUnableToReadAsJSON);
 }
 
+TEST_F(QuickStartDecoderTest, DecodeGetAssertionResponse_NullData) {
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(absl::nullopt, future.GetCallback());
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage);
+}
+
+TEST_F(QuickStartDecoderTest,
+       DecodeGetAssertionResponse_UnexpectedMessageType) {
+  QuickStartMessage message(QuickStartMessageType::kQuickStartPayload);
+  message.GetPayload()->Set(kAwaitingUserVerificationKey, true);
+
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(ConvertMessageToBytes(&message),
+                               future.GetCallback());
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(),
+            mojom::QuickStartDecoderError::kUnexpectedMessageType);
+}
+
 TEST_F(QuickStartDecoderTest, DecodeGetAssertionResponse_EmptyResponse) {
   std::vector<uint8_t> data{};
   std::vector<uint8_t> message = BuildSecondDeviceAuthPayload(data);
@@ -315,6 +337,18 @@
             mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
 }
 
+TEST_F(QuickStartDecoderTest, DecodeBootstrapConfigurations_NullPayload) {
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::BootstrapConfigurationsPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeBootstrapConfigurations(absl::nullopt, future.GetCallback());
+
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage);
+}
+
 TEST_F(QuickStartDecoderTest,
        DecodeBootstrapConfigurations_EmptyMessagePayload) {
   QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations);
@@ -333,6 +367,30 @@
 }
 
 TEST_F(QuickStartDecoderTest,
+       DecodeBootstrapConfigurations_UnexpectedMessageType) {
+  // Build a valid SecondDeviceAuthPayload
+  std::string expected_credential_id(kValidCredentialId.begin(),
+                                     kValidCredentialId.end());
+  std::string email = "testcase@google.com";
+  std::vector<uint8_t> user_id(email.begin(), email.end());
+  std::vector<uint8_t> data = BuildEncodedResponseData(
+      kValidCredentialId, kValidAuthData, kValidSignature, user_id, kSuccess);
+
+  std::vector<uint8_t> payload = BuildSecondDeviceAuthPayload(data);
+
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::BootstrapConfigurationsPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  // Try to parse the SecondDeviceAuthPayload as a BootstrapConfigurations.
+  DoDecodeBootstrapConfigurations(std::move(payload), future.GetCallback());
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(),
+            mojom::QuickStartDecoderError::kUnexpectedMessageType);
+}
+
+TEST_F(QuickStartDecoderTest,
        DecodeBootstrapConfigurations_EmptyBootstrapConfigurations) {
   QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations);
 
@@ -422,19 +480,33 @@
 
   std::vector<uint8_t> payload = BuildSecondDeviceAuthPayload(data);
 
-  absl::optional<std::vector<uint8_t>> result =
-      ExtractFidoDataFromJsonResponse(payload);
-  ASSERT_TRUE(result.has_value());
-  EXPECT_EQ(result.value(), data);
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(payload, future.GetCallback());
+  EXPECT_TRUE(future.Get<0>());
+  EXPECT_FALSE(future.Get<1>().has_value());
 }
 
 TEST_F(QuickStartDecoderTest,
        ExtractFidoDataFromJsonResponseFailsIfFidoDataMissingFromPayload) {
   QuickStartMessage message(QuickStartMessageType::kSecondDeviceAuthPayload);
 
-  absl::optional<std::vector<uint8_t>> result =
-      ExtractFidoDataFromJsonResponse(ConvertMessageToBytes(&message));
-  EXPECT_FALSE(result.has_value());
+  std::string json_serialized_payload;
+  base::JSONWriter::Write(*message.GetPayload(), &json_serialized_payload);
+  std::vector<uint8_t> response_bytes(json_serialized_payload.begin(),
+                                      json_serialized_payload.end());
+
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(response_bytes, future.GetCallback());
+  EXPECT_FALSE(future.Get<0>());
+  EXPECT_TRUE(future.Get<1>().has_value());
 }
 
 TEST_F(QuickStartDecoderTest,
@@ -446,9 +518,14 @@
   std::vector<uint8_t> response_bytes(json_serialized_payload.begin(),
                                       json_serialized_payload.end());
 
-  absl::optional<std::vector<uint8_t>> result =
-      ExtractFidoDataFromJsonResponse(response_bytes);
-  EXPECT_FALSE(result.has_value());
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(response_bytes, future.GetCallback());
+  EXPECT_FALSE(future.Get<0>());
+  EXPECT_TRUE(future.Get<1>().has_value());
 }
 
 TEST_F(QuickStartDecoderTest,
@@ -460,9 +537,14 @@
   std::vector<uint8_t> response_bytes(json_serialized_payload.begin(),
                                       json_serialized_payload.end());
 
-  absl::optional<std::vector<uint8_t>> result =
-      ExtractFidoDataFromJsonResponse(response_bytes);
-  EXPECT_FALSE(result.has_value());
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(response_bytes, future.GetCallback());
+  EXPECT_FALSE(future.Get<0>());
+  EXPECT_TRUE(future.Get<1>().has_value());
 }
 
 TEST_F(QuickStartDecoderTest,
@@ -470,9 +552,60 @@
   // This is just a random payload that is not a valid JSON.
   std::vector<uint8_t> random_payload = {0x01, 0x02, 0x03};
 
-  absl::optional<std::vector<uint8_t>> result =
-      ExtractFidoDataFromJsonResponse(random_payload);
-  EXPECT_FALSE(result.has_value());
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::FidoAssertionResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeGetAssertionResponse(random_payload, future.GetCallback());
+  EXPECT_FALSE(future.Get<0>());
+  EXPECT_TRUE(future.Get<1>().has_value());
+}
+
+TEST_F(QuickStartDecoderTest, DecodeWifiCredentialsResponse_NullData) {
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::WifiCredentialsPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeWifiCredentialsResponse(absl::nullopt, future.GetCallback());
+
+  ASSERT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(),
+            ash::quick_start::mojom::QuickStartDecoderError::kEmptyMessage);
+}
+
+TEST_F(QuickStartDecoderTest, DecodeWifiCredentialsResponse_BadJson) {
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::WifiCredentialsPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeWifiCredentialsResponse(std::vector<uint8_t>{0x01, 0x02, 0x03},
+                                  future.GetCallback());
+
+  ASSERT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(
+      future.Get<1>(),
+      ash::quick_start::mojom::QuickStartDecoderError::kUnableToReadAsJSON);
+}
+
+TEST_F(QuickStartDecoderTest,
+       DecodeWifiCredentialsResponse_UnexpectedMessageType) {
+  QuickStartMessage message(QuickStartMessageType::kQuickStartPayload);
+  message.GetPayload()->Set(kAwaitingUserVerificationKey, true);
+
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::WifiCredentialsPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
+
+  ASSERT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(),
+            mojom::QuickStartDecoderError::kUnexpectedMessageType);
 }
 
 TEST_F(QuickStartDecoderTest, ExtractWifiInformationPassesOnValidResponse) {
@@ -491,7 +624,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   ASSERT_FALSE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<0>()->ssid, "ssid");
@@ -517,7 +651,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   ASSERT_FALSE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<0>()->password, absl::nullopt);
@@ -540,7 +675,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -570,7 +706,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -600,7 +737,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -630,7 +768,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -660,7 +799,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -690,7 +830,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -720,7 +861,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -747,7 +889,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -775,7 +918,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -806,7 +950,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -836,7 +981,8 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
@@ -859,11 +1005,11 @@
       absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
       future;
 
-  DoDecodeWifiCredentialsResponse(&message, future.GetCallback());
+  DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message),
+                                  future.GetCallback());
 
   EXPECT_TRUE(future.Get<0>().is_null());
-  EXPECT_EQ(future.Get<1>(),
-            mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnknownPayload);
   histogram_tester_.ExpectBucketCount(
       kWifiTransferResultFailureReasonHistogramName,
       quick_start_metrics::WifiTransferResultFailureReason::
@@ -925,7 +1071,6 @@
   decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message),
                                           future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   ASSERT_FALSE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<0>().get()->result,
             mojom::UserVerificationResult::kUserVerified);
@@ -933,6 +1078,36 @@
   EXPECT_EQ(future.Get<1>(), absl::nullopt);
 }
 
+TEST_F(QuickStartDecoderTest, DecodeUserVerificationResult_NullData) {
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::UserVerificationResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  decoder()->DecodeUserVerificationResult(absl::nullopt, future.GetCallback());
+
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage);
+}
+
+TEST_F(QuickStartDecoderTest,
+       DecodeUserVerificationResult_UnexpectedMessageType) {
+  QuickStartMessage message(QuickStartMessageType::kQuickStartPayload);
+  message.GetPayload()->Set(kNotifySourceOfUpdateAckKey, true);
+
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::UserVerificationResponsePtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message),
+                                          future.GetCallback());
+
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(),
+            mojom::QuickStartDecoderError::kUnexpectedMessageType);
+}
+
 TEST_F(QuickStartDecoderTest,
        DecodeUserVerificationResultFailsIfMessageIsNotJson) {
   std::vector<uint8_t> message;
@@ -943,7 +1118,6 @@
 
   decoder()->DecodeUserVerificationResult(message, future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
             mojom::QuickStartDecoderError::kUnableToReadAsJSON);
@@ -962,10 +1136,8 @@
   decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message),
                                           future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get<0>().is_null());
-  EXPECT_EQ(future.Get<1>(),
-            mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnknownPayload);
 }
 
 TEST_F(QuickStartDecoderTest,
@@ -982,7 +1154,6 @@
   decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message),
                                           future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
             mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
@@ -1001,7 +1172,6 @@
   decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message),
                                           future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get<0>().is_null());
   EXPECT_EQ(future.Get<1>(),
             mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
@@ -1019,12 +1189,42 @@
   decoder()->DecodeUserVerificationRequested(ConvertMessageToBytes(&message),
                                              future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   ASSERT_FALSE(future.Get<0>().is_null());
   EXPECT_TRUE(future.Get<0>().get()->is_awaiting_user_verification);
   EXPECT_EQ(future.Get<1>(), absl::nullopt);
 }
 
+TEST_F(QuickStartDecoderTest, DecodeUserVerificationRequested_NullData) {
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::UserVerificationRequestedPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  decoder()->DecodeUserVerificationRequested(absl::nullopt,
+                                             future.GetCallback());
+
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage);
+}
+
+TEST_F(QuickStartDecoderTest,
+       DecodeUserVerificationRequested_UnexpectedMessageType) {
+  QuickStartMessage message(QuickStartMessageType::kQuickStartPayload);
+  message.GetPayload()->Set(kNotifySourceOfUpdateAckKey, true);
+
+  base::test::TestFuture<
+      ::ash::quick_start::mojom::UserVerificationRequestedPtr,
+      absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>>
+      future;
+
+  decoder()->DecodeUserVerificationRequested(ConvertMessageToBytes(&message),
+                                             future.GetCallback());
+
+  EXPECT_TRUE(future.Get<0>().is_null());
+  EXPECT_EQ(future.Get<1>(),
+            mojom::QuickStartDecoderError::kUnexpectedMessageType);
+}
+
 TEST_F(QuickStartDecoderTest, DecodeUserVerificationRequestFailsIfKeyMissing) {
   QuickStartMessage message(QuickStartMessageType::kQuickStartPayload);
 
@@ -1036,10 +1236,8 @@
   decoder()->DecodeUserVerificationRequested(ConvertMessageToBytes(&message),
                                              future.GetCallback());
 
-  EXPECT_TRUE(future.IsReady());
   EXPECT_TRUE(future.Get<0>().is_null());
-  EXPECT_EQ(future.Get<1>(),
-            mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema);
+  EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnknownPayload);
 }
 
 }  // namespace ash::quick_start
diff --git a/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest b/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest
index c9c9df6..13214a7 100644
--- a/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest
+++ b/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest
@@ -7,7 +7,7 @@
   "display": "standalone",
   "display_override": ["borderless"],
   "permissions_policy": {
-    "window-placement": [ "*" ]
+    "window-management": [ "*" ]
   },
   "icons": [
     {
diff --git a/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts b/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts
index 983bdf4..4e76a94 100644
--- a/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts
+++ b/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts
@@ -93,4 +93,38 @@
     assertDeepEquals(destinationUrl, middleClickArgs[1]);
     assertEquals(1, middleClickArgs[3]);
   });
+
+  test('RemovesMatch', async () => {
+    const matchIndex = 1;
+    const destinationUrl = {url: 'http://google.com'};
+    matchEl.matchIndex = matchIndex;
+    matchEl.match.destinationUrl = destinationUrl;
+
+    // By pressing 'Enter' on the button.
+    const keydownEvent = (new KeyboardEvent('keydown', {
+      bubbles: true,
+      cancelable: true,
+      composed: true,
+      key: 'Enter',
+    }));
+    matchEl.$.remove.dispatchEvent(keydownEvent);
+    assertTrue(keydownEvent.defaultPrevented);
+    const keydownArgs =
+        await testProxy.handler.whenCalled('deleteAutocompleteMatch');
+    assertEquals(matchIndex, keydownArgs[0]);
+    assertEquals(destinationUrl, keydownArgs[1]);
+    assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
+    // Pressing 'Enter' the button doesn't accidentally trigger navigation.
+    assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch'));
+    testProxy.handler.reset();
+
+    matchEl.$.remove.click();
+    const clickArgs =
+        await testProxy.handler.whenCalled('deleteAutocompleteMatch');
+    assertEquals(matchIndex, clickArgs[0]);
+    assertEquals(destinationUrl, clickArgs[1]);
+    assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
+    // Clicking the button doesn't accidentally trigger navigation.
+    assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch'));
+  });
 });
diff --git a/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts b/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts
index 8add2e2..2402e40 100644
--- a/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts
+++ b/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts
@@ -1287,65 +1287,6 @@
         window.getComputedStyle(matchEls[1]!.$.remove).display, 'none');
   });
 
-  test('Can remove match using the remove button', async () => {
-    realbox.$.input.value = 'hello';
-    realbox.$.input.dispatchEvent(new InputEvent('input'));
-
-    const matches =
-        [createSearchMatch(), createUrlMatch({supportsDeletion: true})];
-    testProxy.callbackRouterRemote.autocompleteResultChanged({
-      input: mojoString16(realbox.$.input.value.trimStart()),
-      matches,
-      suggestionGroupsMap: {},
-    });
-    await testProxy.callbackRouterRemote.$.flushForTesting();
-    assertTrue(areMatchesShowing());
-
-    const matchEls =
-        realbox.$.matches.shadowRoot!.querySelectorAll('cr-realbox-match');
-    assertEquals(2, matchEls.length);
-
-    // Select the second match.
-    const arrowUpEvent = new KeyboardEvent('keydown', {
-      bubbles: true,
-      cancelable: true,
-      composed: true,  // So it propagates across shadow DOM boundary.
-      key: 'ArrowUp',
-    });
-    realbox.$.input.dispatchEvent(arrowUpEvent);
-    assertTrue(arrowUpEvent.defaultPrevented);
-    assertTrue(matchEls[1]!.hasAttribute(Attributes.SELECTED));
-
-    // By pressing 'Enter' on the button.
-    const enter = new KeyboardEvent('keydown', {
-      bubbles: true,
-      cancelable: true,
-      composed: true,  // So it propagates across shadow DOM boundary.
-      key: 'Enter',
-    });
-    matchEls[1]!.$.remove.dispatchEvent(enter);
-    assertTrue(enter.defaultPrevented);
-    await testProxy.handler.whenCalled('deleteAutocompleteMatch')
-        .then((args) => {
-          assertEquals(1, args.line);
-        });
-    assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
-    // Pressing 'Enter' on the button doesn't accidentally trigger navigation.
-    assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch'));
-
-    testProxy.handler.reset();
-
-    // By clicking the button.
-    matchEls[1]!.$.remove.click();
-    await testProxy.handler.whenCalled('deleteAutocompleteMatch')
-        .then((args) => {
-          assertEquals(1, args.line);
-        });
-    assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
-    // Clicking the button doesn't accidentally trigger navigation.
-    assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch'));
-  });
-
   test('Can remove selected match using keyboard shortcut', async () => {
     realbox.$.input.value = 'hello';
     realbox.$.input.dispatchEvent(new InputEvent('input'));
@@ -1414,50 +1355,6 @@
     assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
   });
 
-  test('Can remove match using the remove button', async () => {
-    realbox.$.input.value = 'hello';
-    realbox.$.input.dispatchEvent(new InputEvent('input'));
-
-    const matches =
-        [createSearchMatch(), createUrlMatch({supportsDeletion: true})];
-    testProxy.callbackRouterRemote.autocompleteResultChanged({
-      input: mojoString16(realbox.$.input.value.trimStart()),
-      matches,
-      suggestionGroupsMap: {},
-    });
-    await testProxy.callbackRouterRemote.$.flushForTesting();
-    assertTrue(areMatchesShowing());
-
-    const matchEls =
-        realbox.$.matches.shadowRoot!.querySelectorAll('cr-realbox-match');
-    assertEquals(2, matchEls.length);
-
-    // By pressing 'Enter' on the button.
-    const enter = new KeyboardEvent('keydown', {
-      bubbles: true,
-      cancelable: true,
-      composed: true,  // So it propagates across shadow DOM boundary.
-      key: 'Enter',
-    });
-    matchEls[1]!.$.remove.dispatchEvent(enter);
-    assertTrue(enter.defaultPrevented);
-    await testProxy.handler.whenCalled('deleteAutocompleteMatch')
-        .then((args) => {
-          assertEquals(1, args.line);
-        });
-    assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
-
-    testProxy.handler.reset();
-
-    // By clicking the button.
-    matchEls[1]!.$.remove.click();
-    await testProxy.handler.whenCalled('deleteAutocompleteMatch')
-        .then((args) => {
-          assertEquals(1, args.line);
-        });
-    assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch'));
-  });
-
   test('Selection is restored after selected match is removed', async () => {
     realbox.$.input.value = 'hello';
     realbox.$.input.dispatchEvent(new InputEvent('input'));
diff --git a/chrome/test/data/webui/print_preview/button_strip_test.ts b/chrome/test/data/webui/print_preview/button_strip_test.ts
index 56eeb02..8dca964 100644
--- a/chrome/test/data/webui/print_preview/button_strip_test.ts
+++ b/chrome/test/data/webui/print_preview/button_strip_test.ts
@@ -6,21 +6,7 @@
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
-const button_strip_test = {
-  suiteName: 'ButtonStripTest',
-  TestNames: {
-    ButtonStripChangesForState: 'button strip changes for state',
-    ButtonOrder: 'button order',
-    ButtonStripFiresEvents: 'button strip fires events',
-    // <if expr="is_chromeos">
-    InvalidPinDisablesPrint: 'invalid pin disables print',
-    // </if>
-  },
-};
-
-Object.assign(window, {button_strip_test: button_strip_test});
-
-suite(button_strip_test.suiteName, function() {
+suite('ButtonStripTest', function() {
   let buttonStrip: PrintPreviewButtonStripElement;
 
   setup(function() {
@@ -42,7 +28,7 @@
   // Tests that the correct message is shown for non-READY states, and that
   // the print button is disabled appropriately.
   test(
-      button_strip_test.TestNames.ButtonStripChangesForState, function() {
+      'ButtonStripChangesForState', function() {
         const printButton =
             buttonStrip.shadowRoot!.querySelector<CrButtonElement>(
                 '.action-button')!;
@@ -63,7 +49,7 @@
 
   // Tests that the buttons are in the correct order for different platforms.
   // See https://crbug.com/880562.
-  test(button_strip_test.TestNames.ButtonOrder, function() {
+  test('ButtonOrder', function() {
     // Verify that there are only 2 buttons.
     assertEquals(
         2, buttonStrip.shadowRoot!.querySelectorAll('cr-button').length);
@@ -90,7 +76,7 @@
 
   // Tests that the button strip fires print-requested and cancel-requested
   // events.
-  test(button_strip_test.TestNames.ButtonStripFiresEvents, function() {
+  test('ButtonStripFiresEvents', function() {
     const printButton = buttonStrip.shadowRoot!.querySelector<HTMLElement>(
         'cr-button.action-button')!;
     const cancelButton = buttonStrip.shadowRoot!.querySelector<HTMLElement>(
@@ -108,7 +94,7 @@
 
   // <if expr="is_chromeos">
   // Tests having an invalid pin disable the print button
-  test(button_strip_test.TestNames.InvalidPinDisablesPrint, function() {
+  test('InvalidPinDisablesPrint', function() {
     const printButton = buttonStrip.shadowRoot!.querySelector<CrButtonElement>(
         '.action-button')!;
     assertFalse(printButton.disabled);
diff --git a/chrome/test/data/webui/print_preview/custom_margins_test.ts b/chrome/test/data/webui/print_preview/custom_margins_test.ts
index c4195e1..ec86271 100644
--- a/chrome/test/data/webui/print_preview/custom_margins_test.ts
+++ b/chrome/test/data/webui/print_preview/custom_margins_test.ts
@@ -9,27 +9,7 @@
 import {fakeDataBind} from 'chrome://webui-test/polymer_test_util.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
-const custom_margins_test = {
-  suiteName: 'CustomMarginsTest',
-  TestNames: {
-    ControlsCheck: 'controls check',
-    SetFromStickySettings: 'set from sticky settings',
-    DragControls: 'drag controls',
-    SetControlsWithTextbox: 'set controls with textbox',
-    SetControlsWithTextboxMetric: 'set controls with textbox metric',
-    RestoreStickyMarginsAfterDefault: 'restore sticky margins after default',
-    MediaSizeClearsCustomMargins: 'media size clears custom margins',
-    LayoutClearsCustomMargins: 'layout clears custom margins',
-    IgnoreDocumentMarginsFromPDF: 'ignore document margins from pdf',
-    MediaSizeClearsCustomMarginsPDF: 'media size clears custom margins pdf',
-    RequestScrollToOutOfBoundsTextbox:
-        'request scroll to out of bounds textbox',
-    ControlsDisabledOnError: 'controls disabled on error',
-  },
-};
-
-Object.assign(window, {custom_margins_test: custom_margins_test});
-suite(custom_margins_test.suiteName, function() {
+suite('CustomMarginsTest', function() {
   let container: PrintPreviewMarginControlContainerElement;
 
   let model: PrintPreviewModelElement;
@@ -266,7 +246,7 @@
 
   // Test that controls correctly appear when custom margins are selected and
   // disappear when the preview is loading.
-  test(custom_margins_test.TestNames.ControlsCheck, function() {
+  test('ControlsCheck', function() {
     const getCustomMarginsValue = function(): MarginsSetting {
       return container.getSettingValue('customMargins') as MarginsSetting;
     };
@@ -325,7 +305,7 @@
 
   // Tests that the margin controls can be correctly set from the sticky
   // settings.
-  test(custom_margins_test.TestNames.SetFromStickySettings, function() {
+  test('SetFromStickySettings', function() {
     return finishSetup().then(() => {
       const controls = getControls();
 
@@ -345,7 +325,7 @@
   });
 
   // Test that dragging margin controls updates the custom margins setting.
-  test(custom_margins_test.TestNames.DragControls, function() {
+  test('DragControls', function() {
     /**
      * Tests that the control can be moved from its current position (assumed
      * to be the default margins) to newPositionInPts by dragging it.
@@ -428,7 +408,7 @@
   // Test that setting the margin controls with their textbox inputs updates
   // the custom margins setting.
   test(
-      custom_margins_test.TestNames.SetControlsWithTextbox, function() {
+      'SetControlsWithTextbox', function() {
         return finishSetup().then(() => {
           const controls = getControls();
           // Set a shorter delay for testing so the test doesn't take too
@@ -475,7 +455,7 @@
   // as the decimal delimiter and '.' as the thousands delimiter. Regression
   // test for https://crbug.com/1005816.
   test(
-      custom_margins_test.TestNames.SetControlsWithTextboxMetric, function() {
+      'SetControlsWithTextboxMetric', function() {
         measurementSystem =
             new MeasurementSystem('.', ',', MeasurementSystemUnitType.METRIC);
         return finishSetup().then(() => {
@@ -537,8 +517,7 @@
   // Test that if there is a custom margins sticky setting, it is restored
   // when margin setting changes.
   test(
-      custom_margins_test.TestNames.RestoreStickyMarginsAfterDefault,
-      function() {
+      'RestoreStickyMarginsAfterDefault', function() {
         const marginValues = setupCustomMargins();
         return finishSetup().then(() => {
           // Simulate setting custom margins.
@@ -566,7 +545,7 @@
 
   // Test that if the media size changes, the custom margins are cleared.
   test(
-      custom_margins_test.TestNames.MediaSizeClearsCustomMargins, function() {
+      'MediaSizeClearsCustomMargins', function() {
         return validateMarginsClearedForSetting(
                    'mediaSize', {height_microns: 200000, width_microns: 200000})
             .then(() => {
@@ -586,7 +565,7 @@
 
   // Test that if the orientation changes, the custom margins are cleared.
   test(
-      custom_margins_test.TestNames.LayoutClearsCustomMargins, function() {
+      'LayoutClearsCustomMargins', function() {
         return validateMarginsClearedForSetting('layout', true).then(() => {
           // Simulate setting custom margins again
           model.set('settings.margins.value', MarginsType.CUSTOM);
@@ -606,7 +585,7 @@
   // not updated based on the document margins - i.e. PDFs do not change the
   // custom margins state.
   test(
-      custom_margins_test.TestNames.IgnoreDocumentMarginsFromPDF, function() {
+      'IgnoreDocumentMarginsFromPDF', function() {
         model.set('settings.margins.available', false);
         return finishSetup().then(() => {
           assertEquals(
@@ -616,13 +595,11 @@
 
   // Test that if margins are not available but the user changes the media
   // size, the custom margins are cleared.
-  test(
-      custom_margins_test.TestNames.MediaSizeClearsCustomMarginsPDF,
-      function() {
-        model.set('settings.margins.available', false);
-        return validateMarginsClearedForSetting(
-            'mediaSize', {height_microns: 200000, width_microns: 200000});
-      });
+  test('MediaSizeClearsCustomMarginsPDF', function() {
+    model.set('settings.margins.available', false);
+    return validateMarginsClearedForSetting(
+        'mediaSize', {height_microns: 200000, width_microns: 200000});
+  });
 
   function whenAnimationFrameDone() {
     return new Promise(resolve => window.requestAnimationFrame(resolve));
@@ -631,8 +608,7 @@
   // Test that if the user focuses a textbox that is not visible, the
   // text-focus event is fired with the correct values to scroll by.
   test(
-      custom_margins_test.TestNames.RequestScrollToOutOfBoundsTextbox,
-      function() {
+      'RequestScrollToOutOfBoundsTextbox', function() {
         return finishSetup()
             .then(() => {
               // Wait for the controls to be set up, which occurs in an
@@ -690,7 +666,7 @@
   // Tests that the margin controls can be correctly set from the sticky
   // settings.
   test(
-      custom_margins_test.TestNames.ControlsDisabledOnError, function() {
+      'ControlsDisabledOnError', function() {
         return finishSetup().then(() => {
           // Simulate setting custom margins.
           model.set('settings.margins.value', MarginsType.CUSTOM);
diff --git a/chrome/test/data/webui/print_preview/destination_search_test.ts b/chrome/test/data/webui/print_preview/destination_search_test.ts
index 6653e7b..0dba92c 100644
--- a/chrome/test/data/webui/print_preview/destination_search_test.ts
+++ b/chrome/test/data/webui/print_preview/destination_search_test.ts
@@ -10,17 +10,7 @@
 import {NativeLayerStub} from './native_layer_stub.js';
 import {createDestinationStore, getCddTemplate, setupTestListenerElement} from './print_preview_test_utils.js';
 
-const destination_search_test = {
-  suiteName: 'DestinationSearchTest',
-  TestNames: {
-    GetCapabilitiesSucceeds: 'get capabilities succeeds',
-    GetCapabilitiesFails: 'get capabilities fails',
-  },
-};
-
-Object.assign(window, {destination_search_test: destination_search_test});
-
-suite(destination_search_test.suiteName, function() {
+suite('DestinationSearchTest', function() {
   let dialog: PrintPreviewDestinationDialogElement;
 
   let destinationStore: DestinationStore;
@@ -84,8 +74,7 @@
   // Tests that a destination is selected if the user clicks on it and
   // capabilities fetch succeeds.
   test(
-      destination_search_test.TestNames.GetCapabilitiesSucceeds,
-      async function() {
+      'GetCapabilitiesSucceeds', async function() {
         const destId = '00112233DEADBEEF';
         nativeLayer.setLocalDestinationCapabilities(getCddTemplate(destId));
 
@@ -104,16 +93,14 @@
 
   // Tests what happens when capabilities cannot be retrieved for the chosen
   // destination. The destination will still be selected in this case.
-  test(
-      destination_search_test.TestNames.GetCapabilitiesFails, async function() {
-        const destId = '001122DEADBEEF';
-        nativeLayer.setLocalDestinationCapabilities(
-            getCddTemplate(destId), true);
-        requestSetup(destId);
-        const args = await nativeLayer.whenCalled('getPrinterCapabilities');
-        assertEquals(destId, args.destinationId);
-        // The destination is selected even though capabilities cannot be
-        // retrieved.
-        assertEquals(destId, destinationStore.selectedDestination!.id);
-      });
+  test('GetCapabilitiesFails', async function() {
+    const destId = '001122DEADBEEF';
+    nativeLayer.setLocalDestinationCapabilities(getCddTemplate(destId), true);
+    requestSetup(destId);
+    const args = await nativeLayer.whenCalled('getPrinterCapabilities');
+    assertEquals(destId, args.destinationId);
+    // The destination is selected even though capabilities cannot be
+    // retrieved.
+    assertEquals(destId, destinationStore.selectedDestination!.id);
+  });
 });
diff --git a/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts b/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts
index 46ab6b12..5731210 100644
--- a/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts
+++ b/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts
@@ -11,21 +11,7 @@
 import {NativeLayerStub} from './native_layer_stub.js';
 import {createDestinationStore, getCddTemplate, setupTestListenerElement} from './print_preview_test_utils.js';
 
-const destination_search_test_chromeos = {
-  suiteName: 'DestinationSearchTest',
-  TestNames: {
-    ReceiveSuccessfulSetup: 'receive successful setup',
-    ResolutionFails: 'resolution fails',
-    ReceiveSuccessfulSetupWithPolicies:
-        'receive successful setup with policies',
-  },
-};
-
-Object.assign(
-    window,
-    {destination_search_test_chromeos: destination_search_test_chromeos});
-
-suite(destination_search_test_chromeos.suiteName, function() {
+suite('DestinationSearchTest', function() {
   let dialog: PrintPreviewDestinationDialogCrosElement;
 
   let destinationStore: DestinationStore;
@@ -91,10 +77,9 @@
   }
 
   // Tests that a destination is selected if the user clicks on it and setup
-  // (for CrOS) or capabilities fetch (for non-Cros) succeeds.
+  // succeeds.
   test(
-      destination_search_test_chromeos.TestNames.ReceiveSuccessfulSetup,
-      async function() {
+      'ReceiveSuccessfulSetup', async function() {
         const destId = '00112233DEADBEEF';
         const response = {
           printerId: destId,
@@ -116,19 +101,16 @@
       });
 
   // Test what happens when the setupPrinter request is rejected.
-  test(
-      destination_search_test_chromeos.TestNames.ResolutionFails,
-      async function() {
-        const destId = '001122DEADBEEF';
-        const originalDestination = destinationStore.selectedDestination;
-        nativeLayerCros.setSetupPrinterResponse(
-            {printerId: destId, capabilities: {printer: {}, version: '1'}},
-            true);
-        requestSetup(destId);
-        const actualId = await nativeLayerCros.whenCalled('setupPrinter');
-        assertEquals(destId, actualId);
-        // The selected printer should not have changed, since a printer
-        // cannot be selected until setup succeeds.
-        assertEquals(originalDestination, destinationStore.selectedDestination);
-      });
+  test('ResolutionFails', async function() {
+    const destId = '001122DEADBEEF';
+    const originalDestination = destinationStore.selectedDestination;
+    nativeLayerCros.setSetupPrinterResponse(
+        {printerId: destId, capabilities: {printer: {}, version: '1'}}, true);
+    requestSetup(destId);
+    const actualId = await nativeLayerCros.whenCalled('setupPrinter');
+    assertEquals(destId, actualId);
+    // The selected printer should not have changed, since a printer
+    // cannot be selected until setup succeeds.
+    assertEquals(originalDestination, destinationStore.selectedDestination);
+  });
 });
diff --git a/chrome/test/data/webui/print_preview/header_test.ts b/chrome/test/data/webui/print_preview/header_test.ts
index f8f5989..4ab93a8 100644
--- a/chrome/test/data/webui/print_preview/header_test.ts
+++ b/chrome/test/data/webui/print_preview/header_test.ts
@@ -8,18 +8,7 @@
 import {fakeDataBind} from 'chrome://webui-test/polymer_test_util.js';
 import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js';
 
-const header_test = {
-  suiteName: 'HeaderTest',
-  TestNames: {
-    HeaderPrinterTypes: 'header printer types',
-    HeaderChangesForState: 'header changes for state',
-    EnterprisePolicy: 'enterprise policy',
-  },
-};
-
-Object.assign(window, {header_test: header_test});
-
-suite(header_test.suiteName, function() {
+suite('HeaderTest', function() {
   let header: PrintPreviewHeaderElement;
 
   let pluralString: TestPluralStringProxy;
@@ -59,7 +48,7 @@
 
   // Tests that the 4 different messages (non-virtual printer singular and
   // plural, virtual printer singular and plural) all show up as expected.
-  test(header_test.TestNames.HeaderPrinterTypes, async function() {
+  test('HeaderPrinterTypes', async function() {
     const summary = header.shadowRoot!.querySelector('.summary')!;
     {
       const {messageName, itemCount} =
@@ -100,7 +89,7 @@
 
   // Tests that the correct message is shown for non-READY states, and that
   // the print button is disabled appropriately.
-  test(header_test.TestNames.HeaderChangesForState, async function() {
+  test('HeaderChangesForState', async function() {
     const summary = header.shadowRoot!.querySelector('.summary')!;
     await pluralString.whenCalled('getPluralString');
     assertEquals('1 sheet of paper', summary.textContent!.trim());
@@ -119,7 +108,7 @@
   });
 
   // Tests that enterprise badge shows up if any setting is managed.
-  test(header_test.TestNames.EnterprisePolicy, function() {
+  test('EnterprisePolicy', function() {
     assertTrue(header.shadowRoot!.querySelector('iron-icon')!.hidden);
     header.managed = true;
     assertFalse(header.shadowRoot!.querySelector('iron-icon')!.hidden);
diff --git a/chrome/test/data/webui/print_preview/print_preview_browsertest.cc b/chrome/test/data/webui/print_preview/print_preview_browsertest.cc
index 650261d..3a227c4 100644
--- a/chrome/test/data/webui/print_preview/print_preview_browsertest.cc
+++ b/chrome/test/data/webui/print_preview/print_preview_browsertest.cc
@@ -788,3 +788,155 @@
 IN_PROC_BROWSER_TEST_F(PrintPreviewPreviewAreaTest, ViewportSizeChanges) {
   RunTestCase("ViewportSizeChanges");
 }
+
+class PrintPreviewCustomMarginsTest : public PrintPreviewBrowserTest {
+ protected:
+  void RunTestCase(const std::string& testCase) {
+    PrintPreviewBrowserTest::RunTest(
+        "print_preview/custom_margins_test.js",
+        base::StringPrintf("runMochaTest('CustomMarginsTest', '%s');",
+                           testCase.c_str()));
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, ControlsCheck) {
+  RunTestCase("ControlsCheck");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, SetFromStickySettings) {
+  RunTestCase("SetFromStickySettings");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, DragControls) {
+  RunTestCase("DragControls");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, SetControlsWithTextbox) {
+  RunTestCase("SetControlsWithTextbox");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       SetControlsWithTextboxMetric) {
+  RunTestCase("SetControlsWithTextboxMetric");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       RestoreStickyMarginsAfterDefault) {
+  RunTestCase("RestoreStickyMarginsAfterDefault");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       MediaSizeClearsCustomMargins) {
+  RunTestCase("MediaSizeClearsCustomMargins");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       LayoutClearsCustomMargins) {
+  RunTestCase("LayoutClearsCustomMargins");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       IgnoreDocumentMarginsFromPDF) {
+  RunTestCase("IgnoreDocumentMarginsFromPDF");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       MediaSizeClearsCustomMarginsPDF) {
+  RunTestCase("MediaSizeClearsCustomMarginsPDF");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest,
+                       RequestScrollToOutOfBoundsTextbox) {
+  RunTestCase("RequestScrollToOutOfBoundsTextbox");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, ControlsDisabledOnError) {
+  RunTestCase("ControlsDisabledOnError");
+}
+
+class PrintPreviewDestinationSearchTest : public PrintPreviewBrowserTest {
+ protected:
+  void RunTestCase(const std::string& testCase) {
+    PrintPreviewBrowserTest::RunTest(
+#if BUILDFLAG(IS_CHROMEOS)
+        "print_preview/destination_search_test_chromeos.js",
+#else
+        "print_preview/destination_search_test.js",
+#endif
+        base::StringPrintf("runMochaTest('DestinationSearchTest', '%s');",
+                           testCase.c_str()));
+  }
+};
+
+#if BUILDFLAG(IS_CHROMEOS)
+IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest,
+                       ReceiveSuccessfulSetup) {
+  RunTestCase("ReceiveSuccessfulSetup");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest, ResolutionFails) {
+  RunTestCase("ResolutionFails");
+}
+
+#else
+IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest,
+                       GetCapabilitiesSucceeds) {
+  RunTestCase("GetCapabilitiesSucceeds");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest,
+                       GetCapabilitiesFails) {
+  RunTestCase("GetCapabilitiesFails");
+}
+#endif
+
+class PrintPreviewHeaderTest : public PrintPreviewBrowserTest {
+ protected:
+  void RunTestCase(const std::string& testCase) {
+    PrintPreviewBrowserTest::RunTest(
+        "print_preview/header_test.js",
+        base::StringPrintf("runMochaTest('HeaderTest', '%s');",
+                           testCase.c_str()));
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewHeaderTest, HeaderPrinterTypes) {
+  RunTestCase("HeaderPrinterTypes");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewHeaderTest, HeaderChangesForState) {
+  RunTestCase("HeaderChangesForState");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewHeaderTest, EnterprisePolicy) {
+  RunTestCase("EnterprisePolicy");
+}
+
+class PrintPreviewButtonStripTest : public PrintPreviewBrowserTest {
+ protected:
+  void RunTestCase(const std::string& testCase) {
+    PrintPreviewBrowserTest::RunTest(
+        "print_preview/button_strip_test.js",
+        base::StringPrintf("runMochaTest('ButtonStripTest', '%s');",
+                           testCase.c_str()));
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest,
+                       ButtonStripChangesForState) {
+  RunTestCase("ButtonStripChangesForState");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, ButtonOrder) {
+  RunTestCase("ButtonOrder");
+}
+
+IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, ButtonStripFiresEvents) {
+  RunTestCase("ButtonStripFiresEvents");
+}
+
+#if BUILDFLAG(IS_CHROMEOS)
+IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, InvalidPinDisablesPrint) {
+  RunTestCase("InvalidPinDisablesPrint");
+}
+#endif
diff --git a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
index aa423720..2d0a3ef 100644
--- a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
+++ b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
@@ -34,190 +34,6 @@
   }
 };
 
-var PrintPreviewCustomMarginsTest = class extends PrintPreviewTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://print/test_loader.html?module=print_preview/custom_margins_test.js';
-  }
-
-  /** @override */
-  get suiteName() {
-    return custom_margins_test.suiteName;
-  }
-};
-
-TEST_F('PrintPreviewCustomMarginsTest', 'ControlsCheck', function() {
-  this.runMochaTest(custom_margins_test.TestNames.ControlsCheck);
-});
-
-TEST_F('PrintPreviewCustomMarginsTest', 'SetFromStickySettings', function() {
-  this.runMochaTest(custom_margins_test.TestNames.SetFromStickySettings);
-});
-
-TEST_F('PrintPreviewCustomMarginsTest', 'DragControls', function() {
-  this.runMochaTest(custom_margins_test.TestNames.DragControls);
-});
-
-TEST_F('PrintPreviewCustomMarginsTest', 'SetControlsWithTextbox', function() {
-  this.runMochaTest(custom_margins_test.TestNames.SetControlsWithTextbox);
-});
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'SetControlsWithTextboxMetric',
-    function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.SetControlsWithTextboxMetric);
-    });
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'RestoreStickyMarginsAfterDefault',
-    function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.RestoreStickyMarginsAfterDefault);
-    });
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'MediaSizeClearsCustomMargins',
-    function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.MediaSizeClearsCustomMargins);
-    });
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'LayoutClearsCustomMargins', function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.LayoutClearsCustomMargins);
-    });
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'IgnoreDocumentMarginsFromPDF',
-    function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.IgnoreDocumentMarginsFromPDF);
-    });
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'MediaSizeClearsCustomMarginsPDF',
-    function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.MediaSizeClearsCustomMarginsPDF);
-    });
-
-TEST_F(
-    'PrintPreviewCustomMarginsTest', 'RequestScrollToOutOfBoundsTextbox',
-    function() {
-      this.runMochaTest(
-          custom_margins_test.TestNames.RequestScrollToOutOfBoundsTextbox);
-    });
-
-TEST_F('PrintPreviewCustomMarginsTest', 'ControlsDisabledOnError', function() {
-  this.runMochaTest(custom_margins_test.TestNames.ControlsDisabledOnError);
-});
-
-GEN('#if BUILDFLAG(IS_CHROMEOS)');
-var PrintPreviewDestinationSearchTestChromeOS = class extends PrintPreviewTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://print/test_loader.html?module=print_preview/destination_search_test_chromeos.js';
-  }
-
-  /** @override */
-  get suiteName() {
-    return destination_search_test_chromeos.suiteName;
-  }
-};
-
-TEST_F(
-    'PrintPreviewDestinationSearchTestChromeOS', 'ReceiveSuccessfulSetup',
-    function() {
-      this.runMochaTest(
-          destination_search_test_chromeos.TestNames.ReceiveSuccessfulSetup);
-    });
-
-TEST_F(
-    'PrintPreviewDestinationSearchTestChromeOS', 'ResolutionFails', function() {
-      this.runMochaTest(
-          destination_search_test_chromeos.TestNames.ResolutionFails);
-    });
-
-GEN('#else');
-var PrintPreviewDestinationSearchTest = class extends PrintPreviewTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://print/test_loader.html?module=print_preview/destination_search_test.js';
-  }
-
-  /** @override */
-  get suiteName() {
-    return destination_search_test.suiteName;
-  }
-};
-
-TEST_F(
-    'PrintPreviewDestinationSearchTest', 'GetCapabilitiesSucceeds', function() {
-      this.runMochaTest(
-          destination_search_test.TestNames.GetCapabilitiesSucceeds);
-    });
-
-TEST_F('PrintPreviewDestinationSearchTest', 'GetCapabilitiesFails', function() {
-  this.runMochaTest(destination_search_test.TestNames.GetCapabilitiesFails);
-});
-GEN('#endif');
-
-var PrintPreviewHeaderTest = class extends PrintPreviewTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://print/test_loader.html?module=print_preview/header_test.js';
-  }
-
-  /** @override */
-  get suiteName() {
-    return header_test.suiteName;
-  }
-};
-
-TEST_F('PrintPreviewHeaderTest', 'HeaderPrinterTypes', function() {
-  this.runMochaTest(header_test.TestNames.HeaderPrinterTypes);
-});
-
-TEST_F('PrintPreviewHeaderTest', 'HeaderChangesForState', function() {
-  this.runMochaTest(header_test.TestNames.HeaderChangesForState);
-});
-
-TEST_F('PrintPreviewHeaderTest', 'EnterprisePolicy', function() {
-  this.runMochaTest(header_test.TestNames.EnterprisePolicy);
-});
-
-var PrintPreviewButtonStripTest = class extends PrintPreviewTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://print/test_loader.html?module=print_preview/button_strip_test.js';
-  }
-
-  /** @override */
-  get suiteName() {
-    return button_strip_test.suiteName;
-  }
-};
-
-TEST_F('PrintPreviewButtonStripTest', 'ButtonStripChangesForState', function() {
-  this.runMochaTest(button_strip_test.TestNames.ButtonStripChangesForState);
-});
-
-TEST_F('PrintPreviewButtonStripTest', 'ButtonOrder', function() {
-  this.runMochaTest(button_strip_test.TestNames.ButtonOrder);
-});
-
-TEST_F('PrintPreviewButtonStripTest', 'ButtonStripFiresEvents', function() {
-  this.runMochaTest(button_strip_test.TestNames.ButtonStripFiresEvents);
-});
-
-GEN('#if BUILDFLAG(IS_CHROMEOS)');
-TEST_F('PrintPreviewButtonStripTest', 'InvalidPinDisablesPrint', function() {
-  this.runMochaTest(button_strip_test.TestNames.InvalidPinDisablesPrint);
-});
-GEN('#endif');
-
 var PrintPreviewDestinationItemTest = class extends PrintPreviewTest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 8633492..1b303dac 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -48,7 +48,6 @@
     "lacros_extension_controlled_indicator_test.ts",
     "lock_screen_subpage_test.ts",
     "nearby_share_receive_dialog_tests.js",
-    "nearby_share_subpage_tests.js",
     "onc_mojo_test.ts",
     "os_about_page_tests.js",
     "os_page_availability_test.ts",
@@ -66,7 +65,6 @@
     "test_os_lifetime_browser_proxy.ts",
     "test_os_sync_browser_proxy.ts",
     "test_personalization_hub_browser_proxy.js",
-    "test_profile_info_browser_proxy.js",
     "utils.ts",
 
     # Subfolder files.
@@ -161,6 +159,8 @@
 
     "nearby_share_page/nearby_share_confirm_page_test.ts",
     "nearby_share_page/nearby_share_high_visibility_page_test.ts",
+    "nearby_share_page/nearby_share_subpage_test.ts",
+    "nearby_share_page/test_nearby_account_manager_browser_proxy.ts",
 
     "os_a11y_page/audio_and_captions_page_test.ts",
     "os_a11y_page/change_dictation_locale_dialog_test.ts",
@@ -245,6 +245,7 @@
     "os_people_page/test_fingerprint_browser_proxy.ts",
     "os_people_page/test_os_sync_browser_proxy.ts",
     "os_people_page/test_parental_controls_browser_proxy.ts",
+    "os_people_page/test_profile_info_browser_proxy.ts",
 
     "os_printing_page/cups_print_server_test.ts",
     "os_printing_page/cups_printer_dialog_test.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js b/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
index 6d6b14a..c03199b 100644
--- a/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
+++ b/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
@@ -32,6 +32,7 @@
       'unregisterForegroundReceiveSurface',
       'accept',
       'reject',
+      'recordFastInitiationNotificationUsage',
     ]);
     /** @private {!ReceiveObserverInterface} */
     this.observer_;
@@ -72,7 +73,7 @@
   }
 
   /**
-   * @param {!ReceiveObserverRemote} observer
+   * @param {!nearbyShareMojom.ReceiveObserverRemote} observer
    */
   addReceiveObserver(observer) {
     this.methodCalled('addReceiveObserver');
@@ -88,7 +89,8 @@
   }
 
   /**
-   * @return {!Promise<{result: !RegisterReceiveSurfaceResult}>}
+   * @return {!Promise<{result:
+   *     !nearbyShareMojom.RegisterReceiveSurfaceResult}>}
    */
   async registerForegroundReceiveSurface() {
     this.inHighVisibility_ = true;
@@ -134,6 +136,13 @@
   }
 
   /**
+   * @param {!boolean} success
+   */
+  recordFastInitiationNotificationUsage(success) {
+    this.methodCalled('recordFastInitiationNotificationUsage', success);
+  }
+
+  /**
    * @return {boolean}
    */
   getInHighVisibilityForTest() {
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_page/nearby_share_subpage_test.ts b/chrome/test/data/webui/settings/chromeos/nearby_share_page/nearby_share_subpage_test.ts
new file mode 100644
index 0000000..8216490
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_page/nearby_share_subpage_test.ts
@@ -0,0 +1,725 @@
+// 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.
+
+import 'chrome://os-settings/lazy_load.js';
+
+import {SettingsNearbyShareSubpageElement} from 'chrome://os-settings/lazy_load.js';
+import {CrInputElement, CrToggleElement, NearbyAccountManagerBrowserProxyImpl, nearbyShareMojom, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting, settingMojom, SettingsToggleButtonElement} from 'chrome://os-settings/os_settings.js';
+import {DeviceNameValidationResult, FastInitiationNotificationState} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertEquals, assertFalse, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {FakeContactManager} from 'chrome://webui-test/nearby_share/shared/fake_nearby_contact_manager.js';
+import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
+import {isVisible} from 'chrome://webui-test/test_util.js';
+
+import {FakeReceiveManager} from '../fake_receive_manager.js';
+
+import {TestNearbyAccountManagerBrowserProxy} from './test_nearby_account_manager_browser_proxy.js';
+
+const {RegisterReceiveSurfaceResult} = nearbyShareMojom;
+
+suite('<settings-nearby-share-subpage>', () => {
+  let subpage: SettingsNearbyShareSubpageElement;
+  let featureToggleButton: SettingsToggleButtonElement;
+  let fakeReceiveManager: FakeReceiveManager;
+  let accountManagerBrowserProxy: TestNearbyAccountManagerBrowserProxy;
+  let fakeContactManager: FakeContactManager;
+  let fakeSettings: FakeNearbyShareSettings;
+
+  suiteSetup(() => {
+    accountManagerBrowserProxy = new TestNearbyAccountManagerBrowserProxy();
+    NearbyAccountManagerBrowserProxyImpl.setInstanceForTesting(
+        accountManagerBrowserProxy);
+  });
+
+  function setupFakes(): void {
+    fakeReceiveManager = new FakeReceiveManager();
+    setReceiveManagerForTesting(fakeReceiveManager);
+
+    fakeContactManager = new FakeContactManager();
+    setContactManagerForTesting(fakeContactManager);
+    fakeContactManager.setupContactRecords();
+
+    fakeSettings = new FakeNearbyShareSettings();
+    setNearbyShareSettingsForTesting(fakeSettings);
+  }
+
+  function syncFakeSettings(): void {
+    subpage.set('settings.enabled', fakeSettings.getEnabledForTest());
+    subpage.set(
+        'settings.isFastInitiationHardwareSupported',
+        fakeSettings.getIsFastInitiationHardwareSupportedTest());
+    subpage.set(
+        'settings.fastInitiationNotificationState',
+        fakeSettings.getFastInitiationNotificationStateTest());
+    subpage.set('settings.deviceName', fakeSettings.getDeviceNameForTest());
+    subpage.set('settings.dataUsage', fakeSettings.getDataUsageForTest());
+    subpage.set('settings.visibility', fakeSettings.getVisibilityForTest());
+    subpage.set(
+        'settings.allowedContacts', fakeSettings.getAllowedContactsForTest());
+    subpage.set(
+        'settings.isOnboardingComplete', fakeSettings.isOnboardingComplete());
+  }
+
+  function createSubpage(
+      isEnabled: boolean, isOnboardingComplete: boolean): void {
+    subpage = document.createElement('settings-nearby-share-subpage');
+    subpage.prefs = {
+      'nearby_sharing': {
+        'enabled': {
+          value: isEnabled,
+        },
+        'data_usage': {
+          value: 3,
+        },
+        'device_name': {
+          value: '',
+        },
+        'onboarding_complete': {
+          value: isOnboardingComplete,
+        },
+      },
+    };
+    subpage.isSettingsRetreived = true;
+
+    document.body.appendChild(subpage);
+    flush();
+  }
+
+  setup(async () => {
+    setupFakes();
+    fakeSettings.setEnabled(true);
+    fakeSettings.setIsOnboardingComplete(true);
+
+    createSubpage(/*isEnabled=*/ true, /*isOnboardingComplete=*/ true);
+    syncFakeSettings();
+    const toggle =
+        subpage.shadowRoot!.querySelector<SettingsToggleButtonElement>(
+            '#featureToggleButton');
+    assertTrue(!!toggle);
+    featureToggleButton = toggle;
+    await flushTasks();
+  });
+
+  teardown(() => {
+    subpage.remove();
+    accountManagerBrowserProxy.reset();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  // Returns true if the element exists and has not been 'removed' by the
+  // Polymer template system.
+  function doesElementExist(selector: string): boolean {
+    const el = subpage.shadowRoot!.querySelector<HTMLElement>(selector);
+    return (el !== null) && (el.style.display !== 'none');
+  }
+
+  function subpageControlsHidden(isHidden: boolean): void {
+    assertEquals(isHidden, !doesElementExist('#highVisibilityToggle'));
+    assertEquals(isHidden, !doesElementExist('#editDeviceNameButton'));
+    assertEquals(isHidden, !doesElementExist('#editVisibilityButton'));
+    assertEquals(isHidden, !doesElementExist('#editDataUsageButton'));
+  }
+
+  function subpageControlsDisabled(isDisabled: boolean): void {
+    const highVisibilityToggle =
+        subpage.shadowRoot!.querySelector('#highVisibilityToggle');
+    const editDeviceNameButton =
+        subpage.shadowRoot!.querySelector('#editDeviceNameButton');
+    const editVisibilityButton =
+        subpage.shadowRoot!.querySelector('#editVisibilityButton');
+    const editDataUsageButton =
+        subpage.shadowRoot!.querySelector('#editDataUsageButton');
+
+    assertTrue(!!highVisibilityToggle);
+    assertTrue(!!editDeviceNameButton);
+    assertTrue(!!editVisibilityButton);
+    assertTrue(!!editDataUsageButton);
+
+    assertEquals(isDisabled, highVisibilityToggle.hasAttribute('disabled'));
+    assertEquals(isDisabled, editDeviceNameButton.hasAttribute('disabled'));
+    assertEquals(isDisabled, editVisibilityButton.hasAttribute('disabled'));
+    assertEquals(isDisabled, editDataUsageButton.hasAttribute('disabled'));
+  }
+
+  test('feature toggle button controls preference', () => {
+    // Ensure that these controls are enabled/disabled when the Nearby is
+    // enabled/disabled.
+    assertTrue(featureToggleButton.checked);
+    assertTrue(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('On', featureToggleButton.label.trim());
+    subpageControlsHidden(false);
+    subpageControlsDisabled(false);
+
+    featureToggleButton.click();
+    flush();
+
+    assertFalse(featureToggleButton.checked);
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('Off', featureToggleButton.label.trim());
+    subpageControlsHidden(false);
+  });
+
+  test('toggle row controls preference', () => {
+    assertTrue(featureToggleButton.checked);
+    assertTrue(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('On', featureToggleButton.label.trim());
+
+    featureToggleButton.click();
+
+    assertFalse(featureToggleButton.checked);
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('Off', featureToggleButton.label.trim());
+  });
+
+  suite('Deeplinking', () => {
+    const deepLinkTestData = [
+      {
+        settingId: settingMojom.Setting.kNearbyShareOnOff.toString(),
+        deepLinkElement: '#featureToggleButton',
+      },
+      {
+        settingId: settingMojom.Setting.kNearbyShareDeviceName.toString(),
+        deepLinkElement: '#editDeviceNameButton',
+      },
+      {
+        settingId: settingMojom.Setting.kNearbyShareDeviceVisibility.toString(),
+        deepLinkElement: '#editVisibilityButton',
+      },
+      {
+        settingId: settingMojom.Setting.kNearbyShareContacts.toString(),
+        deepLinkElement: '#manageContactsLinkRow',
+      },
+      {
+        settingId: settingMojom.Setting.kNearbyShareDataUsage.toString(),
+        deepLinkElement: '#editDataUsageButton',
+      },
+      {
+        settingId: settingMojom.Setting
+                       .kDevicesNearbyAreSharingNotificationOnOff.toString(),
+        deepLinkElement: '#fastInitiationNotificationToggle',
+      },
+    ];
+
+    deepLinkTestData.forEach((testData) => {
+      test(
+          `Deep link to nearby setting element ${testData.deepLinkElement}`,
+          async () => {
+            const params = new URLSearchParams();
+            params.append('settingId', testData.settingId);
+            Router.getInstance().navigateTo(routes.NEARBY_SHARE, params);
+            flush();
+
+            const deepLinkElement =
+                subpage.shadowRoot!.querySelector<HTMLElement>(
+                    testData.deepLinkElement);
+            assertTrue(!!deepLinkElement);
+            await waitAfterNextRender(deepLinkElement);
+            assertEquals(
+                deepLinkElement, subpage.shadowRoot!.activeElement,
+                `Nearby share setting element ${testData.deepLinkElement}
+                     should be focused for settingId= ${testData.settingId}`);
+          });
+    });
+  });
+
+  test('update device name preference', () => {
+    assertEquals('', subpage.prefs.nearby_sharing.device_name.value);
+
+    const editDeviceNameButton =
+        subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#editDeviceNameButton');
+    assertTrue(!!editDeviceNameButton);
+    editDeviceNameButton.click();
+    flush();
+
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-device-name-dialog');
+    assertTrue(!!dialog);
+    const newName = 'NEW NAME';
+    const crInput = dialog.shadowRoot!.querySelector('cr-input');
+    assertTrue(!!crInput);
+    crInput.value = newName;
+    const actionButton =
+        dialog.shadowRoot!.querySelector<HTMLButtonElement>('.action-button');
+    assertTrue(!!actionButton);
+    actionButton.click();
+    flush();
+    syncFakeSettings();
+    flush();
+
+    assertEquals(newName, subpage.get('settings').deviceName);
+  });
+
+  test('validate device name preference', async () => {
+    const button = subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+        '#editDeviceNameButton');
+    assertTrue(!!button);
+    button.click();
+    flush();
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-device-name-dialog');
+    assertTrue(!!dialog);
+    const input = dialog.shadowRoot!.querySelector<CrInputElement>('cr-input');
+    assertTrue(!!input);
+    const doneButton =
+        dialog.shadowRoot!.querySelector<HTMLButtonElement>('#doneButton');
+    assertTrue(!!doneButton);
+
+    fakeSettings.setNextDeviceNameResult(
+        DeviceNameValidationResult.kErrorEmpty);
+    input.dispatchEvent(
+        new CustomEvent('input', {bubbles: true, composed: true}));
+    // Allow the validation promise to resolve.
+    await waitAfterNextRender(input);
+    flush();
+    assertTrue(input.invalid);
+    assertTrue(doneButton.disabled);
+
+    fakeSettings.setNextDeviceNameResult(DeviceNameValidationResult.kValid);
+    input.dispatchEvent(
+        new CustomEvent('input', {bubbles: true, composed: true}));
+    await waitAfterNextRender(input);
+    flush();
+    assertFalse(input.invalid);
+    assertFalse(doneButton.disabled);
+  });
+
+  test('update data usage preference', () => {
+    assertEquals(2, subpage.get('settings').dataUsage);
+
+    const editDataUsageButton =
+        subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#editDataUsageButton');
+    assertTrue(!!editDataUsageButton);
+    editDataUsageButton.click();
+    flush();
+
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-data-usage-dialog');
+    assertTrue(!!dialog);
+
+    const dataUsageWifiOnlyButton =
+        dialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#dataUsageWifiOnlyButton');
+    assertTrue(!!dataUsageWifiOnlyButton);
+    dataUsageWifiOnlyButton.click();
+
+    const actionButton =
+        dialog.shadowRoot!.querySelector<HTMLButtonElement>('.action-button');
+    assertTrue(!!actionButton);
+    actionButton.click();
+
+    flush();
+    syncFakeSettings();
+    flush();
+
+    assertEquals(3, subpage.get('settings').dataUsage);
+  });
+
+  test('update visibility shows dialog', () => {
+    // NOTE: all value editing is done and tested in the
+    // nearby-contact-visibility component which is hosted directly on the
+    // dialog. Here we just verify the dialog shows up, it has the component,
+    // and it has a close/action button.
+    const visibilityButton =
+        subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#editVisibilityButton');
+    assertTrue(!!visibilityButton);
+    visibilityButton.click();
+    flush();
+
+    const dialog = subpage.shadowRoot!.querySelector(
+        'nearby-share-contact-visibility-dialog');
+    assertTrue(!!dialog);
+    assertTrue(!!dialog.shadowRoot!.querySelector('nearby-contact-visibility'));
+    const button =
+        dialog.shadowRoot!.querySelector<HTMLButtonElement>('.action-button');
+    assertTrue(!!button);
+    button.click();
+  });
+
+  test('toggle high visibility from UI', async () => {
+    const toggle = subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+        '#highVisibilityToggle');
+    assertTrue(!!toggle);
+    toggle.click();
+    flush();
+    assertTrue(fakeReceiveManager.getInHighVisibilityForTest());
+
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-receive-dialog');
+    assertTrue(!!dialog);
+
+    await waitAfterNextRender(dialog);
+    const highVisibilityDialog =
+        dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page');
+    assertTrue(isVisible(highVisibilityDialog));
+
+    dialog['close_']();
+    assertFalse(fakeReceiveManager.getInHighVisibilityForTest());
+  });
+
+  test('high visibility UI updates from high visibility changes', async () => {
+    const highVisibilityToggle =
+        subpage.shadowRoot!.querySelector<CrToggleElement>(
+            '#highVisibilityToggle');
+    assertTrue(!!highVisibilityToggle);
+    assertFalse(highVisibilityToggle.checked);
+
+    fakeReceiveManager.setInHighVisibilityForTest(true);
+    assertTrue(highVisibilityToggle.checked);
+
+    fakeReceiveManager.setInHighVisibilityForTest(false);
+    assertFalse(highVisibilityToggle.checked);
+
+    // Process stopped unchecks the toggle.
+    fakeReceiveManager.setInHighVisibilityForTest(true);
+    assertTrue(highVisibilityToggle.checked);
+    subpage.onNearbyProcessStopped();
+    flush();
+    assertFalse(highVisibilityToggle.checked);
+
+    // Failure to start advertising unchecks the toggle.
+    fakeReceiveManager.setInHighVisibilityForTest(false);
+    fakeReceiveManager.setInHighVisibilityForTest(true);
+    assertTrue(highVisibilityToggle.checked);
+    subpage.onStartAdvertisingFailure();
+    flush();
+    assertFalse(highVisibilityToggle.checked);
+
+    // Toggle still gets unchecked even if advertising was not attempted.
+    // E.g. if Bluetooth is off when high visibility is toggled.
+    fakeReceiveManager.setInHighVisibilityForTest(false);
+    subpage.set('inHighVisibility_', true);
+    subpage['showHighVisibilityPage_']();
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-receive-dialog');
+    assertTrue(!!dialog);
+    await waitAfterNextRender(dialog);
+    const highVisibilityDialog =
+        dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page');
+    assertTrue(!!highVisibilityDialog);
+    await waitAfterNextRender(dialog);
+    assertTrue(isVisible(highVisibilityDialog));
+    highVisibilityDialog.registerResult =
+        RegisterReceiveSurfaceResult.kNoConnectionMedium;
+    await waitAfterNextRender(highVisibilityDialog);
+    const template =
+        highVisibilityDialog.shadowRoot!.querySelector('nearby-page-template');
+    assertTrue(!!template);
+    const button =
+        template.shadowRoot!.querySelector<HTMLButtonElement>('#closeButton');
+    assertTrue(!!button);
+    button.click();
+    flush();
+    assertFalse(highVisibilityToggle.checked);
+  });
+
+  test('GAIA email, account manager enabled', async () => {
+    await accountManagerBrowserProxy.whenCalled('getAccounts');
+    flush();
+
+    const profileName = subpage.shadowRoot!.querySelector('#profileName');
+    assertTrue(!!profileName);
+    assertEquals('Primary Account', profileName.textContent!.trim());
+    const profileLabel = subpage.shadowRoot!.querySelector('#profileLabel');
+    assertTrue(!!profileLabel);
+    assertEquals('primary@gmail.com', profileLabel.textContent!.trim());
+  });
+
+  test('show receive dialog', () => {
+    subpage.set('showReceiveDialog_', true);
+    flush();
+
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-receive-dialog');
+    assertTrue(!!dialog);
+  });
+
+  test('show high visibility dialog', async () => {
+    // Mock performance.now to return a constant 0 for testing.
+    const originalNow = performance.now;
+    performance.now = () => {
+      return 0;
+    };
+
+    const params = new URLSearchParams();
+    params.append('receive', '1');
+    params.append('timeout', '600');  // 10 minutes
+    Router.getInstance().navigateTo(routes.NEARBY_SHARE, params);
+
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-receive-dialog');
+    assertTrue(!!dialog);
+    const highVisibilityDialog =
+        dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page');
+    assertTrue(!!highVisibilityDialog);
+    assertFalse(highVisibilityDialog['highVisibilityTimedOut_']());
+
+    flush();
+    await waitAfterNextRender(dialog);
+
+    assertTrue(isVisible(highVisibilityDialog));
+    assertEquals(600 * 1000, highVisibilityDialog.shutoffTimestamp);
+
+    // Restore mock
+    performance.now = originalNow;
+  });
+
+  test('high visibility dialog times out', async () => {
+    // Mock performance.now to return a constant 0 for testing.
+    const originalNow = performance.now;
+    performance.now = () => {
+      return 0;
+    };
+
+    const params = new URLSearchParams();
+    params.append('receive', '1');
+    params.append('timeout', '600');  // 10 minutes
+    Router.getInstance().navigateTo(routes.NEARBY_SHARE, params);
+
+    const dialog =
+        subpage.shadowRoot!.querySelector('nearby-share-receive-dialog');
+    assertTrue(!!dialog);
+    const highVisibilityDialog =
+        dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page');
+    assertTrue(!!highVisibilityDialog);
+
+    highVisibilityDialog['calculateRemainingTime_']();
+    assertFalse(highVisibilityDialog['highVisibilityTimedOut_']());
+
+    // Set time past the shutoffTime.
+    performance.now = () => {
+      return 6000001;
+    };
+
+    highVisibilityDialog['calculateRemainingTime_']();
+    await waitAfterNextRender(dialog);
+    assertTrue(isVisible(highVisibilityDialog));
+    assertTrue(highVisibilityDialog['highVisibilityTimedOut_']());
+
+    // Restore mock
+    performance.now = originalNow;
+  });
+
+  test('download contacts on attach', () => {
+    // Ensure contacts download occurs when the subpage is attached.
+    assertTrue(fakeContactManager.downloadContactsCalled);
+  });
+
+  test('Do not download contacts on attach pre-onboarding', async () => {
+    subpage.remove();
+    Router.getInstance().resetRouteForTesting();
+
+    setupFakes();
+    fakeSettings.setEnabled(false);
+    fakeSettings.setIsOnboardingComplete(false);
+    syncFakeSettings();
+    createSubpage(/*isEnabled=*/ false, /*isOnboardingComplete=*/ false);
+
+    await flushTasks();
+    // Ensure contacts download occurs when the subpage is attached.
+    assertFalse(fakeContactManager.downloadContactsCalled);
+  });
+
+  test('Show setup button pre-onboarding', async () => {
+    subpage.remove();
+    Router.getInstance().resetRouteForTesting();
+
+    setupFakes();
+    createSubpage(/*isEnabled=*/ false, /*isOnboardingComplete=*/ false);
+
+    await flushTasks();
+    assertFalse(doesElementExist('#featureToggleButton'));
+    assertTrue(doesElementExist('#setupRow'));
+
+    // Clicking starts onboarding flow
+    const setupRow = subpage.shadowRoot!.querySelector('#setupRow');
+    assertTrue(!!setupRow);
+    const button = setupRow.querySelector('cr-button');
+    assertTrue(!!button);
+    button.click();
+    await flushTasks();
+    assertTrue(doesElementExist('#receiveDialog'));
+
+    const receiveDialog = subpage.shadowRoot!.querySelector('#receiveDialog');
+    assertTrue(!!receiveDialog);
+
+    const element = receiveDialog.shadowRoot!.querySelector('#onboarding-one');
+    assertTrue(!!element);
+
+    assertEquals('active', element.className);
+  });
+
+  test('feature toggle UI changes', () => {
+    // Ensure toggle off UI occurs when toggle off.
+    assertTrue(featureToggleButton.checked);
+    assertEquals('On', featureToggleButton.label.trim());
+    assertTrue(featureToggleButton.classList.contains('enabled-toggle-on'));
+    assertFalse(featureToggleButton.classList.contains('enabled-toggle-off'));
+
+    featureToggleButton.click();
+
+    assertFalse(featureToggleButton.checked);
+    assertEquals('Off', featureToggleButton.label.trim());
+    assertFalse(featureToggleButton.classList.contains('enabled-toggle-on'));
+    assertTrue(featureToggleButton.classList.contains('enabled-toggle-off'));
+  });
+
+  test('subpage hidden when feature toggled off', () => {
+    // Ensure that the subpage content is hidden when the Nearby is off.
+    const subpageContent =
+        subpage.shadowRoot!.querySelector<HTMLElement>('#subpageContent');
+    const highVizToggle = subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+        '#highVisibilityToggle');
+    const editDeviceNameButton =
+        subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#editDeviceNameButton');
+    const editVisibilityButton =
+        subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#editVisibilityButton');
+    const editDataUsageButton =
+        subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#editDataUsageButton');
+
+    assertTrue(!!subpageContent);
+    assertTrue(!!highVizToggle);
+    assertTrue(!!editDeviceNameButton);
+    assertTrue(!!editVisibilityButton);
+    assertTrue(!!editDataUsageButton);
+
+    assertTrue(featureToggleButton.checked);
+    assertTrue(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('On', featureToggleButton.label.trim());
+    assertTrue(doesElementExist('#help'));
+
+    editVisibilityButton.click();
+    flush();
+    const visibilityDialog = subpage.shadowRoot!.querySelector(
+        'nearby-share-contact-visibility-dialog');
+    assertTrue(!!visibilityDialog);
+    assertTrue(!!visibilityDialog.shadowRoot!.querySelector(
+        'nearby-contact-visibility'));
+
+    editDeviceNameButton.click();
+    flush();
+    const deviceNameDialog =
+        subpage.shadowRoot!.querySelector('nearby-share-device-name-dialog');
+    assertTrue(!!deviceNameDialog);
+
+    editDataUsageButton.click();
+    flush();
+    const dataUsageDialog =
+        subpage.shadowRoot!.querySelector('nearby-share-data-usage-dialog');
+    assertTrue(!!dataUsageDialog);
+
+    highVizToggle.click();
+    flush();
+    const receiveDialog =
+        subpage.shadowRoot!.querySelector('nearby-share-receive-dialog');
+    assertTrue(!!receiveDialog);
+
+    const helpContent =
+        subpage.shadowRoot!.querySelector<HTMLElement>('#helpContent');
+    assertTrue(!!helpContent);
+
+    featureToggleButton.click();
+    flush();
+
+    assertFalse(featureToggleButton.checked);
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('Off', featureToggleButton.label.trim());
+    assertEquals('none', subpageContent.style.display);
+    assertEquals('none', helpContent.style.display);
+    subpageControlsHidden(false);
+    assertFalse(doesElementExist('#help'));
+  });
+
+  test('Fast init toggle exists', () => {
+    assertTrue(!!subpage.shadowRoot!.querySelector(
+        '#fastInitiationNotificationToggle'));
+  });
+
+  test('UX changes disabled when no hardware support', async () => {
+    subpage.set('settings.isFastInitiationHardwareSupported', false);
+    await flushTasks();
+
+    // Toggle doesnt exist
+    const fastInitToggle = subpage.shadowRoot!.querySelector<CrToggleElement>(
+        '#fastInitiationNotificationToggle');
+    assertNull(fastInitToggle);
+
+    // Subpage contents do not show when feature off
+    featureToggleButton.click();
+    flush();
+
+    assertFalse(featureToggleButton.checked);
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('Off', featureToggleButton.label.trim());
+
+    subpageControlsHidden(true);
+  });
+
+  test('Fast initiation notification toggle', async () => {
+    const fastInitToggle = subpage.shadowRoot!.querySelector<CrToggleElement>(
+        '#fastInitiationNotificationToggle');
+    assertTrue(!!fastInitToggle);
+    await flushTasks();
+    assertTrue(fastInitToggle.checked);
+    assertEquals(
+        FastInitiationNotificationState.kEnabled,
+        subpage.get('settings').fastInitiationNotificationState);
+
+    fastInitToggle.click();
+    await flushTasks();
+    assertFalse(fastInitToggle.checked);
+    assertEquals(
+        FastInitiationNotificationState.kDisabledByUser,
+        subpage.get('settings').fastInitiationNotificationState);
+  });
+
+  test('Subpage content visible but disabled when feature off', () => {
+    featureToggleButton.click();
+    flush();
+
+    assertFalse(featureToggleButton.checked);
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('Off', featureToggleButton.label.trim());
+
+    subpageControlsHidden(false);
+    subpageControlsDisabled(true);
+  });
+
+  test('Subpage content not visible pre-onboarding', async () => {
+    featureToggleButton.click();
+    subpage.set('prefs.nearby_sharing.onboarding_complete.value', false);
+    await flushTasks();
+
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    subpageControlsHidden(true);
+  });
+
+  test('Subpage content visible but disabled when feature off', () => {
+    featureToggleButton.click();
+    flush();
+
+    assertFalse(featureToggleButton.checked);
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    assertEquals('Off', featureToggleButton.label.trim());
+
+    subpageControlsHidden(false);
+    subpageControlsDisabled(true);
+  });
+
+  test('Subpage content not visible pre-onboarding', async () => {
+    featureToggleButton.click();
+    subpage.set('prefs.nearby_sharing.onboarding_complete.value', false);
+    await flushTasks();
+
+    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
+    subpageControlsHidden(true);
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_page/test_nearby_account_manager_browser_proxy.ts b/chrome/test/data/webui/settings/chromeos/nearby_share_page/test_nearby_account_manager_browser_proxy.ts
new file mode 100644
index 0000000..27b1859
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/nearby_share_page/test_nearby_account_manager_browser_proxy.ts
@@ -0,0 +1,33 @@
+// 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.
+
+import {Account, NearbyAccountManagerBrowserProxy} from 'chrome://os-settings/os_settings.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+
+export class TestNearbyAccountManagerBrowserProxy extends TestBrowserProxy
+    implements NearbyAccountManagerBrowserProxy {
+  constructor() {
+    super([
+      'getAccounts',
+    ]);
+  }
+
+  getAccounts(): Promise<Account[]> {
+    this.methodCalled('getAccounts');
+
+    return Promise.resolve([
+      {
+        id: '123',
+        accountType: 1,
+        isDeviceAccount: true,
+        isSignedIn: true,
+        unmigrated: false,
+        fullName: 'Primary Account',
+        pic: 'data:image/png;base64,primaryAccountPicData',
+        email: 'primary@gmail.com',
+        organization: undefined,
+      },
+    ]);
+  }
+}
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
deleted file mode 100644
index 69510fc7..0000000
--- a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js
+++ /dev/null
@@ -1,676 +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.
-
-import {NearbyAccountManagerBrowserProxyImpl, nearbyShareMojom, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting} from 'chrome://os-settings/os_settings.js';
-import {DeviceNameValidationResult, FastInitiationNotificationState} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {assertEquals} from 'chrome://webui-test/chai_assert.js';
-import {FakeContactManager} from 'chrome://webui-test/nearby_share/shared/fake_nearby_contact_manager.js';
-import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js';
-import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
-import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
-import {isVisible} from 'chrome://webui-test/test_util.js';
-
-import {FakeReceiveManager} from './fake_receive_manager.js';
-
-const {RegisterReceiveSurfaceResult} = nearbyShareMojom;
-
-/** @implements {AccountManagerBrowserProxy} */
-class TestAccountManagerBrowserProxy extends TestBrowserProxy {
-  constructor() {
-    super([
-      'getAccounts',
-    ]);
-  }
-
-  /** @override */
-  getAccounts() {
-    this.methodCalled('getAccounts');
-
-    return Promise.resolve([
-      {
-        id: '123',
-        accountType: 1,
-        isDeviceAccount: true,
-        isSignedIn: true,
-        unmigrated: false,
-        fullName: 'Primary Account',
-        pic: 'data:image/png;base64,primaryAccountPicData',
-        email: 'primary@gmail.com',
-      },
-    ]);
-  }
-}
-
-suite('NearbyShare', function() {
-  /** @type {?SettingsNearbyShareSubpage} */
-  let subpage = null;
-  /** @type {?SettingsToggleButtonElement} */
-  let featureToggleButton = null;
-  /** @type {?FakeReceiveManager} */
-  let fakeReceiveManager = null;
-  /** @type {AccountManagerBrowserProxy} */
-  let accountManagerBrowserProxy = null;
-  /** @type {!FakeContactManager} */
-  let fakeContactManager = null;
-  /** @type {!FakeNearbyShareSettings} */
-  let fakeSettings = null;
-
-  setup(function() {
-    setupFakes();
-    fakeSettings.setEnabled(true);
-    fakeSettings.setIsOnboardingComplete(true);
-
-
-    createSubpage(/*is_enabled=*/ true, /*is_onboarding_complete=*/ true);
-    syncFakeSettings();
-    featureToggleButton =
-        subpage.shadowRoot.querySelector('#featureToggleButton');
-
-    return flushAsync();
-  });
-
-  teardown(function() {
-    subpage.remove();
-    Router.getInstance().resetRouteForTesting();
-  });
-
-  function setupFakes() {
-    accountManagerBrowserProxy = new TestAccountManagerBrowserProxy();
-    NearbyAccountManagerBrowserProxyImpl.setInstanceForTesting(
-        accountManagerBrowserProxy);
-
-    fakeReceiveManager = new FakeReceiveManager();
-    setReceiveManagerForTesting(fakeReceiveManager);
-
-    fakeContactManager = new FakeContactManager();
-    setContactManagerForTesting(fakeContactManager);
-    fakeContactManager.setupContactRecords();
-
-    fakeSettings = new FakeNearbyShareSettings();
-    setNearbyShareSettingsForTesting(fakeSettings);
-  }
-
-  function syncFakeSettings() {
-    subpage.set('settings.enabled', fakeSettings.getEnabledForTest());
-    subpage.set(
-        'settings.isFastInitiationHardwareSupported',
-        fakeSettings.getIsFastInitiationHardwareSupportedTest());
-    subpage.set(
-        'settings.fastInitiationNotificationState',
-        fakeSettings.getFastInitiationNotificationStateTest());
-    subpage.set('settings.deviceName', fakeSettings.getDeviceNameForTest());
-    subpage.set('settings.dataUsage', fakeSettings.getDataUsageForTest());
-    subpage.set('settings.visibility', fakeSettings.getVisibilityForTest());
-    subpage.set(
-        'settings.allowedContacts', fakeSettings.getAllowedContactsForTest());
-    subpage.set(
-        'settings.isOnboardingComplete', fakeSettings.isOnboardingComplete());
-  }
-
-  function createSubpage(is_enabled, is_onboarding_complete) {
-    PolymerTest.clearBody();
-
-    subpage = document.createElement('settings-nearby-share-subpage');
-    subpage.prefs = {
-      'nearby_sharing': {
-        'enabled': {
-          value: is_enabled,
-        },
-        'data_usage': {
-          value: 3,
-        },
-        'device_name': {
-          value: '',
-        },
-        'onboarding_complete': {
-          value: is_onboarding_complete,
-        },
-      },
-    };
-    subpage.isSettingsRetreived = true;
-
-    document.body.appendChild(subpage);
-    flush();
-  }
-
-  // Returns true if the element exists and has not been 'removed' by the
-  // Polymer template system.
-  function doesElementExist(selector) {
-    const el = subpage.shadowRoot.querySelector(selector);
-    return (el !== null) && (el.style.display !== 'none');
-  }
-
-  function subpageControlsHidden(is_hidden) {
-    assertEquals(is_hidden, !doesElementExist('#highVisibilityToggle'));
-    assertEquals(is_hidden, !doesElementExist('#editDeviceNameButton'));
-    assertEquals(is_hidden, !doesElementExist('#editVisibilityButton'));
-    assertEquals(is_hidden, !doesElementExist('#editDataUsageButton'));
-  }
-
-  function subpageControlsDisabled(is_disabled) {
-    assertEquals(
-        is_disabled,
-        subpage.shadowRoot.querySelector('#highVisibilityToggle')
-            .hasAttribute('disabled'));
-    assertEquals(
-        is_disabled,
-        subpage.shadowRoot.querySelector('#editDeviceNameButton')
-            .hasAttribute('disabled'));
-    assertEquals(
-        is_disabled,
-        subpage.shadowRoot.querySelector('#editVisibilityButton')
-            .hasAttribute('disabled'));
-    assertEquals(
-        is_disabled,
-        subpage.shadowRoot.querySelector('#editDataUsageButton')
-            .hasAttribute('disabled'));
-  }
-
-  function flushAsync() {
-    flush();
-    // Use setTimeout to wait for the next macrotask.
-    return new Promise(resolve => setTimeout(resolve));
-  }
-
-  test('feature toggle button controls preference', function() {
-    // Ensure that these controls are enabled/disabled when the Nearby is
-    // enabled/disabled.
-    assertEquals(true, featureToggleButton.checked);
-    assertEquals(true, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('On', featureToggleButton.label.trim());
-    subpageControlsHidden(false);
-    subpageControlsDisabled(false);
-
-    featureToggleButton.click();
-    flush();
-
-    assertEquals(false, featureToggleButton.checked);
-    assertEquals(false, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('Off', featureToggleButton.label.trim());
-    subpageControlsHidden(false);
-  });
-
-  test('toggle row controls preference', function() {
-    assertEquals(true, featureToggleButton.checked);
-    assertEquals(true, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('On', featureToggleButton.label.trim());
-
-    featureToggleButton.click();
-
-    assertEquals(false, featureToggleButton.checked);
-    assertEquals(false, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('Off', featureToggleButton.label.trim());
-  });
-
-  suite('Deeplinking', () => {
-    const deepLinkTestData = [
-      {settingId: '208', deepLinkElement: '#featureToggleButton'},
-      {settingId: '214', deepLinkElement: '#editDeviceNameButton'},
-      {settingId: '215', deepLinkElement: '#editVisibilityButton'},
-      {settingId: '216', deepLinkElement: '#manageContactsLinkRow'},
-      {settingId: '217', deepLinkElement: '#editDataUsageButton'},
-      {settingId: '220', deepLinkElement: '#fastInitiationNotificationToggle'},
-    ];
-
-    deepLinkTestData.forEach((testData) => {
-      test(
-          'Deep link to nearby setting element ' + testData.deepLinkElement,
-          async () => {
-            const params = new URLSearchParams();
-            params.append('settingId', testData.settingId);
-            Router.getInstance().navigateTo(routes.NEARBY_SHARE, params);
-
-            flush();
-
-            const deepLinkElement =
-                subpage.shadowRoot.querySelector(testData.deepLinkElement);
-            await waitAfterNextRender(deepLinkElement);
-            assertEquals(
-                deepLinkElement, subpage.shadowRoot.activeElement,
-                'Nearby share setting element ' + testData.deepLinkElement +
-                    ' should be focused for settingId=' + testData.settingId);
-          });
-    });
-  });
-
-  test('update device name preference', function() {
-    assertEquals('', subpage.prefs.nearby_sharing.device_name.value);
-
-    subpage.shadowRoot.querySelector('#editDeviceNameButton').click();
-    flush();
-
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-device-name-dialog');
-    const oldName = subpage.settings.deviceName;
-    const newName = 'NEW NAME';
-    dialog.shadowRoot.querySelector('cr-input').value = newName;
-    dialog.shadowRoot.querySelector('.action-button').click();
-    flush();
-    syncFakeSettings();
-    flush();
-
-    assertEquals(newName, subpage.settings.deviceName);
-    subpage.set('settings.deviceName', oldName);
-  });
-
-  test('validate device name preference', async () => {
-    subpage.shadowRoot.querySelector('#editDeviceNameButton').click();
-    flush();
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-device-name-dialog');
-    const input = dialog.shadowRoot.querySelector('cr-input');
-    const doneButton = dialog.shadowRoot.querySelector('#doneButton');
-
-    fakeSettings.setNextDeviceNameResult(
-        DeviceNameValidationResult.kErrorEmpty);
-    input.dispatchEvent(
-        new CustomEvent('input', {bubbles: true, composed: true}));
-    // Allow the validation promise to resolve.
-    await waitAfterNextRender();
-    flush();
-    assertTrue(input.invalid);
-    assertTrue(doneButton.disabled);
-
-    fakeSettings.setNextDeviceNameResult(DeviceNameValidationResult.kValid);
-    input.dispatchEvent(
-        new CustomEvent('input', {bubbles: true, composed: true}));
-    await waitAfterNextRender();
-    flush();
-    assertFalse(input.invalid);
-    assertFalse(doneButton.disabled);
-  });
-
-  test('update data usage preference', function() {
-    assertEquals(2, subpage.settings.dataUsage);
-
-    subpage.shadowRoot.querySelector('#editDataUsageButton').click();
-    flush();
-
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-data-usage-dialog');
-    dialog.shadowRoot.querySelector('#dataUsageWifiOnlyButton').click();
-    dialog.shadowRoot.querySelector('.action-button').click();
-    flush();
-    syncFakeSettings();
-    flush();
-
-    assertEquals(3, subpage.settings.dataUsage);
-  });
-
-  test('update visibility shows dialog', function() {
-    // NOTE: all value editing is done and tested in the
-    // nearby-contact-visibility component which is hosted directly on the
-    // dialog. Here we just verify the dialog shows up, it has the component,
-    // and it has a close/action button.
-    subpage.shadowRoot.querySelector('#editVisibilityButton').click();
-    flush();
-
-    const dialog = subpage.shadowRoot.querySelector(
-        'nearby-share-contact-visibility-dialog');
-    assertTrue(
-        dialog.shadowRoot.querySelector('nearby-contact-visibility') !== null);
-    dialog.shadowRoot.querySelector('.action-button').click();
-  });
-
-  test('toggle high visibility from UI', async function() {
-    subpage.shadowRoot.querySelector('#highVisibilityToggle').click();
-    flush();
-    assertTrue(fakeReceiveManager.getInHighVisibilityForTest());
-
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-receive-dialog');
-    assertTrue(!!dialog);
-
-    await waitAfterNextRender(dialog);
-    const highVisibilityDialog =
-        dialog.shadowRoot.querySelector('nearby-share-high-visibility-page');
-    assertTrue(isVisible(highVisibilityDialog));
-
-    dialog.close_();
-    assertFalse(fakeReceiveManager.getInHighVisibilityForTest());
-  });
-
-  test(
-      'high visibility UI updates from high visibility changes',
-      async function() {
-        const highVisibilityToggle =
-            subpage.shadowRoot.querySelector('#highVisibilityToggle');
-        assertFalse(highVisibilityToggle.checked);
-
-        fakeReceiveManager.setInHighVisibilityForTest(true);
-        assertTrue(highVisibilityToggle.checked);
-
-        fakeReceiveManager.setInHighVisibilityForTest(false);
-        assertFalse(highVisibilityToggle.checked);
-
-        // Process stopped unchecks the toggle.
-        fakeReceiveManager.setInHighVisibilityForTest(true);
-        assertTrue(highVisibilityToggle.checked);
-        subpage.onNearbyProcessStopped();
-        flush();
-        assertFalse(highVisibilityToggle.checked);
-
-        // Failure to start advertising unchecks the toggle.
-        fakeReceiveManager.setInHighVisibilityForTest(false);
-        fakeReceiveManager.setInHighVisibilityForTest(true);
-        assertTrue(highVisibilityToggle.checked);
-        subpage.onStartAdvertisingFailure();
-        flush();
-        assertFalse(highVisibilityToggle.checked);
-
-        // Toggle still gets unchecked even if advertising was not attempted.
-        // E.g. if Bluetooth is off when high visibility is toggled.
-        fakeReceiveManager.setInHighVisibilityForTest(false);
-        subpage.inHighVisibility_ = true;
-        subpage.showHighVisibilityPage_();
-        const dialog =
-            subpage.shadowRoot.querySelector('nearby-share-receive-dialog');
-        assertTrue(!!dialog);
-        await waitAfterNextRender(dialog);
-        const highVisibilityDialog = dialog.shadowRoot.querySelector(
-            'nearby-share-high-visibility-page');
-        await waitAfterNextRender(dialog);
-        assertTrue(isVisible(highVisibilityDialog));
-        highVisibilityDialog.registerResult =
-            RegisterReceiveSurfaceResult.kNoConnectionMedium;
-        await waitAfterNextRender(highVisibilityDialog);
-        highVisibilityDialog.shadowRoot.querySelector('nearby-page-template')
-            .shadowRoot.querySelector('#closeButton')
-            .click();
-        flush();
-        assertFalse(highVisibilityToggle.checked);
-      });
-
-  test('GAIA email, account manager enabled', async () => {
-    await accountManagerBrowserProxy.whenCalled('getAccounts');
-    flush();
-
-    const profileName = subpage.shadowRoot.querySelector('#profileName');
-    assertEquals('Primary Account', profileName.textContent.trim());
-    const profileLabel = subpage.shadowRoot.querySelector('#profileLabel');
-    assertEquals('primary@gmail.com', profileLabel.textContent.trim());
-  });
-
-  test('show receive dialog', function() {
-    subpage.showReceiveDialog_ = true;
-    flush();
-
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-receive-dialog');
-    assertTrue(!!dialog);
-  });
-
-  test('show high visibility dialog', async function() {
-    // Mock performance.now to return a constant 0 for testing.
-    const originalNow = performance.now;
-    performance.now = () => {
-      return 0;
-    };
-
-    const params = new URLSearchParams();
-    params.append('receive', '1');
-    params.append('timeout', '600');  // 10 minutes
-    Router.getInstance().navigateTo(routes.NEARBY_SHARE, params);
-
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-receive-dialog');
-    assertTrue(!!dialog);
-    const highVisibilityDialog =
-        dialog.shadowRoot.querySelector('nearby-share-high-visibility-page');
-    assertTrue(!!highVisibilityDialog);
-    assertFalse(highVisibilityDialog.highVisibilityTimedOut_());
-
-    flush();
-    await waitAfterNextRender(dialog);
-
-    assertTrue(isVisible(highVisibilityDialog));
-    assertEquals(highVisibilityDialog.shutoffTimestamp, 600 * 1000);
-
-    // Restore mock
-    performance.now = originalNow;
-  });
-
-  test('high visibility dialog times out', async function() {
-    // Mock performance.now to return a constant 0 for testing.
-    const originalNow = performance.now;
-    performance.now = () => {
-      return 0;
-    };
-
-    const params = new URLSearchParams();
-    params.append('receive', '1');
-    params.append('timeout', '600');  // 10 minutes
-    Router.getInstance().navigateTo(routes.NEARBY_SHARE, params);
-
-    const dialog =
-        subpage.shadowRoot.querySelector('nearby-share-receive-dialog');
-    assertTrue(!!dialog);
-    const highVisibilityDialog =
-        dialog.shadowRoot.querySelector('nearby-share-high-visibility-page');
-    assertTrue(!!highVisibilityDialog);
-
-    highVisibilityDialog.calculateRemainingTime_();
-    assertFalse(highVisibilityDialog.highVisibilityTimedOut_());
-
-    // Set time past the shutoffTime.
-    performance.now = () => {
-      return 6000001;
-    };
-
-    highVisibilityDialog.calculateRemainingTime_();
-    await waitAfterNextRender(dialog);
-    assertTrue(isVisible(highVisibilityDialog));
-    assertTrue(highVisibilityDialog.highVisibilityTimedOut_());
-
-    // Restore mock
-    performance.now = originalNow;
-  });
-
-  test('download contacts on attach', async () => {
-    await flushAsync();
-    // Ensure contacts download occurs when the subpage is attached.
-    assertTrue(fakeContactManager.downloadContactsCalled);
-  });
-
-  test('Do not download contacts on attach pre-onboarding', async () => {
-    await flushAsync();
-
-    subpage.remove();
-    Router.getInstance().resetRouteForTesting();
-
-    setupFakes();
-    fakeSettings.setEnabled(false);
-    fakeSettings.setIsOnboardingComplete(false);
-    syncFakeSettings();
-    createSubpage(/*is_enabled=*/ false, /*is_onboarding_complete=*/ false);
-
-    await flushAsync();
-    // Ensure contacts download occurs when the subpage is attached.
-    assertFalse(fakeContactManager.downloadContactsCalled);
-  });
-
-  test('Show setup button pre-onboarding', async () => {
-    await flushAsync();
-
-    subpage.remove();
-    Router.getInstance().resetRouteForTesting();
-
-    setupFakes();
-    createSubpage(/*is_enabled=*/ false, /*is_onboarding_complete=*/ false);
-
-    await flushAsync();
-    assertFalse(doesElementExist('#featureToggleButton'));
-    assertTrue(doesElementExist('#setupRow'));
-
-    // Clicking starts onboarding flow
-    subpage.shadowRoot.querySelector('#setupRow')
-        .querySelector('cr-button')
-        .click();
-    await flushAsync();
-    assertTrue(doesElementExist('#receiveDialog'));
-    assertEquals(
-        'active',
-        subpage.shadowRoot.querySelector('#receiveDialog')
-            .shadowRoot.querySelector('#onboarding-one')
-            .className);
-  });
-
-  test('feature toggle UI changes', function() {
-    // Ensure toggle off UI occurs when toggle off.
-    assertEquals(true, featureToggleButton.checked);
-    assertEquals('On', featureToggleButton.label.trim());
-    assertTrue(featureToggleButton.classList.contains('enabled-toggle-on'));
-    assertFalse(featureToggleButton.classList.contains('enabled-toggle-off'));
-
-    featureToggleButton.click();
-
-    assertEquals(false, featureToggleButton.checked);
-    assertEquals('Off', featureToggleButton.label.trim());
-    assertFalse(featureToggleButton.classList.contains('enabled-toggle-on'));
-    assertTrue(featureToggleButton.classList.contains('enabled-toggle-off'));
-  });
-
-  test('subpage hidden when feature toggled off', function() {
-    // Ensure that the subpage content is hidden when the Nearby is off.
-    const subpageContent = subpage.shadowRoot.querySelector('#subpageContent');
-    const highVizToggle =
-        subpage.shadowRoot.querySelector('#highVisibilityToggle');
-    const editDeviceNameButton =
-        subpage.shadowRoot.querySelector('#editDeviceNameButton');
-    const editVisibilityButton =
-        subpage.shadowRoot.querySelector('#editVisibilityButton');
-    const editDataUsageButton =
-        subpage.shadowRoot.querySelector('#editDataUsageButton');
-
-    assertEquals(true, featureToggleButton.checked);
-    assertEquals(true, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('On', featureToggleButton.label.trim());
-    assertTrue(doesElementExist('#help'));
-
-    editVisibilityButton.click();
-    flush();
-    const visibilityDialog = subpage.shadowRoot.querySelector(
-        'nearby-share-contact-visibility-dialog');
-    assertTrue(!!visibilityDialog);
-    assertTrue(
-        visibilityDialog.shadowRoot.querySelector(
-            'nearby-contact-visibility') !== null);
-
-    editDeviceNameButton.click();
-    flush();
-    const deviceNameDialog =
-        subpage.shadowRoot.querySelector('nearby-share-device-name-dialog');
-    assertTrue(!!deviceNameDialog);
-
-    editDataUsageButton.click();
-    flush();
-    const dataUsageDialog =
-        subpage.shadowRoot.querySelector('nearby-share-data-usage-dialog');
-    assertTrue(!!dataUsageDialog);
-
-    highVizToggle.click();
-    flush();
-    const receiveDialog =
-        subpage.shadowRoot.querySelector('nearby-share-receive-dialog');
-    assertTrue(!!receiveDialog);
-
-    featureToggleButton.click();
-    flush();
-
-    assertEquals(false, featureToggleButton.checked);
-    assertEquals(false, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('Off', featureToggleButton.label.trim());
-    assertEquals('none', subpageContent.style.display);
-    assertEquals(
-        'none', subpage.shadowRoot.querySelector('#helpContent').style.display);
-    subpageControlsHidden(false);
-    assertFalse(doesElementExist('#help'));
-  });
-
-  test('Fast init toggle exists', function() {
-    assertTrue(!!subpage.shadowRoot.querySelector(
-        '#fastInitiationNotificationToggle'));
-  });
-
-  test('UX changes disabled when no hardware support', async () => {
-    subpage.set('settings.isFastInitiationHardwareSupported', false);
-    await flushAsync();
-
-    // Toggle doesnt exist
-    const fastInitToggle =
-        subpage.shadowRoot.querySelector('#fastInitiationNotificationToggle');
-    assertFalse(!!fastInitToggle);
-
-    // Subpage contents do not show when feature off
-    featureToggleButton.click();
-    flush();
-
-    assertFalse(featureToggleButton.checked);
-    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('Off', featureToggleButton.label.trim());
-
-    subpageControlsHidden(true);
-  });
-
-  test('Fast initiation notification toggle', async () => {
-    const fastInitToggle =
-        subpage.shadowRoot.querySelector('#fastInitiationNotificationToggle');
-    assertTrue(!!fastInitToggle);
-    await flushAsync();
-    assertTrue(fastInitToggle.checked);
-    assertEquals(
-        FastInitiationNotificationState.kEnabled,
-        subpage.settings.fastInitiationNotificationState);
-
-    fastInitToggle.click();
-    await flushAsync();
-    assertFalse(fastInitToggle.checked);
-    assertEquals(
-        FastInitiationNotificationState.kDisabledByUser,
-        subpage.settings.fastInitiationNotificationState);
-  });
-
-  test('Subpage content visible but disabled when feature off', async () => {
-    featureToggleButton.click();
-    flush();
-
-    assertFalse(featureToggleButton.checked);
-    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('Off', featureToggleButton.label.trim());
-
-    subpageControlsHidden(false);
-    subpageControlsDisabled(true);
-  });
-
-  test('Subpage content not visible pre-onboarding', async () => {
-    featureToggleButton.click();
-    subpage.set('prefs.nearby_sharing.onboarding_complete.value', false);
-    await flushAsync();
-
-    assertFalse(subpage.prefs.nearby_sharing.enabled.value);
-    subpageControlsHidden(true);
-  });
-
-  test('Subpage content visible but disabled when feature off', async () => {
-    featureToggleButton.click();
-    flush();
-
-    assertEquals(false, featureToggleButton.checked);
-    assertEquals(false, subpage.prefs.nearby_sharing.enabled.value);
-    assertEquals('Off', featureToggleButton.label.trim());
-
-    subpageControlsHidden(false);
-    subpageControlsDisabled(true);
-  });
-
-  test('Subpage content not visible pre-onboarding', async () => {
-    featureToggleButton.click();
-    subpage.set('prefs.nearby_sharing.onboarding_complete.value', false);
-    await flushAsync();
-
-    assertEquals(false, subpage.prefs.nearby_sharing.enabled.value);
-    subpageControlsHidden(true);
-  });
-});
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
index 89586ef8..f9be9d7 100644
--- a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
@@ -16,9 +16,9 @@
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
 import {TestSyncBrowserProxy} from '../test_os_sync_browser_proxy.js';
-import {TestProfileInfoBrowserProxy} from '../test_profile_info_browser_proxy.js';
 
 import {TestAccountManagerBrowserProxy} from './test_account_manager_browser_proxy.js';
+import {TestProfileInfoBrowserProxy} from './test_profile_info_browser_proxy.js';
 
 interface SubpageTriggerData {
   triggerSelector: string;
diff --git a/chrome/test/data/webui/settings/chromeos/test_profile_info_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/os_people_page/test_profile_info_browser_proxy.ts
similarity index 73%
rename from chrome/test/data/webui/settings/chromeos/test_profile_info_browser_proxy.js
rename to chrome/test/data/webui/settings/chromeos/os_people_page/test_profile_info_browser_proxy.ts
index 2695d9cd..cb35a35 100644
--- a/chrome/test/data/webui/settings/chromeos/test_profile_info_browser_proxy.js
+++ b/chrome/test/data/webui/settings/chromeos/os_people_page/test_profile_info_browser_proxy.ts
@@ -2,10 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+import {ProfileInfo, ProfileInfoBrowserProxy} from 'chrome://os-settings/os_settings.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
-/** @implements {ProfileInfoBrowserProxy} */
-export class TestProfileInfoBrowserProxy extends TestBrowserProxy {
+export class TestProfileInfoBrowserProxy extends TestBrowserProxy implements
+    ProfileInfoBrowserProxy {
+  fakeProfileInfo: ProfileInfo;
+
   constructor() {
     super([
       'getProfileInfo',
@@ -19,14 +22,12 @@
     };
   }
 
-  /** @override */
-  getProfileInfo() {
+  getProfileInfo(): Promise<ProfileInfo> {
     this.methodCalled('getProfileInfo');
     return Promise.resolve(this.fakeProfileInfo);
   }
 
-  /** @override */
-  getProfileStatsCount() {
+  getProfileStatsCount(): void {
     this.methodCalled('getProfileStatsCount');
   }
 }
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 04b8af2..58e6ac25 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -555,8 +555,8 @@
  ],
  ['NearbyShareReceiveDialog', 'nearby_share_receive_dialog_tests.js'],
  [
-   'NearbyShareSubpage',
-   'nearby_share_subpage_tests.js',
+   'NearbySharePageNearbyShareSubpage',
+   'nearby_share_page/nearby_share_subpage_test.js',
    {enabled: ['features::kNearbySharing']},
  ],
  ['OncMojoTest', 'onc_mojo_test.js'],
diff --git a/chrome/updater/device_management/dm_client.cc b/chrome/updater/device_management/dm_client.cc
index 11655c9b..d71f621 100644
--- a/chrome/updater/device_management/dm_client.cc
+++ b/chrome/updater/device_management/dm_client.cc
@@ -75,7 +75,7 @@
   GURL GetDMServerUrl() const override { return server_url_; }
 
   std::string GetAgentParameter() const override {
-    return base::StrCat({"Updater-", kUpdaterVersion});
+    return GetUpdaterUserAgent();
   }
 
   std::string GetPlatformParameter() const override;
diff --git a/chrome/updater/net/network_fetcher_mac.mm b/chrome/updater/net/network_fetcher_mac.mm
index 92553ab..e3c003ec 100644
--- a/chrome/updater/net/network_fetcher_mac.mm
+++ b/chrome/updater/net/network_fetcher_mac.mm
@@ -26,6 +26,7 @@
 #include "chrome/updater/constants.h"
 #include "chrome/updater/net/network.h"
 #include "chrome/updater/policy/service.h"
+#include "chrome/updater/util/util.h"
 #include "components/update_client/network.h"
 #import "net/base/mac/url_conversions.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -343,6 +344,8 @@
   urlRequest.HTTPMethod = @"POST";
   urlRequest.HTTPBody = [[NSData alloc] initWithBytes:post_data.c_str()
                                                length:post_data.size()];
+  [urlRequest setValue:base::SysUTF8ToNSString(GetUpdaterUserAgent())
+      forHTTPHeaderField:@"User-Agent"];
   [urlRequest addValue:base::SysUTF8ToNSString(content_type)
       forHTTPHeaderField:@"Content-Type"];
 
diff --git a/chrome/updater/net/network_fetcher_win.cc b/chrome/updater/net/network_fetcher_win.cc
index dba31425..ac28ae7 100644
--- a/chrome/updater/net/network_fetcher_win.cc
+++ b/chrome/updater/net/network_fetcher_win.cc
@@ -18,12 +18,10 @@
 #include "base/logging.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
-#include "base/strings/strcat.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/updater/policy/service.h"
-#include "chrome/updater/updater_branding.h"
-#include "chrome/updater/updater_version.h"
+#include "chrome/updater/util/util.h"
 #include "chrome/updater/util/win_util.h"
 #include "chrome/updater/win/user_info.h"
 #include "components/update_client/network.h"
@@ -188,9 +186,7 @@
       : proxy_configuration_(
             GetProxyConfiguration(policy_service_proxy_configuration)),
         session_handle_(winhttp::CreateSessionHandle(
-            base::StrCat({base::ASCIIToWide(PRODUCT_FULLNAME_STRING), L" ",
-                          kUpdaterVersionUtf16})
-                .c_str(),
+            base::ASCIIToWide(GetUpdaterUserAgent()).c_str(),
             proxy_configuration_->access_type())) {}
 
   std::unique_ptr<update_client::NetworkFetcher> Create() {
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc
index 44eeec3..413c6e66 100644
--- a/chrome/updater/test/integration_tests.cc
+++ b/chrome/updater/test/integration_tests.cc
@@ -951,11 +951,7 @@
   ASSERT_TRUE(WaitForUpdaterExit());
 
   ASSERT_NO_FATAL_FAILURE(ExpectAppVersion(kAppId, v1));
-
-  // TODO(crbug.com/1471724): An overinstall with a new AP should change the AP.
-  // Once this is fixed, the below assertion should be:
-  // ASSERT_NO_FATAL_FAILURE(ExpectAppTag(kAppId, "foo2"));
-  ASSERT_NO_FATAL_FAILURE(ExpectAppTag(kAppId, "foo"));
+  ASSERT_NO_FATAL_FAILURE(ExpectAppTag(kAppId, "foo2"));
 
   ASSERT_NO_FATAL_FAILURE(ExpectUninstallPing(&test_server));
   ASSERT_NO_FATAL_FAILURE(Uninstall());
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc
index 4ef98a4..0e8ba91 100644
--- a/chrome/updater/test/integration_tests_impl.cc
+++ b/chrome/updater/test/integration_tests_impl.cc
@@ -300,9 +300,10 @@
   test_server->ExpectOnce(
       {request::GetPathMatcher(base::StringPrintf(
            R"(%s\?request=%s&apptype=Chrome&)"
-           R"(agent=Updater-%s&platform=.*&deviceid=%s)",
+           R"(agent=%s\+%s&platform=.*&deviceid=%s)",
            test_server->device_management_path().c_str(), request_type.c_str(),
-           kUpdaterVersion, GetDefaultDMStorage()->GetDeviceID().c_str())),
+           PRODUCT_FULLNAME_STRING, kUpdaterVersion,
+           GetDefaultDMStorage()->GetDeviceID().c_str())),
        request::GetHeaderMatcher(
            "Authorization",
            base::StringPrintf("%s token=%s", authorization_type.c_str(),
diff --git a/chrome/updater/tools/print_guids_for_version.py b/chrome/updater/tools/print_guids_for_version.py
new file mode 100644
index 0000000..13ec96a
--- /dev/null
+++ b/chrome/updater/tools/print_guids_for_version.py
@@ -0,0 +1,86 @@
+# 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.
+"""A script that prints the generated IIDs/CLSIDs/LIBIDs for the COM interfaces,
+classes, and libraries.
+
+The entries in this file need to be kept in sync with the corresponding values
+in `chrome/updater/app/server/win/BUILD.gn`.
+
+Usage:
+    python3 print_guids_for_version.py --version "119.0.5999.0"
+"""
+
+import argparse
+import uuid
+
+
+def _Main():
+    """Prints the COM IIDs/CLSIDs/LIBIDs."""
+    cmd_parser = argparse.ArgumentParser(
+        description='Script to print the COM IIDs/CLSIDs/LIBIDs.')
+
+    cmd_parser.add_argument('--version',
+                            dest='version',
+                            type=str,
+                            required=True,
+                            help='updater version to print the GUIDs for.')
+    flags = cmd_parser.parse_args()
+
+    # These GUIDs must depend on branding only.
+    branding_only_placeholder_guids = {
+        "69464FF0-D9EC-4037-A35F-8AE4358106CC": "UpdaterLib",
+        "158428a4-6014-4978-83ba-9fad0dabe791": "UpdaterUserClass",
+        "415FD747-D79E-42D7-93AC-1BA6E5FD4E93": "UpdaterSystemClass",
+        "63B8FFB1-5314-48C9-9C57-93EC8BC6184B": "IUpdater",
+        "02AFCB67-0899-4676-91A9-67D92B3B7918": "IUpdaterUser",
+        "FCE335F3-A55C-496E-814F-85971C9FA6F1": "IUpdaterSystem",
+        "46ACF70B-AC13-406D-B53B-B2C4BF091FF6": "IUpdateState",
+        "C3485D9F-C684-4C43-B85B-E339EA395C29": "IUpdateStateUser",
+        "EA6FDC05-CDC5-4EA4-AB41-CCBD1040A2B5": "IUpdateStateSystem",
+        "2FCD14AF-B645-4351-8359-E80A0E202A0B": "ICompleteStatus",
+        "9AD1A645-5A4B-4D36-BC21-F0059482E6EA": "ICompleteStatusUser",
+        "E2BD9A6B-0A19-4C89-AE8B-B7E9E51D9A07": "ICompleteStatusSystem",
+        "7B416CFD-4216-4FD6-BD83-7C586054676E": "IUpdaterObserver",
+        "B54493A0-65B7-408C-B650-06265D2182AC": "IUpdaterObserverUser",
+        "057B500A-4BA2-496A-B1CD-C5DED3CCC61B": "IUpdaterObserverSystem",
+        "8BAB6F84-AD67-4819-B846-CC890880FD3B": "IUpdaterCallback",
+        "34ADC89D-552B-4102-8AE5-D613A691335B": "IUpdaterCallbackUser",
+        "F0D6763A-0182-4136-B1FA-508E334CFFC1": "IUpdaterCallbackSystem",
+        "A22AFC54-2DEF-4578-9187-DB3B24381090": "IUpdaterAppState",
+        "028FEB84-44BC-4A73-A0CD-603678155CC3": "IUpdaterAppStateUser",
+        "92631531-8044-46F4-B645-CDFBCCC7FA3B": "IUpdaterAppStateSystem",
+        "EFE903C0-E820-4136-9FAE-FDCD7F256302": "IUpdaterAppStatesCallback",
+        "BCFCF95C-DE48-4F42-B0E9-D50DB407DB53":
+        "IUpdaterAppStatesCallbackUser",
+        "2CB8867E-495E-459F-B1B6-2DD7FFDBD462":
+        "IUpdaterAppStatesCallbackSystem",
+    }
+
+    # These GUIDs must depend on branding and version.
+    branding_version_placeholder_guids = {
+        "C6CE92DB-72CA-42EF-8C98-6EE92481B3C9": "UpdaterInternalLib",
+        "1F87FE2F-D6A9-4711-9D11-8187705F8457": "UpdaterInternalUserClass",
+        "4556BA55-517E-4F03-8016-331A43C269C9": "UpdaterInternalSystemClass",
+        "526DA036-9BD3-4697-865A-DA12D37DFFCA": "IUpdaterInternal",
+        "C82AFDA3-CA76-46EE-96E9-474717BFA7BA": "IUpdaterInternalUser",
+        "E690EB97-6E46-4361-AF8F-90A4F5496475": "IUpdaterInternalSystem",
+        "D272C794-2ACE-4584-B993-3B90C622BE65": "IUpdaterInternalCallback",
+        "618D9B82-9F51-4490-AF24-BB80489E1537": "IUpdaterInternalCallbackUser",
+        "7E806C73-B2A4-4BC5-BDAD-2249D87F67FC":
+        "IUpdaterInternalCallbackSystem",
+    }
+
+    updater_product_full_name = "GoogleUpdater"
+    name = updater_product_full_name
+    for key, interface_name in branding_only_placeholder_guids.items():
+        print(interface_name, ":",
+              str(uuid.uuid5(uuid.UUID(key), name)).upper())
+    name = updater_product_full_name + flags.version
+    for key, interface_name in branding_version_placeholder_guids.items():
+        print(interface_name, ":",
+              str(uuid.uuid5(uuid.UUID(key), name)).upper())
+
+
+if __name__ == '__main__':
+    _Main()
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc
index 56ee2a6a..9c01b995 100644
--- a/chrome/updater/update_service_impl.cc
+++ b/chrome/updater/update_service_impl.cc
@@ -581,6 +581,13 @@
     // Pre-register the app if there is no registration for it. This app
     // registration is removed later if the app install encounters an error.
     persisted_data_->RegisterApp(registration);
+  } else {
+    // Update brand and ap.
+    RegistrationRequest request;
+    request.app_id = registration.app_id;
+    request.brand_code = registration.brand_code;
+    request.ap = registration.ap;
+    persisted_data_->RegisterApp(request);
   }
 
   std::multimap<std::string, base::RepeatingClosure>::iterator pos =
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc
index 60c7bd7d..4ca7a48 100644
--- a/chrome/updater/updater.cc
+++ b/chrome/updater/updater.cc
@@ -129,8 +129,18 @@
 #endif
 
   InitializeThreadPool("updater");
-  const base::ScopedClosureRunner shutdown_thread_pool(
-      base::BindOnce([] { base::ThreadPoolInstance::Get()->Shutdown(); }));
+  const base::ScopedClosureRunner shutdown_thread_pool(base::BindOnce([] {
+    // For the updater, it is important to join all threads before `UpdaterMain`
+    // exits, otherwise the behavior of the program is undefined. The threads
+    // in the pool can still run after shutdown to handle CONTINUE_ON_SHUTDOWN
+    // tasks, for example. In Chrome, the thread pool is leaked for this reason
+    // and there is no way to join its threads in production code. The updater
+    // has no such requirements (crbug.com/1484776).
+    base::ThreadPoolInstance* thread_pool = base::ThreadPoolInstance::Get();
+    thread_pool->Shutdown();
+    thread_pool->JoinForTesting();  // IN-TEST
+    base::ThreadPoolInstance::Set(nullptr);
+  }));
 
   // Records a backtrace in the log, crashes the program, saves a crash dump,
   // and reports the crash.
diff --git a/chrome/updater/util/util.cc b/chrome/updater/util/util.cc
index 974f32c9..17579bea 100644
--- a/chrome/updater/util/util.cc
+++ b/chrome/updater/util/util.cc
@@ -281,6 +281,10 @@
           << settings.log_file_path;
 }
 
+std::string GetUpdaterUserAgent() {
+  return base::StrCat({PRODUCT_FULLNAME_STRING, " ", kUpdaterVersion});
+}
+
 // This function and the helper functions are copied from net/base/url_util.cc
 // to avoid the dependency on //net.
 GURL AppendQueryParameter(const GURL& url,
diff --git a/chrome/updater/util/util.h b/chrome/updater/util/util.h
index 4aaa2cc..a46c6e4 100644
--- a/chrome/updater/util/util.h
+++ b/chrome/updater/util/util.h
@@ -132,6 +132,9 @@
 // Initializes logging for an executable.
 void InitLogging(UpdaterScope updater_scope);
 
+// Returns HTTP user-agent value.
+std::string GetUpdaterUserAgent();
+
 // Returns a new GURL by appending the given query parameter name and the
 // value. Unsafe characters in the name and the value are escaped like
 // %XX%XX. The original query component is preserved if it's present.
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 250f756..95ced761 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-15620.0.0
\ No newline at end of file
+15621.0.0
\ No newline at end of file
diff --git a/chromeos/ash/components/growth/campaigns_manager.cc b/chromeos/ash/components/growth/campaigns_manager.cc
index b1de8b79..9233db2 100644
--- a/chromeos/ash/components/growth/campaigns_manager.cc
+++ b/chromeos/ash/components/growth/campaigns_manager.cc
@@ -18,10 +18,14 @@
 
 CampaignsManager* g_instance = nullptr;
 
+inline constexpr char kCampaignFileName[] = "campaigns.json";
+
 absl::optional<base::Value::Dict> ReadCampaignsFile(
-    const base::FilePath& campaigns_file_path) {
+    const base::FilePath& campaigns_component_path) {
   std::string campaigns_data;
-  if (!base::ReadFileToString(campaigns_file_path, &campaigns_data)) {
+  if (!base::ReadFileToString(
+          campaigns_component_path.Append(kCampaignFileName),
+          &campaigns_data)) {
     LOG(ERROR) << "Failed to read campaigns file from disk.";
     return absl::nullopt;
   }
diff --git a/chromeos/ash/components/growth/campaigns_manager_unittest.cc b/chromeos/ash/components/growth/campaigns_manager_unittest.cc
index a6596d2..5e5bc12 100644
--- a/chromeos/ash/components/growth/campaigns_manager_unittest.cc
+++ b/chromeos/ash/components/growth/campaigns_manager_unittest.cc
@@ -111,7 +111,7 @@
 
   EXPECT_CALL(mock_client_, LoadCampaignsComponent(_))
       .WillOnce(InvokeCallbackArgument<0, CampaignComponentLoadedCallback>(
-          campaigns_file));
+          temp_dir_.GetPath()));
 
   campaigns_manager_->LoadCampaigns();
   observer.Wait();
diff --git a/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc b/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc
index ef10009d..e8245734 100644
--- a/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc
+++ b/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc
@@ -79,6 +79,16 @@
                           absl::nullopt);
 }
 
+void FakeQuickStartDecoder::DecodeQuickStartMessage(
+    const absl::optional<std::vector<uint8_t>>& data,
+    DecodeQuickStartMessageCallback callback) {
+  if (error_ != absl::nullopt) {
+    std::move(callback).Run(nullptr, error_);
+  } else {
+    std::move(callback).Run(std::move(quick_start_message_), absl::nullopt);
+  }
+}
+
 void FakeQuickStartDecoder::SetUserVerificationRequested(
     bool is_awaiting_user_verification) {
   user_verification_request_ =
@@ -127,4 +137,9 @@
   error_ = error;
 }
 
+void FakeQuickStartDecoder::SetQuickStartMessage(
+    mojom::QuickStartMessagePtr quick_start_message) {
+  quick_start_message_ = std::move(quick_start_message);
+}
+
 }  // namespace ash::quick_start
diff --git a/chromeos/ash/components/quick_start/fake_quick_start_decoder.h b/chromeos/ash/components/quick_start/fake_quick_start_decoder.h
index 66628f69..193be64d 100644
--- a/chromeos/ash/components/quick_start/fake_quick_start_decoder.h
+++ b/chromeos/ash/components/quick_start/fake_quick_start_decoder.h
@@ -42,6 +42,9 @@
   void DecodeUserVerificationResult(
       const absl::optional<std::vector<uint8_t>>& data,
       DecodeUserVerificationResultCallback callback) override;
+  void DecodeQuickStartMessage(
+      const absl::optional<std::vector<uint8_t>>& data,
+      DecodeQuickStartMessageCallback callback) override;
 
   void SetExpectedData(std::vector<uint8_t> expected_data);
   void SetAssertionResponse(mojom::FidoAssertionResponsePtr fido_assertion);
@@ -64,6 +67,8 @@
       const std::string& cryptauth_device_id,
       absl::optional<mojom::QuickStartDecoderError> error);
 
+  void SetQuickStartMessage(mojom::QuickStartMessagePtr quick_start_message);
+
  private:
   std::vector<uint8_t> expected_data_;
   mojo::ReceiverSet<ash::quick_start::mojom::QuickStartDecoder> receiver_set_;
@@ -72,6 +77,7 @@
   mojom::FidoAssertionResponsePtr fido_assertion_;
   mojom::UserVerificationRequestedPtr user_verification_request_;
   mojom::UserVerificationResponsePtr user_verification_response_;
+  mojom::QuickStartMessagePtr quick_start_message_;
   absl::optional<mojom::QuickStartDecoderError> error_;
   std::string response_cryptauth_device_id_;
 };
diff --git a/chromeos/ash/components/scalable_iph/scalable_iph_constants.h b/chromeos/ash/components/scalable_iph/scalable_iph_constants.h
index dc58c653..5e3bcf9 100644
--- a/chromeos/ash/components/scalable_iph/scalable_iph_constants.h
+++ b/chromeos/ash/components/scalable_iph/scalable_iph_constants.h
@@ -9,6 +9,8 @@
 
 namespace scalable_iph {
 
+constexpr char16_t kNotificationSummaryText[] = u"Welcome Tips";
+
 constexpr char kScalableIphDebugHost[] = "scalable-iph-debug";
 constexpr char kScalableIphDebugURL[] =
     "chrome-untrusted://scalable-iph-debug/";
diff --git a/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h b/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h
index 40a34674..cc4b0fe3 100644
--- a/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h
+++ b/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h
@@ -68,6 +68,12 @@
                DecodeUserVerificationRequestedCallback callback),
               (override));
 
+  MOCK_METHOD(void,
+              DecodeQuickStartMessage,
+              (const absl::optional<std::vector<uint8_t>>& data,
+               DecodeQuickStartMessageCallback callback),
+              (override));
+
  private:
   mojo::ReceiverSet<ash::quick_start::mojom::QuickStartDecoder> receiver_set_;
   mojo::SharedRemote<ash::quick_start::mojom::QuickStartDecoder> shared_remote_;
diff --git a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom
index 5732b45..00bf1ba 100644
--- a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom
+++ b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom
@@ -52,4 +52,10 @@
   // Decode the UserVerificationResult sent from the target device.
   DecodeUserVerificationResult(array<uint8>? data) => (
     UserVerificationResponse? response, QuickStartDecoderError? error);
+
+  // Decode any kind of Quick Start message and return either a
+  // QuickStartMessage, which is a union over all the message types, or an
+  // error if the data cannot be parsed as any known message.
+  DecodeQuickStartMessage(array<uint8>? data) => (
+    QuickStartMessage? result, QuickStartDecoderError? error);
 };
diff --git a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom
index 9b23fe7..8136615d 100644
--- a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom
+++ b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom
@@ -34,11 +34,13 @@
   bool is_awaiting_user_verification;
 };
 
-// TODO (b/291903244): Convert Responses on QuickStartDecoder to Union Type
 enum QuickStartDecoderError {
   kEmptyMessage = 0,
   kUnableToReadAsJSON = 1,
   kMessageDoesNotMatchSchema = 2,
+  kUnexpectedMessageType = 3,
+  kUnknownPayload = 4,
+  kUnableToReadAsBase64 = 5,
 };
 
 struct WifiCredentials {
@@ -63,3 +65,12 @@
 struct NotifySourceOfUpdateResponse {
   bool ack_received;
 };
+
+union QuickStartMessage {
+  BootstrapConfigurations bootstrap_configurations;
+  WifiCredentials wifi_credentials;
+  NotifySourceOfUpdateResponse notify_source_of_update_response;
+  FidoAssertionResponse fido_assertion_response;
+  UserVerificationRequested user_verification_requested;
+  UserVerificationResponse user_verification_response;
+};
diff --git a/chromeos/ash/services/orca/public/mojom/orca_service.mojom b/chromeos/ash/services/orca/public/mojom/orca_service.mojom
index f7466f4..60bd6bc 100644
--- a/chromeos/ash/services/orca/public/mojom/orca_service.mojom
+++ b/chromeos/ash/services/orca/public/mojom/orca_service.mojom
@@ -6,7 +6,7 @@
 // the Chromium repo. This file should be updated first, before syncing in the
 // other repos.
 
-// Next MinVersion: 2
+// Next MinVersion: 3
 
 module ash.orca.mojom;
 
@@ -120,8 +120,17 @@
   // Requests the service to perform a freeform rewrite.
   RequestFreeformWrite@3(string input) => (TextQueryResponse response);
 
-  // Insert the given text into the current text input target.
+  // Inserts the given text into the current text input target.
   InsertText@4(string text);
+
+  // Sends a consent approval to the service.
+  [MinVersion=2] ApproveConsent@5();
+
+  // Sends a consent declinal to the service.
+  [MinVersion=2] DeclineConsent@6();
+
+  // Sends a consent dismissal to the service.
+  [MinVersion=2] DismissConsent@7();
 };
 
 // Used by the UI to bootstrap the connection with the service.
@@ -144,6 +153,12 @@
 interface TextActuator {
   // Close the UI and insert `text` into the focused input field.
   InsertText@0(string text);
+
+  // Processes the consent approval.
+  [MinVersion=2] ApproveConsent@1();
+
+  // Processes the consent declinal.
+  [MinVersion=2] DeclineConsent@2();
 };
 
 // An interface that can respond to text query requests with responses.
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index ece9ee6..d81af05 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -4112,6 +4112,12 @@
             that includes a top row key but does not include the search key">
           Shortcut with top row keys need to include the search key.
         </message>
+        <message name="IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE"
+            desc="The status message that displays when user press a key combination
+            that includes the search key with a function key."
+            translateable="false">
+          Shortcut with function keys and search are not allowed. Press a new shortcut.
+        </message>
         <message name="IDS_SHORTCUT_CUSTOMIZATION_NON_SEARCH_SHORTCUT_WARNING"
             desc="The status (warning) message that displays when user attempts to input a shortcut that does not include the search/meta key.">
           Shortcut without search key might conflict with some app's shortcut. Press this shortcut again to continue using it, or press a new shortcut using the search key.
diff --git a/chromeos/chromeos_strings_grd/IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE.png.sha1
new file mode 100644
index 0000000..2ecef41
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE.png.sha1
@@ -0,0 +1 @@
+d8e8f3f9b654a65152d0220a1c4570a3a7ec6547
\ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 49dec930..32196d4c 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -230,6 +230,9 @@
   # https://crbug.com/1483337
   "lacros.Activate.keep_alive",
 
+  # b/301133350
+  "privacyhub.SettingsPage.feature_v1_mic_cam_loc_golden",
+
   # READ COMMENT AT TOP BEFORE ADDING NEW TESTS HERE.
 ]
 
diff --git a/clank b/clank
index e3a3ec4..ca072aad 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit e3a3ec407403dece9002c87d4de7130e2ab877e4
+Subproject commit ca072aadc88771c0536b5c9b92925967b0dae51c
diff --git a/components/attribution_reporting/event_report_windows.cc b/components/attribution_reporting/event_report_windows.cc
index d42ffe3..c94c794 100644
--- a/components/attribution_reporting/event_report_windows.cc
+++ b/components/attribution_reporting/event_report_windows.cc
@@ -35,7 +35,6 @@
 constexpr char kStartTime[] = "start_time";
 constexpr char kEndTimes[] = "end_times";
 
-constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1);
 constexpr base::TimeDelta kMinReportWindow = base::Hours(1);
 
 bool EventReportWindowsValid(base::TimeDelta start_time,
@@ -72,7 +71,7 @@
                                   base::TimeDelta deadline) {
   // Valid conversion reports should always have a valid reporting deadline.
   DCHECK(deadline.is_positive());
-  return source_time + deadline + kWindowDeadlineOffset;
+  return source_time + deadline;
 }
 
 }  // namespace
diff --git a/components/attribution_reporting/event_report_windows_unittest.cc b/components/attribution_reporting/event_report_windows_unittest.cc
index 9d2b4b5..4c9123b8 100644
--- a/components/attribution_reporting/event_report_windows_unittest.cc
+++ b/components/attribution_reporting/event_report_windows_unittest.cc
@@ -21,8 +21,6 @@
 using ::attribution_reporting::mojom::SourceRegistrationError;
 using WindowResult = EventReportWindows::WindowResult;
 
-constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1);
-
 TEST(EventReportWindowsTest, CreateWindow) {
   const struct {
     base::TimeDelta window_time;
@@ -369,27 +367,27 @@
   } kTestCases[] = {
       {
           .trigger_time = source_time,
-          .expected = source_time + base::Hours(2) + kWindowDeadlineOffset,
+          .expected = source_time + base::Hours(2),
       },
       {
           .trigger_time = source_time + base::Hours(2) - base::Milliseconds(1),
-          .expected = source_time + base::Hours(2) + kWindowDeadlineOffset,
+          .expected = source_time + base::Hours(2),
       },
       {
           .trigger_time = source_time + base::Hours(2),
-          .expected = source_time + base::Days(1) + kWindowDeadlineOffset,
+          .expected = source_time + base::Days(1),
       },
       {
           .trigger_time = source_time + base::Days(1) - base::Milliseconds(1),
-          .expected = source_time + base::Days(1) + kWindowDeadlineOffset,
+          .expected = source_time + base::Days(1),
       },
       {
           .trigger_time = source_time + base::Days(1),
-          .expected = source_time + base::Days(7) + kWindowDeadlineOffset,
+          .expected = source_time + base::Days(7),
       },
       {
           .trigger_time = source_time + base::Days(7),
-          .expected = source_time + base::Days(7) + kWindowDeadlineOffset,
+          .expected = source_time + base::Days(7),
       }};
 
   for (const auto& test_case : kTestCases) {
@@ -407,19 +405,18 @@
   const struct {
     int index;
     base::Time expected;
-  } kTestCases[] = {
-      {
-          .index = 0,
-          .expected = source_time + base::Hours(1) + kWindowDeadlineOffset,
-      },
-      {
-          .index = 1,
-          .expected = source_time + base::Days(3) + kWindowDeadlineOffset,
-      },
-      {
-          .index = 2,
-          .expected = source_time + base::Days(7) + kWindowDeadlineOffset,
-      }};
+  } kTestCases[] = {{
+                        .index = 0,
+                        .expected = source_time + base::Hours(1),
+                    },
+                    {
+                        .index = 1,
+                        .expected = source_time + base::Days(3),
+                    },
+                    {
+                        .index = 2,
+                        .expected = source_time + base::Days(7),
+                    }};
 
   for (const auto& test_case : kTestCases) {
     EXPECT_EQ(
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 500be12..3a18ccb 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -639,6 +639,7 @@
     "//build:branding_buildflags",
     "//build:chromeos_buildflags",
     "//components/commerce/core:commerce_types",
+    "//components/commerce/core:utils",
     "//components/device_reauth",
     "//components/feature_engagement",
     "//components/google/core/common",
@@ -1180,6 +1181,7 @@
     "//components/policy/core/common",
     "//components/prefs:test_support",
     "//components/resources",
+    "//components/search:search",
     "//components/security_state/core",
     "//components/signin/public/identity_manager:test_support",
     "//components/strings",
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index d801bf6..283389020 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -1101,6 +1101,12 @@
 }
 
 bool BrowserAutofillManager::IsFormNonSecure(const FormData& form) const {
+  // Check if testing override applies.
+  if (consider_form_as_secure_for_testing_.has_value() &&
+      consider_form_as_secure_for_testing_.value()) {
+    return false;
+  }
+
   return IsFormOrClientNonSecure(client(), form);
 }
 
@@ -2762,6 +2768,11 @@
   return autofill_field;
 }
 
+void BrowserAutofillManager::SetConsiderFormAsSecureForTesting(
+    absl::optional<bool> consider_form_as_secure_for_testing) {
+  consider_form_as_secure_for_testing_ = consider_form_as_secure_for_testing;
+}
+
 bool BrowserAutofillManager::FormHasAddressField(const FormData& form) {
   for (const FormFieldData& field : form.fields) {
     const AutofillField* autofill_field = GetAutofillField(form, field);
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
index 3ddfcf9..fa2e31f 100644
--- a/components/autofill/core/browser/browser_autofill_manager.h
+++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -347,6 +347,11 @@
     return *autocomplete_unrecognized_fallback_logger_;
   }
 
+  // Sets the value of `consider_form_as_secure_for_testing_`. We want to
+  // set this to true for test purposes only.
+  void SetConsiderFormAsSecureForTesting(
+      absl::optional<bool> consider_form_as_secure_for_testing);
+
  protected:
   // Stores a `callback` for `form_signature`, possibly overriding an older
   // callback for `form_signature` or triggering a pending callback in case too
@@ -767,6 +772,9 @@
   bool has_observed_one_time_code_field_ = false;
   // Is there a field with phone number collection observed?
   bool has_observed_phone_number_field_ = false;
+  // If this is true, we consider the form to be secure. (Only use this for
+  // testing purposes).
+  absl::optional<bool> consider_form_as_secure_for_testing_;
 
   // When the user first interacted with a potentially fillable form on this
   // page.
diff --git a/components/autofill/core/browser/data_model/autofill_offer_data.cc b/components/autofill/core/browser/data_model/autofill_offer_data.cc
index e112912c..62d5ea5 100644
--- a/components/autofill/core/browser/data_model/autofill_offer_data.cc
+++ b/components/autofill/core/browser/data_model/autofill_offer_data.cc
@@ -11,6 +11,8 @@
 
 namespace autofill {
 
+// TODO(crbug.com/1483969): Refactor these methods and create separate
+// constructors that are specific to each offer.
 // static
 AutofillOfferData AutofillOfferData::GPayCardLinkedOffer(
     int64_t offer_id,
@@ -32,10 +34,11 @@
     const std::vector<GURL>& merchant_origins,
     const GURL& offer_details_url,
     const DisplayStrings& display_strings,
-    const std::string& promo_code) {
+    const std::string& promo_code,
+    bool is_merchant_wide) {
   return AutofillOfferData(OfferType::FREE_LISTING_COUPON_OFFER, offer_id,
                            expiry, merchant_origins, offer_details_url,
-                           display_strings, promo_code);
+                           display_strings, promo_code, is_merchant_wide);
 }
 
 // static
@@ -158,6 +161,11 @@
          base::ranges::count(merchant_origins_, origin) > 0;
 }
 
+bool AutofillOfferData::IsMerchantWideOffer() const {
+  CHECK(IsFreeListingCouponOffer());
+  return is_merchant_wide_offer_;
+}
+
 AutofillOfferData::AutofillOfferData(
     int64_t offer_id,
     const base::Time& expiry,
@@ -181,13 +189,15 @@
                                      const std::vector<GURL>& merchant_origins,
                                      const GURL& offer_details_url,
                                      const DisplayStrings& display_strings,
-                                     const std::string& promo_code)
+                                     const std::string& promo_code,
+                                     bool is_merchant_wide)
     : offer_type_(offer_type),
       offer_id_(offer_id),
       expiry_(expiry),
       offer_details_url_(offer_details_url),
       merchant_origins_(merchant_origins),
       display_strings_(display_strings),
-      promo_code_(promo_code) {}
+      promo_code_(promo_code),
+      is_merchant_wide_offer_(is_merchant_wide) {}
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/autofill_offer_data.h b/components/autofill/core/browser/data_model/autofill_offer_data.h
index e91b94c5..6d884e6 100644
--- a/components/autofill/core/browser/data_model/autofill_offer_data.h
+++ b/components/autofill/core/browser/data_model/autofill_offer_data.h
@@ -60,7 +60,8 @@
       const std::vector<GURL>& merchant_origins,
       const GURL& offer_details_url,
       const DisplayStrings& display_strings,
-      const std::string& promo_code);
+      const std::string& promo_code,
+      bool is_merchant_wide = false);
   // Returns an AutofillOfferData for a GPay promo code offer.
   static AutofillOfferData GPayPromoCodeOffer(
       int64_t offer_id,
@@ -70,6 +71,8 @@
       const DisplayStrings& display_strings,
       const std::string& promo_code);
 
+  // TODO(crbug.com/1483969): Refactor this class to ensure the correct access
+  // specifiers and move constructors and move assignment constructors.
   AutofillOfferData();
   ~AutofillOfferData();
   AutofillOfferData(const AutofillOfferData&);
@@ -100,6 +103,9 @@
   // given |origin| in the list of |merchant_origins|.
   bool IsActiveAndEligibleForOrigin(const GURL& origin) const;
 
+  // Returns true if the current offer is a site wide offer.
+  bool IsMerchantWideOffer() const;
+
   OfferType GetOfferType() const { return offer_type_; }
   int64_t GetOfferId() const { return offer_id_; }
   const base::Time& GetExpiry() const { return expiry_; }
@@ -153,7 +159,8 @@
                     const std::vector<GURL>& merchant_origins,
                     const GURL& offer_details_url,
                     const DisplayStrings& display_strings,
-                    const std::string& promo_code);
+                    const std::string& promo_code,
+                    bool is_merchant_wide = false);
 
   // The specific type of offer, which informs decisions made by other classes,
   // such as UI rendering or metrics.
@@ -191,6 +198,10 @@
 
   // A promo/gift/coupon code that can be applied at checkout with the merchant.
   std::string promo_code_;
+
+  // This only applies to free-listing offers, and it indicates whether the
+  // offer is a site-wide promo, e.g. 15% off on everything.
+  bool is_merchant_wide_offer_ = false;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager.cc b/components/autofill/core/browser/payments/autofill_offer_manager.cc
index 138dd654..cef012e 100644
--- a/components/autofill/core/browser/payments/autofill_offer_manager.cc
+++ b/components/autofill/core/browser/payments/autofill_offer_manager.cc
@@ -16,6 +16,7 @@
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/commerce/core/commerce_types.h"
+#include "components/commerce/core/commerce_utils.h"
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/search/ntp_features.h"
 #include "components/strings/grit/components_strings.h"
@@ -28,7 +29,7 @@
   return AutofillOfferData::FreeListingCouponOffer(
       discount_info.id, base::Time::FromDoubleT(discount_info.expiry_time_sec),
       {url}, url, DisplayStrings{discount_info.description_detail},
-      discount_info.discount_code.value_or(""));
+      discount_info.discount_code.value_or(""), discount_info.is_merchant_wide);
 }
 
 AutofillOfferManager::AutofillOfferManager(
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
index 1a658ec..b8028b4 100644
--- a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
+++ b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
@@ -21,6 +21,7 @@
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/commerce/core/commerce_types.h"
 #include "components/commerce/core/test_utils.h"
+#include "components/search/ntp_features.h"
 #include "components/strings/grit/components_strings.h"
 #include "components/sync/test/test_sync_service.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -46,6 +47,11 @@
     "http://www.example.com/en/payments?name=checkout";
 const char kOfferDetailsUrl[] = "http://pay.google.com";
 
+// Free-listing offer data
+constexpr char kDetail[] = "Discount description details";
+constexpr char kDiscountCode[] = "discount-code";
+constexpr int64_t kDiscountId = 123;
+
 }  // namespace
 
 class AutofillOfferManagerTest : public testing::Test {
@@ -317,18 +323,16 @@
   EXPECT_EQ(offer2, *result);
 }
 
-TEST_F(AutofillOfferManagerTest, GetShoppingServiceOfferForUrl_ReturnOffer) {
-  const GURL url("http://www.example.com");
-  const std::string detail = "Discount description detail";
-  const std::string discount_code = "discount-code";
-  const int64_t discount_id = 123;
+TEST_F(AutofillOfferManagerTest,
+       GetShoppingServiceOfferForUrl_ReturnNonMerchantWideOffer) {
+  const GURL url(kTestUrl);
   const double expiry_time_sec =
       (AutofillClock::Now() + base::Days(2)).ToDoubleT();
 
-  const AutofillOfferData expected_autofill_offer_data =
+  const AutofillOfferData expected_autofill_non_merchant_wide_offer_data =
       AutofillOfferData::FreeListingCouponOffer(
-          discount_id, base::Time::FromDoubleT(expiry_time_sec), {url}, url,
-          DisplayStrings{detail}, discount_code);
+          kDiscountId, base::Time::FromDoubleT(expiry_time_sec), {url}, url,
+          DisplayStrings{kDetail}, kDiscountCode, false);
 
   ON_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls)
       .WillByDefault([&](const std::vector<GURL>& urls,
@@ -336,8 +340,8 @@
         const commerce::DiscountsMap discounts_map{
             {url,
              {commerce::CreateValidDiscountInfo(
-                 detail, /*terms_and_conditions=*/"",
-                 /*value_in_text=*/"$10 off", discount_code, discount_id,
+                 kDetail, /*terms_and_conditions=*/"",
+                 /*value_in_text=*/"$10 off", kDiscountCode, kDiscountId,
                  /*is_merchant_wide=*/false, expiry_time_sec)}}};
         base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
             FROM_HERE, base::BindOnce(std::move(callback), discounts_map));
@@ -348,7 +352,43 @@
   EXPECT_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls);
 
   base::MockCallback<AutofillOfferManager::AsyncOfferCallback> callback;
-  EXPECT_CALL(callback, Run(url, expected_autofill_offer_data));
+  EXPECT_CALL(callback,
+              Run(url, expected_autofill_non_merchant_wide_offer_data));
+
+  autofill_offer_manager_->GetShoppingServiceOfferForUrl(url, callback.Get());
+  task_environment_.RunUntilIdle();
+}
+
+TEST_F(AutofillOfferManagerTest,
+       GetShoppingServiceOfferForUrl_ReturnMerchantWideOffer) {
+  const GURL url(kTestUrl);
+  const double expiry_time_sec =
+      (AutofillClock::Now() + base::Days(2)).ToDoubleT();
+
+  const AutofillOfferData expected_autofill_merchant_wide_offer_data =
+      AutofillOfferData::FreeListingCouponOffer(
+          kDiscountId, base::Time::FromDoubleT(expiry_time_sec), {url}, url,
+          DisplayStrings{kDetail}, kDiscountCode, true);
+
+  ON_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls)
+      .WillByDefault([&](const std::vector<GURL>& urls,
+                         commerce::DiscountInfoCallback callback) {
+        const commerce::DiscountsMap discounts_map{
+            {url,
+             {commerce::CreateValidDiscountInfo(
+                 kDetail, /*terms_and_conditions=*/"",
+                 /*value_in_text=*/"$10 off", kDiscountCode, kDiscountId,
+                 /*is_merchant_wide=*/true, expiry_time_sec)}}};
+        base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+            FROM_HERE, base::BindOnce(std::move(callback), discounts_map));
+      });
+  EXPECT_CALL(*mock_shopping_service_delegate_,
+              IsDiscountEligibleToShowOnNavigation())
+      .WillOnce(testing::Return(true));
+  EXPECT_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls);
+
+  base::MockCallback<AutofillOfferManager::AsyncOfferCallback> callback;
+  EXPECT_CALL(callback, Run(url, expected_autofill_merchant_wide_offer_data));
 
   autofill_offer_manager_->GetShoppingServiceOfferForUrl(url, callback.Get());
   task_environment_.RunUntilIdle();
@@ -356,7 +396,7 @@
 
 TEST_F(AutofillOfferManagerTest,
        GetShoppingServiceOfferForUrl_ReturnEmptyResult) {
-  const GURL url("http://www.example.com");
+  const GURL url(kTestUrl);
   ON_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls)
       .WillByDefault([](const std::vector<GURL>& urls,
                         commerce::DiscountInfoCallback callback) {
diff --git a/components/autofill/core/browser/payments/offer_notification_handler.cc b/components/autofill/core/browser/payments/offer_notification_handler.cc
index 1956771..b99d992 100644
--- a/components/autofill/core/browser/payments/offer_notification_handler.cc
+++ b/components/autofill/core/browser/payments/offer_notification_handler.cc
@@ -10,8 +10,8 @@
 #include "components/autofill/core/browser/payments/autofill_offer_manager.h"
 #include "components/autofill/core/browser/payments/offer_notification_options.h"
 #include "components/autofill/core/common/autofill_payments_features.h"
+#include "components/commerce/core/commerce_utils.h"
 #include "components/search/ntp_features.h"
-#include "net/base/url_util.h"
 #include "url/gurl.h"
 
 namespace autofill {
@@ -40,15 +40,6 @@
   return true;
 }
 
-bool UrlContainsDiscountUtmTag(const GURL& url) {
-  std::string utm_name;
-  // TODO(b:289242951): Update the utm tag and value once they are finalized.
-  if (!net::GetValueForKeyInQuery(url, "utm_source", &utm_name)) {
-    return false;
-  }
-  return utm_name == "chrome-history-cluster-with-discount";
-}
-
 }  // namespace
 
 OfferNotificationHandler::OfferNotificationHandler(
@@ -64,7 +55,7 @@
   bool show_offer_notification_sync =
       !(base::FeatureList::IsEnabled(
             ntp_features::kNtpHistoryClustersModuleDiscounts) &&
-        UrlContainsDiscountUtmTag(url)) &&
+        commerce::UrlContainsDiscountUtmTag(url)) &&
       ValidOfferExistsForUrl(url);
 
   if (show_offer_notification_sync) {
@@ -79,9 +70,10 @@
     AutofillOfferData* offer = offer_manager_->GetOfferForUrl(url);
     CHECK(IsOfferValid(offer));
     int64_t offer_id = offer->GetOfferId();
+    bool offer_id_has_shown_before = shown_notification_ids_.contains(offer_id);
     client->UpdateOfferNotification(
-        offer, {.notification_has_been_shown =
-                    shown_notification_ids_.contains(offer_id)});
+        offer, {.notification_has_been_shown = offer_id_has_shown_before,
+                .show_notification_automatically = !offer_id_has_shown_before});
     shown_notification_ids_.insert(offer_id);
   } else {
     client->DismissOfferNotification();
@@ -119,12 +111,29 @@
   if (!client || url != client->GetLastCommittedPrimaryMainFrameURL()) {
     return;
   }
-
   int64_t offer_id = offer.GetOfferId();
-  client->UpdateOfferNotification(
-      &offer, {.notification_has_been_shown =
-                   shown_notification_ids_.contains(offer_id),
-               .expand_notification_icon = true});
+  OfferNotificationOptions offer_notification_options = {
+      .notification_has_been_shown = shown_notification_ids_.contains(offer_id),
+      .expand_notification_icon = true};
+
+  // The following order of the if block matters:
+  //   * If the url contains the expected UTM tags, the notification should
+  //   always show automatically, otherwise
+  //   * If the available offer is a merchant-wide offer, the notification
+  //   should always be hidden until the user explicitly clicks on the icon.
+  //   * None of the above, falls back to whether the offer has shown before. If
+  //   the offer has shown before, the bubble will not show automatically.
+  if (base::FeatureList::IsEnabled(
+          ntp_features::kNtpHistoryClustersModuleDiscounts) &&
+      commerce::UrlContainsDiscountUtmTag(url)) {
+    offer_notification_options.show_notification_automatically = true;
+  } else if (offer.IsMerchantWideOffer()) {
+    offer_notification_options.show_notification_automatically = false;
+  } else {
+    offer_notification_options.show_notification_automatically =
+        !shown_notification_ids_.contains(offer_id);
+  }
+  client->UpdateOfferNotification(&offer, offer_notification_options);
   shown_notification_ids_.insert(offer_id);
 }
 
diff --git a/components/autofill/core/browser/payments/offer_notification_options.h b/components/autofill/core/browser/payments/offer_notification_options.h
index ab0f2ba..28a1e1b 100644
--- a/components/autofill/core/browser/payments/offer_notification_options.h
+++ b/components/autofill/core/browser/payments/offer_notification_options.h
@@ -11,10 +11,16 @@
 // should show.
 struct OfferNotificationOptions {
   // Indicates whether this notification has been shown since profile start-up.
+  // This is only used in Android.
+  // TODO(crbug.com/1483010): Revisit if we can consolidate
+  // notification_has_been_shown and show_notification_automatically.
   bool notification_has_been_shown = false;
   // Indicates whether the notification will automatically expand upon being
   // shown.
   bool expand_notification_icon = false;
+  // Indicates whether the notification bubble should be shown automatically
+  // when the user navigates to the qualified page.
+  bool show_notification_automatically = false;
 };
 
 }  // namespace autofill
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index 89348a5..c96f0b6 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -705,13 +705,6 @@
              "AutofillKeyboardAccessory_LAUNCHED",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// When enabled, Autofill suggestions from keyboard accessory chips are only
-// accepted if at least 500ms have passed between showing the accessory and
-// interacting with the accessory chip.
-BASE_FEATURE(kAutofillKeyboardAccessoryAcceptanceDelayThreshold,
-             "AutofillKeyboardAccessoryAcceptanceDelayThreshold",
-             base::FEATURE_ENABLED_BY_DEFAULT);
-
 // Controls whether the touch to fill surface is shown for credit cards on
 // Android.
 BASE_FEATURE(kAutofillTouchToFillForCreditCardsAndroid,
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index baa2336..91bf64f 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -243,8 +243,6 @@
 #if BUILDFLAG(IS_ANDROID)
 COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillKeyboardAccessory);
 COMPONENT_EXPORT(AUTOFILL)
-BASE_DECLARE_FEATURE(kAutofillKeyboardAccessoryAcceptanceDelayThreshold);
-COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillTouchToFillForCreditCardsAndroid);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillVirtualViewStructureAndroid);
diff --git a/components/commerce/core/BUILD.gn b/components/commerce/core/BUILD.gn
index 00ae01b..5e19295 100644
--- a/components/commerce/core/BUILD.gn
+++ b/components/commerce/core/BUILD.gn
@@ -192,8 +192,6 @@
     "discounts_storage.h",
     "metrics/scheduled_metrics_manager.cc",
     "metrics/scheduled_metrics_manager.h",
-    "parcel_manager.cc",
-    "parcel_manager.h",
     "price_tracking_utils.cc",
     "price_tracking_utils.h",
     "shopping_bookmark_model_observer.cc",
@@ -413,5 +411,17 @@
 source_set("commerce_types") {
   sources = [ "commerce_types.h" ]
 
-  deps = [ "//url" ]
+  deps = [
+    ":proto",
+    "//base",
+    "//url",
+  ]
+}
+
+source_set("utils") {
+  sources = [
+    "commerce_utils.cc",
+    "commerce_utils.h",
+  ]
+  deps = [ "//net:net" ]
 }
diff --git a/components/commerce/core/DEPS b/components/commerce/core/DEPS
index cf4aac0..5d5f31a 100644
--- a/components/commerce/core/DEPS
+++ b/components/commerce/core/DEPS
@@ -20,6 +20,7 @@
   "+components/variations",
   "+mojo/public/cpp/bindings",
   "+net/base/registry_controlled_domains/registry_controlled_domain.h",
+  "+net/base/url_util.h",
   "+net/http",
   "+net/base",
   "+net/traffic_annotation",
diff --git a/components/commerce/core/commerce_types.h b/components/commerce/core/commerce_types.h
index 5d5fdab..56204c6 100644
--- a/components/commerce/core/commerce_types.h
+++ b/components/commerce/core/commerce_types.h
@@ -5,9 +5,14 @@
 #ifndef COMPONENTS_COMMERCE_CORE_COMMERCE_TYPES_H_
 #define COMPONENTS_COMMERCE_CORE_COMMERCE_TYPES_H_
 
+#include <map>
+#include <memory>
 #include <string>
 #include <vector>
 
+#include "base/functional/callback.h"
+#include "base/time/time.h"
+#include "components/commerce/core/proto/parcel.pb.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
@@ -122,6 +127,21 @@
   bool server_image_available{false};
 };
 
+// Information returned by Parcels API.
+struct ParcelTrackingStatus {
+ public:
+  ParcelTrackingStatus();
+  explicit ParcelTrackingStatus(const ParcelStatus&);
+  ParcelTrackingStatus(const ParcelTrackingStatus&);
+  ParcelTrackingStatus& operator=(const ParcelTrackingStatus&);
+  ~ParcelTrackingStatus();
+
+  ParcelIdentifier::Carrier carrier;
+  std::string tracking_id;
+  GURL tracking_url;
+  base::Time estimated_delivery_time;
+};
+
 // Callbacks and typedefs for various accessors in the shopping service.
 using DiscountsMap = std::map<GURL, std::vector<DiscountInfo>>;
 using DiscountInfoCallback = base::OnceCallback<void(const DiscountsMap&)>;
@@ -135,7 +155,9 @@
                             const absl::optional<const ProductInfo>&)>;
 using IsShoppingPageCallback =
     base::OnceCallback<void(const GURL&, absl::optional<bool>)>;
-
+using GetParcelStatusCallback = base::OnceCallback<
+    void(bool /*success*/, std::unique_ptr<std::vector<ParcelTrackingStatus>>)>;
+using StopParcelTrackingCallback = base::OnceCallback<void(bool /*success*/)>;
 }  // namespace commerce
 
 #endif  // COMPONENTS_COMMERCE_CORE_COMMERCE_TYPES_H_
diff --git a/components/commerce/core/commerce_utils.cc b/components/commerce/core/commerce_utils.cc
new file mode 100644
index 0000000..aba63cf
--- /dev/null
+++ b/components/commerce/core/commerce_utils.cc
@@ -0,0 +1,26 @@
+// 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 "components/commerce/core/commerce_utils.h"
+
+#include "net/base/url_util.h"
+#include "url/gurl.h"
+
+namespace commerce {
+
+namespace {
+// TODO(b:289242951): Update the utm tag and value once they are finalized.
+constexpr char kUtmSourceTag[] = "utm_source";
+constexpr char kUtmSourceValue[] = "chrome-history-cluster-with-discount";
+}  // namespace
+
+bool UrlContainsDiscountUtmTag(const GURL& url) {
+  std::string utm_name;
+  if (!net::GetValueForKeyInQuery(url, kUtmSourceTag, &utm_name)) {
+    return false;
+  }
+  return utm_name == kUtmSourceValue;
+}
+
+}  // namespace commerce
diff --git a/components/commerce/core/commerce_utils.h b/components/commerce/core/commerce_utils.h
new file mode 100644
index 0000000..a50a6bed
--- /dev/null
+++ b/components/commerce/core/commerce_utils.h
@@ -0,0 +1,17 @@
+// 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 COMPONENTS_COMMERCE_CORE_COMMERCE_UTILS_H_
+#define COMPONENTS_COMMERCE_CORE_COMMERCE_UTILS_H_
+
+class GURL;
+
+namespace commerce {
+
+// Returns whether the `url` contains the discount utm tags.
+bool UrlContainsDiscountUtmTag(const GURL& url);
+
+}  // namespace commerce
+
+#endif  // COMPONENTS_COMMERCE_CORE_COMMERCE_UTILS_H_
diff --git a/components/commerce/core/parcel/BUILD.gn b/components/commerce/core/parcel/BUILD.gn
index c8718d81..0590870 100644
--- a/components/commerce/core/parcel/BUILD.gn
+++ b/components/commerce/core/parcel/BUILD.gn
@@ -4,13 +4,18 @@
 
 source_set("parcel") {
   sources = [
+    "parcels_manager.cc",
+    "parcels_manager.h",
     "parcels_server_proxy.cc",
     "parcels_server_proxy.h",
     "parcels_storage.cc",
     "parcels_storage.h",
   ]
   deps = [
+    "//base",
+    "//components/commerce/core:account_checker",
     "//components/commerce/core:commerce_constants",
+    "//components/commerce/core:commerce_types",
     "//components/commerce/core:feature_list",
     "//components/commerce/core:parcel_tracking_db_content_proto",
     "//components/commerce/core:proto",
@@ -28,13 +33,17 @@
 source_set("unit_tests") {
   testonly = true
 
-  sources = [ "parcels_server_proxy_unittest.cc" ]
+  sources = [
+    "parcels_server_proxy_unittest.cc",
+    "parcels_storage_unittest.cc",
+  ]
 
   # Expose all deps for test support.
   public_deps = [
     ":parcel",
     "//base/test:test_support",
     "//components/commerce/core:commerce_constants",
+    "//components/commerce/core:parcel_tracking_db_content_proto",
     "//components/commerce/core:proto",
     "//components/endpoint_fetcher:test_support",
     "//components/signin/public/identity_manager:test_support",
diff --git a/components/commerce/core/parcel/parcels_manager.cc b/components/commerce/core/parcel/parcels_manager.cc
new file mode 100644
index 0000000..aa33905
--- /dev/null
+++ b/components/commerce/core/parcel/parcels_manager.cc
@@ -0,0 +1,100 @@
+// 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 "components/commerce/core/parcel/parcels_manager.h"
+
+#include "base/functional/bind.h"
+#include "components/commerce/core/parcel/parcels_server_proxy.h"
+#include "components/commerce/core/parcel/parcels_storage.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+
+namespace commerce {
+
+namespace {
+
+void OnGetParcelStatusDone(
+    GetParcelStatusCallback callback,
+    ParcelRequestStatus request_status,
+    std::unique_ptr<std::vector<ParcelStatus>> parcel_status) {
+  auto result = std::make_unique<std::vector<ParcelTrackingStatus>>();
+  for (auto& status : *parcel_status) {
+    result->emplace_back(status);
+  }
+  std::move(callback).Run(request_status == ParcelRequestStatus::kSuccess,
+                          std::move(result));
+}
+
+std::vector<ParcelIdentifier> ConvertParcelIdentifier(
+    const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+        parcel_identifiers) {
+  std::vector<ParcelIdentifier> result;
+  for (auto& identifier : parcel_identifiers) {
+    ParcelIdentifier id;
+    id.set_carrier(identifier.first);
+    id.set_tracking_id(identifier.second);
+  }
+  return result;
+}
+
+void OnStopTrackingParcelDone(StopParcelTrackingCallback callback,
+                              ParcelRequestStatus status) {
+  std::move(callback).Run(status == ParcelRequestStatus::kSuccess);
+}
+
+void OnStopTrackingAllParcelsDone(StopParcelTrackingCallback callback,
+                                  ParcelRequestStatus status) {
+  std::move(callback).Run(status == ParcelRequestStatus::kSuccess);
+}
+}  // namespace
+
+ParcelsManager::ParcelsManager(
+    signin::IdentityManager* identity_manager,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+    SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>*
+        parcel_tracking_proto_db,
+    AccountChecker* account_checker)
+    : parcels_server_proxy_(
+          std::make_unique<ParcelsServerProxy>(identity_manager,
+                                               url_loader_factory)),
+      parcels_storage_(
+          std::make_unique<ParcelsStorage>(parcel_tracking_proto_db)) {}
+
+ParcelsManager::~ParcelsManager() = default;
+
+void ParcelsManager::StartTrackingParcels(
+    const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+        parcel_identifiers,
+    const std::string& source_page_domain,
+    GetParcelStatusCallback callback) {
+  parcels_server_proxy_->StartTrackingParcels(
+      ConvertParcelIdentifier(parcel_identifiers), source_page_domain,
+      base::BindOnce(&OnGetParcelStatusDone, std::move(callback)));
+}
+
+void ParcelsManager::GetParcelStatus(
+    const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+        parcel_identifiers,
+    GetParcelStatusCallback callback) {
+  // TODO(qinmin): check db first before sending request to the server.
+  parcels_server_proxy_->GetParcelStatus(
+      ConvertParcelIdentifier(parcel_identifiers),
+      base::BindOnce(&OnGetParcelStatusDone, std::move(callback)));
+}
+
+void ParcelsManager::StopTrackingParcel(const std::string& tracking_id,
+                                        StopParcelTrackingCallback callback) {
+  parcels_server_proxy_->StopTrackingParcel(
+      tracking_id,
+      base::BindOnce(&OnStopTrackingParcelDone, std::move(callback)));
+}
+
+void ParcelsManager::StopTrackingAllParcels(
+    StopParcelTrackingCallback callback) {
+  parcels_server_proxy_->StopTrackingAllParcels(
+      base::BindOnce(&OnStopTrackingAllParcelsDone, std::move(callback)));
+}
+
+// Called to stop tracking a given parcel.
+
+}  // namespace commerce
diff --git a/components/commerce/core/parcel_manager.h b/components/commerce/core/parcel/parcels_manager.h
similarity index 67%
rename from components/commerce/core/parcel_manager.h
rename to components/commerce/core/parcel/parcels_manager.h
index 6230cce1..d85714b 100644
--- a/components/commerce/core/parcel_manager.h
+++ b/components/commerce/core/parcel/parcels_manager.h
@@ -2,12 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_COMMERCE_CORE_PARCEL_MANAGER_H_
-#define COMPONENTS_COMMERCE_CORE_PARCEL_MANAGER_H_
+#ifndef COMPONENTS_COMMERCE_CORE_PARCEL_PARCELS_MANAGER_H_
+#define COMPONENTS_COMMERCE_CORE_PARCEL_PARCELS_MANAGER_H_
 
 #include <memory>
+#include <utility>
 
 #include "base/memory/scoped_refptr.h"
+#include "components/commerce/core/commerce_types.h"
 #include "components/commerce/core/proto/parcel.pb.h"
 #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h"
 #include "components/session_proto_db/session_proto_storage.h"
@@ -26,32 +28,30 @@
 class ParcelsStorage;
 
 // Class for managing all the parcel information
-class ParcelManager {
+class ParcelsManager {
  public:
-  using GetParcelStatusCallback =
-      base::OnceCallback<void(bool /*success*/,
-                              std::unique_ptr<std::vector<ParcelStatus>>)>;
-  using StopParcelTrackingCallback = base::OnceCallback<void(bool /*success*/)>;
-
-  ParcelManager(
+  ParcelsManager(
       signin::IdentityManager* identity_manager,
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
       SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>*
           parcel_tracking_proto_db,
       AccountChecker* account_checker);
-  ~ParcelManager();
-  ParcelManager(const ParcelManager&) = delete;
-  ParcelManager& operator=(const ParcelManager&) = delete;
+  ~ParcelsManager();
+  ParcelsManager(const ParcelsManager&) = delete;
+  ParcelsManager& operator=(const ParcelsManager&) = delete;
 
   // Starts tracking a list of parcels.
   void StartTrackingParcels(
-      const std::vector<ParcelIdentifier>& parcel_identifiers,
+      const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+          parcel_identifiers,
       const std::string& source_page_domain,
       GetParcelStatusCallback callback);
 
   // Gets status for a list of parcels.
-  void GetParcelStatus(const std::vector<ParcelIdentifier>& parcel_identifiers,
-                       GetParcelStatusCallback callback);
+  void GetParcelStatus(
+      const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+          parcel_identifiers,
+      GetParcelStatusCallback callback);
 
   // Called to stop tracking a given parcel.
   void StopTrackingParcel(const std::string& tracking_id,
@@ -68,4 +68,4 @@
 
 }  // namespace commerce
 
-#endif  // COMPONENTS_COMMERCE_CORE_PARCEL_MANAGER_H_
+#endif  // COMPONENTS_COMMERCE_CORE_PARCEL_PARCELS_MANAGER_H_
diff --git a/components/commerce/core/parcel/parcels_storage.cc b/components/commerce/core/parcel/parcels_storage.cc
index a03ea0e..5ad98c9 100644
--- a/components/commerce/core/parcel/parcels_storage.cc
+++ b/components/commerce/core/parcel/parcels_storage.cc
@@ -28,45 +28,57 @@
 
 ParcelsStorage::~ParcelsStorage() = default;
 
-void ParcelsStorage::Init() {
+void ParcelsStorage::Init(OnInitializedCallback callback) {
   DCHECK(!is_initialized_);
   proto_db_->LoadAllEntries(base::BindOnce(&ParcelsStorage::OnAllParcelsLoaded,
-                                           weak_ptr_factory_.GetWeakPtr()));
+                                           weak_ptr_factory_.GetWeakPtr(),
+                                           std::move(callback)));
 }
 
-void ParcelsStorage::GetAllParcelStatus(GetParcelStatusCallback callback) {
+std::unique_ptr<std::vector<ParcelStatus>>
+ParcelsStorage::GetAllParcelStatus() {
   DCHECK(is_initialized_);
-  // TODO(qinmin): Call the callback with everything in cache.
+  auto result = std::make_unique<std::vector<ParcelStatus>>();
+  for (auto& kv : parcels_cache_) {
+    result->emplace_back(kv.second);
+  }
+  return result;
 }
 
 void ParcelsStorage::UpdateParcelStatus(
     const std::vector<ParcelStatus>& parcel_status,
     StorageUpdateCallback callback) {
+  DCHECK(is_initialized_);
+  std::vector<std::pair<std::string, ParcelTrackingContent>> content_to_insert;
   for (const auto& status : parcel_status) {
     std::string key = GetDbKeyFromParcelStatus(status.parcel_identifier());
-    if (parcels_cache_.find(key) != parcels_cache_.end()) {
-      // TODO(qinmin): Update the db.
-    } else {
-      // TODO(qinmin): Insert into db.
-    }
+    ParcelTrackingContent content;
+    content.set_key(key);
+    auto* new_status = content.mutable_parcel_status();
+    *new_status = status;
+    content_to_insert.emplace_back(key, content);
     parcels_cache_[key] = status;
   }
+  proto_db_->UpdateEntries(std::move(content_to_insert), std::move(callback));
 }
 
 void ParcelsStorage::DeleteParcelStatus(
     const ParcelIdentifier& parcel_identifier,
     StorageUpdateCallback callback) {
+  DCHECK(is_initialized_);
   std::string key = GetDbKeyFromParcelStatus(parcel_identifier);
   parcels_cache_.erase(key);
   proto_db_->DeleteOneEntry(key, base::BindOnce(std::move(callback)));
 }
 
 void ParcelsStorage::DeleteAllParcelStatus(StorageUpdateCallback callback) {
+  DCHECK(is_initialized_);
   parcels_cache_.clear();
   proto_db_->DeleteAllContent(std::move(callback));
 }
 
-void ParcelsStorage::OnAllParcelsLoaded(bool success,
+void ParcelsStorage::OnAllParcelsLoaded(OnInitializedCallback callback,
+                                        bool success,
                                         ParcelTrackings parcel_trackings) {
   DCHECK(!is_initialized_);
   if (!success) {
@@ -77,6 +89,7 @@
     auto& parcel_status = kv.second.parcel_status();
     parcels_cache_.emplace(std::move(kv.first), std::move(parcel_status));
   }
+  std::move(callback).Run(success);
 }
 
 }  // namespace commerce
diff --git a/components/commerce/core/parcel/parcels_storage.h b/components/commerce/core/parcel/parcels_storage.h
index 3a28918..295c309 100644
--- a/components/commerce/core/parcel/parcels_storage.h
+++ b/components/commerce/core/parcel/parcels_storage.h
@@ -15,16 +15,18 @@
 #include "components/session_proto_db/session_proto_storage.h"
 
 namespace commerce {
-using ParcelTrackingContent = parcel_tracking_db::ParcelTrackingContent;
-using GetParcelStatusCallback =
-    base::OnceCallback<void(std::unique_ptr<std::vector<ParcelStatus>>)>;
-using ParcelTrackings =
-    std::vector<SessionProtoStorage<ParcelTrackingContent>::KeyAndValue>;
-using StorageUpdateCallback = base::OnceCallback<void(bool /*success*/)>;
 
 // Class for storing parcel tracking information in db.
 class ParcelsStorage {
  public:
+  using ParcelTrackingContent = parcel_tracking_db::ParcelTrackingContent;
+  using GetParcelStatusCallback =
+      base::OnceCallback<void(std::unique_ptr<std::vector<ParcelStatus>>)>;
+  using ParcelTrackings =
+      std::vector<SessionProtoStorage<ParcelTrackingContent>::KeyAndValue>;
+  using StorageUpdateCallback = base::OnceCallback<void(bool /*success*/)>;
+  using OnInitializedCallback = base::OnceCallback<void(bool /*success*/)>;
+
   explicit ParcelsStorage(
       SessionProtoStorage<ParcelTrackingContent>* parcel_tracking_db);
   ParcelsStorage(const ParcelsStorage&) = delete;
@@ -32,10 +34,10 @@
   virtual ~ParcelsStorage();
 
   // Initialize the storage, populate the cache entries.
-  void Init();
+  void Init(OnInitializedCallback callback);
 
   // Gets all parcel status.
-  void GetAllParcelStatus(GetParcelStatusCallback callback);
+  std::unique_ptr<std::vector<ParcelStatus>> GetAllParcelStatus();
 
   // Updates the status for a list of parcels.
   void UpdateParcelStatus(const std::vector<ParcelStatus>& parcel_status,
@@ -49,7 +51,12 @@
   void DeleteAllParcelStatus(StorageUpdateCallback callback);
 
  private:
-  void OnAllParcelsLoaded(bool success, ParcelTrackings parcel_trackings);
+  void OnAllParcelsLoaded(OnInitializedCallback callback,
+                          bool success,
+                          ParcelTrackings parcel_trackings);
+
+  void InsertParcelStatus(const ParcelStatus& parcel_status,
+                          StorageUpdateCallback callback);
 
   raw_ptr<SessionProtoStorage<ParcelTrackingContent>> proto_db_;
 
diff --git a/components/commerce/core/parcel/parcels_storage_unittest.cc b/components/commerce/core/parcel/parcels_storage_unittest.cc
new file mode 100644
index 0000000..8e57f52
--- /dev/null
+++ b/components/commerce/core/parcel/parcels_storage_unittest.cc
@@ -0,0 +1,266 @@
+// 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 <string>
+
+#include "base/check.h"
+#include "base/functional/callback.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
+#include "components/commerce/core/parcel/parcels_storage.h"
+#include "components/commerce/core/proto/parcel.pb.h"
+#include "components/commerce/core/proto/parcel_tracking_db_content.pb.h"
+#include "components/session_proto_db/session_proto_storage.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::_;
+using testing::InSequence;
+
+namespace {
+
+const commerce::ParcelIdentifier::Carrier kCarrier1 =
+    commerce::ParcelIdentifier::UPS;
+const std::string kTrackingId1 = "abc";
+const std::string kTrackingId2 = "xyz";
+const commerce::ParcelStatus::ParcelState kDefaultState =
+    commerce::ParcelStatus::NEW;
+
+std::string GetStorageKey(commerce::ParcelIdentifier::Carrier carrier,
+                          const std::string& tracking_id) {
+  return base::StringPrintf("%d_%s", carrier, tracking_id.c_str());
+}
+
+commerce::ParcelStatus CreateParcelStatus(
+    commerce::ParcelIdentifier::Carrier carrier,
+    const std::string& tracking_id,
+    commerce::ParcelStatus::ParcelState state) {
+  commerce::ParcelStatus status;
+  auto* identifier = status.mutable_parcel_identifier();
+  identifier->set_tracking_id(tracking_id);
+  identifier->set_carrier(carrier);
+  status.set_parcel_state(state);
+  return status;
+}
+
+parcel_tracking_db::ParcelTrackingContent CreateParcelTrackingContent(
+    commerce::ParcelIdentifier::Carrier carrier,
+    const std::string& tracking_id,
+    commerce::ParcelStatus::ParcelState state) {
+  parcel_tracking_db::ParcelTrackingContent content;
+  content.set_key(GetStorageKey(carrier, tracking_id));
+  auto* parcel_status = content.mutable_parcel_status();
+  *parcel_status = CreateParcelStatus(carrier, tracking_id, state);
+  return content;
+}
+
+std::vector<
+    SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::KeyAndValue>
+MockDbLoadResponse() {
+  parcel_tracking_db::ParcelTrackingContent content =
+      CreateParcelTrackingContent(kCarrier1, kTrackingId1, kDefaultState);
+
+  return std::vector<SessionProtoStorage<
+      parcel_tracking_db::ParcelTrackingContent>::KeyAndValue>{
+      {GetStorageKey(kCarrier1, kTrackingId1), content}};
+}
+
+void DoNothing(bool success) {}
+
+class MockProtoStorage
+    : public SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent> {
+ public:
+  MockProtoStorage() = default;
+  ~MockProtoStorage() override = default;
+
+  MOCK_METHOD(void,
+              LoadContentWithPrefix,
+              (const std::string& key_prefix,
+               SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   LoadCallback callback),
+              (override));
+  MOCK_METHOD(void,
+              InsertContent,
+              (const std::string& key,
+               const parcel_tracking_db::ParcelTrackingContent& value,
+               SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   OperationCallback callback),
+              (override));
+  MOCK_METHOD(void,
+              DeleteOneEntry,
+              (const std::string& key,
+               SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   OperationCallback callback),
+              (override));
+  MOCK_METHOD(
+      void,
+      UpdateEntries,
+      ((const std::vector<
+           std::pair<std::string, parcel_tracking_db::ParcelTrackingContent>>&
+            entries_to_update),
+       SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+           OperationCallback callback),
+      (override));
+  MOCK_METHOD(void,
+              DeleteAllContent,
+              (SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   OperationCallback callback),
+              (override));
+  MOCK_METHOD(
+      void,
+      LoadAllEntries,
+      (SessionProtoStorage<
+          parcel_tracking_db::ParcelTrackingContent>::LoadCallback callback),
+      (override));
+  MOCK_METHOD(void,
+              LoadOneEntry,
+              (const std::string& key,
+               SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   LoadCallback callback),
+              (override));
+  MOCK_METHOD(void,
+              PerformMaintenance,
+              (const std::vector<std::string>& keys_to_keep,
+               const std::string& key_substring_to_match,
+               SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   OperationCallback callback),
+              (override));
+  MOCK_METHOD(void,
+              DeleteContentWithPrefix,
+              (const std::string& key_prefix,
+               SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   OperationCallback callback),
+              (override));
+  MOCK_METHOD(void, Destroy, (), (const, override));
+
+  void MockLoadAllResponse() {
+    ON_CALL(*this, LoadAllEntries)
+        .WillByDefault(
+            [](SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                   LoadCallback callback) {
+              std::move(callback).Run(true, MockDbLoadResponse());
+            });
+  }
+
+  void MockOperationResult(bool succeeded) {
+    ON_CALL(*this, InsertContent)
+        .WillByDefault(
+            [succeeded](
+                const std::string& key,
+                const parcel_tracking_db::ParcelTrackingContent& value,
+                SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                    OperationCallback callback) {
+              std::move(callback).Run(succeeded);
+            });
+    ON_CALL(*this, DeleteOneEntry)
+        .WillByDefault(
+            [succeeded](
+                const std::string& key,
+                SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                    OperationCallback callback) {
+              std::move(callback).Run(succeeded);
+            });
+    ON_CALL(*this, DeleteAllContent)
+        .WillByDefault(
+            [succeeded](
+                SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::
+                    OperationCallback callback) {
+              std::move(callback).Run(succeeded);
+            });
+  }
+};
+
+}  // namespace
+
+namespace commerce {
+
+class ParcelsStorageTest : public testing::Test {
+ public:
+  ParcelsStorageTest() = default;
+  ~ParcelsStorageTest() override = default;
+
+  void SetUp() override {
+    proto_db_ = std::make_unique<MockProtoStorage>();
+    proto_db_->MockLoadAllResponse();
+    storage_ = std::make_unique<ParcelsStorage>(proto_db_.get());
+    EXPECT_CALL(*proto_db_, LoadAllEntries(_));
+    storage_->Init(base::BindOnce(&DoNothing));
+  }
+
+ protected:
+  base::test::TaskEnvironment task_environment_;
+  std::unique_ptr<MockProtoStorage> proto_db_;
+  std::unique_ptr<ParcelsStorage> storage_;
+};
+
+TEST_F(ParcelsStorageTest, TestGetAllParcelStatus) {
+  auto all_parcels = storage_->GetAllParcelStatus();
+  ASSERT_EQ(1u, all_parcels->size());
+  auto& parcel_1 = (*all_parcels)[0];
+  ASSERT_EQ(kTrackingId1, parcel_1.parcel_identifier().tracking_id());
+  ASSERT_EQ(kCarrier1, parcel_1.parcel_identifier().carrier());
+  ASSERT_EQ(kDefaultState, parcel_1.parcel_state());
+}
+
+TEST_F(ParcelsStorageTest, TestDeleteAllParcelStatus) {
+  EXPECT_CALL(*proto_db_, DeleteAllContent(_));
+  storage_->DeleteAllParcelStatus(base::BindOnce(&DoNothing));
+  task_environment_.RunUntilIdle();
+  auto all_parcels = storage_->GetAllParcelStatus();
+  ASSERT_EQ(0u, all_parcels->size());
+}
+
+TEST_F(ParcelsStorageTest, TestDeleteParcelStatus) {
+  EXPECT_CALL(*proto_db_, DeleteOneEntry(_, _)).Times(2);
+
+  // Delete an invalid parcel identifier
+  ParcelIdentifier identifier;
+  identifier.set_carrier(commerce::ParcelIdentifier::FEDEX);
+  identifier.set_tracking_id("xyz");
+  storage_->DeleteParcelStatus(identifier, base::BindOnce(&DoNothing));
+  task_environment_.RunUntilIdle();
+
+  auto all_parcels = storage_->GetAllParcelStatus();
+  ASSERT_EQ(1u, all_parcels->size());
+
+  // Delete the parcel identifier in storage.
+  identifier.set_carrier(kCarrier1);
+  identifier.set_tracking_id(kTrackingId1);
+  storage_->DeleteParcelStatus(identifier, base::BindOnce(&DoNothing));
+  task_environment_.RunUntilIdle();
+
+  all_parcels = storage_->GetAllParcelStatus();
+  ASSERT_EQ(0u, all_parcels->size());
+}
+
+TEST_F(ParcelsStorageTest, TestUpdateParcelStatus) {
+  EXPECT_CALL(*proto_db_, UpdateEntries(_, _)).Times(1);
+
+  std::vector<ParcelStatus> status;
+  ParcelStatus status1 = CreateParcelStatus(kCarrier1, kTrackingId1,
+                                            commerce::ParcelStatus::PICKED_UP);
+  ParcelStatus status2 =
+      CreateParcelStatus(kCarrier1, kTrackingId2, kDefaultState);
+  status.emplace_back(status1);
+  status.emplace_back(status2);
+
+  // Delete the parcel identifier in storage.
+  storage_->UpdateParcelStatus(status, base::BindOnce(&DoNothing));
+  task_environment_.RunUntilIdle();
+
+  auto all_parcels = storage_->GetAllParcelStatus();
+  ASSERT_EQ(2u, all_parcels->size());
+  std::map<std::string, ParcelStatus> status_map;
+  for (int i = 0; i < 2; ++i) {
+    auto p = (*all_parcels)[i];
+    status_map.emplace(p.parcel_identifier().tracking_id(), p);
+  }
+
+  ASSERT_EQ(status1.parcel_state(), status_map[kTrackingId1].parcel_state());
+  ASSERT_EQ(status2.parcel_state(), status_map[kTrackingId2].parcel_state());
+}
+
+}  // namespace commerce
diff --git a/components/commerce/core/parcel_manager.cc b/components/commerce/core/parcel_manager.cc
deleted file mode 100644
index 467cb2c..0000000
--- a/components/commerce/core/parcel_manager.cc
+++ /dev/null
@@ -1,84 +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 "components/commerce/core/parcel_manager.h"
-
-#include "base/functional/bind.h"
-#include "components/commerce/core/parcel/parcels_server_proxy.h"
-#include "components/commerce/core/parcel/parcels_storage.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
-
-namespace commerce {
-
-namespace {
-
-void OnGetParcelStatusDone(
-    ParcelManager::GetParcelStatusCallback callback,
-    ParcelRequestStatus status,
-    std::unique_ptr<std::vector<ParcelStatus>> parcel_status) {
-  std::move(callback).Run(status == ParcelRequestStatus::kSuccess,
-                          std::move(parcel_status));
-}
-
-void OnStopTrackingParcelDone(
-    ParcelManager::StopParcelTrackingCallback callback,
-    ParcelRequestStatus status) {
-  std::move(callback).Run(status == ParcelRequestStatus::kSuccess);
-}
-
-void OnStopTrackingAllParcelsDone(
-    ParcelManager::StopParcelTrackingCallback callback,
-    ParcelRequestStatus status) {
-  std::move(callback).Run(status == ParcelRequestStatus::kSuccess);
-}
-}  // namespace
-
-ParcelManager::ParcelManager(
-    signin::IdentityManager* identity_manager,
-    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>*
-        parcel_tracking_proto_db,
-    AccountChecker* account_checker)
-    : parcels_server_proxy_(
-          std::make_unique<ParcelsServerProxy>(identity_manager,
-                                               url_loader_factory)),
-      parcels_storage_(
-          std::make_unique<ParcelsStorage>(parcel_tracking_proto_db)) {}
-
-ParcelManager::~ParcelManager() = default;
-
-void ParcelManager::StartTrackingParcels(
-    const std::vector<ParcelIdentifier>& parcel_identifiers,
-    const std::string& source_page_domain,
-    GetParcelStatusCallback callback) {
-  parcels_server_proxy_->StartTrackingParcels(
-      parcel_identifiers, source_page_domain,
-      base::BindOnce(&OnGetParcelStatusDone, std::move(callback)));
-}
-
-void ParcelManager::GetParcelStatus(
-    const std::vector<ParcelIdentifier>& parcel_identifiers,
-    GetParcelStatusCallback callback) {
-  // TODO(qinmin): check db first before sending request to the server.
-  parcels_server_proxy_->GetParcelStatus(
-      parcel_identifiers,
-      base::BindOnce(&OnGetParcelStatusDone, std::move(callback)));
-}
-
-void ParcelManager::StopTrackingParcel(const std::string& tracking_id,
-                                       StopParcelTrackingCallback callback) {
-  parcels_server_proxy_->StopTrackingParcel(
-      tracking_id,
-      base::BindOnce(&OnStopTrackingParcelDone, std::move(callback)));
-}
-
-void ParcelManager::StopTrackingAllParcels(
-    StopParcelTrackingCallback callback) {
-  parcels_server_proxy_->StopTrackingAllParcels(
-      base::BindOnce(&OnStopTrackingAllParcelsDone, std::move(callback)));
-}
-
-// Called to stop tracking a given parcel.
-
-}  // namespace commerce
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc
index 25c29379..8f4249d7 100644
--- a/components/commerce/core/shopping_service.cc
+++ b/components/commerce/core/shopping_service.cc
@@ -25,6 +25,7 @@
 #include "components/commerce/core/discounts_storage.h"
 #include "components/commerce/core/metrics/metrics_utils.h"
 #include "components/commerce/core/metrics/scheduled_metrics_manager.h"
+#include "components/commerce/core/parcel/parcels_manager.h"
 #include "components/commerce/core/pref_names.h"
 #include "components/commerce/core/price_tracking_utils.h"
 #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h"
@@ -107,6 +108,21 @@
 DiscountInfo& DiscountInfo::operator=(const DiscountInfo&) = default;
 DiscountInfo::~DiscountInfo() = default;
 
+ParcelTrackingStatus::ParcelTrackingStatus() = default;
+ParcelTrackingStatus::ParcelTrackingStatus(const ParcelTrackingStatus&) =
+    default;
+ParcelTrackingStatus& ParcelTrackingStatus::operator=(
+    const ParcelTrackingStatus&) = default;
+ParcelTrackingStatus::~ParcelTrackingStatus() = default;
+ParcelTrackingStatus::ParcelTrackingStatus(const ParcelStatus& parcel_status) {
+  ParcelTrackingStatus status;
+  status.carrier = parcel_status.parcel_identifier().carrier();
+  status.tracking_id = parcel_status.parcel_identifier().tracking_id();
+  status.tracking_url = GURL(parcel_status.tracking_url());
+  status.estimated_delivery_time = base::Time::FromDeltaSinceWindowsEpoch(
+      base::Microseconds(parcel_status.estimated_delivery_time_usec()));
+}
+
 ShoppingService::ShoppingService(
     const std::string& country_on_startup,
     const std::string& locale_on_startup,
@@ -185,7 +201,7 @@
     }
 
     if (parcel_tracking_proto_db) {
-      parcel_manager_ = std::make_unique<ParcelManager>(
+      parcels_manager_ = std::make_unique<ParcelsManager>(
           identity_manager, url_loader_factory, parcel_tracking_proto_db,
           account_checker_.get());
     }
@@ -1482,36 +1498,48 @@
 }
 
 void ShoppingService::StartTrackingParcels(
-    const std::vector<ParcelIdentifier>& parcel_identifiers,
+    const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+        parcel_identifiers,
     const std::string& source_page_domain,
-    ParcelManager::GetParcelStatusCallback callback) {
-  if (parcel_manager_) {
-    parcel_manager_->StartTrackingParcels(
+    GetParcelStatusCallback callback) {
+  if (parcels_manager_) {
+    parcels_manager_->StartTrackingParcels(
         parcel_identifiers, source_page_domain, std::move(callback));
+  } else {
+    std::move(callback).Run(
+        false, std::make_unique<std::vector<ParcelTrackingStatus>>());
   }
 }
 
 void ShoppingService::GetParcelStatus(
-    const std::vector<ParcelIdentifier>& parcel_identifiers,
-    ParcelManager::GetParcelStatusCallback callback) {
-  if (parcel_manager_) {
-    parcel_manager_->GetParcelStatus(parcel_identifiers, std::move(callback));
+    const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+        parcel_identifiers,
+    GetParcelStatusCallback callback) {
+  if (parcels_manager_) {
+    parcels_manager_->GetParcelStatus(parcel_identifiers, std::move(callback));
+  } else {
+    std::move(callback).Run(
+        false, std::make_unique<std::vector<ParcelTrackingStatus>>());
   }
 }
 
 void ShoppingService::StopTrackingParcel(
     const std::string& tracking_id,
     base::OnceCallback<void(bool)> callback) {
-  if (parcel_manager_) {
-    parcel_manager_->StopTrackingParcel(tracking_id, std::move(callback));
+  if (parcels_manager_) {
+    parcels_manager_->StopTrackingParcel(tracking_id, std::move(callback));
+  } else {
+    std::move(callback).Run(false);
   }
 }
 
 // Called to stop tracking all parcels.
 void ShoppingService::StopTrackingAllParcels(
     base::OnceCallback<void(bool)> callback) {
-  if (parcel_manager_) {
-    parcel_manager_->StopTrackingAllParcels(std::move(callback));
+  if (parcels_manager_) {
+    parcels_manager_->StopTrackingAllParcels(std::move(callback));
+  } else {
+    std::move(callback).Run(false);
   }
 }
 
diff --git a/components/commerce/core/shopping_service.h b/components/commerce/core/shopping_service.h
index 6018be1..42bd83a 100644
--- a/components/commerce/core/shopping_service.h
+++ b/components/commerce/core/shopping_service.h
@@ -9,6 +9,7 @@
 #include <memory>
 #include <string>
 #include <tuple>
+#include <utility>
 
 #include "base/cancelable_callback.h"
 #include "base/containers/flat_set.h"
@@ -23,7 +24,6 @@
 #include "base/uuid.h"
 #include "components/commerce/core/account_checker.h"
 #include "components/commerce/core/commerce_types.h"
-#include "components/commerce/core/parcel_manager.h"
 #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h"
 #include "components/commerce/core/proto/discounts_db_content.pb.h"
 #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h"
@@ -120,6 +120,7 @@
 
 class BookmarkUpdateManager;
 class DiscountsStorage;
+class ParcelsManager;
 class ShoppingPowerBookmarkDataProvider;
 class ShoppingBookmarkModelObserver;
 class SubscriptionsManager;
@@ -400,15 +401,18 @@
 
   // Starts tracking a list of parcels from a given page.
   void StartTrackingParcels(
-      const std::vector<ParcelIdentifier>& parcel_identifiers,
+      const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+          parcel_identifiers,
       const std::string& source_page_domain,
-      ParcelManager::GetParcelStatusCallback callback);
+      GetParcelStatusCallback callback);
 
   // Gets status for a list of parcels. If the parcel status is outdated, a
   // request will be sent to the server to retrieve the information. Otherwise,
   // recently cached status will be returned in the callback.
-  void GetParcelStatus(const std::vector<ParcelIdentifier>& parcel_identifiers,
-                       ParcelManager::GetParcelStatusCallback callback);
+  void GetParcelStatus(
+      const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>&
+          parcel_identifiers,
+      GetParcelStatusCallback callback);
 
   // Called to stop tracking a given parcel.
   void StopTrackingParcel(const std::string& tracking_id,
@@ -662,7 +666,7 @@
   std::unique_ptr<DiscountsStorage> discounts_storage_;
 
   // Object for tracking parcel status.
-  std::unique_ptr<ParcelManager> parcel_manager_;
+  std::unique_ptr<ParcelsManager> parcels_manager_;
 
   // A consent throttle that will hold callbacks until the specific consent is
   // obtained.
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
index 08b7f0f..b45cb34 100644
--- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
+++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -78,6 +78,7 @@
         FeatureConstants.IPH_SHARING_HUB_LINK_TOGGLE_FEATURE,
         FeatureConstants.IPH_WEB_FEED_FOLLOW_FEATURE,
         FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE,
+        FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE_WITH_UI_UPDATE,
         FeatureConstants.SHARED_HIGHLIGHTING_BUILDER_FEATURE,
         FeatureConstants.SHARED_HIGHLIGHTING_RECEIVER_FEATURE,
         FeatureConstants.SHARING_HUB_WEBNOTES_STYLIZE_FEATURE,
@@ -356,6 +357,12 @@
     String IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE = "IPH_WebFeedPostFollowDialog";
 
     /**
+     * A dialog IPH feature to inform users about the WebFeed post-follow after the UI update.
+     */
+    String IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE_WITH_UI_UPDATE =
+            "IPH_WebFeedPostFollowDialogWithUIUpdate";
+
+    /**
      * An IPH feature to inform users about the link-to-text on selection share.
      */
     String SHARED_HIGHLIGHTING_BUILDER_FEATURE = "IPH_SharedHighlightingBuilder";
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc
index bad2049..23be00b 100644
--- a/components/feature_engagement/public/feature_configurations.cc
+++ b/components/feature_engagement/public/feature_configurations.cc
@@ -941,6 +941,22 @@
     return config;
   }
 
+  if (kIPHWebFeedPostFollowDialogFeatureWithUIUpdate.name == feature->name) {
+    // A config that allows one of the WebFeed post follow dialogs to be
+    // presented 3 times after the UI update.
+    absl::optional<FeatureConfig> config = FeatureConfig();
+    config->valid = true;
+    config->availability = Comparator(ANY, 0);
+    config->session_rate = Comparator(ANY, 0);
+    config->trigger =
+        EventConfig("web_feed_post_follow_dialog_trigger_with_ui_update",
+                    Comparator(LESS_THAN, 3), 360, 360);
+    config->used =
+        EventConfig("web_feed_post_follow_dialog_shown_with_ui_update",
+                    Comparator(ANY, 0), 360, 360);
+    return config;
+  }
+
   if (kIPHVideoTutorialNTPChromeIntroFeature.name == feature->name) {
     // A config that allows the chrome intro video tutorial card to show up
     // until explicitly interacted upon.
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 51a47af..6d4c165 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -420,6 +420,9 @@
 BASE_FEATURE(kIPHWebFeedPostFollowDialogFeature,
              "IPH_WebFeedPostFollowDialog",
              base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate,
+             "IPH_WebFeedPostFollowDialogWithUIUpdate",
+             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHSharedHighlightingBuilder,
              "IPH_SharedHighlightingBuilder",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index 6208dd8..97c0c07f 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -174,6 +174,7 @@
 BASE_DECLARE_FEATURE(kIPHSharingHubLinkToggleFeature);
 BASE_DECLARE_FEATURE(kIPHWebFeedFollowFeature);
 BASE_DECLARE_FEATURE(kIPHWebFeedPostFollowDialogFeature);
+BASE_DECLARE_FEATURE(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate);
 BASE_DECLARE_FEATURE(kIPHSharedHighlightingBuilder);
 BASE_DECLARE_FEATURE(kIPHSharedHighlightingReceiverFeature);
 BASE_DECLARE_FEATURE(kIPHSharingHubWebnotesStylizeFeature);
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc
index 0c63267..1fb410f 100644
--- a/components/feature_engagement/public/feature_list.cc
+++ b/components/feature_engagement/public/feature_list.cc
@@ -105,6 +105,7 @@
     &kIPHSharingHubLinkToggleFeature,
     &kIPHWebFeedFollowFeature,
     &kIPHWebFeedPostFollowDialogFeature,
+    &kIPHWebFeedPostFollowDialogFeatureWithUIUpdate,
     &kIPHSharedHighlightingBuilder,
     &kIPHSharedHighlightingReceiverFeature,
     &kIPHSharingHubWebnotesStylizeFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h
index 9109b40e..6cfaac8 100644
--- a/components/feature_engagement/public/feature_list.h
+++ b/components/feature_engagement/public/feature_list.h
@@ -202,6 +202,8 @@
 DEFINE_VARIATION_PARAM(kIPHWebFeedFollowFeature, "IPH_WebFeedFollow");
 DEFINE_VARIATION_PARAM(kIPHWebFeedPostFollowDialogFeature,
                        "IPH_WebFeedPostFollowDialog");
+DEFINE_VARIATION_PARAM(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate,
+                       "IPH_WebFeedPostFollowDialogWithUIUpdate");
 DEFINE_VARIATION_PARAM(kIPHSharedHighlightingBuilder,
                        "IPH_SharedHighlightingBuilder");
 DEFINE_VARIATION_PARAM(kIPHSharedHighlightingReceiverFeature,
@@ -511,6 +513,7 @@
         VARIATION_ENTRY(kIPHWebFeedAwarenessFeature),
         VARIATION_ENTRY(kIPHWebFeedFollowFeature),
         VARIATION_ENTRY(kIPHWebFeedPostFollowDialogFeature),
+        VARIATION_ENTRY(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate),
         VARIATION_ENTRY(kIPHSharedHighlightingBuilder),
         VARIATION_ENTRY(kIPHSharedHighlightingReceiverFeature),
         VARIATION_ENTRY(kIPHSharingHubWebnotesStylizeFeature),
diff --git a/components/gwp_asan/client/guarded_page_allocator.cc b/components/gwp_asan/client/guarded_page_allocator.cc
index d0be2f8..e1c13bb7 100644
--- a/components/gwp_asan/client/guarded_page_allocator.cc
+++ b/components/gwp_asan/client/guarded_page_allocator.cc
@@ -432,7 +432,7 @@
   metadata_[metadata_idx].alloc_size = size;
   metadata_[metadata_idx].alloc_ptr = reinterpret_cast<uintptr_t>(ptr);
 
-  void* trace[AllocatorState::kMaxStackFrames];
+  const void* trace[AllocatorState::kMaxStackFrames];
   size_t len =
       AllocationInfo::GetStackTrace(trace, AllocatorState::kMaxStackFrames);
   metadata_[metadata_idx].alloc.trace_len =
@@ -450,7 +450,7 @@
 
 void GuardedPageAllocator::RecordDeallocationMetadata(
     AllocatorState::MetadataIdx metadata_idx) {
-  void* trace[AllocatorState::kMaxStackFrames];
+  const void* trace[AllocatorState::kMaxStackFrames];
   size_t len =
       AllocationInfo::GetStackTrace(trace, AllocatorState::kMaxStackFrames);
   metadata_[metadata_idx].dealloc.trace_len =
diff --git a/components/gwp_asan/client/lightweight_detector.cc b/components/gwp_asan/client/lightweight_detector.cc
index 20dbb80..bb29aa72 100644
--- a/components/gwp_asan/client/lightweight_detector.cc
+++ b/components/gwp_asan/client/lightweight_detector.cc
@@ -70,7 +70,7 @@
   slot_metadata.alloc_size = size;
   slot_metadata.alloc_ptr = reinterpret_cast<uintptr_t>(ptr);
 
-  void* trace[LightweightDetectorState::kMaxStackFrames];
+  const void* trace[LightweightDetectorState::kMaxStackFrames];
   size_t len = AllocationInfo::GetStackTrace(
       trace, LightweightDetectorState::kMaxStackFrames);
   slot_metadata.dealloc.trace_len =
diff --git a/components/gwp_asan/common/allocation_info.cc b/components/gwp_asan/common/allocation_info.cc
index c0033df1..6b11a209 100644
--- a/components/gwp_asan/common/allocation_info.cc
+++ b/components/gwp_asan/common/allocation_info.cc
@@ -13,7 +13,7 @@
 
 namespace gwp_asan::internal {
 
-size_t AllocationInfo::GetStackTrace(void** trace, size_t count) {
+size_t AllocationInfo::GetStackTrace(const void** trace, size_t count) {
   // TODO(vtsyrklevich): Investigate using trace_event::CFIBacktraceAndroid
   // on 32-bit Android for canary/dev (where we can dynamically load unwind
   // data.)
@@ -22,8 +22,7 @@
   // stack trace collection for base::debug::StackTrace doesn't work; however,
   // AArch64 builds ship with frame pointers so we can still collect stack
   // traces in that case.
-  return base::debug::TraceStackFramePointers(const_cast<const void**>(trace),
-                                              count, 0);
+  return base::debug::TraceStackFramePointers(trace, count, 0);
 #else
   return base::debug::CollectStackTrace(trace, count);
 #endif
diff --git a/components/gwp_asan/common/allocation_info.h b/components/gwp_asan/common/allocation_info.h
index f8180f0..edbe0a43 100644
--- a/components/gwp_asan/common/allocation_info.h
+++ b/components/gwp_asan/common/allocation_info.h
@@ -11,7 +11,7 @@
 
 // Information saved for allocations and deallocations.
 struct AllocationInfo {
-  static size_t GetStackTrace(void** trace, size_t count);
+  static size_t GetStackTrace(const void** trace, size_t count);
   static uint64_t GetCurrentTid();
 
   // (De)allocation thread id or base::kInvalidThreadId if no (de)allocation
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index 2377d401..a55f1e1 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1755,8 +1755,10 @@
     // score to the match with the highest respective model prediction score.
     if (!OmniboxFieldTrial::IsMlUrlScoringCounterfactual()) {
       auto match_itr = prediction_and_match_itr_heap.top().second;
-      match_itr->RecordAdditionalInfo("ml_legacy_relevance",
+      match_itr->RecordAdditionalInfo("ml legacy relevance",
                                       match_itr->relevance);
+      match_itr->RecordAdditionalInfo(
+          "ml model output", (prediction_and_match_itr_heap.top().first * 100));
       match_itr->relevance = relevance_heap.top();
     }
     relevance_heap.pop();
diff --git a/components/segmentation_platform/embedder/default_model/default_model_test_base.cc b/components/segmentation_platform/embedder/default_model/default_model_test_base.cc
index 133d9a6e..79c0fa94 100644
--- a/components/segmentation_platform/embedder/default_model/default_model_test_base.cc
+++ b/components/segmentation_platform/embedder/default_model/default_model_test_base.cc
@@ -79,6 +79,7 @@
   auto result = ExecuteWithInput(input);
   EXPECT_TRUE(result.has_value());
 
+  EXPECT_TRUE(fetched_metadata_);
   EXPECT_TRUE(fetched_metadata_->has_output_config());
   auto prediction_result = metadata_utils::CreatePredictionResult(
       result.value(), fetched_metadata_->output_config(), base::Time::Now(),
diff --git a/components/segmentation_platform/embedder/default_model/intentional_user_model.cc b/components/segmentation_platform/embedder/default_model/intentional_user_model.cc
index 051abb4e..a379916 100644
--- a/components/segmentation_platform/embedder/default_model/intentional_user_model.cc
+++ b/components/segmentation_platform/embedder/default_model/intentional_user_model.cc
@@ -26,10 +26,14 @@
 constexpr int64_t kIntentionalUserSignalStorageLength = 28;
 // Wait until we have 7 days of data.
 constexpr int64_t kIntentionalUserMinSignalCollectionLength = 7;
+// Refresh result every 7 days.
+constexpr int64_t kIntentionalUserResultTTLDays = 7;
 // Threshold for our heuristic, if the user launched Chrome directly at least 2
 // times in the last 28 days then we consider them an intentional user.
 constexpr int64_t kIntentionalLaunchThreshold = 2;
 
+constexpr int64_t kIntentionalUserModelVersion = 2;
+
 // InputFeatures.
 
 // MobileStartup.LaunchCause enum values to record an aggregate, these values
@@ -66,8 +70,6 @@
   config->AddSegmentId(SegmentId::INTENTIONAL_USER_SEGMENT,
                        std::make_unique<IntentionalUserModel>());
   config->auto_execute_and_cache = true;
-  config->segment_selection_ttl = base::Days(7);
-  config->unknown_selection_ttl = base::Days(7);
   config->is_boolean_segment = true;
 
   return config;
@@ -84,15 +86,23 @@
       kIntentionalUserMinSignalCollectionLength,
       kIntentionalUserSignalStorageLength);
 
-  // Set discrete mapping.
-  writer.AddBooleanSegmentDiscreteMapping(kIntentionalUserKey);
+  // If the result from ExecuteModelWithInput is greater than 0.5 then return
+  // the intentional user label, otherwise return the non-intentional label.
+  writer.AddOutputConfigForBinaryClassifier(
+      /*threshold=*/0.5f, /*positive_label=*/
+      SegmentIdToHistogramVariant(SegmentId::INTENTIONAL_USER_SEGMENT),
+      /*negative_label=*/kLegacyNegativeLabel);
+  writer.AddPredictedResultTTLInOutputConfig(
+      /*top_label_to_ttl_list=*/{},
+      /*default_ttl=*/kIntentionalUserResultTTLDays,
+      /*time_unit=*/proto::TimeUnit::DAY);
 
   // Set features.
   writer.AddUmaFeatures(kIntentionalUserUMAFeatures.data(),
                         kIntentionalUserUMAFeatures.size());
 
   return std::make_unique<ModelConfig>(std::move(intentional_user_metadata),
-                                       /*model_version=*/1);
+                                       kIntentionalUserModelVersion);
 }
 
 void IntentionalUserModel::ExecuteModelWithInput(
diff --git a/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc b/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc
index c94c498..9d0b2b4 100644
--- a/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc
+++ b/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc
@@ -5,6 +5,7 @@
 #include "components/segmentation_platform/embedder/default_model/intentional_user_model.h"
 
 #include "components/segmentation_platform/embedder/default_model/default_model_test_base.h"
+#include "components/segmentation_platform/public/constants.h"
 
 namespace segmentation_platform {
 
@@ -45,4 +46,20 @@
                            /*expected_result=*/{1});
 }
 
+TEST_F(IntentionalUserModelTest, TestLabels) {
+  ExpectInitAndFetchModel();
+
+  // If Chrome hasn't been launched from its main launcher icon then the user is
+  // not intentional.
+  ExpectClassifierResults({0}, {kLegacyNegativeLabel});
+  ExpectClassifierResults({1}, {kLegacyNegativeLabel});
+
+  // If chrome was launched at least twice from its main laincher icon then the
+  // user is intentional.
+  ExpectClassifierResults(
+      {2}, {SegmentIdToHistogramVariant(SegmentId::INTENTIONAL_USER_SEGMENT)});
+  ExpectClassifierResults(
+      {10}, {SegmentIdToHistogramVariant(SegmentId::INTENTIONAL_USER_SEGMENT)});
+}
+
 }  // namespace segmentation_platform
diff --git a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc
index 6acddbfc..29e35d34 100644
--- a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc
+++ b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc
@@ -22,8 +22,7 @@
 
 // Default parameters for the model.
 constexpr SegmentId kSegmentId = SegmentId::RESUME_HEAVY_USER_SEGMENT;
-constexpr int kResumeHeavyUserSegmentSelectionTTLDays = 14;
-constexpr int kResumeHeavyUserSegmentUnknownSelectionTTLDays = 14;
+constexpr int64_t kModelVersion = 2;
 
 // InputFeatures.
 constexpr std::array<MetadataWriter::UMAFeature, 5> kUMAFeatures = {
@@ -50,16 +49,6 @@
   config->AddSegmentId(SegmentId::RESUME_HEAVY_USER_SEGMENT,
                        std::make_unique<ResumeHeavyUserModel>());
   config->auto_execute_and_cache = true;
-  config->segment_selection_ttl =
-      base::Days(base::GetFieldTrialParamByFeatureAsInt(
-          features::kResumeHeavyUserSegmentFeature,
-          kVariationsParamNameSegmentSelectionTTLDays,
-          kResumeHeavyUserSegmentSelectionTTLDays));
-  config->unknown_selection_ttl =
-      base::Days(base::GetFieldTrialParamByFeatureAsInt(
-          features::kResumeHeavyUserSegmentFeature,
-          kVariationsParamNameUnknownSelectionTTLDays,
-          kResumeHeavyUserSegmentUnknownSelectionTTLDays));
   config->is_boolean_segment = true;
 
   return config;
@@ -76,13 +65,19 @@
       /*min_signal_collection_length_days=*/7,
       /*signal_storage_length_days=*/14);
 
-  // Set discrete mapping.
-  writer.AddBooleanSegmentDiscreteMapping(kResumeHeavyUserKey);
+  // Set OutputConfig.
+  writer.AddOutputConfigForBinaryClassifier(
+      /*threshold=*/0.5f,
+      /*positive_label=*/SegmentIdToHistogramVariant(kSegmentId),
+      /*negative_label=*/kLegacyNegativeLabel);
+
+  writer.AddPredictedResultTTLInOutputConfig(
+      /*top_label_to_ttl_list=*/{}, /*default_ttl=*/14,
+      /*time_unit=*/proto::TimeUnit::DAY);
 
   // Set features.
   writer.AddUmaFeatures(kUMAFeatures.data(), kUMAFeatures.size());
-  return std::make_unique<ModelConfig>(std::move(metadata),
-                                       /*model_version=*/1);
+  return std::make_unique<ModelConfig>(std::move(metadata), kModelVersion);
 }
 
 void ResumeHeavyUserModel::ExecuteModelWithInput(
diff --git a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc
index 85df72b5..a2013dd 100644
--- a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc
+++ b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc
@@ -17,19 +17,26 @@
 
 TEST_F(ResumeHeavyUserModelTest, InitAndFetchModel) {
   ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
 }
 
 TEST_F(ResumeHeavyUserModelTest, ExecuteModelWithInput) {
+  ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
+
+  EXPECT_FALSE(ExecuteWithInput(/*inputs=*/{}));
+
+  ModelProvider::Request input = {};
   // Input arguments in order: bookmarks_opened, mv_tiles_clicked,
   // opened_ntp_from_tab_groups, opened_item_from_history
-  ExpectExecutionWithInput(/*inputs=*/{0, 0, 0, 0, 0}, /*expected_error=*/false,
-                           /*expected_result=*/{0});
-  ExpectExecutionWithInput(/*inputs=*/{1, 0, 0, 0, 0}, /*expected_error=*/false,
-                           /*expected_result=*/{0});
-  ExpectExecutionWithInput(/*inputs=*/{2, 0, 0, 0, 0}, /*expected_error=*/false,
-                           /*expected_result=*/{1});
-  ExpectExecutionWithInput(/*inputs=*/{0, 3, 0, 0, 0}, /*expected_error=*/false,
-                           /*expected_result=*/{1});
+  ExpectClassifierResults(/*input=*/{0, 0, 0, 0, 0}, {kLegacyNegativeLabel});
+  ExpectClassifierResults(/*input=*/{1, 0, 0, 0, 0}, {kLegacyNegativeLabel});
+  ExpectClassifierResults(
+      /*input=*/{2, 0, 0, 0, 0},
+      {SegmentIdToHistogramVariant(SegmentId::RESUME_HEAVY_USER_SEGMENT)});
+  ExpectClassifierResults(
+      /*input=*/{0, 3, 0, 0, 0},
+      {SegmentIdToHistogramVariant(SegmentId::RESUME_HEAVY_USER_SEGMENT)});
 }
 
 }  // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/metadata/metadata_utils.cc b/components/segmentation_platform/internal/metadata/metadata_utils.cc
index 31c4b8c..3c457c4 100644
--- a/components/segmentation_platform/internal/metadata/metadata_utils.cc
+++ b/components/segmentation_platform/internal/metadata/metadata_utils.cc
@@ -530,9 +530,7 @@
       SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER,
       SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2,
       SegmentId::POWER_USER_SEGMENT,
-      SegmentId::CROSS_DEVICE_USER_SEGMENT,
-      SegmentId::INTENTIONAL_USER_SEGMENT,
-      SegmentId::RESUME_HEAVY_USER_SEGMENT};
+      SegmentId::CROSS_DEVICE_USER_SEGMENT};
 
   return segment_ids_use_legacy.contains(segment_id);
 }
diff --git a/components/segmentation_platform/internal/post_processor/post_processor.cc b/components/segmentation_platform/internal/post_processor/post_processor.cc
index 2f149c7a..24c7b5f 100644
--- a/components/segmentation_platform/internal/post_processor/post_processor.cc
+++ b/components/segmentation_platform/internal/post_processor/post_processor.cc
@@ -4,9 +4,11 @@
 
 #include "components/segmentation_platform/internal/post_processor/post_processor.h"
 
+#include "base/time/time.h"
 #include "components/segmentation_platform/internal/metadata/metadata_utils.h"
 
 #include "base/check_op.h"
+#include "base/logging.h"
 #include "base/notreached.h"
 #include "components/segmentation_platform/public/result.h"
 
@@ -212,6 +214,12 @@
   if (prediction_result.result_size() > 0 &&
       prediction_result.has_output_config()) {
     ordered_labels = GetClassifierResults(prediction_result);
+    if (!prediction_result.output_config().has_predicted_result_ttl()) {
+      LOG(ERROR) << "Prediction result has no `predicted_result_ttl` on its "
+                    "`output_config`, returning empty TTL.";
+      return base::TimeDelta();
+    }
+
     auto predicted_result_ttl =
         prediction_result.output_config().predicted_result_ttl();
     auto top_label_to_ttl_map = predicted_result_ttl.top_label_to_ttl_map();
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher.cc b/components/segmentation_platform/internal/selection/request_dispatcher.cc
index 34ab4ac..f0f768b 100644
--- a/components/segmentation_platform/internal/selection/request_dispatcher.cc
+++ b/components/segmentation_platform/internal/selection/request_dispatcher.cc
@@ -169,10 +169,10 @@
     WrappedCallback callback) {
   if (storage_service_->config_holder()->IsLegacySegmentationKey(
           segmentation_key)) {
-    VLOG(1) << "Segmentation key: " << segmentation_key
-            << " is using a legacy config with the new API which is not "
-               "supported. Legacy segments should use "
-               "GetSelectedSegmentOnDemand or migrate to the new config.";
+    LOG(ERROR) << "Segmentation key: " << segmentation_key
+               << " is using a legacy config with the new API which is not "
+                  "supported. Legacy segments should use "
+                  "GetSelectedSegmentOnDemand or migrate to the new config.";
     base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(callback), /*is_cached_result=*/false,
diff --git a/components/variations/cros_evaluate_seed/BUILD.gn b/components/variations/cros_evaluate_seed/BUILD.gn
index 8b7900d..b6b72c11 100644
--- a/components/variations/cros_evaluate_seed/BUILD.gn
+++ b/components/variations/cros_evaluate_seed/BUILD.gn
@@ -19,6 +19,8 @@
     "cros_safe_seed_manager.h",
     "cros_variations_field_trial_creator.cc",
     "cros_variations_field_trial_creator.h",
+    "early_boot_enabled_state_provider.cc",
+    "early_boot_enabled_state_provider.h",
     "early_boot_seed_store.cc",
     "early_boot_seed_store.h",
     "evaluate_seed.cc",
@@ -43,6 +45,7 @@
   testonly = true
   sources = [
     "cros_safe_seed_manager_unittest.cc",
+    "early_boot_enabled_state_provider_unittest.cc",
     "early_boot_seed_store_unittest.cc",
     "evaluate_seed_unittest.cc",
   ]
diff --git a/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.cc b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.cc
new file mode 100644
index 0000000..7e3837a
--- /dev/null
+++ b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.cc
@@ -0,0 +1,20 @@
+// 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 "components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h"
+
+namespace variations::cros_early_boot::evaluate_seed {
+
+EarlyBootEnabledStateProvider::EarlyBootEnabledStateProvider() = default;
+EarlyBootEnabledStateProvider::~EarlyBootEnabledStateProvider() = default;
+
+bool EarlyBootEnabledStateProvider::IsConsentGiven() const {
+  return false;
+}
+
+bool EarlyBootEnabledStateProvider::IsReportingEnabled() const {
+  return false;
+}
+
+}  // namespace variations::cros_early_boot::evaluate_seed
diff --git a/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h
new file mode 100644
index 0000000..1c96057
--- /dev/null
+++ b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h
@@ -0,0 +1,33 @@
+// 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 COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_EARLY_BOOT_ENABLED_STATE_PROVIDER_H_
+#define COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_EARLY_BOOT_ENABLED_STATE_PROVIDER_H_
+
+#include <components/metrics/enabled_state_provider.h>
+
+namespace variations::cros_early_boot::evaluate_seed {
+
+// Override of EnabledStateProvider to determine whether to report metrics in
+// early-boot contexts on ChromeOS.
+// This is a trivial class: we never want to report metrics in early-boot, as
+// they'd be too easily confused with metrics from chromium.
+class EarlyBootEnabledStateProvider : public metrics::EnabledStateProvider {
+ public:
+  EarlyBootEnabledStateProvider();
+
+  EarlyBootEnabledStateProvider(const EarlyBootEnabledStateProvider&) = delete;
+  EarlyBootEnabledStateProvider& operator=(
+      const EarlyBootEnabledStateProvider&) = delete;
+
+  ~EarlyBootEnabledStateProvider() override;
+
+  // EnabledStateProvider methods
+  bool IsConsentGiven() const override;
+  bool IsReportingEnabled() const override;
+};
+
+}  // namespace variations::cros_early_boot::evaluate_seed
+
+#endif  // COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_EARLY_BOOT_ENABLED_STATE_PROVIDER_H_
diff --git a/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider_unittest.cc b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider_unittest.cc
new file mode 100644
index 0000000..c66abb8
--- /dev/null
+++ b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider_unittest.cc
@@ -0,0 +1,25 @@
+// 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 "components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace variations::cros_early_boot::evaluate_seed {
+
+namespace {
+
+TEST(EarlyBootEnabledStateProviderTest, Consent) {
+  EarlyBootEnabledStateProvider provider;
+  EXPECT_FALSE(provider.IsConsentGiven());
+}
+
+TEST(EarlyBootEnabledStateProviderTest, ReportingEnabled) {
+  EarlyBootEnabledStateProvider provider;
+  EXPECT_FALSE(provider.IsReportingEnabled());
+}
+
+}  // namespace
+}  // namespace variations::cros_early_boot::evaluate_seed
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
index 9e8ead1..a6710c06 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
@@ -134,7 +134,7 @@
   base::Time source_time = base::Time::Now();
   const AttributionReport report =
       GetReport(source_time, /*trigger_time=*/source_time);
-  EXPECT_EQ(source_time + kDefaultFirstWindow + base::Hours(1),
+  EXPECT_EQ(source_time + kDefaultFirstWindow,
             AttributionStorageDelegateImpl().GetEventLevelReportTime(
                 report.GetStoredSource()->event_report_windows(), source_time,
                 report.attribution_info().time));
@@ -146,7 +146,7 @@
   base::Time trigger_time =
       source_time + kDefaultFirstWindow - base::Minutes(1);
   const AttributionReport report = GetReport(source_time, trigger_time);
-  EXPECT_EQ(source_time + kDefaultFirstWindow + base::Hours(1),
+  EXPECT_EQ(source_time + kDefaultFirstWindow,
             AttributionStorageDelegateImpl().GetEventLevelReportTime(
                 report.GetStoredSource()->event_report_windows(), source_time,
                 report.attribution_info().time));
@@ -161,7 +161,7 @@
   base::Time trigger_time =
       source_time + kDefaultFirstWindow + base::Minutes(1);
   const AttributionReport report = GetReport(source_time, trigger_time);
-  EXPECT_EQ(source_time + kDefaultSecondWindow + base::Hours(1),
+  EXPECT_EQ(source_time + kDefaultSecondWindow,
             AttributionStorageDelegateImpl().GetEventLevelReportTime(
                 report.GetStoredSource()->event_report_windows(), source_time,
                 report.attribution_info().time));
@@ -175,7 +175,7 @@
   // Set the impression to expire before the first window.
   const AttributionReport report = GetReport(source_time, trigger_time,
                                              /*expiry=*/base::Hours(2));
-  EXPECT_EQ(source_time + base::Hours(3),
+  EXPECT_EQ(source_time + base::Hours(2),
             AttributionStorageDelegateImpl().GetEventLevelReportTime(
                 report.GetStoredSource()->event_report_windows(), source_time,
                 report.attribution_info().time));
@@ -190,7 +190,7 @@
   const AttributionReport report = GetReport(source_time, trigger_time,
                                              /*expiry=*/base::Days(4));
 
-  EXPECT_EQ(source_time + base::Days(4) + base::Hours(1),
+  EXPECT_EQ(source_time + base::Days(4),
             AttributionStorageDelegateImpl().GetEventLevelReportTime(
                 report.GetStoredSource()->event_report_windows(), source_time,
                 report.attribution_info().time));
@@ -205,8 +205,7 @@
   const AttributionReport report = GetReport(source_time, trigger_time,
                                              /*expiry=*/base::Days(9));
 
-  // The expiry window is reported one hour after expiry time.
-  EXPECT_EQ(source_time + base::Days(9) + base::Hours(1),
+  EXPECT_EQ(source_time + base::Days(9),
             AttributionStorageDelegateImpl().GetEventLevelReportTime(
                 report.GetStoredSource()->event_report_windows(), source_time,
                 report.attribution_info().time));
@@ -303,11 +302,10 @@
   constexpr base::TimeDelta kExpiry = base::Days(9);
 
   constexpr base::Time kEarlyReportTime1 =
-      kImpressionTime + kDefaultFirstWindow + base::Hours(1);
+      kImpressionTime + kDefaultFirstWindow;
   constexpr base::Time kEarlyReportTime2 =
-      kImpressionTime + kDefaultSecondWindow + base::Hours(1);
-  constexpr base::Time kExpiryReportTime =
-      kImpressionTime + kExpiry + base::Hours(1);
+      kImpressionTime + kDefaultSecondWindow;
+  constexpr base::Time kExpiryReportTime = kImpressionTime + kExpiry;
 
   const struct {
     SourceType source_type;
@@ -325,8 +323,7 @@
           .sequence_index = 1,
           .expected = {{
               .trigger_data = 0,
-              .trigger_time =
-                  kExpiryReportTime - base::Hours(1) - base::Milliseconds(1),
+              .trigger_time = kExpiryReportTime - base::Milliseconds(1),
               .report_time = kExpiryReportTime,
           }},
       },
@@ -335,8 +332,7 @@
           .sequence_index = 2,
           .expected = {{
               .trigger_data = 1,
-              .trigger_time =
-                  kExpiryReportTime - base::Hours(1) - base::Milliseconds(1),
+              .trigger_time = kExpiryReportTime - base::Milliseconds(1),
               .report_time = kExpiryReportTime,
           }},
       },
@@ -351,8 +347,7 @@
           .sequence_index = 20,
           .expected = {{
               .trigger_data = 3,
-              .trigger_time =
-                  kEarlyReportTime1 - base::Hours(1) - base::Milliseconds(1),
+              .trigger_time = kEarlyReportTime1 - base::Milliseconds(1),
               .report_time = kEarlyReportTime1,
           }},
       },
@@ -363,14 +358,12 @@
               {
                   {
                       .trigger_data = 4,
-                      .trigger_time = kEarlyReportTime1 - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kEarlyReportTime1 - base::Milliseconds(1),
                       .report_time = kEarlyReportTime1,
                   },
                   {
                       .trigger_data = 2,
-                      .trigger_time = kEarlyReportTime1 - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kEarlyReportTime1 - base::Milliseconds(1),
                       .report_time = kEarlyReportTime1,
                   },
               },
@@ -382,14 +375,12 @@
               {
                   {
                       .trigger_data = 4,
-                      .trigger_time = kEarlyReportTime1 - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kEarlyReportTime1 - base::Milliseconds(1),
                       .report_time = kEarlyReportTime1,
                   },
                   {
                       .trigger_data = 4,
-                      .trigger_time = kEarlyReportTime1 - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kEarlyReportTime1 - base::Milliseconds(1),
                       .report_time = kEarlyReportTime1,
                   },
               },
@@ -401,20 +392,17 @@
               {
                   {
                       .trigger_data = 1,
-                      .trigger_time = kExpiryReportTime - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kExpiryReportTime - base::Milliseconds(1),
                       .report_time = kExpiryReportTime,
                   },
                   {
                       .trigger_data = 6,
-                      .trigger_time = kEarlyReportTime2 - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kEarlyReportTime2 - base::Milliseconds(1),
                       .report_time = kEarlyReportTime2,
                   },
                   {
                       .trigger_data = 7,
-                      .trigger_time = kEarlyReportTime1 - base::Hours(1) -
-                                      base::Milliseconds(1),
+                      .trigger_time = kEarlyReportTime1 - base::Milliseconds(1),
                       .report_time = kEarlyReportTime1,
                   },
               },
diff --git a/content/browser/attribution_reporting/attribution_utils.cc b/content/browser/attribution_reporting/attribution_utils.cc
index c19bae0..f4b6570 100644
--- a/content/browser/attribution_reporting/attribution_utils.cc
+++ b/content/browser/attribution_reporting/attribution_utils.cc
@@ -15,7 +15,6 @@
 
 namespace {
 
-constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1);
 constexpr base::TimeDelta kWindowTinyOffset = base::Milliseconds(1);
 
 }  // namespace
@@ -28,8 +27,8 @@
 
 base::Time LastTriggerTimeForReportTime(base::Time report_time) {
   // kWindowTinyOffset is needed as the window is not selected right at
-  // report_time - kWindowDeadlineOffset.
-  return report_time - kWindowDeadlineOffset - kWindowTinyOffset;
+  // report_time.
+  return report_time - kWindowTinyOffset;
 }
 
 std::string SerializeAttributionJson(base::ValueView body, bool pretty_print) {
diff --git a/content/browser/attribution_reporting/attribution_utils_unittest.cc b/content/browser/attribution_reporting/attribution_utils_unittest.cc
index d571b43..e9a9b88 100644
--- a/content/browser/attribution_reporting/attribution_utils_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_utils_unittest.cc
@@ -12,8 +12,7 @@
 
 TEST(AttributionUtilsTest, LastTriggerTimeForReportTime) {
   const base::Time time = base::Time::Now();
-  EXPECT_EQ(LastTriggerTimeForReportTime(time),
-            time - base::Hours(1) - base::Milliseconds(1));
+  EXPECT_EQ(LastTriggerTimeForReportTime(time), time - base::Milliseconds(1));
 }
 
 }  // namespace
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index ee5dd47..0b5e6e1 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -827,6 +827,11 @@
     blockedReasons->push_back(
         Network::SetCookieBlockedReasonEnum::UnknownError);
   }
+  if (status.HasExclusionReason(
+          net::CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT)) {
+    blockedReasons->push_back(
+        Network::SetCookieBlockedReasonEnum::NoCookieContent);
+  }
 
   return blockedReasons;
 }
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc
index 158460d..09922b47 100644
--- a/content/browser/devtools/protocol/storage_handler.cc
+++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -1030,15 +1030,9 @@
     case AccessType::kBid:
       type_enum = Storage::InterestGroupAccessTypeEnum::Bid;
       break;
-    case AccessType::kAdditionalBid:
-      type_enum = Storage::InterestGroupAccessTypeEnum::AdditionalBid;
-      break;
     case AccessType::kWin:
       type_enum = Storage::InterestGroupAccessTypeEnum::Win;
       break;
-    case AccessType::kAdditionalBidWin:
-      type_enum = Storage::InterestGroupAccessTypeEnum::AdditionalBidWin;
-      break;
   };
   frontend_->InterestGroupAccessed(access_time.ToDoubleT(), type_enum,
                                    owner_origin.Serialize(), name);
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc
index bd7dd234..bc55a0b7 100644
--- a/content/browser/interest_group/ad_auction_service_impl.cc
+++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -445,6 +445,7 @@
 
 void AdAuctionServiceImpl::GetInterestGroupAdAuctionData(
     const url::Origin& seller,
+    blink::mojom::AdAuctionCoordinator coordinator,
     GetInterestGroupAdAuctionDataCallback callback) {
   // If the interest group API is not allowed for this origin do nothing.
   if (!IsInterestGroupAPIAllowed(
@@ -456,6 +457,7 @@
   BiddingAndAuctionDataConstructionState state;
   state.callback = std::move(callback);
   state.seller = seller;
+  state.coordinator = coordinator;
 
   GetInterestGroupManager().GetInterestGroupAdAuctionData(
       GetTopWindowOrigin(),
@@ -840,8 +842,9 @@
   }
 
   state.data = std::move(data);
+  blink::mojom::AdAuctionCoordinator coordinator = state.coordinator;
   GetInterestGroupManager().GetBiddingAndAuctionServerKey(
-      GetRefCountedTrustedURLLoaderFactory().get(),
+      GetRefCountedTrustedURLLoaderFactory().get(), coordinator,
       base::BindOnce(&AdAuctionServiceImpl::OnGotBiddingAndAuctionServerKey,
                      weak_ptr_factory_.GetWeakPtr(), std::move(state)));
 }
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h
index 4a4af67d..78db7fdc 100644
--- a/content/browser/interest_group/ad_auction_service_impl.h
+++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -81,6 +81,7 @@
       DeprecatedReplaceInURNCallback callback) override;
   void GetInterestGroupAdAuctionData(
       const url::Origin& seller,
+      blink::mojom::AdAuctionCoordinator coordinator,
       GetInterestGroupAdAuctionDataCallback callback) override;
   void CreateAdRequest(blink::mojom::AdRequestConfigPtr config,
                        CreateAdRequestCallback callback) override;
@@ -118,6 +119,7 @@
     BiddingAndAuctionData data;
     base::Uuid request_id;
     url::Origin seller;
+    blink::mojom::AdAuctionCoordinator coordinator;
     GetInterestGroupAdAuctionDataCallback callback;
   };
 
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
index b6f93b3..4027c36 100644
--- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc
+++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -8444,7 +8444,7 @@
     base::RunLoop run_loop;
     absl::optional<AdAuctionDataAndId> output;
     interest_service->GetInterestGroupAdAuctionData(
-        seller,
+        seller, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting([&](mojo_base::BigBuffer result,
                                        const absl::optional<base::Uuid>& id) {
           AdAuctionDataAndId data;
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc
index 2003a39..48418bed 100644
--- a/content/browser/interest_group/auction_runner_unittest.cc
+++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -4752,24 +4752,9 @@
           ElementsAreRequests(
               BuildPrivateAggregationRequest(/*bucket=*/10, /*value=*/23),
               BuildPrivateAggregationRequest(/*bucket=*/30, /*value=*/43)))));
-
   // Bid count should only be incremented by 1.
-  base::RunLoop run_loop;
-  interest_group_manager_->GetInterestGroup(
-      kBidder1Key,
-      base::BindLambdaForTesting(
-          [&](absl::optional<StorageInterestGroup> interest_group) {
-            ASSERT_TRUE(interest_group);
-            // MakeInterestGroup() set `bid_count` to 5, so it should be 6
-            // (not 7).
-            EXPECT_EQ(6, interest_group->bidding_browser_signals->bid_count);
-            run_loop.Quit();
-          }));
-  run_loop.Run();
-
-  // Both uses should get reported to the observer, however.
   EXPECT_THAT(result_.interest_groups_that_bid,
-              testing::UnorderedElementsAre(kBidder1Key, kBidder1Key));
+              testing::UnorderedElementsAre(kBidder1Key));
   EXPECT_EQ(R"({"renderURL":"https://component2-bid.test/"})",
             result_.winning_group_ad_metadata);
   // Currently an interest group participating twice in an auction is counted
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc
index cb51bd4..6a02ab6 100644
--- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc
+++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc
@@ -58,84 +58,115 @@
     )");
 }  // namespace
 
-BiddingAndAuctionServerKeyFetcher::BiddingAndAuctionServerKeyFetcher() =
-    default;
+BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState::
+    PerCoordinatorFetcherState() = default;
+BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState::
+    ~PerCoordinatorFetcherState() = default;
+BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState::
+    PerCoordinatorFetcherState(PerCoordinatorFetcherState&& state) = default;
+BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState&
+BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState::operator=(
+    PerCoordinatorFetcherState&& state) = default;
+
+BiddingAndAuctionServerKeyFetcher::BiddingAndAuctionServerKeyFetcher() {
+  fetcher_state_map_.insert_or_assign(blink::mojom::AdAuctionCoordinator::kGCP,
+                                      PerCoordinatorFetcherState());
+  fetcher_state_map_.insert_or_assign(blink::mojom::AdAuctionCoordinator::kAWS,
+                                      PerCoordinatorFetcherState());
+  CHECK_EQ(
+      fetcher_state_map_.size(),
+      static_cast<size_t>(blink::mojom::AdAuctionCoordinator::kMaxValue) -
+          static_cast<size_t>(blink::mojom::AdAuctionCoordinator::kMinValue) +
+          1);
+  if (base::FeatureList::IsEnabled(
+          blink::features::kFledgeBiddingAndAuctionServer)) {
+    fetcher_state_map_.at(blink::mojom::AdAuctionCoordinator::kGCP).key_url =
+        GURL(blink::features::kFledgeBiddingAndAuctionKeyURL.Get());
+  }
+}
+
 BiddingAndAuctionServerKeyFetcher::~BiddingAndAuctionServerKeyFetcher() =
     default;
 
 void BiddingAndAuctionServerKeyFetcher::GetOrFetchKey(
     network::mojom::URLLoaderFactory* loader_factory,
+    blink::mojom::AdAuctionCoordinator coordinator,
     BiddingAndAuctionServerKeyFetcherCallback callback) {
-  GURL key_url(blink::features::kFledgeBiddingAndAuctionKeyURL.Get());
-  if (!key_url.is_valid()) {
+  PerCoordinatorFetcherState& state = fetcher_state_map_.at(coordinator);
+  if (!state.key_url.is_valid()) {
     std::move(callback).Run(absl::nullopt);
     return;
   }
 
   // If we have keys and they haven't expired just call the callback now.
-  if (keys_.size() > 0 && expiration_ > base::Time::Now()) {
+  if (state.keys.size() > 0 && state.expiration > base::Time::Now()) {
     // Use a random key from the set to limit the server's ability to identify
     // us based on the key we use.
-    std::move(callback).Run(keys_[base::RandInt(0, keys_.size() - 1)]);
+    std::move(callback).Run(
+        state.keys[base::RandInt(0, state.keys.size() - 1)]);
     return;
   }
 
-  queue_.push_back(std::move(callback));
-  if (queue_.size() > 1) {
+  state.queue.push_back(std::move(callback));
+  if (state.queue.size() > 1) {
     return;
   }
-  keys_.clear();
+  state.keys.clear();
 
+  CHECK(!state.loader);
   auto resource_request = std::make_unique<network::ResourceRequest>();
-  resource_request->url = key_url;
+  resource_request->url = state.key_url;
   resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
   resource_request->trusted_params.emplace();
   resource_request->trusted_params->isolation_info = net::IsolationInfo();
-  loader_ = network::SimpleURLLoader::Create(
+  state.loader = network::SimpleURLLoader::Create(
       std::move(resource_request),
       kBiddingAndAuctionServerKeyFetchTrafficAnnotation);
-  loader_->SetTimeoutDuration(kRequestTimeout);
+  state.loader->SetTimeoutDuration(kRequestTimeout);
 
-  loader_->DownloadToString(
+  state.loader->DownloadToString(
       loader_factory,
       base::BindOnce(&BiddingAndAuctionServerKeyFetcher::OnFetchKeyComplete,
-                     weak_ptr_factory_.GetWeakPtr()),
+                     weak_ptr_factory_.GetWeakPtr(), coordinator),
       /*max_body_size=*/kMaxBodySize);
 }
 
 void BiddingAndAuctionServerKeyFetcher::OnFetchKeyComplete(
+    blink::mojom::AdAuctionCoordinator coordinator,
     std::unique_ptr<std::string> response) {
+  fetcher_state_map_.at(coordinator).loader.reset();
   if (!response) {
-    FailAllCallbacks();
+    FailAllCallbacks(coordinator);
     return;
   }
-  loader_.reset();
   data_decoder::DataDecoder::ParseJsonIsolated(
       *response,
       base::BindOnce(&BiddingAndAuctionServerKeyFetcher::OnParsedKeys,
-                     weak_ptr_factory_.GetWeakPtr()));
+                     weak_ptr_factory_.GetWeakPtr(), coordinator));
 }
 
 void BiddingAndAuctionServerKeyFetcher::OnParsedKeys(
+    blink::mojom::AdAuctionCoordinator coordinator,
     data_decoder::DataDecoder::ValueOrError result) {
   if (!result.has_value()) {
-    FailAllCallbacks();
+    FailAllCallbacks(coordinator);
     return;
   }
 
   const base::Value::Dict* response_dict = result->GetIfDict();
   if (!response_dict) {
-    FailAllCallbacks();
+    FailAllCallbacks(coordinator);
     return;
   }
 
-  const base::Value::List* keys = response_dict->FindList("keys");
-  if (!keys) {
-    FailAllCallbacks();
+  const base::Value::List* key_values = response_dict->FindList("keys");
+  if (!key_values) {
+    FailAllCallbacks(coordinator);
     return;
   }
 
-  for (const auto& entry : *keys) {
+  std::vector<BiddingAndAuctionServerKey> keys;
+  for (const auto& entry : *key_values) {
     BiddingAndAuctionServerKey key;
     const base::Value::Dict* key_dict = entry.GetIfDict();
     if (!key_dict) {
@@ -156,38 +187,43 @@
       continue;
     }
     key.id = key_id;
-    keys_.push_back(std::move(key));
+    keys.push_back(std::move(key));
   }
 
-  if (keys_.size() == 0) {
-    FailAllCallbacks();
+  if (keys.size() == 0) {
+    FailAllCallbacks(coordinator);
     return;
   }
 
-  expiration_ = base::Time::Now() + kKeyRequestInterval;
+  PerCoordinatorFetcherState& state = fetcher_state_map_.at(coordinator);
+  state.keys = std::move(keys);
+  state.expiration = base::Time::Now() + kKeyRequestInterval;
 
-  while (!queue_.empty()) {
+  while (!state.queue.empty()) {
     // We call the callback *before* removing the current request from the list.
-    // It is possible that the callback may synchronously enqueue another
-    // request. If we remove the current request first then enqueuing the
-    // request would start another thread of execution since there was an empty
-    // queue.
+    // That avoids the problem if callback were to synchronously enqueue another
+    // request. If we removed the current request first then enqueued the
+    // request, that would start another thread of execution since there was an
+    // empty queue.
     // Use a random key from the set to limit the server's ability to identify
     // us based on the key we use.
-    std::move(queue_.front()).Run(keys_[base::RandInt(0, keys_.size() - 1)]);
-    queue_.pop_front();
+    std::move(state.queue.front())
+        .Run(state.keys[base::RandInt(0, state.keys.size() - 1)]);
+    state.queue.pop_front();
   }
 }
 
-void BiddingAndAuctionServerKeyFetcher::FailAllCallbacks() {
-  while (!queue_.empty()) {
+void BiddingAndAuctionServerKeyFetcher::FailAllCallbacks(
+    blink::mojom::AdAuctionCoordinator coordinator) {
+  PerCoordinatorFetcherState& state = fetcher_state_map_.at(coordinator);
+  while (!state.queue.empty()) {
     // We call the callback *before* removing the current request from the list.
-    // It is possible that the callback may synchronously enqueue another
-    // request. If we remove the current request first then enqueuing the
-    // request would start another thread of execution since there was an empty
-    // queue.
-    std::move(queue_.front()).Run(absl::nullopt);
-    queue_.pop_front();
+    // That avoids the problem if callback were to synchronously enqueue another
+    // request. If we removed the current request first then enqueued the
+    // request, that would start another thread of execution since there was an
+    // empty queue.
+    std::move(state.queue.front()).Run(absl::nullopt);
+    state.queue.pop_front();
   }
 }
 
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h
index 82851346..9a6a841 100644
--- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h
+++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h
@@ -6,12 +6,15 @@
 #define CONTENT_BROWSER_INTEREST_GROUP_BIDDING_AND_AUCTION_SERVER_KEY_FETCHER_H_
 
 #include <string>
+#include <vector>
 
 #include "base/containers/circular_deque.h"
 #include "base/functional/callback.h"
 #include "content/common/content_export.h"
 #include "services/data_decoder/public/cpp/data_decoder.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
+#include "third_party/blink/public/mojom/interest_group/ad_auction_service.mojom-shared.h"
+#include "url/gurl.h"
 
 namespace network {
 class SimpleURLLoader;
@@ -28,6 +31,9 @@
   uint8_t id;       // key id corresponding to this key.
 };
 
+// BiddingAndAuctionServerKeyFetcher Manages fetching and caching of the public
+// keys for Bidding and Auction Server endpoints from each of the designated
+// Coordinators.
 class CONTENT_EXPORT BiddingAndAuctionServerKeyFetcher {
  public:
   using BiddingAndAuctionServerKeyFetcherCallback =
@@ -45,31 +51,48 @@
   // network with the provided loader_factory if necessary. If the key is
   // immediately available then the callback may be called synchronously.
   void GetOrFetchKey(network::mojom::URLLoaderFactory* loader_factory,
+                     blink::mojom::AdAuctionCoordinator coordinator,
                      BiddingAndAuctionServerKeyFetcherCallback callback);
 
  private:
   // Called when the JSON blob containing the keys have been successfully
   // fetched over the network.
-  void OnFetchKeyComplete(std::unique_ptr<std::string> response);
+  void OnFetchKeyComplete(blink::mojom::AdAuctionCoordinator coordinator,
+                          std::unique_ptr<std::string> response);
 
   // Called when the JSON blob containing the keys has be parsed into
   // base::Values. Uses the parsed result to add keys to the cache and calls
   // queued callbacks.
-  void OnParsedKeys(data_decoder::DataDecoder::ValueOrError result);
-  void FailAllCallbacks();
+  void OnParsedKeys(blink::mojom::AdAuctionCoordinator coordinator,
+                    data_decoder::DataDecoder::ValueOrError result);
+  void FailAllCallbacks(blink::mojom::AdAuctionCoordinator coordinator);
 
-  // queue_ contains callbacks waiting for a key to be fetched over the network.
-  base::circular_deque<BiddingAndAuctionServerKeyFetcherCallback> queue_;
+  struct PerCoordinatorFetcherState {
+    PerCoordinatorFetcherState();
+    ~PerCoordinatorFetcherState();
 
-  // keys_ contains a list of keys received from the server (if any).
-  std::vector<BiddingAndAuctionServerKey> keys_;
+    PerCoordinatorFetcherState(PerCoordinatorFetcherState&& state);
+    PerCoordinatorFetcherState& operator=(PerCoordinatorFetcherState&& state);
 
-  // expiration_ contains the expiration time for any keys that are cached by
-  // this object.
-  base::Time expiration_ = base::Time::Min();
+    GURL key_url;
 
-  // loader_ contains the SimpleURLLoader being used to fetch the keys.
-  std::unique_ptr<network::SimpleURLLoader> loader_;
+    // queue_ contains callbacks waiting for a key to be fetched over the
+    // network.
+    base::circular_deque<BiddingAndAuctionServerKeyFetcherCallback> queue;
+
+    // keys_ contains a list of keys received from the server (if any).
+    std::vector<BiddingAndAuctionServerKey> keys;
+
+    // expiration_ contains the expiration time for any keys that are cached by
+    // this object.
+    base::Time expiration = base::Time::Min();
+
+    // loader_ contains the SimpleURLLoader being used to fetch the keys.
+    std::unique_ptr<network::SimpleURLLoader> loader;
+  };
+
+  base::flat_map<blink::mojom::AdAuctionCoordinator, PerCoordinatorFetcherState>
+      fetcher_state_map_;
 
   base::WeakPtrFactory<BiddingAndAuctionServerKeyFetcher> weak_ptr_factory_{
       this};
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc b/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc
index 3f2c3a1..3dcef250 100644
--- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc
+++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc
@@ -46,7 +46,7 @@
 
   base::RunLoop run_loop;
   fetcher.GetOrFetchKey(
-      &url_loader_factory_,
+      &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
       base::BindLambdaForTesting(
           [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
             EXPECT_FALSE(maybe_key.has_value());
@@ -84,7 +84,7 @@
     SCOPED_TRACE(response);
     base::RunLoop run_loop;
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               EXPECT_FALSE(maybe_key.has_value());
@@ -102,14 +102,14 @@
   int completed = 0;
   base::RunLoop run_loop;
   fetcher.GetOrFetchKey(
-      &url_loader_factory_,
+      &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
       base::BindLambdaForTesting(
           [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
             EXPECT_FALSE(maybe_key.has_value());
             completed++;
           }));
   fetcher.GetOrFetchKey(
-      &url_loader_factory_,
+      &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
       base::BindLambdaForTesting(
           [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
             EXPECT_FALSE(maybe_key.has_value());
@@ -128,13 +128,13 @@
   int completed = 0;
   base::RunLoop run_loop;
   fetcher.GetOrFetchKey(
-      &url_loader_factory_,
+      &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
       base::BindLambdaForTesting(
           [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
             EXPECT_FALSE(maybe_key.has_value());
             completed++;
             fetcher.GetOrFetchKey(
-                &url_loader_factory_,
+                &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
                 base::BindLambdaForTesting(
                     [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
                       EXPECT_FALSE(maybe_key.has_value());
@@ -154,7 +154,7 @@
   content::BiddingAndAuctionServerKey key;
   base::RunLoop run_loop;
   fetcher.GetOrFetchKey(
-      &url_loader_factory_,
+      &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
       base::BindLambdaForTesting(
           [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
             EXPECT_TRUE(maybe_key.has_value());
@@ -177,13 +177,13 @@
   int completed = 0;
   base::RunLoop run_loop;
   fetcher.GetOrFetchKey(
-      &url_loader_factory_,
+      &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
       base::BindLambdaForTesting(
           [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
             EXPECT_TRUE(maybe_key.has_value());
             completed++;
             fetcher.GetOrFetchKey(
-                &url_loader_factory_,
+                &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
                 base::BindLambdaForTesting(
                     [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
                       EXPECT_TRUE(maybe_key.has_value());
@@ -208,7 +208,7 @@
     content::BiddingAndAuctionServerKey key;
     base::RunLoop run_loop;
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               EXPECT_TRUE(maybe_key.has_value());
@@ -230,7 +230,7 @@
     content::BiddingAndAuctionServerKey key;
     base::RunLoop run_loop;
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               EXPECT_TRUE(maybe_key.has_value());
@@ -257,14 +257,14 @@
     content::BiddingAndAuctionServerKey key1, key2;
     base::RunLoop run_loop;
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               EXPECT_TRUE(maybe_key.has_value());
               key1 = *maybe_key;
             }));
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               key2 = *maybe_key;
@@ -293,7 +293,7 @@
     content::BiddingAndAuctionServerKey key;
     base::RunLoop run_loop;
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               EXPECT_TRUE(maybe_key.has_value());
@@ -317,7 +317,7 @@
     content::BiddingAndAuctionServerKey key;
     base::RunLoop run_loop;
     fetcher.GetOrFetchKey(
-        &url_loader_factory_,
+        &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP,
         base::BindLambdaForTesting(
             [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) {
               EXPECT_TRUE(maybe_key.has_value());
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc
index 6b1e9e6..d038ed1 100644
--- a/content/browser/interest_group/interest_group_auction.cc
+++ b/content/browser/interest_group/interest_group_auction.cc
@@ -976,10 +976,6 @@
       if (bid_state->made_bid) {
         interest_groups.emplace(bid_state->bidder->interest_group.owner,
                                 bid_state->bidder->interest_group.name);
-        auction_->interest_group_manager_->NotifyInterestGroupAccessed(
-            InterestGroupManagerImpl::InterestGroupObserver::kBid,
-            bid_state->bidder->interest_group.owner,
-            bid_state->bidder->interest_group.name);
         bid_count++;
       }
     }
@@ -2650,12 +2646,6 @@
   if (saved_response_) {
     interest_groups.insert(saved_response_->bidding_groups.begin(),
                            saved_response_->bidding_groups.end());
-    for (const auto& ig_bid : interest_groups) {
-      interest_group_manager_->NotifyInterestGroupAccessed(
-          InterestGroupManagerImpl::InterestGroupObserver::
-              InterestGroupObserver::kBid,
-          ig_bid.owner, ig_bid.name);
-    }
     return;
   }
 
@@ -2663,16 +2653,13 @@
     buyer_helper->GetInterestGroupsThatBidAndReportBidCounts(interest_groups);
   }
 
-  // Notify devtools of additional bids. These don't go into `interest_groups`,
-  // that's only things in the database.
-  for (const auto& bid_state : bid_states_for_additional_bids_) {
-    DCHECK(bid_state->made_bid);
-    interest_group_manager_->NotifyInterestGroupAccessed(
-        InterestGroupManagerImpl::InterestGroupObserver::InterestGroupObserver::
-            kAdditionalBid,
-        bid_state->bidder->interest_group.owner,
-        bid_state->bidder->interest_group.name);
-  }
+  // TODO(http://crbug.com/1464874, https://crbug.com/1475640): Report
+  // additional bids to devtools as well, similar to what
+  // BuyerHelper::GetInterestGroupsThatBidAndReportBidCounts does for things
+  // from interest groups. Likely will need to untangle
+  // InterestGroupManagerImpl::RecordInterestGroupBids doing both DB recording
+  // and debugging notification (and reporting is the wrong time for the debug
+  // info, too).
 
   // Retrieve data from component auctions as well.
   for (const auto& component_auction_info : component_auctions_) {
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h
index 75d4bfb4..ecf80c1 100644
--- a/content/browser/interest_group/interest_group_auction.h
+++ b/content/browser/interest_group/interest_group_auction.h
@@ -590,11 +590,9 @@
   // Returns all interest groups that bid in an auction. Expected to be called
   // after the bidding and scoring phase completes. Returns an empty set if the
   // auction failed for any reason other than the seller rejecting all bids.
-  // Bids from additional bids are not returned, since they do not really have
+  // Bids from additional bids are not included, since they do not really have
   // interest groups (and we don't want to attribute them to database IGs with
   // aliasing names).
-  //
-  // All bids (including additional bids) are also reported to the observer.
   void GetInterestGroupsThatBidAndReportBidCounts(
       blink::InterestGroupSet& interest_groups) const;
 
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc
index 06828fe..9a7b680 100644
--- a/content/browser/interest_group/interest_group_auction_reporter.cc
+++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -934,13 +934,6 @@
     interest_group_manager_->RecordInterestGroupWin(
         blink::InterestGroupKey(winning_group.owner, winning_group.name),
         winning_bid_info_.ad_metadata);
-    interest_group_manager_->NotifyInterestGroupAccessed(
-        InterestGroupManagerImpl::InterestGroupObserver::kWin,
-        winning_group.owner, winning_group.name);
-  } else {
-    interest_group_manager_->NotifyInterestGroupAccessed(
-        InterestGroupManagerImpl::InterestGroupObserver::kAdditionalBidWin,
-        winning_group.owner, winning_group.name);
   }
 
   interest_group_manager_->RegisterAdKeysAsJoined(
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
index ad1db767..67c4ab0 100644
--- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
+++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -145,24 +145,14 @@
                        "\"This be metadata\""}}})
             .Build();
 
-    // Join the interest groups that "won" and "lost" the auction - this matters
-    // for tests that make sure the interest group is updated correctly.
+    // Join the interest group that "won" the auction - this matters for tests
+    // that make sure the interest group is updated correctly.
     const blink::InterestGroup& interest_group =
         winning_bid_info_.storage_interest_group->interest_group;
     interest_group_manager_impl_->JoinInterestGroup(
         interest_group,
         /*joining_url=*/kWinningBidderOrigin.GetURL());
 
-    auto losing_interest_group =
-        blink::TestInterestGroupBuilder(kLosingBidderOrigin, kLosingBidderName)
-            .SetBiddingUrl(kLosingBidderScriptUrl)
-            // A non-empty ad list is needed by KAnonKeyForAdBid().
-            .SetAds({{{GURL("https://ad.render.url.test/"), "null"}}})
-            .Build();
-    interest_group_manager_impl_->JoinInterestGroup(
-        losing_interest_group,
-        /*joining_url=*/kLosingBidderOrigin.GetURL());
-
     winning_bid_info_.render_url = (*interest_group.ads)[0].render_url;
     winning_bid_info_.ad_metadata = kWinningAdMetadata;
 
@@ -357,26 +347,6 @@
     EXPECT_EQ((*prev_wins)[0]->ad_json, kWinningAdMetadata);
   }
 
-  void ExpectBidsForKey(const url::Origin& origin,
-                        const std::string& name,
-                        int expected_bids) {
-    absl::optional<StorageInterestGroup> interest_group =
-        interest_group_manager_impl_->BlockingGetInterestGroup(origin, name);
-    ASSERT_TRUE(interest_group);
-    EXPECT_EQ(expected_bids, interest_group->bidding_browser_signals->bid_count)
-        << origin << "," << name;
-  }
-
-  void ExpectNoBidsRecorded() {
-    ExpectBidsForKey(kWinningBidderOrigin, kWinningBidderName, 0);
-    ExpectBidsForKey(kLosingBidderOrigin, kLosingBidderName, 0);
-  }
-
-  void ExpectBidsRecordedOnce() {
-    ExpectBidsForKey(kWinningBidderOrigin, kWinningBidderName, 1);
-    ExpectBidsForKey(kLosingBidderOrigin, kLosingBidderName, 1);
-  }
-
   // AuctionWorkletManager::Delegate implementation.
   //
   // Note that none of these matter for these tests, as the the mock worklet
@@ -450,8 +420,6 @@
   const std::string kWinningBidderName = "winning interest group name";
   const std::string kWinningAdMetadata = R"({"render_url": "https://foo/"})";
 
-  const GURL kLosingBidderScriptUrl =
-      GURL("https://losing.bidder.origin.test/bidder_script.js");
   const url::Origin kLosingBidderOrigin =
       url::Origin::Create(GURL("https://losing.bidder.origin.test/"));
   const std::string kLosingBidderName = "losing interest group name";
@@ -465,6 +433,10 @@
   const url::Origin kComponentSellerOrigin =
       url::Origin::Create(kComponentSellerScriptUrl);
 
+  const std::vector<blink::InterestGroupKey> kExpectedInterestGroupsThatBid{
+      {kWinningBidderOrigin, kWinningBidderName},
+      {kLosingBidderOrigin, kLosingBidderName}};
+
   // Private aggregation requests. Their values don't matter, beyond that
   // they're different from each other.
   const auction_worklet::mojom::PrivateAggregationRequestPtr
@@ -1264,12 +1236,15 @@
 TEST_F(InterestGroupAuctionReporterTest, RecordWinAndBids) {
   SetUpAndStartSingleSellerAuction();
   ExpectNoWinsRecorded();
-  ExpectNoBidsRecorded();
+  EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+              testing::UnorderedElementsAre());
 
   // The win and bids should be recorded immediately upon navigation.
   interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run();
   ExpectWinRecordedOnce();
-  ExpectBidsRecordedOnce();
+  EXPECT_THAT(
+      interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+      testing::UnorderedElementsAreArray(kExpectedInterestGroupsThatBid));
 
   WaitForReportResultAndRunCallback(kSellerScriptUrl, absl::nullopt);
   WaitForReportWinAndRunCallback(absl::nullopt);
@@ -1277,7 +1252,8 @@
 
   // The win and bids should have been recorded only once.
   ExpectWinRecordedOnce();
-  ExpectBidsRecordedOnce();
+  EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+              testing::UnorderedElementsAre());
 }
 
 // Check that the winning interest group and bids are reported to the
@@ -1285,7 +1261,8 @@
 // after all reporting scripts have been run.
 TEST_F(InterestGroupAuctionReporterTest, RecordWinAndBidsLateNavigation) {
   SetUpAndStartSingleSellerAuction();
-  ExpectNoBidsRecorded();
+  EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+              testing::UnorderedElementsAre());
 
   WaitForReportResultAndRunCallback(kSellerScriptUrl, absl::nullopt);
   WaitForReportWinAndRunCallback(absl::nullopt);
@@ -1293,18 +1270,22 @@
   // Running reporting scripts should not cause the win or any bids to be
   // recorded.
   ExpectNoWinsRecorded();
-  ExpectNoBidsRecorded();
+  EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+              testing::UnorderedElementsAre());
 
   // The bids should be recorded immediately upon navigation.
   interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run();
   ExpectWinRecordedOnce();
-  ExpectBidsRecordedOnce();
+  EXPECT_THAT(
+      interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+      testing::UnorderedElementsAreArray(kExpectedInterestGroupsThatBid));
 
   WaitForCompletion();
 
   // The win and bids should have been recorded only once.
   ExpectWinRecordedOnce();
-  ExpectBidsRecordedOnce();
+  EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+              testing::UnorderedElementsAre());
 }
 
 // Check that the passed in `k_anon_keys_to_join` are reported to the
@@ -1715,7 +1696,8 @@
   EXPECT_THAT(interest_group_manager_impl_->TakeJoinedKAnonSets(),
               testing::UnorderedElementsAre());
   ExpectNoWinsRecorded();
-  ExpectNoBidsRecorded();
+  EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+              testing::UnorderedElementsAre());
   EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(),
               testing::UnorderedElementsAre());
   EXPECT_TRUE(
@@ -1782,7 +1764,9 @@
   EXPECT_THAT(interest_group_manager_impl_->TakeJoinedKAnonSets(),
               testing::UnorderedElementsAreArray(k_anon_keys_to_join_));
   ExpectWinRecordedOnce();
-  ExpectBidsRecordedOnce();
+  EXPECT_THAT(
+      interest_group_manager_impl_->TakeInterestGroupsThatBid(),
+      testing::UnorderedElementsAreArray(kExpectedInterestGroupsThatBid));
 
   // Private aggregation data should have been passed along only once.
   EXPECT_THAT(
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc
index 1ed0a74..8a7bdca 100644
--- a/content/browser/interest_group/interest_group_browsertest.cc
+++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -15968,21 +15968,24 @@
   // shell().
   [[nodiscard]] std::string GetInterestGroupAdAuctionData(
       url::Origin seller,
+      absl::optional<std::string> coordinator,
       absl::optional<ToRenderFrameHost> execution_target = absl::nullopt) {
     return EvalJs(execution_target ? *execution_target : shell(),
                   JsReplace(R"(
+    let config = {seller: $1}
+    if ($2) {
+      config.coordinator = $2;
+    }
     (async function() {
       try {
-        let data = await navigator.getInterestGroupAdAuctionData({
-          seller: $1
-        });
+        let data = await navigator.getInterestGroupAdAuctionData(config);
         return btoa(String.fromCharCode.apply(null, data.request)) + '|' +
           data.requestId;
       } catch (e) {
         return e.toString();
       }
     })())",
-                            seller))
+                            seller, coordinator.value_or("")))
         .ExtractString();
   }
 
@@ -15997,7 +16000,7 @@
 
   ASSERT_TRUE(NavigateToURL(shell(), test_url));
 
-  EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin));
+  EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin, "gcp"));
 }
 
 IN_PROC_BROWSER_TEST_F(InterestGroupBiddingAndAuctionServerBrowserTest,
@@ -16011,7 +16014,22 @@
       "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on "
       "'Navigator': seller 'null' for AdAuctionDataConfig must be a valid "
       "https origin.",
-      GetInterestGroupAdAuctionData(url::Origin()));
+      GetInterestGroupAdAuctionData(url::Origin(), "gcp"));
+}
+
+IN_PROC_BROWSER_TEST_F(InterestGroupBiddingAndAuctionServerBrowserTest,
+                       TestInvalidCoordinator) {
+  GURL test_url = https_server_->GetURL("a.test", "/interest_group/empty.html");
+  url::Origin test_origin = url::Origin::Create(test_url);
+
+  ASSERT_TRUE(NavigateToURL(shell(), test_url));
+
+  EXPECT_EQ(
+      "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on "
+      "'Navigator': Failed to read the 'coordinator' property from "
+      "'AdAuctionDataConfig': The provided value 'foo' is not a valid enum "
+      "value of type AdAuctionCoordinator.",
+      GetInterestGroupAdAuctionData(test_origin, "foo"));
 }
 
 IN_PROC_BROWSER_TEST_F(InterestGroupBiddingAndAuctionServerBrowserTest,
@@ -16056,8 +16074,8 @@
     WebContentsConsoleObserver console_observer(shell()->web_contents());
     console_observer.SetPattern(WarningPermissionsPolicy("*", "*"));
 
-    EXPECT_EQ("|",
-              GetInterestGroupAdAuctionData(test_origin, execution_target));
+    EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin, "gcp",
+                                                 execution_target));
 #if BUILDFLAG(IS_ANDROID)
     RenderFrameHost* execution_targets_with_message[] = {cross_origin_iframe};
 #else
@@ -16409,10 +16427,10 @@
           "NotAllowedError: Failed to execute 'getInterestGroupAdAuctionData' "
           "on 'Navigator': "
           "Feature run-ad-auction is not enabled by Permissions Policy",
-          GetInterestGroupAdAuctionData(test_origin, execution_target));
+          GetInterestGroupAdAuctionData(test_origin, "gcp", execution_target));
     } else {
-      EXPECT_EQ("|",
-                GetInterestGroupAdAuctionData(test_origin, execution_target));
+      EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin, "gcp",
+                                                   execution_target));
     }
   }
 }
@@ -16440,15 +16458,12 @@
 
   for (bool should_win : {true, false}) {
     SCOPED_TRACE(should_win);
-    AttachInterestGroupObserver();
     ClearReceivedRequests();
     ASSERT_TRUE(NavigateToURL(shell(), test_url));
     std::string auction_nonce = CreateAuctionNonceAndWait();
 
     GURL additional_bid_logic_url = https_server_->GetURL(
         "b.test", "/interest_group/bidding_logic_additional_bid.js");
-    url::Origin additional_bid_origin =
-        url::Origin::Create(additional_bid_logic_url);
 
     std::string auction_config = JsReplace(
         R"({
@@ -16473,7 +16488,7 @@
         test_origin,
         https_server_->GetURL("a.test", "/interest_group/decision_logic.js"),
         auction_nonce, additional_bid_ad_url, additional_bid_logic_url,
-        additional_bid_origin, should_win ? 1.99 : 0.1);
+        url::Origin::Create(additional_bid_logic_url), should_win ? 1.99 : 0.1);
 
     RunAuctionAndWaitForURLAndNavigateIframe(
         auction_config, should_win ? additional_bid_ad_url : ad_url);
@@ -16483,24 +16498,10 @@
           https_server_->GetURL("a.test", "/echoall?report_bidder_additional"));
       EXPECT_FALSE(HasServerSeenUrl(
           https_server_->GetURL("a.test", "/echoall?report_bidder")));
-      WaitForAccessObserved({
-          {TestInterestGroupObserver::kLoaded, test_origin, "cars"},
-          {TestInterestGroupObserver::kBid, test_origin, "cars"},
-          {TestInterestGroupObserver::kAdditionalBid, additional_bid_origin,
-           "campaign123"},
-          {TestInterestGroupObserver::kAdditionalBidWin, additional_bid_origin,
-           "campaign123"},
-      });
     } else {
       WaitForUrl(https_server_->GetURL("a.test", "/echoall?report_bidder"));
       EXPECT_FALSE(HasServerSeenUrl(https_server_->GetURL(
           "a.test", "/echoall?report_bidder_additional")));
-      WaitForAccessObserved(
-          {{TestInterestGroupObserver::kLoaded, test_origin, "cars"},
-           {TestInterestGroupObserver::kBid, test_origin, "cars"},
-           {TestInterestGroupObserver::kAdditionalBid, additional_bid_origin,
-            "campaign123"},
-           {TestInterestGroupObserver::kWin, test_origin, "cars"}});
     }
   }
 }
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc
index 33e03a93..b09a0bca 100644
--- a/content/browser/interest_group/interest_group_manager_impl.cc
+++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -31,6 +31,7 @@
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "services/network/public/mojom/client_security_state.mojom.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/interest_group/interest_group.h"
 
 #include "url/gurl.h"
@@ -249,6 +250,10 @@
   if (group_keys.empty()) {
     return;
   }
+  for (const auto& group_key : group_keys) {
+    NotifyInterestGroupAccessed(InterestGroupObserver::kBid, group_key.owner,
+                                group_key.name);
+  }
   impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupBids)
       .WithArgs(group_keys);
 }
@@ -256,6 +261,8 @@
 void InterestGroupManagerImpl::RecordInterestGroupWin(
     const blink::InterestGroupKey& group_key,
     const std::string& ad_json) {
+  NotifyInterestGroupAccessed(InterestGroupObserver::kWin, group_key.owner,
+                              group_key.name);
   impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupWin)
       .WithArgs(group_key, std::move(ad_json));
 }
@@ -454,9 +461,10 @@
 
 void InterestGroupManagerImpl::GetBiddingAndAuctionServerKey(
     network::mojom::URLLoaderFactory* loader,
+    blink::mojom::AdAuctionCoordinator coordinator,
     base::OnceCallback<void(absl::optional<BiddingAndAuctionServerKey>)>
         callback) {
-  ba_key_fetcher_.GetOrFetchKey(loader, std::move(callback));
+  ba_key_fetcher_.GetOrFetchKey(loader, coordinator, std::move(callback));
 }
 
 void InterestGroupManagerImpl::OnJoinInterestGroupPermissionsChecked(
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h
index f86bc74..6c1730f 100644
--- a/content/browser/interest_group/interest_group_manager_impl.h
+++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -90,16 +90,7 @@
 
   class CONTENT_EXPORT InterestGroupObserver : public base::CheckedObserver {
    public:
-    enum AccessType {
-      kJoin,
-      kLeave,
-      kUpdate,
-      kLoaded,
-      kBid,
-      kAdditionalBid,
-      kWin,
-      kAdditionalBidWin
-    };
+    enum AccessType { kJoin, kLeave, kUpdate, kLoaded, kBid, kWin };
     virtual void OnInterestGroupAccessed(const base::Time& access_time,
                                          AccessType type,
                                          const url::Origin& owner_origin,
@@ -199,7 +190,6 @@
 
   // Adds an entry to the bidding history for this interest group.
   void RecordInterestGroupBids(const blink::InterestGroupSet& groups);
-
   // Adds an entry to the win history for this interest group. `ad_json` is a
   // piece of opaque data to identify the winning ad.
   void RecordInterestGroupWin(const blink::InterestGroupKey& group_key,
@@ -339,6 +329,7 @@
 
   void GetBiddingAndAuctionServerKey(
       network::mojom::URLLoaderFactory* loader,
+      blink::mojom::AdAuctionCoordinator coordinator,
       base::OnceCallback<void(absl::optional<BiddingAndAuctionServerKey>)>
           callback);
 
@@ -351,10 +342,6 @@
     k_anonymity_manager_ = std::move(k_anonymity_manager);
   }
 
-  void NotifyInterestGroupAccessed(InterestGroupObserver::AccessType type,
-                                   const url::Origin& owner_origin,
-                                   const std::string& name);
-
  private:
   // InterestGroupUpdateManager calls private members to write updates to the
   // database.
@@ -433,6 +420,9 @@
   // To be called only by `update_manager_`.
   void ReportUpdateFailed(const blink::InterestGroupKey& group_key,
                           bool parse_failure);
+  void NotifyInterestGroupAccessed(InterestGroupObserver::AccessType type,
+                                   const url::Origin& owner_origin,
+                                   const std::string& name);
 
   void OnGetInterestGroupsComplete(
       base::OnceCallback<void(std::vector<StorageInterestGroup>)> callback,
diff --git a/content/browser/interest_group/test_interest_group_manager_impl.h b/content/browser/interest_group/test_interest_group_manager_impl.h
index 1475283..85975374 100644
--- a/content/browser/interest_group/test_interest_group_manager_impl.h
+++ b/content/browser/interest_group/test_interest_group_manager_impl.h
@@ -97,7 +97,7 @@
   std::vector<GURL> TakeReportUrlsOfType(ReportType report_type);
 
   // Returns all interest groups that bid, removing them from the internal list
-  // in the process. This is based on observer events, not database ones.
+  // in the process.
   std::vector<blink::InterestGroupKey> TakeInterestGroupsThatBid();
 
   // Returns all K-anon sets that have been joined, removing them from the
diff --git a/content/browser/interest_group/test_interest_group_observer.cc b/content/browser/interest_group/test_interest_group_observer.cc
index a19bfa0..16e89c5 100644
--- a/content/browser/interest_group/test_interest_group_observer.cc
+++ b/content/browser/interest_group/test_interest_group_observer.cc
@@ -13,7 +13,6 @@
 #include "base/time/time.h"
 #include "content/browser/interest_group/interest_group_manager_impl.h"
 #include "content/common/content_export.h"
-#include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/origin.h"
 
@@ -44,7 +43,7 @@
     run_loop_->Run();
     run_loop_.reset();
   }
-  EXPECT_THAT(accesses_, ::testing::UnorderedElementsAreArray(expected));
+  EXPECT_EQ(expected, accesses_);
 
   // Clear accesses so can be reused.
   accesses_.clear();
diff --git a/content/shell/browser/shell_platform_data_aura.cc b/content/shell/browser/shell_platform_data_aura.cc
index 72b880e..50450e5e 100644
--- a/content/shell/browser/shell_platform_data_aura.cc
+++ b/content/shell/browser/shell_platform_data_aura.cc
@@ -81,7 +81,9 @@
 
 #if BUILDFLAG(IS_OZONE)
   // Setup global display::Screen singleton.
-  screen_ = std::make_unique<aura::ScopedScreenOzone>();
+  if (!display::Screen::HasScreen()) {
+    screen_ = std::make_unique<aura::ScreenOzone>();
+  }
 #endif  // BUILDFLAG(IS_OZONE)
 
   ui::PlatformWindowInitProperties properties;
diff --git a/content/shell/browser/shell_platform_data_aura.h b/content/shell/browser/shell_platform_data_aura.h
index ff67f75d..0631869b 100644
--- a/content/shell/browser/shell_platform_data_aura.h
+++ b/content/shell/browser/shell_platform_data_aura.h
@@ -20,8 +20,8 @@
 }  // namespace aura
 
 #if BUILDFLAG(IS_OZONE)
-namespace display {
-class ScopedNativeScreen;
+namespace aura {
+class ScreenOzone;
 }
 #endif
 
@@ -47,7 +47,7 @@
 
  private:
 #if BUILDFLAG(IS_OZONE)
-  std::unique_ptr<display::ScopedNativeScreen> screen_;
+  std::unique_ptr<aura::ScreenOzone> screen_;
 #endif
 
   std::unique_ptr<aura::WindowTreeHost> host_;
diff --git a/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json b/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json
index d0d6f28..81da184 100644
--- a/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json
+++ b/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json
@@ -216,25 +216,25 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "2"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/aggregatable_report_window.json b/content/test/data/attribution_reporting/interop/aggregatable_report_window.json
index a053611..952735a 100644
--- a/content/test/data/attribution_reporting/interop/aggregatable_report_window.json
+++ b/content/test/data/attribution_reporting/interop/aggregatable_report_window.json
@@ -201,12 +201,12 @@
            "randomized_trigger_rate": 0.0024263,
            // 176,400 s  = 2 days (default first event_report_window) + 1 hour
            // (base delay)
-           "scheduled_report_time": "176400",
+           "scheduled_report_time": "172800",
            "source_event_id": "123",
            "source_type": "navigation",
            "trigger_data": "1"
         },
-        "report_time": "176400000",
+        "report_time": "172800000",
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
      },
      {
@@ -215,12 +215,12 @@
          "randomized_trigger_rate": 0.0024263,
          // 176,400 s  = 2 day (default first event_report_window) + 1 hour
          // (base delay)
-         "scheduled_report_time": "176400",
+         "scheduled_report_time": "172800",
          "source_event_id": "123",
          "source_type": "navigation",
          "trigger_data": "2"
       },
-      "report_time": "176400000",
+      "report_time": "172800000",
       "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
    }
     ],
diff --git a/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json b/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json
index 6965175..356bd6d1 100644
--- a/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json
+++ b/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json
@@ -165,36 +165,36 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411974",
+          "scheduled_report_time": "1643408374",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "2"
        },
-       "report_time": "1643411974000",
+       "report_time": "1643408374000",
        "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://another-destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411975",
+          "scheduled_report_time": "1643408375",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "3"
        },
-       "report_time": "1643411975000",
+       "report_time": "1643408375000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/basic.json b/content/test/data/attribution_reporting/interop/basic.json
index ae9be3ba..1b930fb 100644
--- a/content/test/data/attribution_reporting/interop/basic.json
+++ b/content/test/data/attribution_reporting/interop/basic.json
@@ -50,13 +50,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/basic_aggregatable.json b/content/test/data/attribution_reporting/interop/basic_aggregatable.json
index 200d063..12c2430a9 100644
--- a/content/test/data/attribution_reporting/interop/basic_aggregatable.json
+++ b/content/test/data/attribution_reporting/interop/basic_aggregatable.json
@@ -60,13 +60,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/channel_capacity.json b/content/test/data/attribution_reporting/interop/channel_capacity.json
index 5421d34..b0ce5a6 100644
--- a/content/test/data/attribution_reporting/interop/channel_capacity.json
+++ b/content/test/data/attribution_reporting/interop/channel_capacity.json
@@ -231,25 +231,25 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0007154,
-          "scheduled_report_time": "7204",
+          "scheduled_report_time": "3604",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "7204000"
+        "report_time": "3604000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 1.0,
-          "scheduled_report_time": "7206",
+          "scheduled_report_time": "3606",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "4"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "7206000"
+        "report_time": "3606000"
       }
     ]
   }
diff --git a/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json b/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json
index 397f59cb..791f7ad 100644
--- a/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json
+++ b/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json
@@ -53,13 +53,13 @@
 	  // (3 * 4 + 3) choose 3 = 455
 	  // 455 / (455 - 1 + exp(14)) = .0003782
           "randomized_trigger_rate": 0.0003782,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ]
   }
diff --git a/content/test/data/attribution_reporting/interop/dedup_key.json b/content/test/data/attribution_reporting/interop/dedup_key.json
index 63ee9c26..cc50df2 100644
--- a/content/test/data/attribution_reporting/interop/dedup_key.json
+++ b/content/test/data/attribution_reporting/interop/dedup_key.json
@@ -116,25 +116,25 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "randomized_trigger_rate": 0.0024263,
           "attribution_destination": "https://destination.test",
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/destination_limit.json b/content/test/data/attribution_reporting/interop/destination_limit.json
index 902bc2d..ecce9ca 100644
--- a/content/test/data/attribution_reporting/interop/destination_limit.json
+++ b/content/test/data/attribution_reporting/interop/destination_limit.json
@@ -342,60 +342,60 @@
         "payload": {
           "attribution_destination": "https://destination1.test",
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643325573",
+          "scheduled_report_time": "1643321973",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643325573000"
+        "report_time": "1643321973000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411977",
+          "scheduled_report_time": "1643408377",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411977000"
+        "report_time": "1643408377000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411979",
+          "scheduled_report_time": "1643408379",
           "source_event_id": "444",
           "source_type": "navigation",
           "trigger_data": "4"
         },
-        "report_time": "1643411979000",
+        "report_time": "1643408379000",
         "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411981",
+          "scheduled_report_time": "1643408381",
           "source_event_id": "666",
           "source_type": "navigation",
           "trigger_data": "6"
        },
-       "report_time": "1643411981000",
+       "report_time": "1643408381000",
        "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination3.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643498373",
+          "scheduled_report_time": "1643494773",
           "source_event_id": "555",
           "source_type": "navigation",
           "trigger_data": "5"
         },
-        "report_time": "1643498373000",
+        "report_time": "1643494773000",
         "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/destination_rate_limit.json b/content/test/data/attribution_reporting/interop/destination_rate_limit.json
index ec82421..7cdd3087 100644
--- a/content/test/data/attribution_reporting/interop/destination_rate_limit.json
+++ b/content/test/data/attribution_reporting/interop/destination_rate_limit.json
@@ -295,36 +295,36 @@
         "payload": {
           "attribution_destination": "https://destination3.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "2"
         },
         "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination5.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411975",
+          "scheduled_report_time": "1643408375",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "4"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411975000"
+        "report_time": "1643408375000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination8.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643412034",
+          "scheduled_report_time": "1643408434",
           "source_event_id": "444",
           "source_type": "navigation",
           "trigger_data": "6"
         },
-        "report_time": "1643412034000",
+        "report_time": "1643408434000",
         "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/event_level_report_time.json b/content/test/data/attribution_reporting/interop/event_level_report_time.json
index 7bc82eb..be4bb22 100644
--- a/content/test/data/attribution_reporting/interop/event_level_report_time.json
+++ b/content/test/data/attribution_reporting/interop/event_level_report_time.json
@@ -206,72 +206,72 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643335573",
+          "scheduled_report_time": "1643331973",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643335573000"
+        "report_time": "1643331973000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0008051,
-          "scheduled_report_time": "1643411974",
+          "scheduled_report_time": "1643408374",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "2"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411974000"
+        "report_time": "1643408374000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0008051,
-          "scheduled_report_time": "1643421974",
+          "scheduled_report_time": "1643418374",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643421974000"
+        "report_time": "1643418374000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1643421976",
+          "scheduled_report_time": "1643418376",
           "source_event_id": "666",
           "source_type": "event",
           "trigger_data": "1"
        },
-       "report_time": "1643421976000",
+       "report_time": "1643418376000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1644103175",
+          "scheduled_report_time": "1644099575",
           "source_event_id": "789",
           "source_type": "navigation",
           "trigger_data": "4"
         },
         "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1644103175000"
+        "report_time": "1644099575000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1644103175",
+          "scheduled_report_time": "1644099575",
           "source_event_id": "789",
           "source_type": "navigation",
           "trigger_data": "5"
        },
-       "report_time": "1644103175000",
+       "report_time": "1644099575000",
        "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ]
diff --git a/content/test/data/attribution_reporting/interop/event_level_storage_limit.json b/content/test/data/attribution_reporting/interop/event_level_storage_limit.json
index 39566cb..7ad9a02 100644
--- a/content/test/data/attribution_reporting/interop/event_level_storage_limit.json
+++ b/content/test/data/attribution_reporting/interop/event_level_storage_limit.json
@@ -165,24 +165,24 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://another-destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411975",
+          "scheduled_report_time": "1643408375",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "3"
        },
-       "report_time": "1643411975000",
+       "report_time": "1643408375000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json b/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json
index caa52e5..ae7b9752 100644
--- a/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json
+++ b/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json
@@ -272,49 +272,49 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "176400",
+          "scheduled_report_time": "172800",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "176400000"
+        "report_time": "172800000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "176400",
+          "scheduled_report_time": "172800",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "5"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "176400000"
+        "report_time": "172800000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "176400",
+          "scheduled_report_time": "172800",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "6"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "176400000"
+        "report_time": "172800000"
       },
       {
         "payload": {
           "attribution_destination": "https://another-destination.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "2595600",
+          "scheduled_report_time": "2592000",
           "source_event_id": "456",
           "source_type": "event",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "2595600001"
+        "report_time": "2592000001"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json b/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json
index f4af085f..d961903 100644
--- a/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json
+++ b/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json
@@ -184,37 +184,37 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "5"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "6"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "verbose_debug_reports": [
@@ -223,7 +223,7 @@
           "body": {
              "attribution_destination": "https://destination.test",
              "randomized_trigger_rate": 0.0024263,
-             "scheduled_report_time": "1643411973",
+             "scheduled_report_time": "1643408373",
              "source_event_id": "123",
              "source_type": "navigation",
              "trigger_data": "4"
@@ -238,7 +238,7 @@
           "body": {
              "attribution_destination": "https://destination.test",
              "randomized_trigger_rate": 0.0024263,
-             "scheduled_report_time": "1643843973",
+             "scheduled_report_time": "1643840373",
              "source_event_id": "123",
              "source_type": "navigation",
              "trigger_data": "7"
diff --git a/content/test/data/attribution_reporting/interop/event_report_window.json b/content/test/data/attribution_reporting/interop/event_report_window.json
index 60c8e54..8c98204 100644
--- a/content/test/data/attribution_reporting/interop/event_report_window.json
+++ b/content/test/data/attribution_reporting/interop/event_report_window.json
@@ -190,42 +190,40 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0001372,
-          // 7200 s = 3600 s (clamped event_report_window) + 1 h (base
-          // delay)
-          "scheduled_report_time": "7200",
+          // 3600 s = 3600 s (clamped event_report_window) delay
+          "scheduled_report_time": "3600",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "7200000"
+        "report_time": "3600000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0000025,
-          // 92,001 s = 1 s (source timestamp) + 88,400 s (event_report_window)
-          // + 1 h (base delay)
-          "scheduled_report_time": "92001",
+          // 88,401 s = 1 s (source timestamp) + 88,400 s (event_report_window)
+          "scheduled_report_time": "88401",
           "source_event_id": "456",
           "source_type": "event",
           "trigger_data": "1"
        },
-       "report_time": "92001000",
+       "report_time": "88401000",
        "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0000025,
-          // 90,002 s = 2 s (source timestamp) + 86,400 s (clamped
-          // event_report_window) + 1h (base delay)
-          "scheduled_report_time": "90002",
+          // 86,r02 s = 2 s (source timestamp) + 86,400 s (clamped
+          // event_report_window)
+          "scheduled_report_time": "86402",
           "source_event_id": "789",
           "source_type": "event",
           "trigger_data": "0"
        },
-       "report_time": "90002000",
+       "report_time": "86402000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/event_report_windows.json b/content/test/data/attribution_reporting/interop/event_report_windows.json
index 05a1263..e145666 100644
--- a/content/test/data/attribution_reporting/interop/event_report_windows.json
+++ b/content/test/data/attribution_reporting/interop/event_report_windows.json
@@ -193,41 +193,38 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0008051,
-          // 90000 s = 86400 s + 1 h (base delay).
-          "scheduled_report_time": "90000",
+          "scheduled_report_time": "86400",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "90000000"
+        "report_time": "86400000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0008051,
-          // 1299600 s = 1296000 s + 1 h (base delay).
-          "scheduled_report_time": "1299600",
+          "scheduled_report_time": "1296000",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "2"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1299600000"
+        "report_time": "1296000000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0001372,
-          // 7201 s = 3600 s (rounded window) + 1 h (base delay) + 1 s (source
-          // timestamp).
-          "scheduled_report_time": "7201",
+          // 3601 s = 3600 s (rounded window) + 1 s (source timestamp).
+          "scheduled_report_time": "3601",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "4"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "7201000"
+        "report_time": "3601000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/event_source.json b/content/test/data/attribution_reporting/interop/event_source.json
index 5878ae3d..d49b201 100644
--- a/content/test/data/attribution_reporting/interop/event_source.json
+++ b/content/test/data/attribution_reporting/interop/event_source.json
@@ -48,13 +48,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1645831173",
+          "scheduled_report_time": "1645827573",
           "source_event_id": "123",
           "source_type": "event",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1645831173000"
+        "report_time": "1645827573000"
       }
     ]
   }
diff --git a/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json b/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json
index 9c672f6..dd1a5ecf 100644
--- a/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json
+++ b/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json
@@ -103,27 +103,25 @@
         "payload": {
            "attribution_destination": "https://destination.test",
            "randomized_trigger_rate": 0.0000291,
-           // 25200 s = 21600 s + 1 h (base delay).
-           "scheduled_report_time": "25200",
+           "scheduled_report_time": "21600",
            "source_event_id": "123",
            "source_type": "event",
            "trigger_data": "0"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "25200000"
+        "report_time": "21600000"
       },
       {
         "payload": {
            "attribution_destination": "https://destination.test",
            "randomized_trigger_rate": 0.0000291,
-           // 46800 s = 43200 s + 1 h (base delay).
-           "scheduled_report_time": "46800",
+           "scheduled_report_time": "43200",
            "source_event_id": "123",
            "source_type": "event",
            "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "46800000"
+        "report_time": "43200000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json b/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json
index bde0ccd..f24bc5c 100644
--- a/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json
+++ b/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json
@@ -91,13 +91,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1645831173",
+          "scheduled_report_time": "1645827573",
           "source_event_id": "123",
           "source_type": "event",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1645831173000"
+        "report_time": "1645827573000"
       }
     ],
     "verbose_debug_reports": [
@@ -106,7 +106,7 @@
           "body": {
              "attribution_destination": "https://destination.test",
              "randomized_trigger_rate": 0.0000025,
-             "scheduled_report_time": "1645831173",
+             "scheduled_report_time": "1645827573",
              "source_event_id": "123",
              "source_type": "event",
              "trigger_data": "0"
diff --git a/content/test/data/attribution_reporting/interop/expired_source.json b/content/test/data/attribution_reporting/interop/expired_source.json
index ca8b85b1..0982382 100644
--- a/content/test/data/attribution_reporting/interop/expired_source.json
+++ b/content/test/data/attribution_reporting/interop/expired_source.json
@@ -202,36 +202,36 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643325573",
+          "scheduled_report_time": "1643321973",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "0"
        },
-       "report_time": "1643325573000",
+       "report_time": "1643321973000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643413975",
+          "scheduled_report_time": "1643410375",
           "source_event_id": "789",
           "source_type": "navigation",
           "trigger_data": "5"
        },
-       "report_time": "1643413975000",
+       "report_time": "1643410375000",
        "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://another-destination.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1643498374",
+          "scheduled_report_time": "1643494774",
           "source_event_id": "654",
           "source_type": "event",
           "trigger_data": "1"
        },
-       "report_time": "1643498374001",
+       "report_time": "1643494774001",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json b/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json
index c451c13..d69430e 100644
--- a/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json
+++ b/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json
@@ -116,13 +116,13 @@
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0000208,
-          "scheduled_report_time": "176402",
+          "scheduled_report_time": "172802",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "176402000"
+        "report_time": "172802000"
       }
     ],
     "verbose_debug_reports": [
@@ -131,7 +131,7 @@
           "body": {
             "attribution_destination": "https://destination.test",
             "randomized_trigger_rate": 8e-7,
-            "scheduled_report_time": "176400",
+            "scheduled_report_time": "172800",
             "source_event_id": "123",
             "source_type": "navigation",
             "trigger_data": "2"
@@ -146,7 +146,7 @@
            "body": {
               "attribution_destination": "https://destination2.test",
               "randomized_trigger_rate": 0.0000208,
-              "scheduled_report_time": "176402",
+              "scheduled_report_time": "172802",
               "source_event_id": "456",
               "source_type": "navigation",
               "trigger_data": "4"
diff --git a/content/test/data/attribution_reporting/interop/most_recent_source.json b/content/test/data/attribution_reporting/interop/most_recent_source.json
index cbe7d8e..8fb6fb6 100644
--- a/content/test/data/attribution_reporting/interop/most_recent_source.json
+++ b/content/test/data/attribution_reporting/interop/most_recent_source.json
@@ -65,13 +65,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411974",
+          "scheduled_report_time": "1643408374",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411974000"
+        "report_time": "1643408374000"
       }
     ]
   }
diff --git a/content/test/data/attribution_reporting/interop/multiple_destinations.json b/content/test/data/attribution_reporting/interop/multiple_destinations.json
index 5d5ed8e..d2d735f 100644
--- a/content/test/data/attribution_reporting/interop/multiple_destinations.json
+++ b/content/test/data/attribution_reporting/interop/multiple_destinations.json
@@ -94,13 +94,13 @@
             "https://destination.test"
           ],
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
@@ -109,13 +109,13 @@
             "https://destination.test"
           ],
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "5"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json
index f879694..5e54c7b4 100644
--- a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json
+++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json
@@ -278,49 +278,49 @@
         "payload": {
           "attribution_destination": [ "https://another-destination.test", "https://destination.test" ],
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411977",
+          "scheduled_report_time": "1643408377",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "6"
         },
         "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411977000"
+        "report_time": "1643408377000"
       },
       {
         "payload": {
           "attribution_destination": "https://another-destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411979",
+          "scheduled_report_time": "1643408379",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "5"
         },
         "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411979000"
+        "report_time": "1643408379000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1645831181",
+          "scheduled_report_time": "1645827581",
           "source_event_id": "444",
           "source_type": "event",
           "trigger_data": "1"
         },
         "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1645831181000"
+        "report_time": "1645827581000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json
index 507351d4..80e9c507 100644
--- a/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json
+++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json
@@ -400,73 +400,73 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643325573",
+          "scheduled_report_time": "1643321973",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643325573000"
+        "report_time": "1643321973000"
       },
       {
         "payload": {
           "attribution_destination": [ "https://another-destination.test", "https://destination.test" ],
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643325575",
+          "scheduled_report_time": "1643321975",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "7"
        },
-       "report_time": "1643325575000",
+       "report_time": "1643321975000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": [ "https://another-destination.test", "https://destination.test" ],
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643325575",
+          "scheduled_report_time": "1643321975",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643325575000"
+        "report_time": "1643321975000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411977",
+          "scheduled_report_time": "1643408377",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "2"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411977000"
+        "report_time": "1643408377000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411981",
+          "scheduled_report_time": "1643408381",
           "source_event_id": "555",
           "source_type": "navigation",
           "trigger_data": "4"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411981001"
+        "report_time": "1643408381001"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1645831183",
+          "scheduled_report_time": "1645827583",
           "source_event_id": "666",
           "source_type": "event",
           "trigger_data": "0"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1645831183000"
+        "report_time": "1645827583000"
       }
     ],
     "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json b/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json
index f21e858..64ee6b4 100644
--- a/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json
+++ b/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json
@@ -172,36 +172,36 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "1"
         },
-        "report_time": "1643411973001",
+        "report_time": "1643408373001",
         "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "2"
         },
-        "report_time": "1643411973002",
+        "report_time": "1643408373002",
         "report_url": "https://a.reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643498373",
+          "scheduled_report_time": "1643494773",
           "source_event_id": "555",
           "source_type": "navigation",
           "trigger_data": "4"
         },
-        "report_time": "1643498373000",
+        "report_time": "1643494773000",
         "report_url": "https://b.reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json
index c4e4ae2..ab1d04f 100644
--- a/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json
+++ b/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json
@@ -271,49 +271,49 @@
         "payload": {
           "attribution_destination": "https://destination1.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "111",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination1.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411974",
+          "scheduled_report_time": "1643408374",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "6"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411974000"
+        "report_time": "1643408374000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination2.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411976",
+          "scheduled_report_time": "1643408376",
           "source_event_id": "333",
           "source_type": "navigation",
           "trigger_data": "5"
         },
         "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411976000"
+        "report_time": "1643408376000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination1.test",
           "randomized_trigger_rate": 0.0000025,
-          "scheduled_report_time": "1648423173",
+          "scheduled_report_time": "1648419573",
           "source_event_id": "555",
           "source_type": "event",
           "trigger_data": "1"
         },
         "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1648423173000"
+        "report_time": "1648419573000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/same_destination_site.json b/content/test/data/attribution_reporting/interop/same_destination_site.json
index 90a149f..1c3b016a 100644
--- a/content/test/data/attribution_reporting/interop/same_destination_site.json
+++ b/content/test/data/attribution_reporting/interop/same_destination_site.json
@@ -69,13 +69,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/same_reporting_origin.json b/content/test/data/attribution_reporting/interop/same_reporting_origin.json
index a7df061..f8542152 100644
--- a/content/test/data/attribution_reporting/interop/same_reporting_origin.json
+++ b/content/test/data/attribution_reporting/interop/same_reporting_origin.json
@@ -67,13 +67,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ]
   }
diff --git a/content/test/data/attribution_reporting/interop/source_deactivation.json b/content/test/data/attribution_reporting/interop/source_deactivation.json
index 1012f7c22..a86ac1c 100644
--- a/content/test/data/attribution_reporting/interop/source_deactivation.json
+++ b/content/test/data/attribution_reporting/interop/source_deactivation.json
@@ -157,12 +157,12 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0001372,
-          "scheduled_report_time": "1643325574",
+          "scheduled_report_time": "1643321974",
           "source_event_id": "222",
           "source_type": "navigation",
           "trigger_data": "2"
        },
-       "report_time": "1643325574000",
+       "report_time": "1643321974000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ]
diff --git a/content/test/data/attribution_reporting/interop/source_priority.json b/content/test/data/attribution_reporting/interop/source_priority.json
index 522e75e..d43f6323 100644
--- a/content/test/data/attribution_reporting/interop/source_priority.json
+++ b/content/test/data/attribution_reporting/interop/source_priority.json
@@ -85,13 +85,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411974",
+          "scheduled_report_time": "1643408374",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "7"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411974000"
+        "report_time": "1643408374000"
       }
     ]
   }
diff --git a/content/test/data/attribution_reporting/interop/source_storage_limit.json b/content/test/data/attribution_reporting/interop/source_storage_limit.json
index b66c60e0..0b04895af 100644
--- a/content/test/data/attribution_reporting/interop/source_storage_limit.json
+++ b/content/test/data/attribution_reporting/interop/source_storage_limit.json
@@ -193,12 +193,12 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643412073",
+          "scheduled_report_time": "1643408473",
           "source_event_id": "555",
           "source_type": "navigation",
           "trigger_data": "4"
        },
-       "report_time": "1643412073000",
+       "report_time": "1643408473000",
        "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/success_debug_event_level.json b/content/test/data/attribution_reporting/interop/success_debug_event_level.json
index 948a050..96879437 100644
--- a/content/test/data/attribution_reporting/interop/success_debug_event_level.json
+++ b/content/test/data/attribution_reporting/interop/success_debug_event_level.json
@@ -175,7 +175,7 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7",
@@ -183,59 +183,59 @@
           "trigger_debug_key": "333"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "6",
           "source_debug_key": "111"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "5",
           "source_debug_key": "111"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "456",
           "source_type": "navigation",
           "trigger_data": "4",
           "trigger_debug_key": "555"
         },
         "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973001"
+        "report_time": "1643408373001"
       },
       {
         "payload": {
           "attribution_destination": "https://another-destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "789",
           "source_type": "navigation",
           "trigger_data": "3",
           "trigger_debug_key": "666"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973002"
+        "report_time": "1643408373002"
       }
     ],
     "debug_event_level_results": [
@@ -243,7 +243,7 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "7",
diff --git a/content/test/data/attribution_reporting/interop/top_level_filter_data.json b/content/test/data/attribution_reporting/interop/top_level_filter_data.json
index 693de3ad..3554d4fa 100644
--- a/content/test/data/attribution_reporting/interop/top_level_filter_data.json
+++ b/content/test/data/attribution_reporting/interop/top_level_filter_data.json
@@ -340,36 +340,36 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "3"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       },
       {
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "5"
         },
-        "report_time": "1643411973000",
+        "report_time": "1643408373000",
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       },
       {
         "payload": {
            "attribution_destination": "https://another-destination.test",
            "randomized_trigger_rate": 0.0000025,
-           "scheduled_report_time": "1645831173",
+           "scheduled_report_time": "1645827573",
            "source_event_id": "456",
            "source_type": "event",
            "trigger_data": "1"
         },
-        "report_time": "1645831173001",
+        "report_time": "1645827573001",
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution"
       }
     ],
diff --git a/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json b/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json
index da67a7d..7ee0e83e 100644
--- a/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json
+++ b/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json
@@ -80,13 +80,13 @@
         "payload": {
           "attribution_destination": "https://destination.test",
           "randomized_trigger_rate": 0.0024263,
-          "scheduled_report_time": "1643411973",
+          "scheduled_report_time": "1643408373",
           "source_event_id": "123",
           "source_type": "navigation",
           "trigger_data": "1"
         },
         "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution",
-        "report_time": "1643411973000"
+        "report_time": "1643408373000"
       }
     ],
     "verbose_debug_reports": [
diff --git a/content/test/gpu/unexpected_passes/gpu_builders.py b/content/test/gpu/unexpected_passes/gpu_builders.py
index 6ecc477..d3fb530 100644
--- a/content/test/gpu/unexpected_passes/gpu_builders.py
+++ b/content/test/gpu/unexpected_passes/gpu_builders.py
@@ -22,7 +22,7 @@
     # Builders running tests in Chrome Labs.
     tests = test_map.get('isolated_scripts', [])
     for t in tests:
-      if t.get('isolate_name') not in self.GetIsolateNames():
+      if t.get('test') not in self.GetIsolateNames():
         continue
       if self._suite in t.get('args', []):
         return True
diff --git a/content/test/gpu/unexpected_passes/gpu_builders_unittest.py b/content/test/gpu/unexpected_passes/gpu_builders_unittest.py
index 022db14..cd311a11 100755
--- a/content/test/gpu/unexpected_passes/gpu_builders_unittest.py
+++ b/content/test/gpu/unexpected_passes/gpu_builders_unittest.py
@@ -24,7 +24,7 @@
                 'args': [
                     'webgl_conformance',
                 ],
-                'isolate_name': 'telemetry_gpu_integration_test',
+                'test': 'telemetry_gpu_integration_test',
             },
         ],
     }
@@ -52,7 +52,7 @@
                 'args': [
                     'webgl_conformance',
                 ],
-                'isolate_name': 'not_telemetry',
+                'test': 'not_telemetry',
             },
         ],
     }
@@ -80,7 +80,7 @@
                 'args': [
                     'not_a_suite',
                 ],
-                'isolate_name': 'telemetry_gpu_integration_test',
+                'test': 'telemetry_gpu_integration_test',
             },
         ],
     }
diff --git a/device/fido/features.cc b/device/fido/features.cc
index a358428..fd01a20c 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -64,10 +64,10 @@
              "WebAuthenticationAndroidCredMan",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Enabled in M118. Remove in or after M121.
+// Not yet enabled by default.
 BASE_FEATURE(kWebAuthnAndroidCredManForHybrid,
              "WebAuthenticationAndroidCredManForHybrid",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Added in M118, Not yet enabled by default.
 BASE_FEATURE(kWebAuthnAndroidCredManAndGmsCore,
diff --git a/docs/chromium_browser_vs_google_chrome.md b/docs/chromium_browser_vs_google_chrome.md
index 1ed161f8..7aadbf2 100644
--- a/docs/chromium_browser_vs_google_chrome.md
+++ b/docs/chromium_browser_vs_google_chrome.md
@@ -43,7 +43,8 @@
 *   Cache is kept in `~/.cache/chromium`
 *   New release testing depends on the distribution
     *   Distributions are encouraged to track stable channel releases: see
-        http://googlechromereleases.blogspot.com/, http://omahaproxy.appspot.com/
-        and http://gsdview.appspot.com/chromium-browser-official/
+        https://chromereleases.googleblog.com/,
+        https://chromiumdash.appspot.com/releases?platform=Linux
+        and https://gsdview.appspot.com/chromium-browser-official/
 *   Google API keys depend on the distribution
     *   See https://www.chromium.org/developers/how-tos/api-keys
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md
index a9a0077..1c86704 100644
--- a/docs/updater/functional_spec.md
+++ b/docs/updater/functional_spec.md
@@ -463,7 +463,7 @@
 [Omaha Protocol](protocol_3_1.md).
 
 The updater uses platform-native network stacks (WinHTTP on Windows and
-NSURLSession on macOS).
+NSURLSession on macOS) with user-agent `"{PRODUCT_FULLNAME} {UpdaterVersion}"`.
 
 #### Security
 It is not possible to MITM the updater even if the network (including TLS) is
diff --git a/docs/website b/docs/website
index c83dfca..ca1c5b7 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit c83dfcabbbce1956edf91dbdc1d863cb062e3fd5
+Subproject commit ca1c5b7a5c17baf0bda343ab5bb4e18c30c87c01
diff --git a/extensions/common/user_script.cc b/extensions/common/user_script.cc
index 2a46fc2..15003759 100644
--- a/extensions/common/user_script.cc
+++ b/extensions/common/user_script.cc
@@ -199,24 +199,20 @@
 }
 
 bool UserScript::MatchesURL(const GURL& url) const {
-  if (!url_set_.is_empty()) {
-    if (!url_set_.MatchesURL(url))
-      return false;
+  if (!url_set_.is_empty() && !url_set_.MatchesURL(url)) {
+    return false;
   }
 
-  if (!exclude_url_set_.is_empty()) {
-    if (exclude_url_set_.MatchesURL(url))
-      return false;
+  if (!exclude_url_set_.is_empty() && exclude_url_set_.MatchesURL(url)) {
+    return false;
   }
 
-  if (!globs_.empty()) {
-    if (!UrlMatchesGlobs(&globs_, url))
-      return false;
+  if (!globs_.empty() && !UrlMatchesGlobs(&globs_, url)) {
+    return false;
   }
 
-  if (!exclude_globs_.empty()) {
-    if (UrlMatchesGlobs(&exclude_globs_, url))
-      return false;
+  if (!exclude_globs_.empty() && UrlMatchesGlobs(&exclude_globs_, url)) {
+    return false;
   }
 
   return true;
diff --git a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc
index e006f0a..69388fd 100644
--- a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc
+++ b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc
@@ -244,7 +244,7 @@
                           base::Unretained(this)));
 
   // Configure Ozone with an Aura implementation of the Screen abstraction.
-  screen_ = std::make_unique<aura::ScopedScreenOzone>();
+  screen_ = std::make_unique<aura::ScreenOzone>();
 
   // Create the FuchsiaCdmManager at startup rather than on-demand, to allow it
   // to perform potentially expensive startup work in the background.
diff --git a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h
index f0037396b..3b5911f 100644
--- a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h
+++ b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h
@@ -22,8 +22,8 @@
 class FuchsiaIntlProfileWatcher;
 }
 
-namespace display {
-class ScopedNativeScreen;
+namespace aura {
+class ScreenOzone;
 }
 
 namespace content {
@@ -122,7 +122,7 @@
 
   content::ContentBrowserClient* const browser_client_;
 
-  std::unique_ptr<display::ScopedNativeScreen> screen_;
+  std::unique_ptr<aura::ScreenOzone> screen_;
 
   // Used to publish diagnostics including the active Contexts and FrameHosts.
   std::unique_ptr<sys::ComponentInspector> component_inspector_;
diff --git a/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json b/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json
index 202a6bc..8e7d7dca 100644
--- a/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json
+++ b/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json
@@ -63,8 +63,7 @@
   },
   "$build/siso": {
     "configs": [
-      "builder",
-      "local_typescript"
+      "builder"
     ],
     "enable_cloud_profiler": true,
     "enable_cloud_trace": true,
diff --git a/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json b/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json
index 21b66708..3c835d09 100644
--- a/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json
+++ b/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json
@@ -59,6 +59,15 @@
     "metrics_project": "chromium-reclient-metrics",
     "scandeps_server": true
   },
+  "$build/siso": {
+    "configs": [
+      "builder"
+    ],
+    "enable_cloud_profiler": true,
+    "enable_cloud_trace": true,
+    "experiments": [],
+    "project": "rbe-chromium-untrusted"
+  },
   "$recipe_engine/resultdb/test_presentation": {
     "column_keys": [],
     "grouping_keys": [
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index a12d75c..7f0182b 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -827,6 +827,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-asan-compile-dbg\">android-asan-compile-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -922,6 +923,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-nvidia-shield-tv\">gpu-fyi-try-android-nvidia-shield-tv</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1016,6 +1018,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-m-nexus-5x-64\">gpu-fyi-try-android-m-nexus-5x-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1110,6 +1113,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-p-pixel-2-32\">gpu-fyi-try-android-p-pixel-2-32</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1204,6 +1208,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-r-pixel-4-32\">gpu-fyi-try-android-r-pixel-4-32</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1298,6 +1303,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-pixel-6-64\">gpu-fyi-try-android-pixel-6-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-cq-android-arm64\">gpu-fyi-cq-android-arm64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1581,6 +1587,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-rel\">android-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel\">android-arm64-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-android-m-nexus-5x-64\">gpu-try-android-m-nexus-5x-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1675,6 +1682,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-nougat-arm64-dbg\">android-webview-nougat-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_unswarmed_pixel_aosp\">android_unswarmed_pixel_aosp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1769,6 +1777,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-oreo-arm64-dbg\">android-webview-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1863,6 +1872,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-pie-arm64-dbg\">android-webview-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -1958,6 +1968,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm-compile-dbg\">android-arm-compile-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2053,6 +2064,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-oreo-arm64-dbg\">android-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-dbg\">android-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-nougat-arm64-dbg\">android-webview-nougat-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-oreo-arm64-dbg\">android-webview-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-pie-arm64-dbg\">android-webview-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_unswarmed_pixel_aosp\">android_unswarmed_pixel_aosp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/try-nougat-phone-tester\">try-nougat-phone-tester</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2145,6 +2157,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-all-targets-dbg\">android-arm64-all-targets-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_compile_dbg\">android_compile_dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2238,6 +2251,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-dbg\">android-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-x64-dbg\">android-12l-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-12-x64-dbg\">android-webview-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-13-x64-dbg\">android-webview-13-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2334,6 +2348,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_compile_x64_dbg\">android_compile_x64_dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2429,6 +2444,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_compile_x86_dbg\">android_compile_x86_dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2799,6 +2815,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-x64-cast\">android-x64-cast</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2894,6 +2911,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-x64-castos-audio\">linux-x64-castos-audio</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -2988,6 +3006,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-x64-castos\">linux-x64-castos</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -3082,6 +3101,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-arm64-castos\">linux-arm64-castos</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -3176,6 +3196,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-x64-castos-dbg\">linux-x64-castos-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -3362,6 +3383,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-chromeos-amd64-generic\">gpu-fyi-try-chromeos-amd64-generic</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -3457,6 +3479,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-chromeos-kevin\">gpu-fyi-try-chromeos-kevin</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -3552,6 +3575,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-chromeos-skylab-kevin\">gpu-fyi-try-chromeos-skylab-kevin</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -5657,6 +5681,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-dawn-arm-rel\">android-dawn-arm-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -5752,6 +5777,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm-deps-rel\">dawn-android-arm-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -5846,6 +5872,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm-deps-rel\">dawn-android-arm-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -5940,6 +5967,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm-deps-rel\">dawn-android-arm-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6034,6 +6062,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-dawn-arm-rel\">android-dawn-arm-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6128,6 +6157,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-dawn-arm-rel\">android-dawn-arm-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6223,6 +6253,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm64-deps-rel\">dawn-android-arm64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6318,6 +6349,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-dawn-arm64-rel\">android-dawn-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6413,6 +6445,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-linux-tsan-rel\">dawn-try-linux-tsan-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6508,6 +6541,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dawn-rel\">linux-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6602,6 +6636,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-linux-x64-deps-rel\">dawn-linux-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6695,6 +6730,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-linux-x64-deps-rel\">dawn-linux-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6788,6 +6824,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-linux-x64-deps-rel\">dawn-linux-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6881,6 +6918,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dawn-rel\">linux-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -6974,6 +7012,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dawn-rel\">linux-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7159,6 +7198,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-arm64-rel\">dawn-try-mac-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7252,6 +7292,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-dawn-rel\">mac-dawn-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-amd-exp\">dawn-try-mac-amd-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-intel-exp\">dawn-try-mac-intel-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7344,6 +7385,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-mac-x64-deps-rel\">dawn-mac-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7437,6 +7479,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-mac-x64-deps-rel\">dawn-mac-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7530,6 +7573,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-mac-x64-deps-rel\">dawn-mac-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7623,6 +7667,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-amd-exp\">dawn-try-mac-amd-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7716,6 +7761,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-intel-exp\">dawn-try-mac-intel-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7809,6 +7855,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-dawn-rel\">mac-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7902,6 +7949,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-dawn-rel\">mac-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -7996,6 +8044,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-intel-asan\">dawn-try-win10-x64-intel-asan</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-nvidia-asan\">dawn-try-win10-x64-nvidia-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8090,6 +8139,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-intel-asan\">dawn-try-win10-x64-intel-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8184,6 +8234,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-nvidia-asan\">dawn-try-win10-x64-nvidia-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8279,6 +8330,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x64-intel-exp\">dawn-try-win-x64-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-dawn-rel\">win-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8373,6 +8425,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x64-deps-rel\">dawn-win10-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8466,6 +8519,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x64-deps-rel\">dawn-win10-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8559,6 +8613,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x64-deps-rel\">dawn-win10-x64-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8652,6 +8707,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x64-intel-exp\">dawn-try-win-x64-intel-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8745,6 +8801,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-dawn-rel\">win-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8838,6 +8895,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-dawn-rel\">win-dawn-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -8932,6 +8990,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x86-intel-exp\">dawn-try-win-x86-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x86-rel\">dawn-try-win10-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -9026,6 +9085,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x86-deps-rel\">dawn-win10-x86-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -9119,6 +9179,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x86-deps-rel\">dawn-win10-x86-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -9213,6 +9274,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x86-deps-rel\">dawn-win10-x86-deps-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -9306,6 +9368,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x86-intel-exp\">dawn-try-win-x86-intel-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -9399,6 +9462,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x86-rel\">dawn-try-win10-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -9492,6 +9556,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x86-rel\">dawn-try-win10-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10066,6 +10131,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-nvidia-shield-tv\">gpu-fyi-try-android-nvidia-shield-tv</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-p-pixel-2-32\">gpu-fyi-try-android-p-pixel-2-32</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-r-pixel-4-32\">gpu-fyi-try-android-r-pixel-4-32</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10161,6 +10227,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-m-nexus-5x-64\">gpu-fyi-try-android-m-nexus-5x-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-pixel-6-64\">gpu-fyi-try-android-pixel-6-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-cq-android-arm64\">gpu-fyi-cq-android-arm64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10256,6 +10323,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-amd-rel\">gpu-fyi-try-lacros-amd-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-intel-rel\">gpu-fyi-try-lacros-intel-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10351,6 +10419,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-amd-rel\">gpu-fyi-try-linux-amd-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-exp\">gpu-fyi-try-linux-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-rel\">gpu-fyi-try-linux-intel-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-exp\">gpu-fyi-try-linux-nvidia-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-rel\">gpu-fyi-try-linux-nvidia-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10446,6 +10515,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-dbg\">gpu-fyi-try-linux-nvidia-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10539,6 +10609,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-pro-rel\">gpu-fyi-try-mac-amd-pro-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-exp\">gpu-fyi-try-mac-amd-retina-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-rel\">gpu-fyi-try-mac-amd-retina-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-exp\">gpu-fyi-try-mac-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-rel\">gpu-fyi-try-mac-intel-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-exp\">gpu-fyi-try-mac-nvidia-retina-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-rel\">gpu-fyi-try-mac-nvidia-retina-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10632,6 +10703,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-asan\">gpu-fyi-try-mac-amd-retina-asan</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-asan\">gpu-fyi-try-mac-intel-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10725,6 +10797,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-dbg\">gpu-fyi-try-mac-amd-retina-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-dbg\">gpu-fyi-try-mac-intel-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10818,6 +10891,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp\">gpu-fyi-try-mac-arm64-apple-m1-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel\">gpu-fyi-try-mac-arm64-apple-m1-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel\">gpu-fyi-try-mac-arm64-apple-m2-retina-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -10913,6 +10987,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-32\">gpu-fyi-try-win10-nvidia-rel-32</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11007,6 +11082,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-amd-rel-64\">gpu-fyi-try-win10-amd-rel-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-exp-64\">gpu-fyi-try-win10-intel-exp-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-rel-64\">gpu-fyi-try-win10-intel-rel-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-exp-64\">gpu-fyi-try-win10-nvidia-exp-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-64\">gpu-fyi-try-win10-nvidia-rel-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11102,6 +11178,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dbg-64\">gpu-fyi-try-win10-nvidia-dbg-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11196,6 +11273,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-rel-64\">gpu-fyi-try-win10-nvidia-dx12vk-rel-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11291,6 +11369,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-dbg-64\">gpu-fyi-try-win10-nvidia-dx12vk-dbg-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11576,6 +11655,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-rel\">gpu-try-linux-nvidia-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11668,6 +11748,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-dbg\">gpu-try-linux-nvidia-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11760,6 +11841,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11850,6 +11932,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-amd-retina-dbg\">gpu-try-mac-amd-retina-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-intel-dbg\">gpu-try-mac-intel-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -11944,6 +12027,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -12129,6 +12213,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-amd-rel\">gpu-fyi-try-lacros-amd-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -12223,6 +12308,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-intel-rel\">gpu-fyi-try-lacros-intel-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -12315,6 +12401,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/leak_detection_linux\">leak_detection_linux</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -13645,6 +13732,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng\">linux_chromium_asan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng\">linux_chromium_asan_siso_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -13738,6 +13826,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng\">linux_chromium_asan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng\">linux_chromium_asan_siso_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -13925,6 +14014,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_rel_ng\">linux_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14020,6 +14110,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel\">linux-wayland-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel\">linux-wayland-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14114,6 +14205,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_dbg_ng\">linux_chromium_compile_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_dbg_ng\">linux_chromium_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14300,6 +14392,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_cfi_rel_ng\">linux_chromium_cfi_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14394,6 +14487,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_asan_rel_ng\">linux_chromium_chromeos_asan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14487,6 +14581,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_asan_rel_ng\">linux_chromium_chromeos_asan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14675,6 +14770,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_msan_rel_ng\">linux_chromium_chromeos_msan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14768,6 +14864,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_msan_rel_ng\">linux_chromium_chromeos_msan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14858,6 +14955,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-dbg\">gpu-try-linux-nvidia-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -14951,6 +15049,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-dbg\">gpu-fyi-try-linux-nvidia-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15045,6 +15144,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-exp\">gpu-fyi-try-linux-intel-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15139,6 +15239,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-exp\">gpu-fyi-try-linux-nvidia-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15233,6 +15334,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-tsn\">gpu-fyi-try-linux-nvidia-tsn</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15327,6 +15429,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-amd-rel\">gpu-fyi-try-linux-amd-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15421,6 +15524,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-rel\">gpu-fyi-try-linux-intel-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15515,6 +15619,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-rel\">gpu-fyi-try-linux-nvidia-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15610,6 +15715,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_msan_rel_ng\">linux_chromium_msan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15704,6 +15810,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_msan_rel_ng\">linux_chromium_msan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15797,6 +15904,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-rel\">gpu-try-linux-nvidia-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15892,6 +16000,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng\">linux_chromium_tsan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng\">linux_chromium_tsan_siso_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -15986,6 +16095,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng\">linux_chromium_tsan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng\">linux_chromium_tsan_siso_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16089,6 +16199,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_rel_ng\">linux_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16183,6 +16294,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel\">linux-wayland-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel\">linux-wayland-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16276,6 +16388,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_dbg_ng\">linux_chromium_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_dbg_ng\">linux_chromium_compile_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16369,6 +16482,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-viz-rel\">linux-viz-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16834,6 +16948,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_asan_rel_ng\">mac_chromium_asan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16926,6 +17041,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_asan_rel_ng\">mac_chromium_asan_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17018,6 +17134,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_10.15_rel_ng\">mac_chromium_10.15_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_11.0_rel_ng\">mac_chromium_11.0_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-tests\">mac12-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-tests\">mac13-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17111,6 +17228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_dbg_ng\">mac_chromium_compile_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_dbg_ng\">mac_chromium_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17292,6 +17410,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-builder-next\">mac-builder-next</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17383,6 +17502,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-intel-dbg\">gpu-try-mac-intel-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17476,6 +17596,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-asan\">gpu-fyi-try-mac-intel-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17570,6 +17691,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-dbg\">gpu-fyi-try-mac-intel-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17664,6 +17786,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp\">gpu-fyi-try-mac-arm64-apple-m1-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17758,6 +17881,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-exp\">gpu-fyi-try-mac-intel-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17852,6 +17976,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-exp\">gpu-fyi-try-mac-amd-retina-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17946,6 +18071,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-exp\">gpu-fyi-try-mac-nvidia-retina-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18040,6 +18166,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel\">gpu-fyi-try-mac-arm64-apple-m1-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18134,6 +18261,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-rel\">gpu-fyi-try-mac-intel-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18228,6 +18356,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-asan\">gpu-fyi-try-mac-amd-retina-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18322,6 +18451,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-dbg\">gpu-fyi-try-mac-amd-retina-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18416,6 +18546,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-rel\">gpu-fyi-try-mac-amd-retina-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18510,6 +18641,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel\">gpu-fyi-try-mac-arm64-apple-m2-retina-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18604,6 +18736,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-rel\">gpu-fyi-try-mac-nvidia-retina-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18698,6 +18831,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-pro-rel\">gpu-fyi-try-mac-amd-pro-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18792,6 +18926,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18886,6 +19021,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-amd-retina-dbg\">gpu-try-mac-amd-retina-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -18980,6 +19116,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19256,6 +19393,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_10.15_rel_ng\">mac_chromium_10.15_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19350,6 +19488,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_11.0_rel_ng\">mac_chromium_11.0_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19444,6 +19583,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-tests\">mac12-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19534,6 +19674,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-tests\">mac13-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19624,6 +19765,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_dbg_ng\">mac_chromium_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_dbg_ng\">mac_chromium_compile_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19718,6 +19860,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/network_service_linux\">network_service_linux</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19811,6 +19954,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/try-nougat-phone-tester\">try-nougat-phone-tester</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -19902,6 +20046,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-oreo-arm64-dbg\">android-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24001,6 +24146,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/layout_test_leak_detection\">layout_test_leak_detection</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24095,6 +24241,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-webkit-msan-rel\">linux-webkit-msan-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24187,6 +24334,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_compile_rel_ng\">win_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24558,6 +24706,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_compile_rel_ng\">win_chromium_compile_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24651,6 +24800,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_compile_dbg_ng\">win_chromium_compile_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24744,6 +24894,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_x64_rel_ng\">win_chromium_x64_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win11-x64-fyi-rel\">win11-x64-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -24839,6 +24990,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_dbg_ng\">win10_chromium_x64_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25115,6 +25267,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-dbg-64\">gpu-fyi-try-win10-nvidia-dx12vk-dbg-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25209,6 +25362,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-rel-64\">gpu-fyi-try-win10-nvidia-dx12vk-rel-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25303,6 +25457,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dbg-64\">gpu-fyi-try-win10-nvidia-dbg-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25397,6 +25552,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-exp-64\">gpu-fyi-try-win10-nvidia-exp-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25490,6 +25646,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-exp-64\">gpu-fyi-try-win10-intel-exp-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25584,6 +25741,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-amd-rel-64\">gpu-fyi-try-win10-amd-rel-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25678,6 +25836,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-rel-64\">gpu-fyi-try-win10-intel-rel-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25772,6 +25931,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-64\">gpu-fyi-try-win10-nvidia-rel-64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -25960,6 +26120,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-32\">gpu-fyi-try-win10-nvidia-rel-32</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26053,6 +26214,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26143,6 +26305,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_dbg_ng\">win10_chromium_x64_dbg_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26331,6 +26494,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26422,6 +26586,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win11-x64-fyi-rel\">win11-x64-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26616,6 +26781,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-10-arm64-rel\">android-10-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26800,6 +26966,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-11-x86-rel\">android-11-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -26891,6 +27058,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-dbg\">android-12-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -27077,6 +27245,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-dual-coverage-exp-rel\">android-12-x64-dual-coverage-exp-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-rel\">android-12-x64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -27172,6 +27341,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-x64-dbg\">android-12l-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -27448,6 +27618,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-13-x64-rel\">android-13-x64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -27704,6 +27875,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-angle-chromium-try\">android-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -27875,6 +28047,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-angle-chromium-try\">android-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -28156,6 +28329,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_archive_rel_ng\">android_archive_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -28635,6 +28809,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-bfcache-rel\">android-bfcache-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -28960,6 +29135,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-chrome-pie-x86-wpt-android-specific\">android-chrome-pie-x86-wpt-android-specific</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29052,6 +29228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-chrome-pie-x86-wpt-fyi-rel\">android-chrome-pie-x86-wpt-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29144,6 +29321,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-code-coverage\">android-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29236,6 +29414,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-code-coverage-native\">android-code-coverage-native</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29327,6 +29506,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-arm-dbg\">android-cronet-arm-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29418,6 +29598,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_cronet\">android_cronet</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29509,6 +29690,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-arm64-dbg\">android-cronet-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg\">android-cronet-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29600,6 +29782,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-arm64-rel\">android-cronet-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29691,6 +29874,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-asan-arm-rel\">android-cronet-asan-arm-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29874,6 +30058,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-arm64-dbg\">android-cronet-mainline-clang-arm64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -29965,6 +30150,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-arm64-rel\">android-cronet-mainline-clang-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30056,6 +30242,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-x86-dbg\">android-cronet-mainline-clang-x86-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30147,6 +30334,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-mainline-clang-x86-rel\">android-cronet-mainline-clang-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30328,6 +30516,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg-12-tests\">android-cronet-x64-dbg-12-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg-13-tests\">android-cronet-x64-dbg-13-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30418,6 +30607,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg-12-tests\">android-cronet-x64-dbg-12-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30508,6 +30698,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg-13-tests\">android-cronet-x64-dbg-13-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30599,6 +30790,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-rel\">android-cronet-x64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30690,6 +30882,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-10-tests\">android-cronet-x86-dbg-10-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-11-tests\">android-cronet-x86-dbg-11-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-oreo-tests\">android-cronet-x86-dbg-oreo-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-pie-tests\">android-cronet-x86-dbg-pie-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-nougat-tests\">android-cronet-x86-dbg-nougat-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-lolipop\">android-cronet-x86-dbg-lolipop</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-marshmallow\">android-cronet-x86-dbg-marshmallow</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30780,6 +30973,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-10-tests\">android-cronet-x86-dbg-10-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30870,6 +31064,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-11-tests\">android-cronet-x86-dbg-11-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -30960,6 +31155,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-lolipop\">android-cronet-x86-dbg-lolipop</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31050,6 +31246,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-marshmallow\">android-cronet-x86-dbg-marshmallow</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31140,6 +31337,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-nougat-tests\">android-cronet-x86-dbg-nougat-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31230,6 +31428,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-oreo-tests\">android-cronet-x86-dbg-oreo-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31320,6 +31519,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-pie-tests\">android-cronet-x86-dbg-pie-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31411,6 +31611,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-rel\">android-cronet-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31616,6 +31817,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-fieldtrial-rel\">android-fieldtrial-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31711,6 +31913,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-dual-coverage-exp-rel\">android-nougat-x86-dual-coverage-exp-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel\">android-nougat-x86-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-siso-rel\">android-nougat-x86-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31804,6 +32007,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-official\">android-official</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31899,6 +32103,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-oreo-x86-rel\">android-oreo-x86-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -31992,6 +32197,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-perfetto-rel\">android-perfetto-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32085,6 +32291,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-dbg\">android-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32180,6 +32387,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-rel\">android-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel\">android-arm64-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32367,6 +32575,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-pie-x86-rel\">android-pie-x86-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-inverse-fieldtrials-pie-x86-fyi-rel\">android-inverse-fieldtrials-pie-x86-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32459,6 +32668,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-rust-arm32-rel\">android-rust-arm32-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32550,6 +32760,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-rust-arm64-dbg\">android-rust-arm64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32641,6 +32852,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-rust-arm64-rel\">android-rust-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -32969,6 +33181,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-10-x86-rel-tests\">android-webview-10-x86-rel-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -33061,6 +33274,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-12-x64-dbg\">android-webview-12-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -33152,6 +33366,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-13-x64-dbg\">android-webview-13-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -33244,6 +33459,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-pie-x86-wpt-fyi-rel\">android-webview-pie-x86-wpt-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -33430,6 +33646,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-10-x86-rel-tests\">android-webview-10-x86-rel-tests</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -34384,6 +34601,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-asan-rel\">chromeos-amd64-generic-asan-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -34478,6 +34696,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-cfi-thin-lto-rel\">chromeos-amd64-generic-cfi-thin-lto-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -34572,6 +34791,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-dbg\">chromeos-amd64-generic-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -34666,6 +34886,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-lacros-dbg\">chromeos-amd64-generic-lacros-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -34760,6 +34981,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-siso-rel\">chromeos-amd64-generic-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35039,6 +35261,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-arm-generic-dbg\">chromeos-arm-generic-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35133,6 +35356,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-arm-generic-rel\">chromeos-arm-generic-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35227,6 +35451,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-arm64-generic-rel\">chromeos-arm64-generic-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35318,6 +35543,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-jacuzzi-rel\">chromeos-jacuzzi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35410,6 +35636,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-js-coverage-rel\">chromeos-js-coverage-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-js-code-coverage\">chromeos-js-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35501,6 +35728,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-octopus-rel\">chromeos-octopus-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35637,6 +35865,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-angle-try\">fuchsia-angle-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35740,6 +35969,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-arm64-cast-receiver-rel\">fuchsia-arm64-cast-receiver-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35835,6 +36065,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-arm64-rel\">fuchsia-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -35928,6 +36159,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-code-coverage\">fuchsia-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36022,6 +36254,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-fyi-arm64-dbg\">fuchsia-fyi-arm64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36212,6 +36445,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-fyi-x64-dbg\">fuchsia-fyi-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36397,6 +36631,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-official\">fuchsia-official</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36489,6 +36724,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-accessibility-rel\">fuchsia-x64-accessibility-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36583,6 +36819,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel\">fuchsia-x64-cast-receiver-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-siso-rel\">fuchsia-x64-cast-receiver-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36678,6 +36915,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-compile-x64-dbg\">fuchsia-compile-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36773,6 +37011,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-rel\">fuchsia-x64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -36956,6 +37195,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-angle-try-intel\">ios-angle-try-intel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37131,6 +37371,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-angle-try-intel\">ios-angle-try-intel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37227,6 +37468,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-asan\">ios-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37320,6 +37562,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-blink-dbg-fyi\">ios-blink-dbg-fyi</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37417,6 +37660,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-catalyst\">ios-catalyst</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37514,6 +37758,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-device\">ios-device</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37607,6 +37852,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-fieldtrial-rel\">ios-fieldtrial-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37701,6 +37947,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-m1-simulator\">ios-m1-simulator</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37795,6 +38042,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-m1-simulator-cronet\">ios-m1-simulator-cronet</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37892,6 +38140,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator\">ios-simulator</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-inverse-fieldtrials-fyi\">ios-simulator-inverse-fieldtrials-fyi</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -37988,6 +38237,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-code-coverage\">ios-simulator-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38080,6 +38330,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-cronet\">ios-simulator-cronet</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38177,6 +38428,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-full-configs\">ios-simulator-full-configs</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38270,6 +38522,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-multi-window\">ios-simulator-multi-window</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38367,6 +38620,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-noncq\">ios-simulator-noncq</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38554,6 +38808,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-wpt-fyi-rel\">ios-wpt-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38648,6 +38903,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios16-beta-simulator\">ios16-beta-simulator</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38836,6 +39092,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios16-sdk-simulator\">ios16-sdk-simulator</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -38930,6 +39187,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios17-beta-simulator\">ios17-beta-simulator</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -39024,6 +39282,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios17-sdk-simulator\">ios17-sdk-simulator</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -39213,6 +39472,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/lacros-amd64-generic-rel\">lacros-amd64-generic-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -39771,6 +40031,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/lacros-arm-generic-rel\">lacros-arm-generic-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -40139,6 +40400,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/lacros-arm64-generic-rel\">lacros-arm64-generic-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -40632,6 +40894,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-angle-chromium-try\">linux-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -40803,6 +41066,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-angle-chromium-try\">linux-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -40966,6 +41230,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-angle-chromium-try\">linux-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -41059,6 +41324,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-annotator-rel\">linux-annotator-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -41248,6 +41514,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_archive_rel_ng\">linux_chromium_archive_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_clobber_rel_ng\">linux_chromium_clobber_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -41343,6 +41610,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-arm64-rel-cft\">linux-arm64-rel-cft</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -41588,6 +41856,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-bfcache-rel\">linux-bfcache-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -41772,6 +42041,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-blink-heap-verification-try\">linux-blink-heap-verification-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -41863,6 +42133,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-blink-web-tests-force-accessibility-rel\">linux-blink-web-tests-force-accessibility-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -42177,6 +42448,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-cfm-rel\">linux-cfm-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -42270,6 +42542,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-annotator-rel\">linux-chromeos-annotator-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -42647,6 +42920,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-code-coverage\">linux-chromeos-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -42741,6 +43015,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-compile-dbg\">linux-chromeos-compile-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-dbg\">linux-chromeos-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -42833,6 +43108,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel\">linux-chromeos-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-inverse-fieldtrials-fyi-rel\">linux-chromeos-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel\">linux-chromeos-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -42926,6 +43202,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-code-coverage\">linux-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43018,6 +43295,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-exp-asan-lsan-fyi-rel\">linux-exp-asan-lsan-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43110,6 +43388,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-exp-msan-fyi-rel\">linux-exp-msan-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43202,6 +43481,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-exp-tsan-fyi-rel\">linux-exp-tsan-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43296,6 +43576,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-extended-tracing-rel\">linux-extended-tracing-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43388,6 +43669,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-fieldtrial-rel\">linux-fieldtrial-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43574,6 +43856,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-gcc-rel\">linux-gcc-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43666,6 +43949,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-headless-shell-rel\">linux-headless-shell-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43758,6 +44042,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-js-coverage-rel\">linux-js-coverage-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-js-code-coverage\">linux-js-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -43943,6 +44228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-asan-lsan-rel\">linux-lacros-asan-lsan-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44035,6 +44321,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-fyi-rel\">linux-lacros-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44127,6 +44414,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel\">linux-lacros-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel\">linux-lacros-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44312,6 +44600,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-code-coverage\">linux-lacros-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44404,6 +44693,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-dbg\">linux-lacros-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44679,6 +44969,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-fyi-rel\">linux-lacros-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44772,6 +45063,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel\">linux-lacros-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel\">linux-lacros-siso-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -44864,6 +45156,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-version-skew-fyi\">linux-lacros-version-skew-fyi</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45045,6 +45338,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-official\">linux-official</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45138,6 +45432,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-perfetto-rel\">linux-perfetto-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45317,6 +45612,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-cft\">linux-rel-cft</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45500,6 +45796,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rust-x64-dbg\">linux-rust-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45591,6 +45888,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rust-x64-rel\">linux-rust-x64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45685,6 +45983,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-chromium-try-x64\">linux-swangle-chromium-try-x64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45780,6 +46079,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-chromium-try-x64-exp\">linux-swangle-chromium-try-x64-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -45915,6 +46215,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-try-tot-swiftshader-x64\">linux-swangle-try-tot-swiftshader-x64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46019,6 +46320,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-try-x64\">linux-swangle-try-x64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46114,6 +46416,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-try-x64-exp\">linux-swangle-try-x64-exp</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46207,6 +46510,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-ubsan-fyi-rel\">linux-ubsan-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46301,6 +46605,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-ubsan-vptr\">linux-ubsan-vptr</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46392,6 +46697,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-dbg\">linux-updater-try-builder-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46483,6 +46789,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-rel\">linux-updater-try-builder-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46573,6 +46880,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-dbg\">linux-updater-try-builder-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46663,6 +46971,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-rel\">linux-updater-try-builder-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -46846,6 +47155,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-v4l2-codec-rel\">linux-v4l2-codec-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47126,6 +47436,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-content-shell-fyi-rel\">linux-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47219,6 +47530,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-content-shell-leak-detection\">linux-wpt-content-shell-leak-detection</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47312,6 +47624,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-fyi-rel\">linux-wpt-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47405,6 +47718,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-identity-fyi-rel\">linux-wpt-identity-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47498,6 +47812,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-input-fyi-rel\">linux-wpt-input-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47660,6 +47975,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-angle-chromium-try\">mac-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -47872,6 +48188,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-angle-chromium-try\">mac-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -48043,6 +48360,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-angle-chromium-try\">mac-angle-chromium-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -48228,6 +48546,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_archive_rel_ng\">mac_chromium_archive_rel_ng</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -48506,6 +48825,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-arm64-on-arm64-rel\">mac-arm64-on-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -48599,6 +48919,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-fieldtrial-tester\">mac-fieldtrial-tester</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-arm64-rel\">mac11-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-rel\">mac12-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel\">mac13-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49108,6 +49429,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-code-coverage\">mac-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49199,6 +49521,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-fieldtrial-tester\">mac-fieldtrial-tester</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49287,6 +49610,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-intel-on-arm64-rel\">mac-intel-on-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49469,6 +49793,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-official\">mac-official</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49561,6 +49886,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-osxbeta-rel\">mac-osxbeta-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49653,6 +49979,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-perfetto-rel\">mac-perfetto-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49745,6 +50072,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-cft\">mac-rel-cft</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49836,6 +50164,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rust-x64-dbg\">mac-rust-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -49928,6 +50257,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-swangle-chromium-try-x64\">mac-swangle-chromium-try-x64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -50285,6 +50615,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-dbg\">mac-updater-try-builder-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -50374,6 +50705,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-rel\">mac-updater-try-builder-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -50554,6 +50886,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-dbg\">mac-updater-try-builder-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -50644,6 +50977,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-rel\">mac-updater-try-builder-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -50733,6 +51067,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac10.15-wpt-content-shell-fyi-rel\">mac10.15-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -50827,6 +51162,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-arm64-rel\">mac11-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -51097,6 +51433,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-arm64-wpt-content-shell-fyi-rel\">mac11-arm64-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -51187,6 +51524,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-wpt-content-shell-fyi-rel\">mac11-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -51461,6 +51799,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-rel\">mac12-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -51640,6 +51979,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-wpt-content-shell-fyi-rel\">mac12-arm64-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -51730,6 +52070,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-wpt-content-shell-fyi-rel\">mac12-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -51914,6 +52255,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel\">mac13-arm64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -52094,6 +52436,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-wpt-content-shell-fyi-rel\">mac13-arm64-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -52184,6 +52527,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-wpt-content-shell-fyi-rel\">mac13-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -52715,6 +53059,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x64-try\">win-angle-chromium-x64-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -52859,6 +53204,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x86-try\">win-angle-chromium-x86-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -52960,6 +53306,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-annotator-rel\">win-annotator-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -53145,6 +53492,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_x64_archive\">win_x64_archive</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -53240,6 +53588,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-asan\">win-asan</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -53554,6 +53903,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-fieldtrial-rel\">win-fieldtrial-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -53738,6 +54088,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-official\">win-official</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -53831,6 +54182,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-perfetto-rel\">win-perfetto-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54010,6 +54362,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel-cft\">win-rel-cft</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54102,6 +54455,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rust-x64-dbg\">win-rust-x64-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54193,6 +54547,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rust-x64-rel\">win-rust-x64-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54287,6 +54642,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-chromium-try-x86\">win-swangle-chromium-try-x86</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54422,6 +54778,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-tot-swiftshader-x64\">win-swangle-try-tot-swiftshader-x64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54566,6 +54923,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-tot-swiftshader-x86\">win-swangle-try-tot-swiftshader-x86</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54670,6 +55028,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-x64\">win-swangle-try-x64</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54765,6 +55124,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-x86\">win-swangle-try-x86</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54857,6 +55217,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-dbg\">win-updater-try-builder-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -54948,6 +55309,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-rel\">win-updater-try-builder-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -55382,6 +55744,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x64-try\">win-angle-chromium-x64-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -55544,6 +55907,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x64-try\">win-angle-chromium-x64-try</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -55636,6 +56000,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10-code-coverage\">win10-code-coverage</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -55817,6 +56182,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-dbg\">win-updater-try-builder-dbg</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -55997,6 +56363,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-rel\">win-updater-try-builder-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -56180,6 +56547,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10-wpt-content-shell-fyi-rel\">win10-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -56452,6 +56820,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win11-wpt-content-shell-fyi-rel\">win11-wpt-content-shell-fyi-rel</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -56637,6 +57006,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_archive\">win_archive</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -56821,6 +57191,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win32-official\">win32-official</a></li></ul>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -62683,6 +63054,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-10-arm64-rel\">android-10-arm64-rel</a></li></ul>"
     }
     builders {
       name: "android-11-x86-rel"
@@ -62773,6 +63145,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-11-x86-rel\">android-11-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-12-x64-dbg"
@@ -62863,6 +63236,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12-x64-dbg-tests\">android-12-x64-dbg-tests</a></li></ul>"
     }
     builders {
       name: "android-12-x64-dual-coverage-exp-rel"
@@ -62954,7 +63328,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows android-12-x64-rel builder to experiment both jacoco and clang coverage enabled builds.\n"
+      description_html: "This builder shadows android-12-x64-rel builder to experiment both jacoco and clang coverage enabled builds.\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12-x64-rel\">android-12-x64-rel</a></li></ul>"
     }
     builders {
       name: "android-12-x64-rel"
@@ -63045,7 +63419,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-rel-compilator\">android-12-x64-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12-x64-rel\">android-12-x64-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-rel-compilator\">android-12-x64-rel-compilator</a>."
     }
     builders {
       name: "android-12-x64-rel-compilator"
@@ -63227,6 +63601,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12l-x64-dbg-tests\">android-12l-x64-dbg-tests</a></li></ul>"
     }
     builders {
       name: "android-13-x64-rel"
@@ -63317,6 +63692,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-13-x64-rel\">android-13-x64-rel</a></li></ul>"
     }
     builders {
       name: "android-angle-chromium-try"
@@ -63482,6 +63858,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-angle-chromium-arm64-builder\">android-angle-chromium-arm64-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-angle-chromium-arm64-nexus5x\">android-angle-chromium-arm64-nexus5x</a></li></ul>"
     }
     builders {
       name: "android-arm-compile-dbg"
@@ -63572,6 +63949,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm Builder (dbg)\">Android arm Builder (dbg)</a></li></ul>"
     }
     builders {
       name: "android-arm64-all-targets-dbg"
@@ -63662,6 +64040,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder All Targets (dbg)\">Android arm64 Builder All Targets (dbg)</a></li></ul>"
     }
     builders {
       name: "android-arm64-rel"
@@ -63752,7 +64131,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder may trigger tests on multiple Android versions.<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-rel-compilator\">android-arm64-rel-compilator</a>."
+      description_html: "This builder may trigger tests on multiple Android versions.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android Release (Nexus 5X)\">Android Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-arm64-rel\">android-pie-arm64-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-rel-compilator\">android-arm64-rel-compilator</a>."
     }
     builders {
       name: "android-arm64-rel-compilator"
@@ -63934,7 +64313,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows android-arm64-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-arm64-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel-compilator\">android-arm64-siso-rel-compilator</a>."
+      description_html: "This builder shadows android-arm64-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-arm64-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android Release (Nexus 5X)\">Android Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-arm64-rel\">android-pie-arm64-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel-compilator\">android-arm64-siso-rel-compilator</a>."
     }
     builders {
       name: "android-arm64-siso-rel-compilator"
@@ -64116,6 +64495,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android ASAN (dbg)\">Android ASAN (dbg)</a></li></ul>"
     }
     builders {
       name: "android-bfcache-rel"
@@ -64206,6 +64586,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-bfcache-rel\">android-bfcache-rel</a></li></ul>"
     }
     builders {
       name: "android-binary-size"
@@ -64398,6 +64779,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-chrome-pie-x86-wpt-android-specific\">android-chrome-pie-x86-wpt-android-specific</a></li></ul>"
     }
     builders {
       name: "android-chrome-pie-x86-wpt-fyi-rel"
@@ -64488,6 +64870,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-chrome-pie-x86-wpt-fyi-rel\">android-chrome-pie-x86-wpt-fyi-rel</a></li></ul>"
     }
     builders {
       name: "android-clang-tidy-rel"
@@ -64661,6 +65044,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-code-coverage\">android-code-coverage</a></li></ul>"
     }
     builders {
       name: "android-code-coverage-native"
@@ -64751,6 +65135,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-code-coverage-native\">android-code-coverage-native</a></li></ul>"
     }
     builders {
       name: "android-cronet-arm-dbg"
@@ -64842,6 +65227,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm-dbg\">android-cronet-arm-dbg</a></li></ul>"
     }
     builders {
       name: "android-cronet-arm64-dbg"
@@ -64932,6 +65318,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-dbg\">android-cronet-arm64-dbg</a></li></ul>"
     }
     builders {
       name: "android-cronet-arm64-rel"
@@ -65022,6 +65409,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-rel\">android-cronet-arm64-rel</a></li></ul>"
     }
     builders {
       name: "android-cronet-asan-arm-rel"
@@ -65112,6 +65500,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-asan-arm-rel\">android-cronet-asan-arm-rel</a></li></ul>"
     }
     builders {
       name: "android-cronet-mainline-clang-arm64-dbg"
@@ -65202,6 +65591,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-arm64-dbg\">android-cronet-mainline-clang-arm64-dbg</a></li></ul>"
     }
     builders {
       name: "android-cronet-mainline-clang-arm64-rel"
@@ -65292,6 +65682,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-arm64-rel\">android-cronet-mainline-clang-arm64-rel</a></li></ul>"
     }
     builders {
       name: "android-cronet-mainline-clang-x86-dbg"
@@ -65382,6 +65773,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-x86-dbg\">android-cronet-mainline-clang-x86-dbg</a></li></ul>"
     }
     builders {
       name: "android-cronet-mainline-clang-x86-rel"
@@ -65472,6 +65864,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-x86-rel\">android-cronet-mainline-clang-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-cronet-x64-dbg"
@@ -65562,6 +65955,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-dbg\">android-cronet-arm64-dbg</a></li></ul>"
     }
     builders {
       name: "android-cronet-x64-dbg-12-tests"
@@ -65652,6 +66046,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg\">android-cronet-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg-12-tests\">android-cronet-x64-dbg-12-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x64-dbg-13-tests"
@@ -65742,6 +66137,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg\">android-cronet-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg-13-tests\">android-cronet-x64-dbg-13-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x64-rel"
@@ -65832,6 +66228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-rel\">android-cronet-x64-rel</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg"
@@ -65922,6 +66319,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-10-tests"
@@ -66013,6 +66411,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-10-tests\">android-cronet-x86-dbg-10-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-11-tests"
@@ -66103,6 +66502,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-11-tests\">android-cronet-x86-dbg-11-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-lolipop"
@@ -66193,6 +66593,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-lollipop-tests\">android-cronet-x86-dbg-lollipop-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-marshmallow"
@@ -66283,6 +66684,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-marshmallow-tests\">android-cronet-x86-dbg-marshmallow-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-nougat-tests"
@@ -66373,6 +66775,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-nougat-tests\">android-cronet-x86-dbg-nougat-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-oreo-tests"
@@ -66463,6 +66866,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-oreo-tests\">android-cronet-x86-dbg-oreo-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-dbg-pie-tests"
@@ -66553,6 +66957,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-pie-tests\">android-cronet-x86-dbg-pie-tests</a></li></ul>"
     }
     builders {
       name: "android-cronet-x86-rel"
@@ -66643,6 +67048,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-rel\">android-cronet-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-dawn-arm-rel"
@@ -66731,6 +67137,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm Builder\">Dawn Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm Release (Nexus 5X)\">Dawn Android arm Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm Release (Pixel 4)\">Dawn Android arm Release (Pixel 4)</a></li></ul>"
     }
     builders {
       name: "android-dawn-arm64-rel"
@@ -66819,6 +67226,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm64 Release (Pixel 6)\">Dawn Android arm64 Release (Pixel 6)</a></li></ul>"
     }
     builders {
       name: "android-deterministic-dbg"
@@ -67075,6 +67483,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-fieldtrial-rel\">android-fieldtrial-rel</a></li></ul>"
     }
     builders {
       name: "android-inverse-fieldtrials-pie-x86-fyi-rel"
@@ -67165,6 +67574,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-x86-rel\">android-pie-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-nougat-x86-dual-coverage-exp-rel"
@@ -67260,7 +67670,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows android-nougat-x86-rel builder to experiment both jacoco and clang coverage enabled builds.\n"
+      description_html: "This builder shadows android-nougat-x86-rel builder to experiment both jacoco and clang coverage enabled builds.\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-nougat-x86-rel"
@@ -67355,7 +67765,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel-compilator\">android-nougat-x86-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel-compilator\">android-nougat-x86-rel-compilator</a>."
     }
     builders {
       name: "android-nougat-x86-rel-compilator"
@@ -67541,7 +67951,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows android-nougat-x86-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-nougat-x86-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-siso-rel-compilator\">android-nougat-x86-siso-rel-compilator</a>."
+      description_html: "This builder shadows android-nougat-x86-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-nougat-x86-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-siso-rel-compilator\">android-nougat-x86-siso-rel-compilator</a>."
     }
     builders {
       name: "android-nougat-x86-siso-rel-compilator"
@@ -67723,6 +68133,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-official\">android-official</a></li></ul>"
     }
     builders {
       name: "android-oreo-arm64-dbg"
@@ -67813,6 +68224,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Oreo Phone Tester\">Oreo Phone Tester</a></li></ul>"
     }
     builders {
       name: "android-oreo-x86-rel"
@@ -67903,6 +68315,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-oreo-x86-rel\">android-oreo-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-perfetto-rel"
@@ -67993,6 +68406,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-perfetto-rel\">android-perfetto-rel</a></li></ul>"
     }
     builders {
       name: "android-pie-arm64-dbg"
@@ -68083,6 +68497,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-arm64-dbg\">android-pie-arm64-dbg</a></li></ul>"
     }
     builders {
       name: "android-pie-x86-rel"
@@ -68173,6 +68588,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-x86-rel\">android-pie-x86-rel</a></li></ul>"
     }
     builders {
       name: "android-rust-arm32-rel"
@@ -68263,6 +68679,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-rust-arm32-rel\">android-rust-arm32-rel</a></li></ul>"
     }
     builders {
       name: "android-rust-arm64-dbg"
@@ -68353,6 +68770,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-rust-arm64-dbg\">android-rust-arm64-dbg</a></li></ul>"
     }
     builders {
       name: "android-rust-arm64-rel"
@@ -68443,6 +68861,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-rust-arm64-rel\">android-rust-arm64-rel</a></li></ul>"
     }
     builders {
       name: "android-webview-10-x86-rel-tests"
@@ -68533,6 +68952,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-x86-rel\">android-x86-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-10-x86-rel-tests\">android-webview-10-x86-rel-tests</a></li></ul>"
     }
     builders {
       name: "android-webview-12-x64-dbg"
@@ -68623,6 +69043,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-12-x64-dbg-tests\">android-webview-12-x64-dbg-tests</a></li></ul>"
     }
     builders {
       name: "android-webview-13-x64-dbg"
@@ -68713,6 +69134,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-13-x64-dbg-tests\">android-webview-13-x64-dbg-tests</a></li></ul>"
     }
     builders {
       name: "android-webview-nougat-arm64-dbg"
@@ -68803,6 +69225,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView N (dbg)\">Android WebView N (dbg)</a></li></ul>"
     }
     builders {
       name: "android-webview-oreo-arm64-dbg"
@@ -68893,6 +69316,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView O (dbg)\">Android WebView O (dbg)</a></li></ul>"
     }
     builders {
       name: "android-webview-pie-arm64-dbg"
@@ -68983,6 +69407,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView P (dbg)\">Android WebView P (dbg)</a></li></ul>"
     }
     builders {
       name: "android-webview-pie-x86-wpt-fyi-rel"
@@ -69073,6 +69498,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-pie-x86-wpt-fyi-rel\">android-webview-pie-x86-wpt-fyi-rel</a></li></ul>"
     }
     builders {
       name: "android-x64-cast"
@@ -69163,6 +69589,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Android (dbg)\">Cast Android (dbg)</a></li></ul>"
     }
     builders {
       name: "android_archive_rel_ng"
@@ -69253,6 +69680,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-archive-rel\">android-archive-rel</a></li></ul>"
     }
     builders {
       name: "android_arm64_dbg_recipe"
@@ -69343,6 +69771,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li></ul>"
     }
     builders {
       name: "android_blink_rel"
@@ -69524,6 +69953,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder All Targets (dbg)\">Android arm64 Builder All Targets (dbg)</a></li></ul>"
     }
     builders {
       name: "android_compile_x64_dbg"
@@ -69615,6 +70045,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder All Targets (dbg)\">Android x64 Builder All Targets (dbg)</a></li></ul>"
     }
     builders {
       name: "android_compile_x86_dbg"
@@ -69706,6 +70137,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x86 Builder (dbg)\">Android x86 Builder (dbg)</a></li></ul>"
     }
     builders {
       name: "android_cronet"
@@ -69796,6 +70228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm-rel\">android-cronet-arm-rel</a></li></ul>"
     }
     builders {
       name: "android_optional_gpu_tests_rel"
@@ -69976,6 +70409,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView N (dbg)\">Android WebView N (dbg)</a></li></ul>"
     }
     builders {
       name: "branch-config-verifier"
@@ -70241,6 +70675,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-asan-rel\">chromeos-amd64-generic-asan-rel</a></li></ul>"
     }
     builders {
       name: "chromeos-amd64-generic-cfi-thin-lto-rel"
@@ -70331,6 +70766,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-cfi-thin-lto-rel\">chromeos-amd64-generic-cfi-thin-lto-rel</a></li></ul>"
     }
     builders {
       name: "chromeos-amd64-generic-dbg"
@@ -70422,6 +70858,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-dbg\">chromeos-amd64-generic-dbg</a></li></ul>"
     }
     builders {
       name: "chromeos-amd64-generic-lacros-dbg"
@@ -70512,6 +70949,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-lacros-dbg\">chromeos-amd64-generic-lacros-dbg</a></li></ul>"
     }
     builders {
       name: "chromeos-amd64-generic-rel"
@@ -70606,7 +71044,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-rel-compilator\">chromeos-amd64-generic-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-rel-compilator\">chromeos-amd64-generic-rel-compilator</a>."
     }
     builders {
       name: "chromeos-amd64-generic-rel-compilator"
@@ -70792,7 +71230,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows chromeos-amd64-generic-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating chromeos-amd64-generic-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-siso-rel-compilator\">chromeos-amd64-generic-siso-rel-compilator</a>."
+      description_html: "This builder shadows chromeos-amd64-generic-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating chromeos-amd64-generic-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-siso-rel-compilator\">chromeos-amd64-generic-siso-rel-compilator</a>."
     }
     builders {
       name: "chromeos-amd64-generic-siso-rel-compilator"
@@ -70974,6 +71412,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-arm-generic-dbg\">chromeos-arm-generic-dbg</a></li></ul>"
     }
     builders {
       name: "chromeos-arm-generic-rel"
@@ -71064,6 +71503,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-arm-generic-rel\">chromeos-arm-generic-rel</a></li></ul>"
     }
     builders {
       name: "chromeos-arm64-generic-rel"
@@ -71154,6 +71594,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-arm64-generic-rel\">chromeos-arm64-generic-rel</a></li></ul>"
     }
     builders {
       name: "chromeos-jacuzzi-rel"
@@ -71244,6 +71685,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-jacuzzi-rel\">chromeos-jacuzzi-rel</a></li></ul>"
     }
     builders {
       name: "chromeos-js-code-coverage"
@@ -71334,6 +71776,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-js-code-coverage\">chromeos-js-code-coverage</a></li></ul>"
     }
     builders {
       name: "chromeos-js-coverage-rel"
@@ -71425,6 +71868,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-js-code-coverage\">chromeos-js-code-coverage</a></li></ul>"
     }
     builders {
       name: "chromeos-octopus-rel"
@@ -71515,6 +71959,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-octopus-rel\">chromeos-octopus-rel</a></li></ul>"
     }
     builders {
       name: "chromium_presubmit"
@@ -71691,6 +72136,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm DEPS Builder\">Dawn Android arm DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm DEPS Release (Nexus 5X)\">Dawn Android arm DEPS Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm DEPS Release (Pixel 4)\">Dawn Android arm DEPS Release (Pixel 4)</a></li></ul>"
     }
     builders {
       name: "dawn-android-arm64-deps-rel"
@@ -71780,6 +72226,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm64 DEPS Release (Pixel 6)\">Dawn Android arm64 DEPS Release (Pixel 6)</a></li></ul>"
     }
     builders {
       name: "dawn-linux-x64-deps-rel"
@@ -71869,6 +72316,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 DEPS Builder\">Dawn Linux x64 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)\">Dawn Linux x64 DEPS Release (Intel UHD 630)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)\">Dawn Linux x64 DEPS Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "dawn-mac-x64-deps-rel"
@@ -71958,6 +72406,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 DEPS Builder\">Dawn Mac x64 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 DEPS Release (AMD)\">Dawn Mac x64 DEPS Release (AMD)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 DEPS Release (Intel)\">Dawn Mac x64 DEPS Release (Intel)</a></li></ul>"
     }
     builders {
       name: "dawn-try-linux-tsan-rel"
@@ -72047,6 +72496,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux TSAN Release\">Dawn Linux TSAN Release</a></li></ul>"
     }
     builders {
       name: "dawn-try-mac-amd-exp"
@@ -72135,6 +72585,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Builder\">Dawn Mac x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Experimental Release (AMD)\">Dawn Mac x64 Experimental Release (AMD)</a></li></ul>"
     }
     builders {
       name: "dawn-try-mac-arm64-rel"
@@ -72223,6 +72674,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac arm64 Release (Apple M2)\">Dawn Mac arm64 Release (Apple M2)</a></li></ul>"
     }
     builders {
       name: "dawn-try-mac-intel-exp"
@@ -72311,6 +72763,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Builder\">Dawn Mac x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Experimental Release (Intel)\">Dawn Mac x64 Experimental Release (Intel)</a></li></ul>"
     }
     builders {
       name: "dawn-try-win-x64-intel-exp"
@@ -72400,6 +72853,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Builder\">Dawn Win10 x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Experimental Release (Intel)\">Dawn Win10 x64 Experimental Release (Intel)</a></li></ul>"
     }
     builders {
       name: "dawn-try-win-x86-intel-exp"
@@ -72489,6 +72943,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Builder\">Dawn Win10 x86 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Experimental Release (Intel)\">Dawn Win10 x86 Experimental Release (Intel)</a></li></ul>"
     }
     builders {
       name: "dawn-try-win10-x64-intel-asan"
@@ -72578,6 +73033,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Builder\">Dawn Win10 x64 ASAN Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Release (Intel)\">Dawn Win10 x64 ASAN Release (Intel)</a></li></ul>"
     }
     builders {
       name: "dawn-try-win10-x64-nvidia-asan"
@@ -72667,6 +73123,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Builder\">Dawn Win10 x64 ASAN Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Release (NVIDIA)\">Dawn Win10 x64 ASAN Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "dawn-try-win10-x86-rel"
@@ -72755,6 +73212,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Builder\">Dawn Win10 x86 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Release (Intel)\">Dawn Win10 x86 Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Release (NVIDIA)\">Dawn Win10 x86 Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "dawn-win10-x64-deps-rel"
@@ -72844,6 +73302,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 DEPS Builder\">Dawn Win10 x64 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 DEPS Release (Intel)\">Dawn Win10 x64 DEPS Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 DEPS Release (NVIDIA)\">Dawn Win10 x64 DEPS Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "dawn-win10-x86-deps-rel"
@@ -72933,6 +73392,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 DEPS Builder\">Dawn Win10 x86 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 DEPS Release (Intel)\">Dawn Win10 x86 DEPS Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 DEPS Release (NVIDIA)\">Dawn Win10 x86 DEPS Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "fuchsia-angle-try"
@@ -73059,6 +73519,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-angle-builder\">fuchsia-angle-builder</a></li></ul>"
     }
     builders {
       name: "fuchsia-arm64-cast-receiver-rel"
@@ -73150,6 +73611,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-arm64-cast-receiver-rel\">fuchsia-arm64-cast-receiver-rel</a></li></ul>"
     }
     builders {
       name: "fuchsia-arm64-rel"
@@ -73253,6 +73715,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-arm64-rel\">fuchsia-arm64-rel</a></li></ul>"
     }
     builders {
       name: "fuchsia-binary-size"
@@ -73521,6 +73984,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-code-coverage\">fuchsia-code-coverage</a></li></ul>"
     }
     builders {
       name: "fuchsia-compile-x64-dbg"
@@ -73612,6 +74076,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-dbg\">fuchsia-x64-dbg</a></li></ul>"
     }
     builders {
       name: "fuchsia-deterministic-dbg"
@@ -73785,6 +74250,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-fyi-arm64-dbg\">fuchsia-fyi-arm64-dbg</a></li></ul>"
     }
     builders {
       name: "fuchsia-fyi-x64-dbg"
@@ -73875,6 +74341,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-fyi-x64-dbg\">fuchsia-fyi-x64-dbg</a></li></ul>"
     }
     builders {
       name: "fuchsia-official"
@@ -73965,6 +74432,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-official\">fuchsia-official</a></li></ul>"
     }
     builders {
       name: "fuchsia-x64-accessibility-rel"
@@ -74056,6 +74524,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-accessibility-rel\">fuchsia-x64-accessibility-rel</a></li></ul>"
     }
     builders {
       name: "fuchsia-x64-cast-receiver-rel"
@@ -74158,7 +74627,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel-compilator\">fuchsia-x64-cast-receiver-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-cast-receiver-rel\">fuchsia-x64-cast-receiver-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel-compilator\">fuchsia-x64-cast-receiver-rel-compilator</a>."
     }
     builders {
       name: "fuchsia-x64-cast-receiver-rel-compilator"
@@ -74352,7 +74821,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows fuchsia-x64-cast-receiver-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating fuchsia-x64-cast-receiver-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-siso-rel-compilator\">fuchsia-x64-cast-receiver-siso-rel-compilator</a>."
+      description_html: "This builder shadows fuchsia-x64-cast-receiver-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating fuchsia-x64-cast-receiver-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-cast-receiver-rel\">fuchsia-x64-cast-receiver-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-siso-rel-compilator\">fuchsia-x64-cast-receiver-siso-rel-compilator</a>."
     }
     builders {
       name: "fuchsia-x64-cast-receiver-siso-rel-compilator"
@@ -74546,6 +75015,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-rel\">fuchsia-x64-rel</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-cq-android-arm64"
@@ -74636,6 +75106,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm64 Builder\">GPU FYI Android arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 6)\">Android FYI Release (Pixel 6)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-android-m-nexus-5x-64"
@@ -74722,6 +75193,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm64 Builder\">GPU FYI Android arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Nexus 5X)\">Android FYI Release (Nexus 5X)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-android-nvidia-shield-tv"
@@ -74808,6 +75280,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm Builder\">GPU FYI Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (NVIDIA Shield TV)\">Android FYI Release (NVIDIA Shield TV)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-android-p-pixel-2-32"
@@ -74894,6 +75367,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm Builder\">GPU FYI Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 2)\">Android FYI Release (Pixel 2)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-android-pixel-6-64"
@@ -74980,6 +75454,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm64 Builder\">GPU FYI Android arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 6)\">Android FYI Release (Pixel 6)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-android-r-pixel-4-32"
@@ -75066,6 +75541,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm Builder\">GPU FYI Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 4)\">Android FYI Release (Pixel 4)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-chromeos-amd64-generic"
@@ -75152,6 +75628,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ChromeOS FYI Release (amd64-generic)\">ChromeOS FYI Release (amd64-generic)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-chromeos-kevin"
@@ -75238,6 +75715,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ChromeOS FYI Release (kevin)\">ChromeOS FYI Release (kevin)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-chromeos-skylab-kevin"
@@ -75324,6 +75802,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ChromeOS FYI Release Skylab (kevin)\">ChromeOS FYI Release Skylab (kevin)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-lacros-amd-rel"
@@ -75410,6 +75889,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Lacros x64 Builder\">GPU FYI Lacros x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Lacros FYI x64 Release (AMD)\">Lacros FYI x64 Release (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-lacros-intel-rel"
@@ -75496,6 +75976,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Lacros x64 Builder\">GPU FYI Lacros x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Lacros FYI x64 Release (Intel)\">Lacros FYI x64 Release (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-amd-rel"
@@ -75582,6 +76063,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Release (AMD RX 5500 XT)\">Linux FYI Release (AMD RX 5500 XT)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-intel-exp"
@@ -75668,6 +76150,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Experimental Release (Intel UHD 630)\">Linux FYI Experimental Release (Intel UHD 630)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-intel-rel"
@@ -75754,6 +76237,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Release (Intel UHD 630)\">Linux FYI Release (Intel UHD 630)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-nvidia-dbg"
@@ -75840,6 +76324,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder (dbg)\">GPU FYI Linux Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Debug (NVIDIA)\">Linux FYI Debug (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-nvidia-exp"
@@ -75926,6 +76411,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Experimental Release (NVIDIA)\">Linux FYI Experimental Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-nvidia-rel"
@@ -76012,6 +76498,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Release (NVIDIA)\">Linux FYI Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-linux-nvidia-tsn"
@@ -76098,6 +76585,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI GPU TSAN Release\">Linux FYI GPU TSAN Release</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-amd-pro-rel"
@@ -76183,6 +76671,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Pro FYI Release (AMD)\">Mac Pro FYI Release (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-amd-retina-asan"
@@ -76268,6 +76757,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (asan)\">GPU FYI Mac Builder (asan)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina ASAN (AMD)\">Mac FYI Retina ASAN (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-amd-retina-dbg"
@@ -76353,6 +76843,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (dbg)\">GPU FYI Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Debug (AMD)\">Mac FYI Retina Debug (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-amd-retina-exp"
@@ -76438,6 +76929,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Retina Release (AMD)\">Mac FYI Experimental Retina Release (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-amd-retina-rel"
@@ -76523,6 +77015,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Release (AMD)\">Mac FYI Retina Release (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-arm64-apple-m1-exp"
@@ -76608,6 +77101,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac arm64 Builder\">GPU FYI Mac arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Release (Apple M1)\">Mac FYI Experimental Release (Apple M1)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-arm64-apple-m1-rel"
@@ -76693,6 +77187,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac arm64 Builder\">GPU FYI Mac arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Release (Apple M1)\">Mac FYI Release (Apple M1)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-arm64-apple-m2-retina-rel"
@@ -76778,6 +77273,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac arm64 Builder\">GPU FYI Mac arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Release (Apple M2)\">Mac FYI Retina Release (Apple M2)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-intel-asan"
@@ -76863,6 +77359,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (asan)\">GPU FYI Mac Builder (asan)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI ASAN (Intel)\">Mac FYI ASAN (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-intel-dbg"
@@ -76948,6 +77445,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (dbg)\">GPU FYI Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Debug (Intel)\">Mac FYI Debug (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-intel-exp"
@@ -77033,6 +77531,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Release (Intel)\">Mac FYI Experimental Release (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-intel-rel"
@@ -77118,6 +77617,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Release (Intel)\">Mac FYI Release (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-nvidia-retina-exp"
@@ -77203,6 +77703,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Retina Release (NVIDIA)\">Mac FYI Experimental Retina Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-mac-nvidia-retina-rel"
@@ -77288,6 +77789,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Release (NVIDIA)\">Mac FYI Retina Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-amd-rel-64"
@@ -77374,6 +77876,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Release (AMD RX 5500 XT)\">Win10 FYI x64 Release (AMD RX 5500 XT)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-intel-exp-64"
@@ -77460,6 +77963,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Experimental Release (Intel)\">Win10 FYI x64 Experimental Release (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-intel-rel-64"
@@ -77546,6 +78050,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Release (Intel)\">Win10 FYI x64 Release (Intel)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-nvidia-dbg-64"
@@ -77632,6 +78137,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder (dbg)\">GPU FYI Win x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Debug (NVIDIA)\">Win10 FYI x64 Debug (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-nvidia-dx12vk-dbg-64"
@@ -77718,6 +78224,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 DX12 Vulkan Builder (dbg)\">GPU FYI Win x64 DX12 Vulkan Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)\">Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-nvidia-dx12vk-rel-64"
@@ -77804,6 +78311,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 DX12 Vulkan Builder\">GPU FYI Win x64 DX12 Vulkan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)\">Win10 FYI x64 DX12 Vulkan Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-nvidia-exp-64"
@@ -77890,6 +78398,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Exp Release (NVIDIA)\">Win10 FYI x64 Exp Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-nvidia-rel-32"
@@ -77976,6 +78485,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win Builder\">GPU FYI Win Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x86 Release (NVIDIA)\">Win10 FYI x86 Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-fyi-try-win10-nvidia-rel-64"
@@ -78062,6 +78572,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Release (NVIDIA)\">Win10 FYI x64 Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-try-android-m-nexus-5x-64"
@@ -78148,6 +78659,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android Release (Nexus 5X)\">Android Release (Nexus 5X)</a></li></ul>"
     }
     builders {
       name: "gpu-try-linux-nvidia-dbg"
@@ -78234,6 +78746,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder (dbg)\">GPU Linux Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Debug (NVIDIA)\">Linux Debug (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-try-linux-nvidia-rel"
@@ -78320,6 +78833,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "gpu-try-mac-amd-retina-dbg"
@@ -78405,6 +78919,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder (dbg)\">GPU Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Retina Debug (AMD)\">Mac Retina Debug (AMD)</a></li></ul>"
     }
     builders {
       name: "gpu-try-mac-intel-dbg"
@@ -78490,6 +79005,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder (dbg)\">GPU Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Debug (Intel)\">Mac Debug (Intel)</a></li></ul>"
     }
     builders {
       name: "ios-angle-try-intel"
@@ -78660,6 +79176,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-angle-builder\">ios-angle-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-angle-intel\">ios-angle-intel</a></li></ul>"
     }
     builders {
       name: "ios-asan"
@@ -78752,6 +79269,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-asan\">ios-asan</a></li></ul>"
     }
     builders {
       name: "ios-blink-dbg-fyi"
@@ -78844,6 +79362,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-blink-dbg-fyi\">ios-blink-dbg-fyi</a></li></ul>"
     }
     builders {
       name: "ios-catalyst"
@@ -78936,6 +79455,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-catalyst\">ios-catalyst</a></li></ul>"
     }
     builders {
       name: "ios-device"
@@ -79028,6 +79548,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-device\">ios-device</a></li></ul>"
     }
     builders {
       name: "ios-fieldtrial-rel"
@@ -79120,6 +79641,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-fieldtrial-rel\">ios-fieldtrial-rel</a></li></ul>"
     }
     builders {
       name: "ios-m1-simulator"
@@ -79212,6 +79734,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-m1-simulator\">ios-m1-simulator</a></li></ul>"
     }
     builders {
       name: "ios-m1-simulator-cronet"
@@ -79304,6 +79827,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-m1-simulator-cronet\">ios-m1-simulator-cronet</a></li></ul>"
     }
     builders {
       name: "ios-simulator"
@@ -79398,7 +79922,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-compilator\">ios-simulator-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator\">ios-simulator</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-compilator\">ios-simulator-compilator</a>."
     }
     builders {
       name: "ios-simulator-code-coverage"
@@ -79491,6 +80015,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-code-coverage\">ios-simulator-code-coverage</a></li></ul>"
     }
     builders {
       name: "ios-simulator-compilator"
@@ -79677,6 +80202,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-cronet\">ios-simulator-cronet</a></li></ul>"
     }
     builders {
       name: "ios-simulator-full-configs"
@@ -79770,6 +80296,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-full-configs\">ios-simulator-full-configs</a></li></ul>"
     }
     builders {
       name: "ios-simulator-inverse-fieldtrials-fyi"
@@ -79862,6 +80389,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator\">ios-simulator</a></li></ul>"
     }
     builders {
       name: "ios-simulator-multi-window"
@@ -79954,6 +80482,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-multi-window\">ios-simulator-multi-window</a></li></ul>"
     }
     builders {
       name: "ios-simulator-noncq"
@@ -80047,6 +80576,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-noncq\">ios-simulator-noncq</a></li></ul>"
     }
     builders {
       name: "ios-wpt-fyi-rel"
@@ -80139,6 +80669,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-wpt-fyi-rel\">ios-wpt-fyi-rel</a></li></ul>"
     }
     builders {
       name: "ios16-beta-simulator"
@@ -80231,6 +80762,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios16-beta-simulator\">ios16-beta-simulator</a></li></ul>"
     }
     builders {
       name: "ios16-sdk-simulator"
@@ -80323,6 +80855,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios16-sdk-simulator\">ios16-sdk-simulator</a></li></ul>"
     }
     builders {
       name: "ios17-beta-simulator"
@@ -80415,6 +80948,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios17-beta-simulator\">ios17-beta-simulator</a></li></ul>"
     }
     builders {
       name: "ios17-sdk-simulator"
@@ -80507,6 +81041,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios17-sdk-simulator\">ios17-sdk-simulator</a></li></ul>"
     }
     builders {
       name: "lacros-amd64-generic-rel"
@@ -80597,6 +81132,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/lacros-amd64-generic-rel\">lacros-amd64-generic-rel</a></li></ul>"
     }
     builders {
       name: "lacros-amd64-generic-rel-skylab"
@@ -80777,6 +81313,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/lacros-arm-generic-rel\">lacros-arm-generic-rel</a></li></ul>"
     }
     builders {
       name: "lacros-arm64-generic-rel"
@@ -80867,6 +81404,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/lacros-arm64-generic-rel\">lacros-arm64-generic-rel</a></li></ul>"
     }
     builders {
       name: "layout_test_leak_detection"
@@ -80957,6 +81495,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/WebKit Linux Leak\">WebKit Linux Leak</a></li></ul>"
     }
     builders {
       name: "leak_detection_linux"
@@ -81047,6 +81586,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Leak Detection Linux\">Leak Detection Linux</a></li></ul>"
     }
     builders {
       name: "linux-afl-asan-rel"
@@ -81332,6 +81872,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-builder\">linux-angle-chromium-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-intel\">linux-angle-chromium-intel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-nvidia\">linux-angle-chromium-nvidia</a></li></ul>"
     }
     builders {
       name: "linux-annotator-rel"
@@ -81422,6 +81963,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-annotator-rel\">linux-annotator-rel</a></li></ul>"
     }
     builders {
       name: "linux-arm64-castos"
@@ -81513,6 +82055,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Linux ARM64\">Cast Linux ARM64</a></li></ul>"
     }
     builders {
       name: "linux-arm64-rel-cft"
@@ -81603,6 +82146,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-arm64-rel-cft\">linux-arm64-rel-cft</a></li></ul>"
     }
     builders {
       name: "linux-bfcache-rel"
@@ -81693,6 +82237,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-bfcache-rel\">linux-bfcache-rel</a></li></ul>"
     }
     builders {
       name: "linux-blink-heap-verification-try"
@@ -81783,6 +82328,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-blink-heap-verification\">linux-blink-heap-verification</a></li></ul>"
     }
     builders {
       name: "linux-blink-rel"
@@ -81964,6 +82510,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-blink-web-tests-force-accessibility-rel\">linux-blink-web-tests-force-accessibility-rel</a></li></ul>"
     }
     builders {
       name: "linux-centipede-asan-rel"
@@ -82137,6 +82684,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-cfm-rel\">linux-cfm-rel</a></li></ul>"
     }
     builders {
       name: "linux-chromeos-annotator-rel"
@@ -82227,6 +82775,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-annotator-rel\">linux-chromeos-annotator-rel</a></li></ul>"
     }
     builders {
       name: "linux-chromeos-clang-tidy-rel"
@@ -82399,6 +82948,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-code-coverage\">linux-chromeos-code-coverage</a></li></ul>"
     }
     builders {
       name: "linux-chromeos-compile-dbg"
@@ -82489,6 +83039,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-dbg\">linux-chromeos-dbg</a></li></ul>"
     }
     builders {
       name: "linux-chromeos-dbg"
@@ -82579,6 +83130,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-dbg\">linux-chromeos-dbg</a></li></ul>"
     }
     builders {
       name: "linux-chromeos-inverse-fieldtrials-fyi-rel"
@@ -82669,6 +83221,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-rel\">linux-chromeos-rel</a></li></ul>"
     }
     builders {
       name: "linux-chromeos-rel"
@@ -82763,7 +83316,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-rel\">linux-chromeos-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>."
     }
     builders {
       name: "linux-chromeos-rel-compilator"
@@ -82949,7 +83502,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows linux-chromeos-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-chromeos-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel-compilator\">linux-chromeos-siso-rel-compilator</a>."
+      description_html: "This builder shadows linux-chromeos-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-chromeos-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-rel\">linux-chromeos-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel-compilator\">linux-chromeos-siso-rel-compilator</a>."
     }
     builders {
       name: "linux-chromeos-siso-rel-compilator"
@@ -83213,6 +83766,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-code-coverage\">linux-code-coverage</a></li></ul>"
     }
     builders {
       name: "linux-dawn-rel"
@@ -83301,6 +83855,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 Builder\">Dawn Linux x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 Release (Intel UHD 630)\">Dawn Linux x64 Release (Intel UHD 630)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 Release (NVIDIA)\">Dawn Linux x64 Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "linux-dcheck-off-rel"
@@ -83391,6 +83946,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "linux-exp-asan-lsan-fyi-rel"
@@ -83481,6 +84037,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-exp-asan-lsan-fyi-rel\">linux-exp-asan-lsan-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-exp-msan-fyi-rel"
@@ -83571,6 +84128,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-exp-msan-fyi-rel\">linux-exp-msan-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-exp-tsan-fyi-rel"
@@ -83661,6 +84219,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-exp-tsan-fyi-rel\">linux-exp-tsan-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-extended-tracing-rel"
@@ -83751,6 +84310,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-extended-tracing-rel\">linux-extended-tracing-rel</a></li></ul>"
     }
     builders {
       name: "linux-fieldtrial-rel"
@@ -83841,6 +84401,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-fieldtrial-rel\">linux-fieldtrial-rel</a></li></ul>"
     }
     builders {
       name: "linux-gcc-rel"
@@ -83931,6 +84492,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-gcc-rel\">linux-gcc-rel</a></li></ul>"
     }
     builders {
       name: "linux-headless-shell-rel"
@@ -84022,6 +84584,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-headless-shell-rel\">linux-headless-shell-rel</a></li></ul>"
     }
     builders {
       name: "linux-inverse-fieldtrials-fyi-rel"
@@ -84112,6 +84675,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "linux-js-code-coverage"
@@ -84202,6 +84766,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-js-code-coverage\">linux-js-code-coverage</a></li></ul>"
     }
     builders {
       name: "linux-js-coverage-rel"
@@ -84293,6 +84858,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-js-code-coverage\">linux-js-code-coverage</a></li></ul>"
     }
     builders {
       name: "linux-lacros-asan-lsan-rel"
@@ -84383,6 +84949,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-asan-lsan-rel\">linux-lacros-asan-lsan-rel</a></li></ul>"
     }
     builders {
       name: "linux-lacros-clang-tidy-rel"
@@ -84556,6 +85123,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-code-coverage\">linux-lacros-code-coverage</a></li></ul>"
     }
     builders {
       name: "linux-lacros-dbg"
@@ -84646,6 +85214,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-dbg\">linux-lacros-dbg</a></li></ul>"
     }
     builders {
       name: "linux-lacros-fyi-rel"
@@ -84736,6 +85305,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-builder-fyi-rel\">linux-lacros-builder-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-tester-fyi-rel\">linux-lacros-tester-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-lacros-rel"
@@ -84826,7 +85396,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel-compilator\">linux-lacros-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-builder-rel\">linux-lacros-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-tester-rel\">linux-lacros-tester-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel-compilator\">linux-lacros-rel-compilator</a>."
     }
     builders {
       name: "linux-lacros-rel-compilator"
@@ -85008,7 +85578,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows linux-lacros-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-lacros-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel-compilator\">linux-lacros-siso-rel-compilator</a>."
+      description_html: "This builder shadows linux-lacros-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-lacros-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-builder-rel\">linux-lacros-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-tester-rel\">linux-lacros-tester-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel-compilator\">linux-lacros-siso-rel-compilator</a>."
     }
     builders {
       name: "linux-lacros-siso-rel-compilator"
@@ -85190,6 +85760,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-version-skew-fyi\">linux-lacros-version-skew-fyi</a></li></ul>"
     }
     builders {
       name: "linux-layout-tests-edit-ng"
@@ -85456,6 +86027,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "linux-mbi-mode-per-site-instance-rel"
@@ -85546,6 +86118,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "linux-official"
@@ -85636,6 +86209,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-official\">linux-official</a></li></ul>"
     }
     builders {
       name: "linux-perfetto-rel"
@@ -85727,6 +86301,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-perfetto-rel\">linux-perfetto-rel</a></li></ul>"
     }
     builders {
       name: "linux-rel"
@@ -85821,7 +86396,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator\">linux-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator\">linux-rel-compilator</a>."
     }
     builders {
       name: "linux-rel-cft"
@@ -85912,6 +86487,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-rel-cft\">linux-rel-cft</a></li></ul>"
     }
     builders {
       name: "linux-rel-compilator"
@@ -86093,6 +86669,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-rust-x64-dbg\">linux-rust-x64-dbg</a></li></ul>"
     }
     builders {
       name: "linux-rust-x64-rel"
@@ -86183,6 +86760,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-rust-x64-rel\">linux-rust-x64-rel</a></li></ul>"
     }
     builders {
       name: "linux-siso-rel"
@@ -86277,7 +86855,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows linux-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel-compilator\">linux-siso-rel-compilator</a>."
+      description_html: "This builder shadows linux-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel-compilator\">linux-siso-rel-compilator</a>."
     }
     builders {
       name: "linux-siso-rel-compilator"
@@ -86456,6 +87034,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-chromium-x64\">linux-swangle-chromium-x64</a></li></ul>"
     }
     builders {
       name: "linux-swangle-chromium-try-x64-exp"
@@ -86543,6 +87122,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-chromium-x64-exp\">linux-swangle-chromium-x64-exp</a></li></ul>"
     }
     builders {
       name: "linux-swangle-try-tot-swiftshader-x64"
@@ -86666,6 +87246,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-tot-swiftshader-x64\">linux-swangle-tot-swiftshader-x64</a></li></ul>"
     }
     builders {
       name: "linux-swangle-try-x64"
@@ -86753,6 +87334,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-x64\">linux-swangle-x64</a></li></ul>"
     }
     builders {
       name: "linux-swangle-try-x64-exp"
@@ -86840,6 +87422,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-x64-exp\">linux-swangle-x64-exp</a></li></ul>"
     }
     builders {
       name: "linux-ubsan-fyi-rel"
@@ -86930,6 +87513,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-ubsan-fyi-rel\">linux-ubsan-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-ubsan-vptr"
@@ -87020,6 +87604,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-ubsan-vptr\">linux-ubsan-vptr</a></li></ul>"
     }
     builders {
       name: "linux-updater-try-builder-dbg"
@@ -87110,6 +87695,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-builder-dbg\">linux-updater-builder-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-tester-dbg\">linux-updater-tester-dbg</a></li></ul>"
     }
     builders {
       name: "linux-updater-try-builder-rel"
@@ -87200,6 +87786,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-builder-rel\">linux-updater-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-tester-rel\">linux-updater-tester-rel</a></li></ul>"
     }
     builders {
       name: "linux-v4l2-codec-rel"
@@ -87290,6 +87877,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-v4l2-codec-rel\">linux-v4l2-codec-rel</a></li></ul>"
     }
     builders {
       name: "linux-viz-rel"
@@ -87380,6 +87968,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Viz\">Linux Viz</a></li></ul>"
     }
     builders {
       name: "linux-wayland-rel"
@@ -87470,7 +88059,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel-compilator\">linux-wayland-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (Wayland)\">Linux Builder (Wayland)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests (Wayland)\">Linux Tests (Wayland)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel-compilator\">linux-wayland-rel-compilator</a>."
     }
     builders {
       name: "linux-wayland-rel-compilator"
@@ -87652,7 +88241,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows linux-wayland-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-wayland-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel-compilator\">linux-wayland-siso-rel-compilator</a>."
+      description_html: "This builder shadows linux-wayland-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-wayland-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (Wayland)\">Linux Builder (Wayland)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests (Wayland)\">Linux Tests (Wayland)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel-compilator\">linux-wayland-siso-rel-compilator</a>."
     }
     builders {
       name: "linux-wayland-siso-rel-compilator"
@@ -87834,6 +88423,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/WebKit Linux MSAN\">WebKit Linux MSAN</a></li></ul>"
     }
     builders {
       name: "linux-wpt-content-shell-fyi-rel"
@@ -87924,6 +88514,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-content-shell-fyi-rel\">linux-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-wpt-content-shell-leak-detection"
@@ -88014,6 +88605,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-content-shell-leak-detection\">linux-wpt-content-shell-leak-detection</a></li></ul>"
     }
     builders {
       name: "linux-wpt-fyi-rel"
@@ -88104,6 +88696,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-fyi-rel\">linux-wpt-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-wpt-identity-fyi-rel"
@@ -88194,6 +88787,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-identity-fyi-rel\">linux-wpt-identity-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-wpt-input-fyi-rel"
@@ -88284,6 +88878,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-input-fyi-rel\">linux-wpt-input-fyi-rel</a></li></ul>"
     }
     builders {
       name: "linux-x64-castos"
@@ -88374,6 +88969,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Linux\">Cast Linux</a></li></ul>"
     }
     builders {
       name: "linux-x64-castos-audio"
@@ -88464,6 +89060,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Audio Linux\">Cast Audio Linux</a></li></ul>"
     }
     builders {
       name: "linux-x64-castos-dbg"
@@ -88555,6 +89152,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Linux Debug\">Cast Linux Debug</a></li></ul>"
     }
     builders {
       name: "linux_chromium_archive_rel_ng"
@@ -88645,6 +89243,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-archive-rel\">linux-archive-rel</a></li></ul>"
     }
     builders {
       name: "linux_chromium_asan_rel_ng"
@@ -88739,7 +89338,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng-compilator\">linux_chromium_asan_rel_ng-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Builder\">Linux ASan LSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Tests (1)\">Linux ASan LSan Tests (1)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng-compilator\">linux_chromium_asan_rel_ng-compilator</a>."
     }
     builders {
       name: "linux_chromium_asan_rel_ng-compilator"
@@ -88925,7 +89524,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows linux_chromium_asan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_asan_rel_ng from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng-compilator\">linux_chromium_asan_siso_rel_ng-compilator</a>."
+      description_html: "This builder shadows linux_chromium_asan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_asan_rel_ng from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Builder\">Linux ASan LSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Tests (1)\">Linux ASan LSan Tests (1)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng-compilator\">linux_chromium_asan_siso_rel_ng-compilator</a>."
     }
     builders {
       name: "linux_chromium_asan_siso_rel_ng-compilator"
@@ -89108,6 +89707,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux CFI\">Linux CFI</a></li></ul>"
     }
     builders {
       name: "linux_chromium_chromeos_asan_rel_ng"
@@ -89198,6 +89798,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Chromium OS ASan LSan Builder\">Linux Chromium OS ASan LSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Chromium OS ASan LSan Tests (1)\">Linux Chromium OS ASan LSan Tests (1)</a></li></ul>"
     }
     builders {
       name: "linux_chromium_chromeos_msan_rel_ng"
@@ -89288,6 +89889,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ChromiumOS MSan Builder\">Linux ChromiumOS MSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ChromiumOS MSan Tests\">Linux ChromiumOS MSan Tests</a></li></ul>"
     }
     builders {
       name: "linux_chromium_clobber_deterministic"
@@ -89461,6 +90063,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-archive-rel\">linux-archive-rel</a></li></ul>"
     }
     builders {
       name: "linux_chromium_compile_dbg_ng"
@@ -89555,6 +90158,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (dbg)\">Linux Builder (dbg)</a></li></ul>"
     }
     builders {
       name: "linux_chromium_compile_rel_ng"
@@ -89645,6 +90249,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li></ul>"
     }
     builders {
       name: "linux_chromium_dbg_ng"
@@ -89740,6 +90345,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (dbg)\">Linux Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests (dbg)(1)\">Linux Tests (dbg)(1)</a></li></ul>"
     }
     builders {
       name: "linux_chromium_msan_rel_ng"
@@ -89830,6 +90436,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux MSan Builder\">Linux MSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux MSan Tests\">Linux MSan Tests</a></li></ul>"
     }
     builders {
       name: "linux_chromium_tsan_rel_ng"
@@ -89924,7 +90531,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng-compilator\">linux_chromium_tsan_rel_ng-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Builder\">Linux TSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Tests\">Linux TSan Tests</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng-compilator\">linux_chromium_tsan_rel_ng-compilator</a>."
     }
     builders {
       name: "linux_chromium_tsan_rel_ng-compilator"
@@ -90110,7 +90717,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows linux_chromium_tsan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_tsan_rel_ng from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng-compilator\">linux_chromium_tsan_siso_rel_ng-compilator</a>."
+      description_html: "This builder shadows linux_chromium_tsan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_tsan_rel_ng from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Builder\">Linux TSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Tests\">Linux TSan Tests</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng-compilator\">linux_chromium_tsan_siso_rel_ng-compilator</a>."
     }
     builders {
       name: "linux_chromium_tsan_siso_rel_ng-compilator"
@@ -90658,6 +91265,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-angle-chromium-amd\">mac-angle-chromium-amd</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-angle-chromium-builder\">mac-angle-chromium-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-angle-chromium-intel\">mac-angle-chromium-intel</a></li></ul>"
     }
     builders {
       name: "mac-arm64-on-arm64-rel"
@@ -90747,6 +91355,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-on-arm64-rel\">mac-arm64-on-arm64-rel</a></li></ul>"
     }
     builders {
       name: "mac-builder-next"
@@ -90836,6 +91445,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder Next\">Mac Builder Next</a></li></ul>"
     }
     builders {
       name: "mac-clang-tidy-rel"
@@ -91012,6 +91622,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-code-coverage\">mac-code-coverage</a></li></ul>"
     }
     builders {
       name: "mac-dawn-rel"
@@ -91100,6 +91711,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Builder\">Dawn Mac x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Release (AMD)\">Dawn Mac x64 Release (AMD)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Release (Intel)\">Dawn Mac x64 Release (Intel)</a></li></ul>"
     }
     builders {
       name: "mac-fieldtrial-tester"
@@ -91189,6 +91801,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-fieldtrial-tester\">mac-fieldtrial-tester</a></li></ul>"
     }
     builders {
       name: "mac-intel-on-arm64-rel"
@@ -91278,6 +91891,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-intel-on-arm64-rel\">mac-intel-on-arm64-rel</a></li></ul>"
     }
     builders {
       name: "mac-inverse-fieldtrials-fyi-rel"
@@ -91367,6 +91981,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests\">Mac13 Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder\">GPU Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Release (Intel)\">Mac Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Retina Release (AMD)\">Mac Retina Release (AMD)</a></li></ul>"
     }
     builders {
       name: "mac-official"
@@ -91455,6 +92070,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-official\">mac-official</a></li></ul>"
     }
     builders {
       name: "mac-osxbeta-rel"
@@ -91544,6 +92160,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-osxbeta-rel\">mac-osxbeta-rel</a></li></ul>"
     }
     builders {
       name: "mac-perfetto-rel"
@@ -91633,6 +92250,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-perfetto-rel\">mac-perfetto-rel</a></li></ul>"
     }
     builders {
       name: "mac-rel"
@@ -91727,7 +92345,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator\">mac-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests\">Mac13 Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder\">GPU Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Release (Intel)\">Mac Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Retina Release (AMD)\">Mac Retina Release (AMD)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator\">mac-rel-compilator</a>."
     }
     builders {
       name: "mac-rel-cft"
@@ -91816,6 +92434,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-rel-cft\">mac-rel-cft</a></li></ul>"
     }
     builders {
       name: "mac-rel-compilator"
@@ -91993,6 +92612,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-rust-x64-dbg\">mac-rust-x64-dbg</a></li></ul>"
     }
     builders {
       name: "mac-swangle-chromium-try-x64"
@@ -92078,6 +92698,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-swangle-chromium-x64\">mac-swangle-chromium-x64</a></li></ul>"
     }
     builders {
       name: "mac-updater-try-builder-dbg"
@@ -92167,6 +92788,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-updater-builder-dbg\">mac-updater-builder-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac10.15-updater-tester-dbg\">mac10.15-updater-tester-dbg</a></li></ul>"
     }
     builders {
       name: "mac-updater-try-builder-rel"
@@ -92256,6 +92878,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-updater-builder-rel\">mac-updater-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac10.15-updater-tester-rel\">mac10.15-updater-tester-rel</a></li></ul>"
     }
     builders {
       name: "mac10.15-blink-rel"
@@ -92434,6 +93057,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac10.15-wpt-content-shell-fyi-rel\">mac10.15-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac11-arm64-rel"
@@ -92523,6 +93147,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac11-arm64-rel-tests\">mac11-arm64-rel-tests</a></li></ul>"
     }
     builders {
       name: "mac11-arm64-wpt-content-shell-fyi-rel"
@@ -92612,6 +93237,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac11-arm64-wpt-content-shell-fyi-rel\">mac11-arm64-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac11-wpt-content-shell-fyi-rel"
@@ -92701,6 +93327,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac11-wpt-content-shell-fyi-rel\">mac11-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac11.0-blink-rel"
@@ -92968,6 +93595,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac12-arm64-rel-tests\">mac12-arm64-rel-tests</a></li></ul>"
     }
     builders {
       name: "mac12-arm64-wpt-content-shell-fyi-rel"
@@ -93057,6 +93685,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac12-arm64-wpt-content-shell-fyi-rel\">mac12-arm64-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac12-tests"
@@ -93146,6 +93775,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac12 Tests\">Mac12 Tests</a></li></ul>"
     }
     builders {
       name: "mac12-wpt-content-shell-fyi-rel"
@@ -93235,6 +93865,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac12-wpt-content-shell-fyi-rel\">mac12-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac12.0-blink-rel"
@@ -93503,7 +94134,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel-compilator\">mac13-arm64-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac13-arm64-rel-tests\">mac13-arm64-rel-tests</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel-compilator\">mac13-arm64-rel-compilator</a>."
     }
     builders {
       name: "mac13-arm64-rel-compilator"
@@ -93683,6 +94314,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac13-arm64-wpt-content-shell-fyi-rel\">mac13-arm64-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac13-blink-rel"
@@ -93861,6 +94493,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests\">Mac13 Tests</a></li></ul>"
     }
     builders {
       name: "mac13-wpt-content-shell-fyi-rel"
@@ -93950,6 +94583,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac13-wpt-content-shell-fyi-rel\">mac13-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "mac13.arm64-blink-rel"
@@ -94128,6 +94762,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac10.15 Tests\">Mac10.15 Tests</a></li></ul>"
     }
     builders {
       name: "mac_chromium_11.0_rel_ng"
@@ -94217,6 +94852,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac11 Tests\">Mac11 Tests</a></li></ul>"
     }
     builders {
       name: "mac_chromium_archive_rel_ng"
@@ -94306,6 +94942,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-archive-rel\">mac-archive-rel</a></li></ul>"
     }
     builders {
       name: "mac_chromium_asan_rel_ng"
@@ -94395,6 +95032,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac ASan 64 Builder\">Mac ASan 64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac ASan 64 Tests (1)\">Mac ASan 64 Tests (1)</a></li></ul>"
     }
     builders {
       name: "mac_chromium_compile_dbg_ng"
@@ -94485,6 +95123,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder (dbg)\">Mac Builder (dbg)</a></li></ul>"
     }
     builders {
       name: "mac_chromium_compile_rel_ng"
@@ -94574,6 +95213,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li></ul>"
     }
     builders {
       name: "mac_chromium_dbg_ng"
@@ -94663,6 +95303,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder (dbg)\">Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests (dbg)\">Mac13 Tests (dbg)</a></li></ul>"
     }
     builders {
       name: "mac_optional_gpu_tests_rel"
@@ -95166,6 +95807,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Network Service Linux\">Network Service Linux</a></li></ul>"
     }
     builders {
       name: "reclient-config-deployment-verifier"
@@ -95844,6 +96486,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Nougat Phone Tester\">Nougat Phone Tester</a></li></ul>"
     }
     builders {
       name: "win-angle-chromium-x64-try"
@@ -96047,6 +96690,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-angle-chromium-x64-builder\">win-angle-chromium-x64-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-angle-chromium-x64-intel\">win10-angle-chromium-x64-intel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-angle-chromium-x64-nvidia\">win10-angle-chromium-x64-nvidia</a></li></ul>"
     }
     builders {
       name: "win-angle-chromium-x86-try"
@@ -96173,6 +96817,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-angle-chromium-x86-builder\">win-angle-chromium-x86-builder</a></li></ul>"
     }
     builders {
       name: "win-annotator-rel"
@@ -96263,6 +96908,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-annotator-rel\">win-annotator-rel</a></li></ul>"
     }
     builders {
       name: "win-asan"
@@ -96353,6 +96999,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-asan\">win-asan</a></li></ul>"
     }
     builders {
       name: "win-celab-try-rel"
@@ -96528,6 +97175,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Builder\">Dawn Win10 x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Release (Intel)\">Dawn Win10 x64 Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Release (NVIDIA)\">Dawn Win10 x64 Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "win-fieldtrial-rel"
@@ -96618,6 +97266,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-fieldtrial-rel\">win-fieldtrial-rel</a></li></ul>"
     }
     builders {
       name: "win-libfuzzer-asan-rel"
@@ -96795,6 +97444,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-official\">win-official</a></li></ul>"
     }
     builders {
       name: "win-perfetto-rel"
@@ -96885,6 +97535,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-perfetto-rel\">win-perfetto-rel</a></li></ul>"
     }
     builders {
       name: "win-presubmit"
@@ -97066,7 +97717,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel-compilator\">win-rel-compilator</a>."
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64\">Win10 Tests x64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Win x64 Builder\">GPU Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 x64 Release (NVIDIA)\">Win10 x64 Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel-compilator\">win-rel-compilator</a>."
     }
     builders {
       name: "win-rel-cft"
@@ -97157,6 +97808,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-rel-cft\">win-rel-cft</a></li></ul>"
     }
     builders {
       name: "win-rel-compilator"
@@ -97338,6 +97990,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-rust-x64-dbg\">win-rust-x64-dbg</a></li></ul>"
     }
     builders {
       name: "win-rust-x64-rel"
@@ -97428,6 +98081,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-rust-x64-rel\">win-rust-x64-rel</a></li></ul>"
     }
     builders {
       name: "win-siso-rel"
@@ -97522,7 +98176,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder shadows win-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating win-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel-compilator\">win-siso-rel-compilator</a>."
+      description_html: "This builder shadows win-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating win-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64\">Win10 Tests x64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Win x64 Builder\">GPU Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 x64 Release (NVIDIA)\">Win10 x64 Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel-compilator\">win-siso-rel-compilator</a>."
     }
     builders {
       name: "win-siso-rel-compilator"
@@ -97701,6 +98355,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-chromium-x86\">win-swangle-chromium-x86</a></li></ul>"
     }
     builders {
       name: "win-swangle-try-tot-swiftshader-x64"
@@ -97824,6 +98479,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-tot-swiftshader-x64\">win-swangle-tot-swiftshader-x64</a></li></ul>"
     }
     builders {
       name: "win-swangle-try-tot-swiftshader-x86"
@@ -97947,6 +98603,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-tot-swiftshader-x86\">win-swangle-tot-swiftshader-x86</a></li></ul>"
     }
     builders {
       name: "win-swangle-try-x64"
@@ -98034,6 +98691,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-x64\">win-swangle-x64</a></li></ul>"
     }
     builders {
       name: "win-swangle-try-x86"
@@ -98121,6 +98779,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-x86\">win-swangle-x86</a></li></ul>"
     }
     builders {
       name: "win-updater-try-builder-dbg"
@@ -98212,6 +98871,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-updater-builder-dbg\">win-updater-builder-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-updater-tester-dbg\">win10-updater-tester-dbg</a></li></ul>"
     }
     builders {
       name: "win-updater-try-builder-rel"
@@ -98303,6 +98963,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-updater-builder-rel\">win-updater-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-updater-tester-rel\">win10-updater-tester-rel</a></li></ul>"
     }
     builders {
       name: "win10-clang-tidy-rel"
@@ -98476,6 +99137,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-code-coverage\">win10-code-coverage</a></li></ul>"
     }
     builders {
       name: "win10-wpt-content-shell-fyi-rel"
@@ -98566,6 +99228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-wpt-content-shell-fyi-rel\">win10-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "win10.20h2-blink-rel"
@@ -98746,6 +99409,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64\">Win10 Tests x64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Win x64 Builder\">GPU Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 x64 Release (NVIDIA)\">Win10 x64 Release (NVIDIA)</a></li></ul>"
     }
     builders {
       name: "win10_chromium_x64_dbg_ng"
@@ -98836,6 +99500,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder (dbg)\">Win x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64 (dbg)\">Win10 Tests x64 (dbg)</a></li></ul>"
     }
     builders {
       name: "win11-arm64-blink-rel"
@@ -99106,6 +99771,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win11-wpt-content-shell-fyi-rel\">win11-wpt-content-shell-fyi-rel</a></li></ul>"
     }
     builders {
       name: "win11-x64-fyi-rel"
@@ -99197,6 +99863,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win11 Tests x64\">Win11 Tests x64</a></li></ul>"
     }
     builders {
       name: "win32-official"
@@ -99287,6 +99954,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win32-official\">win32-official</a></li></ul>"
     }
     builders {
       name: "win_archive"
@@ -99377,6 +100045,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win32-archive-rel\">win32-archive-rel</a></li></ul>"
     }
     builders {
       name: "win_chromium_compile_dbg_ng"
@@ -99468,6 +100137,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win Builder (dbg)\">Win Builder (dbg)</a></li></ul>"
     }
     builders {
       name: "win_chromium_compile_rel_ng"
@@ -99558,6 +100228,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win Builder\">Win Builder</a></li></ul>"
     }
     builders {
       name: "win_chromium_x64_rel_ng"
@@ -99648,6 +100319,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li></ul>"
     }
     builders {
       name: "win_optional_gpu_tests_rel"
@@ -99980,6 +100652,7 @@
           use_invocation_timestamp: true
         }
       }
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-archive-rel\">win-archive-rel</a></li></ul>"
     }
   }
   shadow: "try.shadow"
diff --git a/infra/config/lib/builder_config.star b/infra/config/lib/builder_config.star
index a523ba1..08dbfe4 100644
--- a/infra/config/lib/builder_config.star
+++ b/infra/config/lib/builder_config.star
@@ -7,6 +7,7 @@
 load("@stdlib//internal/graph.star", "graph")
 load("@stdlib//internal/luci/common.star", "keys", "kinds", "triggerer")
 load("./args.star", "args")
+load("./builder_url.star", "linkify_builder")
 load("./nodes.star", "nodes")
 load("./structs.star", "structs")
 load("//project.star", "settings")
@@ -578,6 +579,38 @@
                 ),
             ))
 
+def _get_builder_mirror_description(bucket_name, builder, bc_state):
+    node = _BUILDER_CONFIG.get(bucket_name, builder.name)
+    if not node:
+        return builder.description_html
+    mirrored_builders = bc_state.mirrors(node)
+    mirroring_builders = _get_mirroring_builders(bc_state, node)
+    if not mirrored_builders and not mirroring_builders:
+        return builder.description_html
+    elif mirrored_builders and mirroring_builders:
+        # Need to change the descriptions below if this assertion no
+        # longer holds true.
+        fail("A builder can't both mirror and be mirrored:", builder.name)
+
+    description = builder.description_html
+    if description:
+        description += "<br/>"
+    if mirrored_builders:
+        description += "This builder mirrors the following CI builders:<br/>"
+    else:
+        description += "This builder is mirrored by any of the following try builders:<br/>"
+
+    description += "<ul>"
+    for m in mirrored_builders or mirroring_builders:
+        m_id = _builder_id(m)
+        if (bucket_name, m_id["bucket"]) not in [("try", "ci"), ("ci", "try")]:
+            # Change the descriptions above if this assertion no
+            # longer holds true.
+            fail("{} to {} mirroring is not allowed. Only 'try' can mirror 'ci'.".format(bucket_name, m_id["bucket"]))
+        link = linkify_builder(m_id["bucket"], m_id["builder"])
+        description += "<li>%s</li>" % link
+    return description + "</ul>"
+
 def _set_builder_config_property(ctx):
     cfg = None
     for f in ctx.output:
@@ -681,6 +714,8 @@
             )
             builder.properties = json.encode(builder_properties)
 
+            builder.description_html = _get_builder_mirror_description(bucket_name, builder, bc_state)
+
 lucicfg.generator(_set_builder_config_property)
 
 # Capture the details of working with the graph in methods that use caching so
diff --git a/infra/config/lib/builder_url.star b/infra/config/lib/builder_url.star
index b80c91e..0f39856 100644
--- a/infra/config/lib/builder_url.star
+++ b/infra/config/lib/builder_url.star
@@ -13,3 +13,10 @@
         builder,
     )
     return url
+
+def linkify_builder(bucket, builder, project = None):
+    """Returns an HTML link to a builder compatible with Milo-descriptions."""
+    return "<a href=\"{}\">{}</a>".format(
+        builder_url(bucket, builder, project),
+        builder,
+    )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 136a226..d56fc51 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -100,8 +100,6 @@
     name = "android-12-x64-rel-compilator",
     branch_selector = branches.selector.ANDROID_BRANCHES,
     main_list_view = "try",
-    # TODO: b/297443583 - Enable remote typescript on production.
-    siso_configs = ["builder", "local_typescript"],
     siso_enabled = True,
 )
 
@@ -504,6 +502,7 @@
     branch_selector = branches.selector.ANDROID_BRANCHES,
     cores = 64 if settings.is_main else 32,
     main_list_view = "try",
+    siso_enabled = True,
 )
 
 try_.builder(
diff --git a/internal b/internal
index daac40a..79116fa 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit daac40a8c36b8511e43db0ede65732c6b67d1ad2
+Subproject commit 79116fa67c8a1a0806af034eb2a9a7a3557607c0
diff --git a/ios/chrome/browser/ui/autofill/autofill_app_interface.h b/ios/chrome/browser/ui/autofill/autofill_app_interface.h
index 9270e07..b147273 100644
--- a/ios/chrome/browser/ui/autofill/autofill_app_interface.h
+++ b/ios/chrome/browser/ui/autofill/autofill_app_interface.h
@@ -97,6 +97,11 @@
 // Sets the risk data for payments.
 + (void)setPaymentsRiskData:(NSString*)riskData;
 
+// Make it that we consider the credit card form to be a secure in the current
+// context. This will allow us to fill the textfields on the web page. We only
+// want to use this for tests.
++ (void)considerCreditCardFormSecureForTesting;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/autofill/autofill_app_interface.mm b/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
index 3a729be9..3395b53 100644
--- a/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
+++ b/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
@@ -427,7 +427,7 @@
 + (NSString*)saveMaskedCreditCard {
   autofill::PersonalDataManager* personalDataManager =
       [self personalDataManager];
-  autofill::CreditCard card = autofill::test::GetMaskedServerCard();
+  autofill::CreditCard card = autofill::test::GetMaskedServerCardWithCvc();
   DCHECK(card.record_type() != autofill::CreditCard::RecordType::kLocalCard);
 
   personalDataManager->AddServerCreditCardForTest(
@@ -472,6 +472,17 @@
       ->SetPaymentsRiskData(base::SysNSStringToUTF8(riskData));
 }
 
++ (void)considerCreditCardFormSecureForTesting {
+  web::WebState* web_state = chrome_test_util::GetCurrentWebState();
+  web::WebFramesManager* frames_manager =
+      autofill::AutofillJavaScriptFeature::GetInstance()->GetWebFramesManager(
+          web_state);
+  web::WebFrame* main_frame = frames_manager->GetMainWebFrame();
+  autofill::AutofillDriverIOS::FromWebStateAndWebFrame(web_state, main_frame)
+      ->GetAutofillManager()
+      .SetConsiderFormAsSecureForTesting(true);
+}
+
 + (NSString*)paymentsRiskData {
   return ios::provider::GetRiskData();
 }
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
index a5ac01f..87fa807 100644
--- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
@@ -29,6 +29,9 @@
 
 const char kCreditCardUrl[] = "/credit_card.html";
 const char kFormCardName[] = "CCName";
+const char kFormCardNumber[] = "CCNo";
+const char kFormCardExpirationMonth[] = "CCExpiresMonth";
+const char kFormCardExpirationYear[] = "CCExpiresYear";
 
 using base::test::ios::kWaitForActionTimeout;
 
@@ -125,6 +128,48 @@
   // Loads simple page. It is on localhost so it is considered a secure context.
   [ChromeEarlGrey loadURL:self.testServer->GetURL(kCreditCardUrl)];
   [ChromeEarlGrey waitForWebStateContainingText:"Autofill Test"];
+
+  // Localhost is not considered secure, therefore form security needs to be
+  // overridden for the tests to work. This will allow us to fill the textfields
+  // on the web page.
+  [AutofillAppInterface considerCreditCardFormSecureForTesting];
+}
+
+// Verify credit card infos are filled.
+- (void)verifyCreditCardInfosHaveBeenFilled:(autofill::CreditCard)card {
+  std::string locale = l10n_util::GetLocaleOverride();
+
+  // Credit card name.
+  NSString* name = base::SysUTF16ToNSString(
+      card.GetInfo(autofill::CREDIT_CARD_NAME_FULL, locale));
+  NSString* condition = [NSString
+      stringWithFormat:@"window.document.getElementById('%s').value === '%@'",
+                       kFormCardName, name];
+  [ChromeEarlGrey waitForJavaScriptCondition:condition];
+
+  // Credit card number.
+  NSString* number = base::SysUTF16ToNSString(
+      card.GetInfo(autofill::CREDIT_CARD_NUMBER, locale));
+  condition = [NSString
+      stringWithFormat:@"window.document.getElementById('%s').value === '%@'",
+                       kFormCardNumber, number];
+  [ChromeEarlGrey waitForJavaScriptCondition:condition];
+
+  // Credit card expiration month.
+  NSString* expMonth = base::SysUTF16ToNSString(
+      card.GetInfo(autofill::CREDIT_CARD_EXP_MONTH, locale));
+  condition = [NSString
+      stringWithFormat:@"window.document.getElementById('%s').value === '%@'",
+                       kFormCardExpirationMonth, expMonth];
+  [ChromeEarlGrey waitForJavaScriptCondition:condition];
+
+  // Credit card expiration year.
+  NSString* expYear = base::SysUTF16ToNSString(
+      card.GetInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, locale));
+  condition = [NSString
+      stringWithFormat:@"window.document.getElementById('%s').value === '%@'",
+                       kFormCardExpirationYear, expYear];
+  [ChromeEarlGrey waitForJavaScriptCondition:condition];
 }
 
 #pragma mark - Tests
@@ -141,7 +186,18 @@
 
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:continueButton];
 
+  // Verify that the credit card is visible to the user.
+  [[EarlGrey selectElementWithMatcher:grey_text(_lastDigits)]
+      assertWithMatcher:grey_notNil()];
+
+  // Make sure the user is seeing 1 card on the bottom sheet.
+  GREYAssertEqual(1, [AutofillAppInterface localCreditCount],
+                  @"Wrong number of stored credit cards.");
+
   [[EarlGrey selectElementWithMatcher:continueButton] performAction:grey_tap()];
+
+  // Verify that the page is filled properly.
+  [self verifyCreditCardInfosHaveBeenFilled:autofill::test::GetCreditCard()];
 }
 
 // Tests that the Payments Bottom Sheet updates its contents when a new credit
@@ -167,11 +223,30 @@
   id<GREYMatcher> localCreditCardEntry = grey_text(_lastDigits);
   [ChromeEarlGrey waitForUIElementToAppearWithMatcher:localCreditCardEntry];
 
+  // Make sure the user is seeing 2 cards on the bottom sheet.
+  GREYAssertEqual(2, [AutofillAppInterface localCreditCount],
+                  @"Wrong number of stored credit cards.");
+
   // Select and use the new credit card.
   [[EarlGrey selectElementWithMatcher:serverCreditCardEntry]
       performAction:grey_tap()];
 
+  // Verify that the accessory view (checkmark) is visible.
+  id<GREYMatcher> accessoryView = grey_allOf(
+      grey_kindOfClassName(@"UIImageView"),
+      grey_ancestor(grey_kindOfClassName(@"_UITableCellAccessoryButton")),
+      grey_sufficientlyVisible(), nil);
+  [[EarlGrey selectElementWithMatcher:accessoryView]
+      assertWithMatcher:grey_notNil()];
+
   [[EarlGrey selectElementWithMatcher:continueButton] performAction:grey_tap()];
+
+  // Verify the CVC requester is visible.
+  [[EarlGrey selectElementWithMatcher:grey_text(@"Confirm Card")]
+      assertWithMatcher:grey_notNil()];
+
+  // TODO(crbug.com/845472): Figure out a way to enter CVC and get the unlocked
+  // card result.
 }
 
 // Tests that accessing a long press menu does not disable the bottom sheet.
@@ -385,4 +460,22 @@
       assertWithMatcher:grey_nil()];
 }
 
+// Verify that tapping outside the Payments Bottom Sheet opens the keyboard.
+- (void)testTapOutsideThePaymentsBottomSheetShowsKeyboard {
+  [self loadPaymentsPage];
+
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
+      performAction:chrome_test_util::TapWebElementWithId(kFormCardName)];
+
+  id<GREYMatcher> continueButton = ContinueButton();
+
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:continueButton];
+
+  // Dismiss the bottom sheet by tapping outside.
+  [[EarlGrey selectElementWithMatcher:grey_keyWindow()]
+      performAction:grey_tap()];
+
+  WaitForKeyboardToAppear();
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn
index acba48aa..aa12b881 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn
@@ -42,6 +42,7 @@
     "//ios/chrome/browser/ui/settings/password:features",
     "//ios/chrome/browser/ui/settings/password:password_ui",
     "//ios/chrome/browser/ui/settings/password/passwords_in_other_apps",
+    "//ios/chrome/browser/ui/settings/password/reauthentication",
     "//ios/chrome/browser/ui/settings/utils",
     "//ios/chrome/common/ui/reauthentication",
     "//ui/base",
@@ -94,18 +95,31 @@
 
 source_set("unit_tests") {
   testonly = true
-  sources = [ "password_settings_mediator_unittest.mm" ]
+  sources = [
+    "password_settings_coordinator_unittest.mm",
+    "password_settings_mediator_unittest.mm",
+  ]
   deps = [
+    ":common",
     ":password_settings",
+    ":password_settings_ui",
     "//base/test:test_support",
     "//components/password_manager/core/browser:test_support",
     "//components/password_manager/core/common:features",
     "//components/signin/public/identity_manager/objc",
     "//ios/chrome/browser/passwords:store_factory",
+    "//ios/chrome/browser/shared/coordinator/scene:scene_state_browser_agent",
+    "//ios/chrome/browser/shared/coordinator/scene:scene_state_header",
+    "//ios/chrome/browser/shared/model/browser/test:test_support",
     "//ios/chrome/browser/shared/model/browser_state:test_support",
+    "//ios/chrome/browser/shared/public/commands",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/sync",
+    "//ios/chrome/browser/ui/settings/password:features",
+    "//ios/chrome/browser/ui/settings/password/reauthentication:reauthentication_ui",
     "//ios/chrome/common/ui/reauthentication",
+    "//ios/chrome/test:test_support",
+    "//ios/chrome/test/app:test_support",
     "//ios/web/public/test",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h
index 5c598f31..c24eccf2de 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h
+++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h
@@ -15,6 +15,14 @@
 // Delegate.
 @property(nonatomic, weak) id<PasswordSettingsCoordinatorDelegate> delegate;
 
+// Whether Local Authentication should be skipped when the coordinator is
+// started. Defaults to NO. Authentication should be required when starting the
+// coordinator unless it was already required by the starting coordinator or
+// another ancestor higher in the ancestor chain. This property is most likely
+// used only by coordinators for other password manager subpages as the password
+// manager requires authentication upon entry.
+@property(nonatomic) BOOL skipAuthenticationOnStart;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SETTINGS_PASSWORD_SETTINGS_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm
index e69914a..a7d4c3c 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm
@@ -6,6 +6,7 @@
 
 #import <UIKit/UIKit.h>
 
+#import "base/debug/dump_without_crashing.h"
 #import "base/i18n/message_formatter.h"
 #import "base/metrics/user_metrics.h"
 #import "base/strings/sys_string_conversions.h"
@@ -37,6 +38,7 @@
 #import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.h"
 #import "ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.h"
 #import "ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_coordinator.h"
+#import "ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_coordinator.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
 #import "ios/chrome/browser/ui/settings/utils/password_utils.h"
 #import "ios/chrome/browser/ui/settings/utils/settings_utils.h"
@@ -47,6 +49,8 @@
 #import "ui/base/l10n/l10n_util.h"
 #import "ui/base/l10n/l10n_util_mac.h"
 
+using password_manager::features::IsAuthOnEntryV2Enabled;
+
 namespace {
 
 // The user action for when the bulk move passwords to account confirmation
@@ -110,6 +114,7 @@
     PasswordSettingsPresentationDelegate,
     PasswordsInOtherAppsCoordinatorDelegate,
     PopoverLabelViewControllerDelegate,
+    ReauthenticationCoordinatorDelegate,
     SettingsNavigationControllerDelegate> {
   // Service which gives us a view on users' saved passwords.
   std::unique_ptr<password_manager::SavedPasswordsPresenter>
@@ -142,6 +147,12 @@
 @property(nonatomic, strong)
     PasswordsInOtherAppsCoordinator* passwordsInOtherAppsCoordinator;
 
+// Coordinator for blocking Password Settings until Local Authentication is
+// passed. Used for requiring authentication when opening Password Settings
+// from outside the Password Manager and when the app is
+// backgrounded/foregrounded with Password Settings opened.
+@property(nonatomic, strong) ReauthenticationCoordinator* reauthCoordinator;
+
 @end
 
 @implementation PasswordSettingsCoordinator
@@ -188,10 +199,15 @@
   self.mediator.consumer = self.passwordSettingsViewController;
   self.passwordSettingsViewController.delegate = self.mediator;
 
+  // Don't animate presentation when content will be covered for authentication.
+  // Otherwise content can be visible during the animation phase.
   [self.baseViewController
       presentViewController:self.settingsNavigationController
-                   animated:YES
+                   animated:_skipAuthenticationOnStart ||
+                            !IsAuthOnEntryV2Enabled()
                  completion:nil];
+
+  [self startReauthCoordinatorWithAuthOnStart:!_skipAuthenticationOnStart];
 }
 
 - (void)stop {
@@ -221,6 +237,8 @@
   self.mediator.consumer = nil;
   self.mediator = nil;
   _savedPasswordsPresenter.reset();
+
+  [self stopReauthenticationCoordinator];
 }
 
 #pragma mark - PasswordSettingsPresentationDelegate
@@ -289,6 +307,7 @@
 
 - (void)showPasswordsInOtherAppsScreen {
   DCHECK(!self.passwordsInOtherAppsCoordinator);
+  [self stopReauthCoordinatorBeforeStartingChildCoordinator];
   self.passwordsInOtherAppsCoordinator =
       [[PasswordsInOtherAppsCoordinator alloc]
           initWithBaseNavigationController:self.settingsNavigationController
@@ -324,7 +343,7 @@
     (NSString*)message {
   // No need to auth if AuthOnEntryV2 is enabled, since user is presumed to have
   // just recently authed.
-  if (password_manager::features::IsAuthOnEntryV2Enabled()) {
+  if (IsAuthOnEntryV2Enabled()) {
     [self.mediator userDidStartBulkMoveLocalPasswordsToAccountFlow];
     return;
   }
@@ -495,7 +514,7 @@
                                          IDS_IOS_EXPORT_PASSWORDS_CANCEL_BUTTON)
                                style:UIAlertActionStyleCancel
                              handler:^(UIAlertAction*) {
-                               [weakSelf.mediator userDidCancelExportFlow];
+                               [weakSelf.mediator exportFlowCanceled];
                              }];
   [_preparingPasswordsAlert addAction:cancelAction];
   [self.passwordSettingsViewController
@@ -524,6 +543,7 @@
   [self.passwordsInOtherAppsCoordinator stop];
   self.passwordsInOtherAppsCoordinator.delegate = nil;
   self.passwordsInOtherAppsCoordinator = nil;
+  [self restartReauthCoordinator];
 }
 
 #pragma mark - SettingsNavigationControllerDelegate
@@ -557,6 +577,22 @@
                             SnackbarCommands);
 }
 
+#pragma mark - ReauthenticationCoordinatorDelegate
+
+- (void)successfulReauthenticationWithCoordinator:
+    (ReauthenticationCoordinator*)coordinator {
+  // No-op.
+}
+
+- (void)willPushReauthenticationViewController {
+  // Cancel password export flow before authentication UI is presented.
+  if (_preparingPasswordsAlert.beingPresented) {
+    [_preparingPasswordsAlert dismissViewControllerAnimated:NO completion:nil];
+    [self.mediator exportFlowCanceled];
+    _preparingPasswordsAlert = nil;
+  }
+}
+
 #pragma mark - Private
 
 // Helper to show the "set passcode" dialog with customizable content.
@@ -609,4 +645,66 @@
   }
 }
 
+// Starts reauthCoordinator.
+// - authOnStart: Pass `YES` to cover Password Settings with an empty view
+// controller until successful Local Authentication when reauthCoordinator
+// starts.
+//
+// Local authentication is required every time the current
+// scene is backgrounded and foregrounded until reauthCoordinator is stopped.
+- (void)startReauthCoordinatorWithAuthOnStart:(BOOL)authOnStart {
+  // No-op if Auth on Entry is not enabled for the password manager.
+  if (!IsAuthOnEntryV2Enabled()) {
+    return;
+  }
+
+  if (_reauthCoordinator) {
+    // The previous reauth coordinator should have been stopped and deallocated
+    // by now. Create a crash report without crashing and gracefully handle the
+    // error by cleaning up the old coordinator.
+    base::debug::DumpWithoutCrashing();
+    [_reauthCoordinator stopAndPopViewController];
+  }
+
+  _reauthCoordinator = [[ReauthenticationCoordinator alloc]
+      initWithBaseNavigationController:_settingsNavigationController
+                               browser:self.browser
+                reauthenticationModule:_reauthModule
+                           authOnStart:authOnStart];
+
+  _reauthCoordinator.delegate = self;
+
+  [_reauthCoordinator start];
+}
+
+// Stops reauthCoordinator.
+- (void)stopReauthenticationCoordinator {
+  [_reauthCoordinator stop];
+  _reauthCoordinator.delegate = nil;
+  _reauthCoordinator = nil;
+}
+
+// Stop reauth coordinator when a child coordinator will be started.
+//
+// Needed so reauth coordinator doesn't block for reauth if the scene state
+// changes while the child coordinator is presenting its content. The child
+// coordinator will add its own reauth coordinator to block its content for
+// reauth.
+- (void)stopReauthCoordinatorBeforeStartingChildCoordinator {
+  // See PasswordsCoordinator
+  // stopReauthCoordinatorBeforeStartingChildCoordinator.
+  [_reauthCoordinator stopAndPopViewController];
+  _reauthCoordinator.delegate = nil;
+  _reauthCoordinator = nil;
+}
+
+// Starts reauthCoordinator after a child coordinator content was dismissed.
+- (void)restartReauthCoordinator {
+  // Restart reauth coordinator so it monitors scene state changes and requests
+  // local authentication after the scene goes to the background.
+  if (IsAuthOnEntryV2Enabled()) {
+    [self startReauthCoordinatorWithAuthOnStart:NO];
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator_unittest.mm
new file mode 100644
index 0000000..e592dfb9
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator_unittest.mm
@@ -0,0 +1,155 @@
+// 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.
+
+#import <UIKit/UIKit.h>
+
+#import "base/apple/foundation_util.h"
+#import "base/test/bind.h"
+#import "base/test/ios/wait_util.h"
+#import "base/test/scoped_feature_list.h"
+#import "components/password_manager/core/browser/password_manager_test_utils.h"
+#import "components/password_manager/core/browser/test_password_store.h"
+#import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
+#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h"
+#import "ios/chrome/browser/shared/coordinator/scene/scene_state_browser_agent.h"
+#import "ios/chrome/browser/shared/model/browser/test/test_browser.h"
+#import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/shared/public/commands/application_commands.h"
+#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
+#import "ios/chrome/browser/ui/settings/password/password_manager_ui_features.h"
+#import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h"
+#import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.h"
+#import "ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.h"
+#import "ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.h"
+#import "ios/chrome/test/app/mock_reauthentication_module.h"
+#import "ios/chrome/test/scoped_key_window.h"
+#import "ios/web/public/test/web_task_environment.h"
+#import "testing/gtest/include/gtest/gtest.h"
+#import "testing/platform_test.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#import "third_party/ocmock/gtest_support.h"
+
+namespace password_manager {
+
+// Test fixture for PasswordSettingsCoordinator.
+class PasswordSettingsCoordinatorTest : public PlatformTest {
+ protected:
+  void SetUp() override {
+    PlatformTest::SetUp();
+
+    scoped_feature_list_.InitAndEnableFeature(
+        password_manager::features::kIOSPasswordAuthOnEntryV2);
+
+    TestChromeBrowserState::Builder builder;
+    // Add test password store. Used by the mediator.
+    builder.AddTestingFactory(
+        IOSChromePasswordStoreFactory::GetInstance(),
+        base::BindRepeating(
+            &password_manager::BuildPasswordStore<
+                web::BrowserState, password_manager::TestPasswordStore>));
+
+    browser_state_ = builder.Build();
+    browser_ = std::make_unique<TestBrowser>(browser_state_.get());
+
+    // Mock ApplicationCommands. Since ApplicationCommands conforms to
+    // ApplicationSettingsCommands, it must be mocked as well.
+    mocked_application_commands_handler_ =
+        OCMStrictProtocolMock(@protocol(ApplicationCommands));
+    [browser_->GetCommandDispatcher()
+        startDispatchingToTarget:mocked_application_commands_handler_
+                     forProtocol:@protocol(ApplicationCommands)];
+    id mocked_application_settings_command_handler =
+        OCMProtocolMock(@protocol(ApplicationSettingsCommands));
+    [browser_->GetCommandDispatcher()
+        startDispatchingToTarget:mocked_application_settings_command_handler
+                     forProtocol:@protocol(ApplicationSettingsCommands)];
+
+    mock_reauth_module_ = [[MockReauthenticationModule alloc] init];
+    // Delay auth result so auth doesn't pass right after starting coordinator.
+    // Needed for verifying behavior when auth is required.
+    mock_reauth_module_.shouldReturnSynchronously = NO;
+    mock_reauth_module_.expectedResult = ReauthenticationResult::kSuccess;
+    // Make coordinator use mock reauth module.
+    scoped_reauth_override_ =
+        ScopedPasswordSettingsReauthModuleOverride::MakeAndArmForTesting(
+            mock_reauth_module_);
+
+    root_view_controller_ = [[UIViewController alloc] init];
+    scoped_window_.Get().rootViewController = root_view_controller_;
+
+    coordinator_ = [[PasswordSettingsCoordinator alloc]
+        initWithBaseViewController:root_view_controller_
+                           browser:browser_.get()];
+
+    // Create scene state for reauthentication coordinator.
+    scene_state_ = [[SceneState alloc] initWithAppState:nil];
+    scene_state_.activationLevel = SceneActivationLevelForegroundActive;
+    SceneStateBrowserAgent::CreateForBrowser(browser_.get(), scene_state_);
+  }
+
+  void TearDown() override {
+    [coordinator_ stop];
+    PlatformTest::TearDown();
+  }
+
+  // Starts the coordinator.
+  //  - skip_auth_on_start: Whether to skip local authentication when the
+  //  coordinator is started.
+  void StartCoordinatorSkippingAuth(BOOL skip_auth_on_start) {
+    coordinator_.skipAuthenticationOnStart = skip_auth_on_start;
+
+    [coordinator_ start];
+
+    // Wait for presentation animation of the coordinator's view controller.
+    base::test::ios::SpinRunLoopWithMaxDelay(
+        base::test::ios::kWaitForUIElementTimeout);
+  }
+
+  // Whether PasswordSettingsViewController was pushed in the
+  // navigation controller.
+  bool IsPasswordSettingsPresented() {
+    UINavigationController* navigation_controller =
+        base::apple::ObjCCastStrict<UINavigationController>(
+            root_view_controller_.presentedViewController);
+
+    return [navigation_controller.topViewController
+        isKindOfClass:[PasswordSettingsViewController class]];
+  }
+
+  web::WebTaskEnvironment task_environment_;
+  std::unique_ptr<ChromeBrowserState> browser_state_;
+  std::unique_ptr<TestBrowser> browser_;
+  SceneState* scene_state_;
+  UIViewController* root_view_controller_;
+  ScopedKeyWindow scoped_window_;
+  MockReauthenticationModule* mock_reauth_module_ = nil;
+  std::unique_ptr<ScopedPasswordSettingsReauthModuleOverride>
+      scoped_reauth_override_;
+  base::test::ScopedFeatureList scoped_feature_list_;
+  id mocked_application_commands_handler_;
+  PasswordSettingsCoordinator* coordinator_ = nil;
+};
+
+// Tests that Password Settings is presented without authentication required.
+TEST_F(PasswordSettingsCoordinatorTest, PasswordSettingsPresentedWithoutAuth) {
+  StartCoordinatorSkippingAuth(/*skip_auth_on_start=*/YES);
+
+  ASSERT_TRUE(IsPasswordSettingsPresented());
+}
+
+// Tests that Password Settings is presented only after passing authentication
+TEST_F(PasswordSettingsCoordinatorTest, PasswordSettingsPresentedWithAuth) {
+  StartCoordinatorSkippingAuth(/*skip_auth_on_start=*/NO);
+
+  // Password Settings should be covered until auth is passed.
+  ASSERT_FALSE(IsPasswordSettingsPresented());
+
+  [mock_reauth_module_ returnMockedReathenticationResult];
+
+  // Successful auth should leave Password Settings visible.
+  ASSERT_TRUE(IsPasswordSettingsPresented());
+}
+
+}  // namespace password_manager
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h
index 22f9b3a..70c79049 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h
+++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h
@@ -58,8 +58,10 @@
 // Indicates that the user completed the export flow.
 - (void)userDidCompleteExportFlow;
 
-// Indicates that the user canceled the export flow while it was processing.
-- (void)userDidCancelExportFlow;
+// Indicates that the export flow was canceled while it was processing.
+// The export flow can be canceled by the user or when reauthentication is
+// required due to the app going to the background.
+- (void)exportFlowCanceled;
 
 // Detaches observers.
 - (void)disconnect;
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
index bf9360ab..a0e6d362 100644
--- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
@@ -224,7 +224,7 @@
   [self.passwordExporter resetExportState];
 }
 
-- (void)userDidCancelExportFlow {
+- (void)exportFlowCanceled {
   [self.passwordExporter cancelExport];
 }
 
diff --git a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
index 0bc9497d..5adca18 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
@@ -398,6 +398,8 @@
       initWithBaseViewController:self.viewController
                          browser:self.browser];
   self.passwordSettingsCoordinator.delegate = self;
+  // No auth required as Passwords Coordinator already is auth protected.
+  self.passwordSettingsCoordinator.skipAuthenticationOnStart = YES;
 
   base::RecordAction(base::UserMetricsAction("PasswordManager_OpenSettings"));
   [self.passwordSettingsCoordinator start];
diff --git a/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm b/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm
index a4a5465..c78a4c1 100644
--- a/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm
@@ -29,6 +29,10 @@
     _reauthModule = reauthenticationModule;
     _reauthUponPresentation = reauthUponPresentation;
     self.navigationItem.hidesBackButton = YES;
+
+    // This view does not support large titles as it uses a custom title view.
+    self.navigationItem.largeTitleDisplayMode =
+        UINavigationItemLargeTitleDisplayModeNever;
   }
 
   return self;
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn
index 93cf87a3..6f6ba6a4 100644
--- a/media/audio/BUILD.gn
+++ b/media/audio/BUILD.gn
@@ -191,14 +191,23 @@
     sources += [
       "mac/audio_device_listener_mac.cc",
       "mac/audio_device_listener_mac.h",
+      "mac/audio_loopback_input_mac.h",
+      "mac/audio_loopback_input_mac_impl.h",
+      "mac/audio_loopback_input_mac_impl.mm",
       "mac/audio_low_latency_input_mac.cc",
       "mac/audio_low_latency_input_mac.h",
       "mac/audio_manager_mac.cc",
       "mac/audio_manager_mac.h",
       "mac/coreaudio_dispatch_override.cc",
       "mac/coreaudio_dispatch_override.h",
+      "mac/screen_capture_kit_swizzler.h",
+      "mac/screen_capture_kit_swizzler.mm",
     ]
-    frameworks += [ "AudioUnit.framework" ]
+    frameworks += [
+      "AudioUnit.framework",
+      "CoreMedia.framework",
+    ]
+    weak_frameworks = [ "ScreenCaptureKit.framework" ]  # macOS 13.0
   }
 
   if (is_ios) {
@@ -468,9 +477,13 @@
   if (is_mac) {
     sources += [
       "mac/audio_device_listener_mac_unittest.cc",
+      "mac/audio_loopback_input_mac_unittest.mm",
       "mac/audio_low_latency_input_mac_unittest.cc",
       "mac/audio_manager_mac_unittest.cc",
     ]
+    deps += [ "//third_party/ocmock" ]
+    frameworks = [ "CoreMedia.framework" ]
+    weak_frameworks = [ "ScreenCaptureKit.framework" ]  # macOS 13.0
   }
 
   if (is_chromeos_ash || is_castos || is_cast_android) {
diff --git a/media/audio/mac/DEPS b/media/audio/mac/DEPS
new file mode 100644
index 0000000..3c7dec4
--- /dev/null
+++ b/media/audio/mac/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+    "+third_party/ocmock"
+]
\ No newline at end of file
diff --git a/media/audio/mac/audio_loopback_input_mac.h b/media/audio/mac/audio_loopback_input_mac.h
new file mode 100644
index 0000000..8c7ab34
--- /dev/null
+++ b/media/audio/mac/audio_loopback_input_mac.h
@@ -0,0 +1,29 @@
+// 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 MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_H_
+#define MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_H_
+
+#include "media/audio/mac/audio_manager_mac.h"
+#include "media/base/audio_parameters.h"
+
+namespace media {
+
+// ScreenCaptureKit uses the default sample rate of 48kHz.
+static constexpr uint32_t kLoopbackSampleRate = 48000;
+
+// Documentation for the AudioInputStream implementation in
+// audio_loopback_input_mac.h.
+// Returns a nullptr if the API is unavailable.
+// Supported sample rates: 8000Hz, 16000Hz, 24000Hz, 48000Hz.
+// Supported channel layouts: mono, stereo.
+AudioInputStream* CreateSCKAudioInputStream(
+    const AudioParameters& params,
+    const std::string& device_id,
+    AudioManager::LogCallback log_callback,
+    const base::RepeatingCallback<void(AudioInputStream*)> close_callback);
+
+}  // namespace media
+
+#endif  // MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_H_
diff --git a/media/audio/mac/audio_loopback_input_mac_impl.h b/media/audio/mac/audio_loopback_input_mac_impl.h
new file mode 100644
index 0000000..db44d72
--- /dev/null
+++ b/media/audio/mac/audio_loopback_input_mac_impl.h
@@ -0,0 +1,156 @@
+// 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 MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_
+#define MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_
+
+#include <string>
+
+#include "base/apple/scoped_cftyperef.h"
+#include "base/memory/raw_ptr.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "media/audio/agc_audio_stream.h"
+#include "media/audio/audio_io.h"
+#include "media/audio/mac/audio_manager_mac.h"
+#include "media/base/audio_parameters.h"
+
+@class NSError;
+@class SCContentFilter;
+@class ScreenCaptureKitAudioHelper;
+@class SCShareableContent;
+@class SCStream;
+@class SCStreamConfiguration;
+@protocol SCStreamDelegate;
+using CMSampleBufferRef = struct opaqueCMSampleBuffer*;
+
+namespace media {
+
+class SharedHelper;
+
+// Implementation of AudioInputStream using the ScreenCaptureKit (SCK) API for
+// macOS 13.0 and later, intended solely for system audio loopback capture.
+//
+// Overview of operation:
+// - An instance of SCKAudioInputStream is created by AudioManagerMac.
+// - Open() is called, prompting enumeration of available shareable content. The
+//   function synchronously waits for the content to be enumerated and sets up
+//   the stream with the created filter.
+// - Start(sink) is called, causing the stream to start delivering samples.
+// - Audio samples are being received by OnStreamSample() and forwarded to the
+//   sink.
+// - Stop() is called, causing the stream to stop.
+// - Close() is called, causing the stream output to be removed and the stream
+//   to be destroyed.
+//
+// API notes:
+// - ScreenCaptureKit requires TCC screen capture permissions, which are granted
+//   to the browser process and inherited by the audio service. For the
+//   inheritance to work correctly, Chromium must be code signed.
+// - The audio service sandbox requires +[SCStreamManager
+//   requestUserPermissionForScreenCapture] to be swizzled so that it reports
+//   that permissions have been granted. This is currently done in
+//   AudioManagerMac.
+class MEDIA_EXPORT API_AVAILABLE(macos(13.0)) SCKAudioInputStream
+    : public AgcAudioStream<AudioInputStream> {
+  using NotifyOnCloseCallback =
+      base::RepeatingCallback<void(AudioInputStream*)>;
+  using StartSCStreamMockingCallback =
+      base::RepeatingCallback<void(SCStream*,
+                                   SCContentFilter*,
+                                   SCStreamConfiguration*,
+                                   id<SCStreamDelegate>)>;
+
+ public:
+  SCKAudioInputStream(const AudioParameters& params,
+                      const std::string& device_id,
+                      const AudioManager::LogCallback log_callback,
+                      const NotifyOnCloseCallback close_callback);
+  SCKAudioInputStream(
+      const AudioParameters& params,
+      const std::string& device_id,
+      const AudioManager::LogCallback log_callback,
+      const NotifyOnCloseCallback close_callback,
+      const StartSCStreamMockingCallback start_scstream_mocking_callback,
+      const base::TimeDelta shareable_content_timeout);
+
+  SCKAudioInputStream(const SCKAudioInputStream&) = delete;
+  SCKAudioInputStream(SCKAudioInputStream&&) = delete;
+  SCKAudioInputStream(const SCKAudioInputStream&&) = delete;
+  SCKAudioInputStream& operator=(const SCKAudioInputStream&) = delete;
+  SCKAudioInputStream& operator=(SCKAudioInputStream&&) = delete;
+  SCKAudioInputStream& operator=(const SCKAudioInputStream&&) = delete;
+
+  ~SCKAudioInputStream() override;
+
+  // AudioInputStream:: implementation.
+  AudioInputStream::OpenOutcome Open() override;
+  void Start(AudioInputCallback* callback) override;
+  void Stop() override;
+  void Close() override;
+  double GetMaxVolume() override;
+  void SetVolume(double volume) override;
+  double GetVolume() override;
+  bool IsMuted() override;
+  void SetOutputDeviceForAec(const std::string& output_device_id) override;
+
+ private:
+  // Processes the audio data received from the system. Runs on a SCK thread.
+  void OnStreamSample(
+      base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer,
+      const double volume);
+
+  // Invoked when an error occurs while starting or running the stream. Runs on
+  // a SCK thread.
+  void OnStreamError();
+
+  // Send log messages to the stream creator.
+  void SendLogMessage(const char* format, ...);
+
+  // Audio parameters passed to the constructor.
+  const AudioParameters params_;
+
+  // One of AudioDeviceDescription::kLoopback*.
+  const std::string device_id_;
+
+  // Wraps the non-interleaved audio buffer received from the system.
+  const std::unique_ptr<AudioBus> audio_bus_;
+
+  // Receives the processed audio data and errors. Must not be modified while
+  // |shared_helper_| has callbacks set.
+  raw_ptr<AudioInputCallback> sink_;
+
+  // Callback to send log messages to the client.
+  AudioManager::LogCallback log_callback_;
+
+  // Called when the stream is closed and can be safely deleted.
+  const NotifyOnCloseCallback close_callback_;
+
+  // Used by tests to get notified of a new SCStream creation.
+  StartSCStreamMockingCallback start_scstream_mocking_callback_;
+
+  // Refcounted helper which helps us sync operation between browser and SCK
+  // threads.
+  scoped_refptr<SharedHelper> shared_helper_;
+
+  // Stream output and delegate registered with the API to receive and handle
+  // samples and errors.
+  ScreenCaptureKitAudioHelper* __strong sck_helper_;
+
+  // The stream object created by the API.
+  SCStream* __strong stream_;
+
+  // Serial queue used by the API for new samples.
+  dispatch_queue_t __strong queue_;
+
+  // The length of time covered by the audio data in a single audio buffer.
+  const base::TimeDelta buffer_frames_duration_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace media
+
+#endif  // MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_
diff --git a/media/audio/mac/audio_loopback_input_mac_impl.mm b/media/audio/mac/audio_loopback_input_mac_impl.mm
new file mode 100644
index 0000000..283c010
--- /dev/null
+++ b/media/audio/mac/audio_loopback_input_mac_impl.mm
@@ -0,0 +1,564 @@
+// 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 "media/audio/mac/audio_loopback_input_mac_impl.h"
+
+#import <ScreenCaptureKit/ScreenCaptureKit.h>
+
+#include "base/functional/bind.h"
+#include "base/functional/callback.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/synchronization/lock.h"
+#include "base/synchronization/waitable_event.h"
+#include "media/audio/mac/audio_loopback_input_mac.h"
+#include "media/base/audio_timestamp_helper.h"
+
+using SampleCallback = base::RepeatingCallback<
+    void(base::apple::ScopedCFTypeRef<CMSampleBufferRef>, const double)>;
+using ErrorCallback = base::RepeatingCallback<void()>;
+
+namespace media {
+
+constexpr float kMaxVolume = 1.0;
+
+// Used for synchronized data access between SCKAudioInputStream and
+// ScreenCaptureKitAudioHelper. In case callbacks from ScreenCaptureKit are
+// invoked after the client no longer wants to receive data, or
+// SCKAudioInputStream has already been destroyed, this reference counted class
+// outlives both objects and helps prevent use-after-free situations.
+class API_AVAILABLE(macos(13.0)) SharedHelper
+    : public base::RefCountedThreadSafe<SharedHelper> {
+ public:
+  SharedHelper(const base::TimeDelta shareable_content_timeout)
+      : volume_(kMaxVolume),
+        shareable_content_timeout_(shareable_content_timeout) {}
+  SharedHelper(SharedHelper&) = delete;
+  SharedHelper(SharedHelper&&) = delete;
+  SharedHelper& operator=(SharedHelper&) = delete;
+  SharedHelper& operator=(SharedHelper&&) = delete;
+
+  // Set the sample and error callback to be invoked by the helper.
+  void SetStreamCallbacks(SampleCallback sample_callback,
+                          ErrorCallback error_callback) {
+    base::AutoLock auto_lock(lock_);
+    sample_callback_ = std::move(sample_callback);
+    error_callback_ = std::move(error_callback);
+  }
+
+  // Reset the sample and error callbacks, resulting in no more samples being
+  // delivered.
+  void ResetStreamCallbacks() {
+    base::AutoLock auto_lock(lock_);
+    sample_callback_.Reset();
+    error_callback_.Reset();
+  }
+
+  void SetVolume(float volume) {
+    base::AutoLock auto_lock(lock_);
+    volume_ = volume;
+  }
+
+  float GetVolume() {
+    base::AutoLock auto_lock(lock_);
+    return volume_;
+  }
+
+  // Invokes the sample callback, if one is set.
+  void OnStreamSample(
+      base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer) {
+    base::AutoTryLock auto_try_lock(lock_);
+    if (auto_try_lock.is_acquired() && !sample_callback_.is_null()) {
+      // |volume_| is passed in as a parameter, as it is guarded by |lock_|,
+      // which also protects the callbacks and is already acquired.
+      sample_callback_.Run(sample_buffer, volume_);
+    }
+  }
+
+  // Logs the error and reports it via the error callback, if one is set.
+  void OnStreamError(NSError* error) {
+    if (!error) {
+      return;
+    }
+
+    LOG(ERROR) << "Stream error: "
+               << base::SysNSStringToUTF8([error localizedDescription]);
+
+    base::UmaHistogramSparse("Media.Audio.Capture.SCK.StreamError",
+                             [error code]);
+
+    base::AutoTryLock auto_try_lock(lock_);
+    if (auto_try_lock.is_acquired() && !error_callback_.is_null()) {
+      error_callback_.Run();
+    }
+  }
+
+  // Synchronously retrieves a stream filter.
+  AudioInputStream::OpenOutcome GetContentFilter(SCContentFilter** filter) {
+    // We want to avoid any deadlocks due to issues with ScreenCaptureKit. Thus,
+    // we use a WaitableEvent with a timeout.
+    const auto data = base::MakeRefCounted<ShareableContentData>();
+    [SCShareableContent getShareableContentWithCompletionHandler:^(
+                            SCShareableContent* content, NSError* error) {
+      // |data| is captured by value, so the reference count increases.
+      OnShareableContentCreated(data, content, error);
+      data->event.Signal();
+    }];
+
+    base::TimeTicks enumeration_start = base::TimeTicks::Now();
+    // Wait for shareable content to be enumerated.
+    const bool timed_out = !data->event.TimedWait(shareable_content_timeout_);
+    base::TimeDelta enumeration_time =
+        base::TimeTicks::Now() - enumeration_start;
+
+    base::UmaHistogramBoolean(
+        "Media.Audio.Capture.SCK.ContentEnumerationTimedOut", timed_out);
+
+    if (timed_out) {
+      LOG(ERROR) << "Shareable content enumeration timed out.";
+      return AudioInputStream::OpenOutcome::kFailed;
+    } else {
+      base::UmaHistogramTimes(
+          "Media.Audio.Capture.SCK.ContentEnumerationTimeMs", enumeration_time);
+    }
+
+    if (data->open_outcome == AudioInputStream::OpenOutcome::kSuccess) {
+      *filter = data->filter;
+    }
+
+    return data->open_outcome;
+  }
+
+ private:
+  friend class base::RefCountedThreadSafe<SharedHelper>;
+
+  class ShareableContentData
+      : public base::RefCountedThreadSafe<ShareableContentData> {
+   public:
+    // Event used to signal completion of shareable content enumeration.
+    base::WaitableEvent event;
+
+    // Outcome of shareable content enumeration.
+    AudioInputStream::OpenOutcome open_outcome =
+        AudioInputStream::OpenOutcome::kFailed;
+
+    // Filter to be generated based on the enumerated shareable content.
+    SCContentFilter* filter{nil};
+
+   private:
+    friend class base::RefCountedThreadSafe<ShareableContentData>;
+    ~ShareableContentData() = default;
+  };
+
+  ~SharedHelper() = default;
+
+  // Invoked when shareable content (displays, applications, windows) has been
+  // enumerated. Generates a filter based on the available content. Runs on a
+  // SCK thread.
+  static void OnShareableContentCreated(
+      scoped_refptr<ShareableContentData> data,
+      SCShareableContent* content,
+      NSError* error) {
+    CHECK(data);
+
+    data->open_outcome = AudioInputStream::OpenOutcome::kFailed;
+    if (error) {
+      if ([error code] == SCStreamErrorUserDeclined) {
+        data->open_outcome =
+            AudioInputStream::OpenOutcome::kFailedSystemPermissions;
+      }
+      return;
+    }
+
+    CHECK(content);
+
+    if ([[content displays] count] == 0) {
+      VLOG(1) << "No displays found.";
+      return;
+    }
+
+    // Capturing any display will capture the entire system's audio.
+    SCDisplay* display = [[content displays] firstObject];
+
+    VLOG(1) << "Capturing display with ID " << [display displayID]
+            << " and resolution " << [display width] << "x" << [display height];
+
+    data->filter = [[SCContentFilter alloc] initWithDisplay:display
+                                           excludingWindows:@[]];
+
+    data->open_outcome = AudioInputStream::OpenOutcome::kSuccess;
+  }
+
+  // Lock must be used when accessing the callbacks.
+  base::Lock lock_;
+
+  // Callbacks registered by SCKAudioInputStream and invoked by
+  // ScreenCaptureKitAudioHelper.
+  SampleCallback sample_callback_ GUARDED_BY(lock_);
+  ErrorCallback error_callback_ GUARDED_BY(lock_);
+
+  // Current volume.
+  double volume_ GUARDED_BY(lock_);
+
+  // Timeout for shareable content enumeration.
+  const base::TimeDelta shareable_content_timeout_;
+};
+
+}  // namespace media
+
+API_AVAILABLE(macos(13.0))
+@interface ScreenCaptureKitAudioHelper
+    : NSObject <SCStreamDelegate, SCStreamOutput> {
+  scoped_refptr<media::SharedHelper> _sharedHelper;
+}
+
+- (instancetype)initWithSharedHelper:
+    (scoped_refptr<media::SharedHelper>)sharedHelper;
+- (void)stream:(SCStream*)stream didStopWithError:(NSError*)error;
+- (void)stream:(SCStream*)stream
+    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
+                   ofType:(SCStreamOutputType)type;
+
+@end
+
+@implementation ScreenCaptureKitAudioHelper
+
+- (instancetype)initWithSharedHelper:
+    (scoped_refptr<media::SharedHelper>)sharedHelper {
+  self = [super init];
+  if (self) {
+    _sharedHelper = sharedHelper;
+  }
+
+  return self;
+}
+
+- (void)stream:(SCStream*)stream didStopWithError:(NSError*)error {
+  _sharedHelper->OnStreamError(error);
+}
+
+- (void)stream:(SCStream*)stream
+    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
+                   ofType:(SCStreamOutputType)type {
+  if (type != SCStreamOutputTypeAudio || !sampleBuffer) {
+    return;
+  }
+
+  _sharedHelper->OnStreamSample(base::apple::ScopedCFTypeRef<CMSampleBufferRef>(
+      sampleBuffer, base::scoped_policy::RETAIN));
+}
+
+@end
+
+namespace media {
+
+SCKAudioInputStream::SCKAudioInputStream(
+    const AudioParameters& params,
+    const std::string& device_id,
+    const AudioManager::LogCallback log_callback,
+    const NotifyOnCloseCallback close_callback)
+    : SCKAudioInputStream(params,
+                          device_id,
+                          std::move(log_callback),
+                          std::move(close_callback),
+                          StartSCStreamMockingCallback(),
+                          base::Seconds(5)) {}
+
+SCKAudioInputStream::SCKAudioInputStream(
+    const AudioParameters& params,
+    const std::string& device_id,
+    const AudioManager::LogCallback log_callback,
+    const NotifyOnCloseCallback close_callback,
+    StartSCStreamMockingCallback start_scstream_mocking_callback,
+    base::TimeDelta shareable_content_timeout)
+    : params_(params),
+      device_id_(device_id),
+      audio_bus_(AudioBus::CreateWrapper(params.channels())),
+      sink_(nullptr),
+      log_callback_(std::move(log_callback)),
+      close_callback_(std::move(close_callback)),
+      start_scstream_mocking_callback_(start_scstream_mocking_callback),
+      shared_helper_(
+          base::MakeRefCounted<SharedHelper>(shareable_content_timeout)),
+      sck_helper_([[ScreenCaptureKitAudioHelper alloc]
+          initWithSharedHelper:shared_helper_]),
+      buffer_frames_duration_(
+          AudioTimestampHelper::FramesToTime(params_.frames_per_buffer(),
+                                             params_.sample_rate())) {
+  CHECK(AudioDeviceDescription::IsLoopbackDevice(device_id_));
+  CHECK(!log_callback_.is_null());
+  // TODO(crbug.com/1480224): Update getDisplayMedia to handle sample rate
+  // constraints
+  // ScreenCaptureKit supports only certain sample rates:
+  // https://developer.apple.com/documentation/screencapturekit/scstreamconfiguration/3931903-samplerate
+  CHECK(params_.sample_rate() == 48000 || params_.sample_rate() == 24000 ||
+        params_.sample_rate() == 16000 || params_.sample_rate() == 8000);
+  // Only mono and stereo audio is supported:
+  // https://developer.apple.com/documentation/screencapturekit/scstreamconfiguration/3931901-channelcount
+  CHECK(params_.channels() == 1 || params_.channels() == 2);
+
+  // We need a wrapper because we set the channel data to point directly into
+  // the sample buffer.
+  audio_bus_->set_frames(params_.frames_per_buffer());
+}
+
+SCKAudioInputStream::~SCKAudioInputStream() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+}
+
+AudioInputStream::OpenOutcome SCKAudioInputStream::Open() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (stream_) {
+    return OpenOutcome::kAlreadyOpen;
+  }
+
+  SCContentFilter* filter = nil;
+  OpenOutcome open_outcome = shared_helper_->GetContentFilter(&filter);
+
+  if (open_outcome != OpenOutcome::kSuccess) {
+    if (open_outcome == OpenOutcome::kFailedSystemPermissions) {
+      SendLogMessage("%s => Missing screen capture permissions.", __func__);
+    } else {
+      SendLogMessage("%s => Failed to retrieve shareable content.", __func__);
+    }
+
+    return open_outcome;
+  }
+
+  // All settings related to video capture must remain at their default values,
+  // otherwise a video sample stream output must also be added.
+  SCStreamConfiguration* config = [[SCStreamConfiguration alloc] init];
+  [config setCapturesAudio:YES];
+  [config setSampleRate:params_.sample_rate()];
+  [config setChannelCount:params_.channels()];
+  if (device_id_ == AudioDeviceDescription::kLoopbackWithoutChromeId) {
+    // Excludes audio from all browser subprocesses outputting audio through
+    // the audio service.
+    [config setExcludesCurrentProcessAudio:YES];
+  }
+
+  stream_ = [[SCStream alloc] initWithFilter:filter
+                               configuration:config
+                                    delegate:sck_helper_];
+
+  // Notifies the test so that it can start mocking the new SCStream object.
+  if (!start_scstream_mocking_callback_.is_null()) {
+    start_scstream_mocking_callback_.Run(stream_, filter, config, sck_helper_);
+  }
+
+  // |queue_| is used internally by the API to store |config.queueDepth| number
+  // of frames (default is 3).
+  queue_ = dispatch_queue_create("org.chromium.SCKAudioInputStream",
+                                 DISPATCH_QUEUE_SERIAL);
+
+  NSError* add_stream_output_error = nil;
+  const bool stream_output_added =
+      [stream_ addStreamOutput:sck_helper_
+                          type:SCStreamOutputTypeAudio
+            sampleHandlerQueue:queue_
+                         error:&add_stream_output_error];
+  if (!stream_output_added) {
+    SendLogMessage(
+        "%s => Failed to add stream output: %s", __func__,
+        base::SysNSStringToUTF8([add_stream_output_error localizedDescription])
+            .c_str());
+    stream_ = nil;
+    queue_ = nil;
+    return OpenOutcome::kFailed;
+  }
+
+  return OpenOutcome::kSuccess;
+}
+
+void SCKAudioInputStream::Start(AudioInputCallback* callback) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(callback);
+
+  // Don't do anything if the stream isn't open and ignore any consecutive
+  // Start() calls.
+  if (!stream_ || sink_) {
+    return;
+  }
+
+  sink_ = callback;
+
+  // Sample and error callbacks are set and reset by SCKAudioInputStream when
+  // starting and stopping the stream, respectively. Thus, |this| will always be
+  // valid if the callback is not null.
+  shared_helper_->SetStreamCallbacks(
+      base::BindRepeating(&SCKAudioInputStream::OnStreamSample,
+                          base::Unretained(this)),
+      base::BindRepeating(&SCKAudioInputStream::OnStreamError,
+                          base::Unretained(this)));
+
+  [stream_ startCaptureWithCompletionHandler:^(NSError* error) {
+    if (!error) {
+      return;
+    }
+
+    shared_helper_->OnStreamError(error);
+  }];
+}
+
+void SCKAudioInputStream::Close() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  CHECK(!sink_);
+
+  // It is valid to call Close() before calling Open().
+  if (stream_) {
+    NSError* error = nil;
+    bool stream_output_removed =
+        [stream_ removeStreamOutput:sck_helper_
+                               type:SCStreamOutputTypeAudio
+                              error:&error];
+    if (!stream_output_removed) {
+      SendLogMessage(
+          "%s => Failed to remove stream output: %s", __func__,
+          base::SysNSStringToUTF8([error localizedDescription]).c_str());
+    }
+  }
+
+  // Notify the owner that the stream can be deleted.
+  close_callback_.Run(this);
+}
+
+void SCKAudioInputStream::Stop() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  // Reset the callbacks since the client is asking to stop the stream and
+  // does not want to receive any more samples and errors. This must be done
+  // before setting |sink_| to null, to avoid a race.
+  shared_helper_->ResetStreamCallbacks();
+
+  if (!sink_) {
+    return;
+  }
+
+  // An attempt to stop an already stopped stream (due to an error) will
+  // simply result in an error, which can be ignored.
+  [stream_ stopCaptureWithCompletionHandler:^(NSError* error) {
+    if (!error) {
+      return;
+    }
+
+    LOG(ERROR) << "Error while stopping the stream: "
+               << base::SysNSStringToUTF8([error localizedDescription]);
+  }];
+
+  sink_ = nullptr;
+}
+
+double SCKAudioInputStream::GetMaxVolume() {
+  return kMaxVolume;
+}
+
+void SCKAudioInputStream::SetVolume(double volume) {
+  CHECK_GE(volume, 0.0);
+  CHECK_LE(volume, kMaxVolume);
+  shared_helper_->SetVolume(volume);
+}
+
+double SCKAudioInputStream::GetVolume() {
+  return shared_helper_->GetVolume();
+}
+
+bool SCKAudioInputStream::IsMuted() {
+  return GetVolume() == 0.0;
+}
+
+void SCKAudioInputStream::SetOutputDeviceForAec(
+    const std::string& output_device_id) {
+  return;
+}
+
+void SCKAudioInputStream::OnStreamSample(
+    base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer,
+    const double volume) {
+  const CMBlockBufferRef block_buffer =
+      CMSampleBufferGetDataBuffer(sample_buffer);
+  if (!block_buffer) {
+    VLOG(1) << "Sample buffer is empty.";
+    return;
+  }
+
+  char* buffer = nullptr;
+  if (CMBlockBufferGetDataPointer(block_buffer, 0, nullptr, nullptr, &buffer) !=
+      kCMBlockBufferNoErr) {
+    VLOG(1) << "Cannot access block buffer data.";
+    return;
+  }
+
+  const CMTime time_stamp =
+      CMSampleBufferGetPresentationTimeStamp(sample_buffer);
+  const CMFormatDescriptionRef format_description =
+      CMSampleBufferGetFormatDescription(sample_buffer);
+  const AudioStreamBasicDescription* audio_description =
+      CMAudioFormatDescriptionGetStreamBasicDescription(format_description);
+
+  CHECK(static_cast<int>(audio_description->mChannelsPerFrame) ==
+            params_.channels() &&
+        audio_description->mSampleRate == params_.sample_rate());
+  CHECK_EQ(audio_description->mBytesPerFrame, sizeof(float))
+      << "Expected non-interleaved data.";
+
+  const size_t total_frame_count = CMSampleBufferGetNumSamples(sample_buffer);
+
+  base::TimeTicks capture_time;
+  capture_time += base::Seconds(CMTimeGetSeconds(time_stamp));
+
+  // |sample_buffer| can deliver more frames than specified in |params_|, but
+  // the amount should always be a multiple of the one specified.
+  CHECK(total_frame_count % params_.frames_per_buffer() == 0);
+
+  for (size_t frames_delivered = 0; frames_delivered < total_frame_count;
+       frames_delivered += params_.frames_per_buffer()) {
+    // Data in |buffer| is non-interleaved and immutable. Since we don't copy
+    // the audio data, we must retain a reference to |sample_buffer| until
+    // |audio_bus_| is no longer used.
+    for (int channel = 0; channel < params_.channels(); channel++) {
+      float* channel_data = reinterpret_cast<float*>(buffer) +
+                            channel * total_frame_count + frames_delivered;
+      audio_bus_->SetChannelData(channel, channel_data);
+    }
+
+    // Adjust the volume.
+    audio_bus_->Scale(volume);
+
+    // OnStreamSample() is only called if |shared_helper_| has callbacks set.
+    sink_->OnData(audio_bus_.get(), capture_time, volume, {});
+
+    capture_time += buffer_frames_duration_;
+  }
+}
+
+void SCKAudioInputStream::OnStreamError() {
+  CHECK(sink_);
+  // |sink_| is safe to access, as OnStreamError() is called from
+  // |shared_helper_| with the lock acquired.
+  sink_->OnError();
+}
+
+void SCKAudioInputStream::SendLogMessage(const char* format, ...) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  va_list args;
+  va_start(args, format);
+  log_callback_.Run("SCKAudioInputStream::" + base::StringPrintV(format, args));
+  va_end(args);
+}
+
+AudioInputStream* CreateSCKAudioInputStream(
+    const AudioParameters& params,
+    const std::string& device_id,
+    AudioManager::LogCallback log_callback,
+    const base::RepeatingCallback<void(AudioInputStream*)> close_callback) {
+  if (@available(macOS 13.0, *)) {
+    return new SCKAudioInputStream(params, device_id, std::move(log_callback),
+                                   std::move(close_callback));
+  }
+
+  return nullptr;
+}
+
+}  // namespace media
diff --git a/media/audio/mac/audio_loopback_input_mac_unittest.mm b/media/audio/mac/audio_loopback_input_mac_unittest.mm
new file mode 100644
index 0000000..e071109
--- /dev/null
+++ b/media/audio/mac/audio_loopback_input_mac_unittest.mm
@@ -0,0 +1,562 @@
+// 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 "media/audio/mac/audio_loopback_input_mac.h"
+#include "media/audio/mac/audio_loopback_input_mac_impl.h"
+
+#include <ScreenCaptureKit/ScreenCaptureKit.h>
+
+#include <cstdint>
+#include <vector>
+
+#include "base/apple/scoped_cftyperef.h"
+#include "base/apple/scoped_objc_class_swizzler.h"
+#include "base/functional/callback.h"
+#include "base/logging.h"
+#include "base/run_loop.h"
+#include "base/task/single_thread_task_runner.h"
+#include "base/test/task_environment.h"
+#include "media/audio/audio_io.h"
+#include "media/base/audio_parameters.h"
+#include "media/base/limits.h"
+#include "media/base/mac/audio_latency_mac.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/platform_test.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+#include "ui/gfx/geometry/rect.h"
+
+using ::testing::_;
+
+namespace media {
+
+constexpr int kSampleRate = 48000;
+constexpr int kFramesPerBuffer = 480;
+
+constexpr gfx::Rect kDisplayPrimary(0, 0, 1920, 1080);
+constexpr gfx::Rect kDisplaySecondary(-1920, 10, 1920, 1080);
+
+class SCKAudioInputStreamTest : public PlatformTest {
+ protected:
+  static SCDisplay* API_AVAILABLE(macos(13.0)) CreateSCDisplay(CGRect frame) {
+    id display = OCMClassMock([SCDisplay class]);
+    OCMStub([display frame]).andReturn(frame);
+    return display;
+  }
+
+  // Reports 2 displays when enumerating shareable content.
+  static void API_AVAILABLE(macos(13.0))
+      ShareableContentSuccess(NSInvocation* invocation) {
+    void (^handler)(SCShareableContent* _Nullable, NSError* _Nullable);
+    [invocation getArgument:&handler atIndex:2];
+
+    NSArray* displays = @[
+      CreateSCDisplay(kDisplayPrimary.ToCGRect()),
+      CreateSCDisplay(kDisplaySecondary.ToCGRect())
+    ];
+
+    id content = OCMClassMock([SCShareableContent class]);
+    OCMStub([content displays]).andReturn(displays);
+
+    handler(content, nil);
+  }
+
+  SCKAudioInputStreamTest()
+      : task_environment_(
+            base::test::SingleThreadTaskEnvironment::MainThreadType::UI) {}
+
+  ~SCKAudioInputStreamTest() override = default;
+
+  void API_AVAILABLE(macos(13.0)) SetUp() override {
+    stream_delegates_.clear();
+    playing_stream_count_ = 0;
+  }
+
+  void API_AVAILABLE(macos(13.0))
+      SetUpShareableContentMock(void (^handler)(NSInvocation* invocation)) {
+    shareable_content_mock_ = OCMClassMock([SCShareableContent class]);
+    OCMStub([shareable_content_mock_
+                getShareableContentWithCompletionHandler:[OCMArg any]])
+        .andDo(handler);
+  }
+
+  // Mocks instance methods of an SCStream.
+  API_AVAILABLE(macos(13.0))
+  void StartSCStreamMocking(SCStream* stream,
+                            SCContentFilter* filter,
+                            SCStreamConfiguration* config,
+                            id<SCStreamDelegate> delegate) {
+    if (@available(macOS 13.0, *)) {
+      EXPECT_TRUE(stream);
+      EXPECT_TRUE(filter);
+      EXPECT_TRUE(config);
+      EXPECT_TRUE(delegate);
+
+      stream_delegates_.emplace_back(delegate);
+
+      scstream_mock_ = OCMPartialMock(stream);
+
+      OCMStub([scstream_mock_ addStreamOutput:[OCMArg any]
+                                         type:SCStreamOutputTypeAudio
+                           sampleHandlerQueue:[OCMArg any]
+                                        error:[OCMArg anyObjectRef]])
+          .andDo(^(NSInvocation* invocation) {
+            __unsafe_unretained id<SCStreamOutput> stream_output;
+            [invocation getArgument:&stream_output atIndex:2];
+            stream_outputs_.emplace_back(stream_output);
+          })
+          .andReturn(TRUE);
+
+      OCMStub([scstream_mock_ removeStreamOutput:[OCMArg any]
+                                            type:SCStreamOutputTypeAudio
+                                           error:[OCMArg anyObjectRef]])
+          .andDo(^(NSInvocation* invocation) {
+            __unsafe_unretained id<SCStreamOutput> stream_output;
+            [invocation getArgument:&stream_output atIndex:2];
+            stream_outputs_.erase(
+                std::remove(stream_outputs_.begin(), stream_outputs_.end(),
+                            stream_output),
+                stream_outputs_.end());
+          })
+          .andReturn(TRUE);
+
+      OCMStub([scstream_mock_ startCaptureWithCompletionHandler:[OCMArg any]])
+          .andDo(^(NSInvocation* invocation) {
+            playing_stream_count_++;
+          });
+
+      OCMStub([scstream_mock_ stopCaptureWithCompletionHandler:[OCMArg any]])
+          .andDo(^(NSInvocation* invocation) {
+            playing_stream_count_--;
+          });
+    }
+  }
+
+  // Create an instance of SCKAudioInputStream with default parameters.
+  API_AVAILABLE(macos(13.0))
+  SCKAudioInputStream* CreateAudioInputStream() {
+    const auto params = AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                        ChannelLayoutConfig::Stereo(),
+                                        kSampleRate, kFramesPerBuffer);
+    auto* stream = new SCKAudioInputStream(
+        params, AudioDeviceDescription::kLoopbackInputDeviceId,
+        base::BindRepeating(&SCKAudioInputStreamTest::OnLogMessage,
+                            base::Unretained(this)),
+        base::BindRepeating([](AudioInputStream* stream) { delete stream; }),
+        base::BindRepeating(&SCKAudioInputStreamTest::StartSCStreamMocking,
+                            base::Unretained(this)),
+        base::Milliseconds(100));
+
+    return stream;
+  }
+
+  // Create a CMSampleBuffer from a given stereo audio buffer with default
+  // parameters. `buffer` must outlive the returned CMSampleBufferRef.
+  base::apple::ScopedCFTypeRef<CMSampleBufferRef> CreateStereoAudioSampleBuffer(
+      std::array<float, 2 * kFramesPerBuffer>& buffer) {
+    CMBlockBufferCustomBlockSource custom_block_source{};
+    custom_block_source.FreeBlock = [](void* refcon, void* doomedMemoryBlock,
+                                       size_t sizeInBytes) {
+      // Memory block is allocated and deallocated by the caller, which must
+      // guarantee it outlives `block_buffer`, and should not be freed during
+      // `block_buffer` release.
+    };
+
+    base::apple::ScopedCFTypeRef<CMBlockBufferRef> block_buffer;
+    CMBlockBufferCreateWithMemoryBlock(
+        NULL, buffer.data(), buffer.size() * sizeof(float), NULL,
+        &custom_block_source, 0, buffer.size() * sizeof(float), 0,
+        block_buffer.InitializeInto());
+
+    AudioStreamBasicDescription asbd;
+    asbd.mFormatID = kAudioFormatLinearPCM;
+    asbd.mFormatFlags = 0;  // Raw.
+    asbd.mSampleRate = kSampleRate;
+    asbd.mBitsPerChannel = 8 * sizeof(float);
+    asbd.mBytesPerFrame = sizeof(float);  // Non-interleaved data.
+    asbd.mChannelsPerFrame = 2;           // Stereo.
+    asbd.mBytesPerPacket =
+        2 * kFramesPerBuffer *
+        sizeof(float);  // 2 channels, |kFramesPerBuffer| frames each.
+    asbd.mFramesPerPacket = kFramesPerBuffer;
+
+    base::apple::ScopedCFTypeRef<CMAudioFormatDescriptionRef>
+        format_description;
+    CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &asbd, 0, NULL, 0, NULL,
+                                   NULL, format_description.InitializeInto());
+
+    base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer;
+    CMAudioSampleBufferCreateReadyWithPacketDescriptions(
+        kCFAllocatorDefault, block_buffer, format_description, kFramesPerBuffer,
+        CMTimeMakeWithSeconds(
+            base::TimeTicks::Now().since_origin().InMicrosecondsF(), 1000000),
+        NULL, sample_buffer.InitializeInto());
+
+    return sample_buffer;
+  }
+
+  // Send an audio sample packet to the registered SCStreamOutput.
+  void SendAudioSample(std::array<float, 2 * kFramesPerBuffer> buffer) {
+    if (@available(macOS 13.0, *)) {
+      for (auto& stream_output : stream_outputs_) {
+        EXPECT_TRUE(stream_output);
+
+        // Pass |stream| as a variable to bypass the nullability check as
+        // |stream| is not needed.
+        SCStream* stream = nil;
+        [stream_output stream:stream
+            didOutputSampleBuffer:CreateStereoAudioSampleBuffer(buffer)
+                           ofType:SCStreamOutputTypeAudio];
+      }
+    }
+  }
+
+  // Send an audio sample with dummy data.
+  void SendAudioSample() {
+    // Buffer must be 16-bit aligned.
+    alignas(16) std::array<float, 2 * kFramesPerBuffer> buffer;
+    for (size_t i = 0; i < buffer.size(); i++) {
+      buffer[i] = i;
+    }
+
+    SendAudioSample(buffer);
+  }
+
+  // Send an error to the registered SCStreamDelegate.
+  void SendError() {
+    if (@available(macOS 13.0, *)) {
+      for (auto& stream_delegate : stream_delegates_) {
+        // Pass |stream| as a variable to bypass the nullability check as
+        // |stream| is not needed.
+        SCStream* stream = nil;
+        [stream_delegate
+                      stream:stream
+            didStopWithError:[NSError errorWithDomain:SCStreamErrorDomain
+                                                 code:SCStreamErrorInternalError
+                                             userInfo:nil]];
+      }
+    }
+  }
+
+  // Fake log callback.
+  void OnLogMessage(const std::string& message) {}
+
+  base::test::SingleThreadTaskEnvironment task_environment_;
+
+  // Mock SCShareableContent.
+  id shareable_content_mock_;
+
+  // Mock SCStream.
+  id scstream_mock_;
+
+  // Keep track of open SCStream related objects.
+  // Must be __unsafe_unretained as they come from an NSInvocation.
+  API_AVAILABLE(macos(13.0))
+  std::vector<__unsafe_unretained id<SCStreamDelegate>> stream_delegates_;
+  API_AVAILABLE(macos(13.0))
+  std::vector<__unsafe_unretained id<SCStreamOutput>> stream_outputs_;
+
+  // Number of currently playing streams; incremented on a successful start of
+  // SCK stream and decremented on stop.
+  int playing_stream_count_;
+};
+
+class MockAudioInputCallback : public AudioInputStream::AudioInputCallback {
+ public:
+  MOCK_METHOD4(OnData,
+               void(const AudioBus* src,
+                    base::TimeTicks capture_time,
+                    double volume,
+                    const AudioGlitchInfo& glitch_info));
+  MOCK_METHOD0(OnError, void());
+};
+
+class FakeAudioInputCallback : public AudioInputStream::AudioInputCallback {
+ public:
+  FakeAudioInputCallback() = default;
+
+  FakeAudioInputCallback(const FakeAudioInputCallback&) = delete;
+  FakeAudioInputCallback& operator=(const FakeAudioInputCallback&) = delete;
+
+  void OnData(const AudioBus* src,
+              base::TimeTicks capture_time,
+              double volume,
+              const AudioGlitchInfo& glitch_info) override {
+    EXPECT_GE(capture_time, base::TimeTicks());
+    for (int i = 0; i < src->channels(); i++) {
+      channel_data_.insert(channel_data_.end(), src->channel(i),
+                           src->channel(i) + src->frames());
+    }
+  }
+
+  void OnError() override {}
+
+  std::vector<float> channel_data() const { return channel_data_; }
+
+ private:
+  std::vector<float> channel_data_;
+};
+
+// Test starting a single stream.
+TEST_F(SCKAudioInputStreamTest, StartOneStream) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+    EXPECT_EQ(stream_delegates_.size(), 1u);
+    EXPECT_EQ(stream_outputs_.size(), 1u);
+    EXPECT_EQ(playing_stream_count_, 0);
+
+    MockAudioInputCallback sink;
+    stream->Start(&sink);
+    EXPECT_EQ(playing_stream_count_, 1);
+
+    stream->Stop();
+    EXPECT_EQ(playing_stream_count_, 0);
+
+    stream->Close();
+    EXPECT_TRUE(stream_outputs_.empty());
+
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+// Test opening and starting two streams simultaneously.
+TEST_F(SCKAudioInputStreamTest, StartTwoStreams) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* first_stream = CreateAudioInputStream();
+    SCKAudioInputStream* second_stream = CreateAudioInputStream();
+
+    EXPECT_EQ(first_stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+
+    // For some reason, only the first call to [SCShareableContent
+    // getShareableContentWithCompletionHandler:] is getting mocked. As a
+    // workaround, destroy the existing mock object and create a new one.
+    [shareable_content_mock_ stopMocking];
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    EXPECT_EQ(second_stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+    EXPECT_EQ(stream_delegates_.size(), 2u);
+    EXPECT_EQ(stream_outputs_.size(), 2u);
+
+    MockAudioInputCallback first_sink;
+    MockAudioInputCallback second_sink;
+    first_stream->Start(&first_sink);
+    second_stream->Start(&second_sink);
+
+    EXPECT_EQ(playing_stream_count_, 2);
+
+    first_stream->Stop();
+    second_stream->Stop();
+
+    EXPECT_EQ(playing_stream_count_, 0);
+
+    first_stream->Close();
+    second_stream->Close();
+
+    EXPECT_TRUE(stream_outputs_.empty());
+
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+// Test Start(), Stop(), Start(), Stop().
+TEST_F(SCKAudioInputStreamTest, StreamPausing) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+
+    MockAudioInputCallback sink;
+    stream->Start(&sink);
+    EXPECT_EQ(playing_stream_count_, 1);
+    stream->Stop();
+    EXPECT_EQ(playing_stream_count_, 0);
+    stream->Start(&sink);
+    EXPECT_EQ(playing_stream_count_, 1);
+    stream->Stop();
+    EXPECT_EQ(playing_stream_count_, 0);
+
+    stream->Close();
+    EXPECT_TRUE(stream_outputs_.empty());
+
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+// Test that the stream can only be opened once.
+TEST_F(SCKAudioInputStreamTest, DoubleOpenStart) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kAlreadyOpen);
+
+    MockAudioInputCallback sink;
+    stream->Start(&sink);
+    stream->Start(&sink);
+    EXPECT_EQ(playing_stream_count_, 1);
+
+    stream->Stop();
+    stream->Close();
+    EXPECT_TRUE(stream_outputs_.empty());
+
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+// Test that Open() fails if shareable content enumeration times out.
+TEST_F(SCKAudioInputStreamTest, OpenTimeout) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation){
+        // Don't invoke the handler.
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kFailed);
+    stream->Close();
+
+    EXPECT_TRUE(stream_outputs_.empty());
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+// Test Open() with system screen capture permissions denied.
+TEST_F(SCKAudioInputStreamTest, ScreenCapturePermissionsDenied) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      void (^handler)(SCShareableContent* _Nullable, NSError* _Nullable);
+      [invocation getArgument:&handler atIndex:2];
+
+      // Error reported by the API in case screen capture permissions
+      // haven't been granted.
+      NSError* error = [NSError errorWithDomain:SCStreamErrorDomain
+                                           code:SCStreamErrorUserDeclined
+                                       userInfo:nil];
+      handler(nil, error);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(),
+              AudioInputStream::OpenOutcome::kFailedSystemPermissions);
+    stream->Close();
+
+    EXPECT_TRUE(stream_outputs_.empty());
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+// Test that no samples and errors are received by the callbacks after the
+// stream is stopped.
+TEST_F(SCKAudioInputStreamTest, NoStreamSamplesAfterStop) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+
+    MockAudioInputCallback sink;
+    EXPECT_CALL(sink, OnData(_, _, _, _)).Times(0);
+
+    stream->Start(&sink);
+    stream->Stop();
+    SendAudioSample();
+    stream->Close();
+
+    EXPECT_TRUE(stream_outputs_.empty());
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+TEST_F(SCKAudioInputStreamTest, CaptureSamples) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+
+    FakeAudioInputCallback sink;
+    stream->Start(&sink);
+
+    // Buffer must be 16-bit aligned.
+    alignas(16) std::array<float, 2 * kFramesPerBuffer> buffer;
+    for (size_t i = 0; i < buffer.size(); i++) {
+      buffer[i] = i;
+    }
+
+    SendAudioSample(buffer);
+
+    stream->Stop();
+    stream->Close();
+
+    // Verify sample data matches.
+    EXPECT_EQ(sink.channel_data().size(), buffer.size());
+    for (size_t i = 0; i < buffer.size(); i++) {
+      EXPECT_EQ(sink.channel_data()[i], buffer[i]);
+    }
+
+    EXPECT_TRUE(stream_outputs_.empty());
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+TEST_F(SCKAudioInputStreamTest, ReportErrorToClient) {
+  if (@available(macOS 13.0, *)) {
+    SetUpShareableContentMock(^(NSInvocation* invocation) {
+      ShareableContentSuccess(invocation);
+    });
+
+    SCKAudioInputStream* stream = CreateAudioInputStream();
+
+    EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess);
+
+    MockAudioInputCallback sink;
+    EXPECT_CALL(sink, OnError()).Times(1);
+
+    stream->Start(&sink);
+    SendError();
+    stream->Stop();
+    stream->Close();
+
+    EXPECT_TRUE(stream_outputs_.empty());
+    // Remove dangling references to stream delegates.
+    stream_delegates_.clear();
+  }
+}
+
+}  // namespace media
diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc
index f834373..c97d1ff 100644
--- a/media/audio/mac/audio_manager_mac.cc
+++ b/media/audio/mac/audio_manager_mac.cc
@@ -27,10 +27,12 @@
 #include "media/audio/audio_device_description.h"
 #include "media/audio/mac/audio_auhal_mac.h"
 #include "media/audio/mac/audio_input_mac.h"
+#include "media/audio/mac/audio_loopback_input_mac.h"
 #include "media/audio/mac/audio_low_latency_input_mac.h"
 #include "media/audio/mac/core_audio_util_mac.h"
 #include "media/audio/mac/coreaudio_dispatch_override.h"
 #include "media/audio/mac/scoped_audio_unit.h"
+#include "media/audio/mac/screen_capture_kit_swizzler.h"
 #include "media/base/audio_parameters.h"
 #include "media/base/audio_timestamp_helper.h"
 #include "media/base/channel_layout.h"
@@ -103,14 +105,13 @@
       kAudioObjectPropertyElementMain   // mElement
   };
   UInt32 output_device_id_size = static_cast<UInt32>(sizeof(output_device_id));
-  OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject,
-                                            &property_address,
-                                            0,     // inQualifierDataSize
-                                            NULL,  // inQualifierData
-                                            &output_device_id_size,
-                                            &output_device_id);
+  OSStatus err =
+      AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address,
+                                 0,     // inQualifierDataSize
+                                 NULL,  // inQualifierData
+                                 &output_device_id_size, &output_device_id);
   return err == kAudioHardwareNoError &&
-      output_device_id != kAudioObjectUnknown;
+         output_device_id != kAudioObjectUnknown;
 }
 
 static std::string GetAudioDeviceNameFromDeviceId(AudioDeviceID device_id,
@@ -142,23 +143,27 @@
         (is_input ? core_audio_mac::IsInputDevice(device_id)
                   : core_audio_mac::IsOutputDevice(device_id));
 
-    if (!is_valid_for_direction)
+    if (!is_valid_for_direction) {
       continue;
+    }
 
     absl::optional<std::string> unique_id =
         core_audio_mac::GetDeviceUniqueID(device_id);
-    if (!unique_id)
+    if (!unique_id) {
       continue;
+    }
 
     absl::optional<std::string> label =
         core_audio_mac::GetDeviceLabel(device_id, is_input);
-    if (!label)
+    if (!label) {
       continue;
+    }
 
     // Filter out aggregate devices, e.g. those that get created by using
     // kAudioUnitSubType_VoiceProcessingIO.
-    if (core_audio_mac::IsPrivateAggregateDevice(device_id))
+    if (core_audio_mac::IsPrivateAggregateDevice(device_id)) {
       continue;
+    }
 
     device_names->emplace_back(std::move(*label), std::move(*unique_id));
   }
@@ -184,16 +189,13 @@
 
   if (AudioDeviceDescription::IsDefaultDevice(device_id)) {
     // Default Device.
-    property_address.mSelector = is_input ?
-        kAudioHardwarePropertyDefaultInputDevice :
-        kAudioHardwarePropertyDefaultOutputDevice;
+    property_address.mSelector =
+        is_input ? kAudioHardwarePropertyDefaultInputDevice
+                 : kAudioHardwarePropertyDefaultOutputDevice;
 
-    result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
-                                        &property_address,
-                                        0,
-                                        0,
-                                        &device_size,
-                                        &audio_device_id);
+    result =
+        AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address,
+                                   0, 0, &device_size, &audio_device_id);
   } else {
     // Non-default device.
     base::apple::ScopedCFTypeRef<CFStringRef> uid(
@@ -206,17 +208,14 @@
     UInt32 translation_size = sizeof(AudioValueTranslation);
 
     property_address.mSelector = kAudioHardwarePropertyDeviceForUID;
-    result = AudioObjectGetPropertyData(kAudioObjectSystemObject,
-                                        &property_address,
-                                        0,
-                                        0,
-                                        &translation_size,
-                                        &value);
+    result =
+        AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address,
+                                   0, 0, &translation_size, &value);
   }
 
   if (result) {
-    OSSTATUS_DLOG(WARNING, result) << "Unable to query device " << device_id
-                                   << " for AudioDeviceID";
+    OSSTATUS_DLOG(WARNING, result)
+        << "Unable to query device " << device_id << " for AudioDeviceID";
   }
 
   return audio_device_id;
@@ -264,23 +263,26 @@
 
   UInt32 size;
   OSStatus result = AudioObjectGetPropertyDataSize(device, &pa, 0, 0, &size);
-  if (result != noErr || !size)
+  if (result != noErr || !size) {
     return false;
+  }
 
   std::unique_ptr<uint8_t[]> list_storage(new uint8_t[size]);
   AudioBufferList* buffer_list =
       reinterpret_cast<AudioBufferList*>(list_storage.get());
 
   result = AudioObjectGetPropertyData(device, &pa, 0, 0, &size, buffer_list);
-  if (result != noErr)
+  if (result != noErr) {
     return false;
+  }
 
   // Determine number of channels based on the AudioBufferList.
   // |mNumberBuffers] is the  number of interleaved channels in the buffer.
   // If the number is 1, the buffer is noninterleaved.
   *channels = 0;
-  for (UInt32 i = 0; i < buffer_list->mNumberBuffers; ++i)
+  for (UInt32 i = 0; i < buffer_list->mNumberBuffers; ++i) {
     *channels += buffer_list->mBuffers[i].mNumberChannels;
+  }
 
   DVLOG(1) << __FUNCTION__
            << (scope == kAudioDevicePropertyScopeInput ? " Input" : " Output")
@@ -324,8 +326,9 @@
   // input element, or confirm that we can't.
   if (element == AUElement::INPUT) {
     ScopedAudioUnit au(device, element);
-    if (!au.is_valid())
+    if (!au.is_valid()) {
       return false;
+    }
 
     if (!GetAudioUnitStreamFormatChannelCount(au.audio_unit(), element,
                                               channels)) {
@@ -356,8 +359,9 @@
   }
 
   ScopedAudioUnit au(device, element);
-  if (!au.is_valid())
+  if (!au.is_valid()) {
     return false;
+  }
 
   return GetDeviceChannels(au.audio_unit(), element, channels);
 }
@@ -435,8 +439,9 @@
     *channels = 0;
     for (UInt32 i = 0; i < layout->mNumberChannelDescriptions; ++i) {
       if (layout->mChannelDescriptions[i].mChannelLabel !=
-          kAudioChannelLabel_Unknown)
+          kAudioChannelLabel_Unknown) {
         (*channels)++;
+      }
     }
   }
 
@@ -453,8 +458,9 @@
     // The PowerMonitor requires significant setup (a CFRunLoop and preallocated
     // IO ports) so it's not available under unit tests.  See the OSX impl of
     // base::PowerMonitorDeviceSource for more details.
-    if (!is_monitoring_)
+    if (!is_monitoring_) {
       return;
+    }
     base::PowerMonitor::AddPowerSuspendObserver(this);
   }
 
@@ -463,8 +469,9 @@
 
   ~AudioPowerObserver() override {
     DCHECK(thread_checker_.CalledOnValidThread());
-    if (!is_monitoring_)
+    if (!is_monitoring_) {
       return;
+    }
     base::PowerMonitor::RemovePowerSuspendObserver(this);
   }
 
@@ -647,12 +654,9 @@
   static const AudioObjectPropertyAddress kNominalSampleRateAddress = {
       kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal,
       kAudioObjectPropertyElementMain};
-  OSStatus result = AudioObjectGetPropertyData(device_id,
-                                               &kNominalSampleRateAddress,
-                                               0,
-                                               0,
-                                               &info_size,
-                                               &nominal_sample_rate);
+  OSStatus result =
+      AudioObjectGetPropertyData(device_id, &kNominalSampleRateAddress, 0, 0,
+                                 &info_size, &nominal_sample_rate);
   if (result != noErr) {
     OSSTATUS_DLOG(WARNING, result)
         << "Could not get default sample rate for device: " << device_id;
@@ -666,8 +670,9 @@
 int AudioManagerMac::HardwareSampleRate() {
   // Determine the default output device's sample-rate.
   AudioDeviceID device_id = kAudioObjectUnknown;
-  if (!GetDefaultOutputDevice(&device_id))
+  if (!GetDefaultOutputDevice(&device_id)) {
     return kFallbackSampleRate;
+  }
 
   return HardwareSampleRateForDevice(device_id);
 }
@@ -687,6 +692,12 @@
 AudioParameters AudioManagerMac::GetInputStreamParameters(
     const std::string& device_id) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
+  if (AudioDeviceDescription::IsLoopbackDevice(device_id)) {
+    return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                           ChannelLayoutConfig::Stereo(), kLoopbackSampleRate,
+                           ChooseBufferSize(true, kLoopbackSampleRate));
+  }
+
   AudioDeviceID device = GetAudioDeviceIdByUId(true, device_id);
   if (device == kAudioObjectUnknown) {
     DLOG(ERROR) << "Invalid device " << device_id;
@@ -705,8 +716,9 @@
   }
 
   int sample_rate = HardwareSampleRateForDevice(device);
-  if (!sample_rate)
+  if (!sample_rate) {
     sample_rate = kFallbackSampleRate;
+  }
 
   // Due to the sharing of the input and output buffer sizes, we need to choose
   // the input buffer size based on the output sample rate.  See
@@ -744,8 +756,9 @@
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
   AudioObjectID input_device_id =
       GetAudioDeviceIdByUId(true, input_device_unique_id);
-  if (input_device_id == kAudioObjectUnknown)
+  if (input_device_id == kAudioObjectUnknown) {
     return std::string();
+  }
 
   std::vector<AudioObjectID> related_device_ids =
       GetRelatedDeviceIDs(input_device_id);
@@ -754,8 +767,9 @@
   // GetRelatedDeviceIDs().
   base::flat_set<AudioObjectID> related_output_device_ids;
   for (AudioObjectID device_id : related_device_ids) {
-    if (core_audio_mac::GetNumStreams(device_id, false /* is_input */) > 0)
+    if (core_audio_mac::GetNumStreams(device_id, false /* is_input */) > 0) {
       related_output_device_ids.insert(device_id);
+    }
   }
 
   // Return the device ID if there is only one associated device.
@@ -765,8 +779,9 @@
   if (related_output_device_ids.size() == 1) {
     absl::optional<std::string> related_unique_id =
         GetDeviceUniqueID(*related_output_device_ids.begin());
-    if (related_unique_id)
+    if (related_unique_id) {
       return std::move(*related_unique_id);
+    }
   }
 
   return std::string();
@@ -819,8 +834,9 @@
   // listener.
   if (device_listener_first_init) {
     // Only set the current output device for the default device.
-    if (AudioDeviceDescription::IsDefaultDevice(device_id))
+    if (AudioDeviceDescription::IsDefaultDevice(device_id)) {
       current_output_device_ = device;
+    }
     // Just use the current sample rate since we don't allow non-native sample
     // rates on OSX.
     current_sample_rate_ = params.sample_rate();
@@ -844,22 +860,20 @@
 std::string AudioManagerMac::GetDefaultDeviceID(bool is_input) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
   AudioDeviceID device_id = kAudioObjectUnknown;
-  if (!GetDefaultDevice(&device_id, is_input))
+  if (!GetDefaultDevice(&device_id, is_input)) {
     return std::string();
+  }
 
   const AudioObjectPropertyAddress property_address = {
       kAudioDevicePropertyDeviceUID, kAudioObjectPropertyScopeGlobal,
       kAudioObjectPropertyElementMain};
   CFStringRef device_uid = NULL;
   UInt32 size = sizeof(device_uid);
-  OSStatus status = AudioObjectGetPropertyData(device_id,
-                                               &property_address,
-                                               0,
-                                               NULL,
-                                               &size,
-                                               &device_uid);
-  if (status != kAudioHardwareNoError || !device_uid)
+  OSStatus status = AudioObjectGetPropertyData(device_id, &property_address, 0,
+                                               NULL, &size, &device_uid);
+  if (status != kAudioHardwareNoError || !device_uid) {
     return std::string();
+  }
 
   std::string ret(base::SysCFStringRefToUTF8(device_uid));
   CFRelease(device_uid);
@@ -884,6 +898,16 @@
     const LogCallback& log_callback) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
   DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format());
+
+  if (AudioDeviceDescription::IsLoopbackDevice(device_id)) {
+    screen_capture_kit_swizzler_ = SwizzleScreenCaptureKit();
+
+    return CreateSCKAudioInputStream(
+        params, device_id, log_callback,
+        base::BindRepeating(&AudioManagerBase::ReleaseInputStream,
+                            base::Unretained(this)));
+  }
+
   // Gets the AudioDeviceID that refers to the AudioInputDevice with the device
   // unique id. This AudioDeviceID is used to set the device for Audio Unit.
   AudioDeviceID audio_device_id = GetAudioDeviceIdByUId(true, device_id);
@@ -942,8 +966,9 @@
   }
 
   int hardware_channels;
-  if (!GetDeviceChannels(device, AUElement::OUTPUT, &hardware_channels))
+  if (!GetDeviceChannels(device, AUElement::OUTPUT, &hardware_channels)) {
     hardware_channels = 2;
+  }
 
   // Use the input channel count and channel layout if possible.  Let OSX take
   // care of remapping the channels; this lets user specified channel layouts
@@ -953,8 +978,9 @@
   if (!has_valid_input_params || output_channels > hardware_channels) {
     output_channels = hardware_channels;
     channel_layout = GuessChannelLayout(output_channels);
-    if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED)
+    if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) {
       channel_layout = CHANNEL_LAYOUT_DISCRETE;
+    }
   }
 
   AudioParameters params(
@@ -1092,8 +1118,9 @@
   // stream can't handle buffer size larger than its requested buffer size.
   // See http://crbug.com/428706 for a reason why.
 
-  if (buffer_size == desired_buffer_size)
+  if (buffer_size == desired_buffer_size) {
     return true;
+  }
 
   if (desired_buffer_size > buffer_size) {
     // Do NOT set the buffer size if there is another output stream using
@@ -1135,10 +1162,11 @@
   DVLOG(1) << __FUNCTION__ << " valid IO buffer size range: [" << minimum
            << ", " << maximum << "]";
   buffer_size = desired_buffer_size;
-  if (buffer_size < minimum)
+  if (buffer_size < minimum) {
     buffer_size = minimum;
-  else if (buffer_size > maximum)
+  } else if (buffer_size > maximum) {
     buffer_size = maximum;
+  }
   DVLOG(1) << "validated desired buffer size: " << buffer_size;
 
   // Set new (and valid) I/O buffer size for the specified device. The property
@@ -1170,8 +1198,9 @@
     OSStatus result =
         AudioObjectGetPropertyData(device_id, &kNoiseReductionPropertyAddress,
                                    0, nullptr, &size, &initially_enabled);
-    if (result != noErr)
+    if (result != noErr) {
       return false;
+    }
 
     if (initially_enabled) {
       const UInt32 disable = 0;
@@ -1222,14 +1251,16 @@
     // Preferences.
     AudioDeviceID default_id;
     GetDefaultDevice(&default_id, true);
-    if (default_id == device_id)
+    if (default_id == device_id) {
       return true;
+    }
   }
 
   // Each low latency streams has its own device ID.
   for (auto* stream : low_latency_input_streams_) {
-    if (stream->device_id() == device_id)
+    if (stream->device_id() == device_id) {
       return true;
+    }
   }
   return false;
 }
@@ -1269,10 +1300,11 @@
     AudioInputStream* stream) {
   DCHECK(GetTaskRunner()->BelongsToCurrentThread());
   auto stream_it = base::ranges::find(basic_input_streams_, stream);
-  if (stream_it == basic_input_streams_.end())
+  if (stream_it == basic_input_streams_.end()) {
     low_latency_input_streams_.remove(static_cast<AUAudioInputStream*>(stream));
-  else
+  } else {
     basic_input_streams_.erase(stream_it);
+  }
 
   AudioManagerBase::ReleaseInputStream(stream);
 }
diff --git a/media/audio/mac/audio_manager_mac.h b/media/audio/mac/audio_manager_mac.h
index 6355b7e9..ecdeec6 100644
--- a/media/audio/mac/audio_manager_mac.h
+++ b/media/audio/mac/audio_manager_mac.h
@@ -20,6 +20,13 @@
 #include "media/audio/mac/audio_auhal_mac.h"
 #include "media/audio/mac/audio_device_listener_mac.h"
 
+namespace base {
+
+namespace apple {
+class ScopedObjCClassSwizzler;
+}  // namespace apple
+}  // namespace base
+
 namespace media {
 
 class AUAudioInputStream;
@@ -223,6 +230,10 @@
   std::list<AUAudioInputStream*> low_latency_input_streams_;
   std::list<AUHALStream*> output_streams_;
 
+  // Used to swizzle SCStreamManager when performing loopback capture.
+  std::unique_ptr<base::apple::ScopedObjCClassSwizzler>
+      screen_capture_kit_swizzler_;
+
   // Set to true in the destructor. Ensures that methods that touches native
   // Core Audio APIs are not executed during shutdown.
   bool in_shutdown_;
diff --git a/media/audio/mac/screen_capture_kit_swizzler.h b/media/audio/mac/screen_capture_kit_swizzler.h
new file mode 100644
index 0000000..987ae1a
--- /dev/null
+++ b/media/audio/mac/screen_capture_kit_swizzler.h
@@ -0,0 +1,16 @@
+// 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 MEDIA_AUDIO_MAC_SCREEN_CAPTURE_KIT_SWIZZLER_H_
+#define MEDIA_AUDIO_MAC_SCREEN_CAPTURE_KIT_SWIZZLER_H_
+
+#include <memory>
+
+#include "base/apple/scoped_objc_class_swizzler.h"
+
+namespace media {
+std::unique_ptr<base::apple::ScopedObjCClassSwizzler> SwizzleScreenCaptureKit();
+}
+
+#endif  // MEDIA_AUDIO_MAC_SCREEN_CAPTURE_KIT_SWIZZLER_H_
diff --git a/media/audio/mac/screen_capture_kit_swizzler.mm b/media/audio/mac/screen_capture_kit_swizzler.mm
new file mode 100644
index 0000000..06099323
--- /dev/null
+++ b/media/audio/mac/screen_capture_kit_swizzler.mm
@@ -0,0 +1,42 @@
+// 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 "screen_capture_kit_swizzler.h"
+
+#import <Foundation/NSObject.h>
+
+@interface SCStreamManagerSwizzler : NSObject
+@end
+
+@implementation SCStreamManagerSwizzler
+
++ (id)requestUserPermissionForScreenCapture {
+  // Returning nil indicates that the permission is granted.
+  return nil;
+}
+
+@end
+
+namespace media {
+
+std::unique_ptr<base::apple::ScopedObjCClassSwizzler>
+SwizzleScreenCaptureKit() {
+  if (@available(macOS 13.0, *)) {
+    // ScreenCaptureKit internally performs a TCC permission check before
+    // attempting any operations. This requires access to the TCC daemon,
+    // which we would like to avoid granting to helper processes due to
+    // security concerns. Skipping this preliminary check is acceptable, as
+    // permissions are afterward externally checked by system services. To
+    // do this, we swizzle the private API +[SCStreamManager
+    // requestUserPermissionForScreenCapture], always returning to the
+    // caller that the process has permissions.
+    return std::make_unique<base::apple::ScopedObjCClassSwizzler>(
+        NSClassFromString(@"SCStreamManager"), [SCStreamManagerSwizzler class],
+        @selector(requestUserPermissionForScreenCapture));
+  }
+
+  return nullptr;
+}
+
+}  // namespace media
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 00d35ea..91c4e39 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -365,6 +365,20 @@
 #endif
 );
 
+#if BUILDFLAG(IS_MAC)
+// Enables system audio mirroring using ScreenCaptureKit when casting the
+// screen on macOS 13.0+.
+BASE_FEATURE(kMacLoopbackAudioForCast,
+             "MacLoopbackAudioForCast",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+// Enables system audio sharing using ScreenCaptureKit when screen sharing on
+// macOS 13.0+.
+BASE_FEATURE(kMacLoopbackAudioForScreenShare,
+             "MacLoopbackAudioForScreenShare",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+#endif
+
 // When enabled, MediaCapabilities will check with GPU Video Accelerator
 // Factories to determine isPowerEfficient = true/false.
 BASE_FEATURE(kMediaCapabilitiesQueryGpuFactories,
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index 6213100..3e1e6d22 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -255,6 +255,10 @@
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kLiveCaptionSystemWideOnChromeOS);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kLiveTranslate);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kLowDelayVideoRenderingOnLiveStream);
+#if BUILDFLAG(IS_MAC)
+MEDIA_EXPORT BASE_DECLARE_FEATURE(kMacLoopbackAudioForCast);
+MEDIA_EXPORT BASE_DECLARE_FEATURE(kMacLoopbackAudioForScreenShare);
+#endif  // BUILDFLAG(IS_MAC)
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaCapabilitiesQueryGpuFactories);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaCapabilitiesWithParameters);
 MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaCastOverlayButton);
diff --git a/media/gpu/test/video_encode_accelerator_perf_tests.cc b/media/gpu/test/video_encode_accelerator_perf_tests.cc
index 29c19a4..22fa5ad6 100644
--- a/media/gpu/test/video_encode_accelerator_perf_tests.cc
+++ b/media/gpu/test/video_encode_accelerator_perf_tests.cc
@@ -338,6 +338,7 @@
       const DecoderBufferValidator* const decoder_buffer_validator,
       const absl::optional<size_t>& spatial_idx,
       const absl::optional<size_t>& temporal_idx,
+      size_t num_spatial_layers,
       SVCInterLayerPredMode inter_layer_pred_mode);
 
   void Output(uint32_t target_bitrate, uint32_t actual_bitrate);
@@ -380,6 +381,7 @@
       uint32_t target_bitrate,
       uint32_t actual_bitrate) const;
 
+  const size_t num_spatial_layers_;
   const SVCInterLayerPredMode inter_layer_pred_mode;
 
   const raw_ptr<const PSNRVideoFrameValidator> psnr_validator;
@@ -398,9 +400,11 @@
     const DecoderBufferValidator* const decoder_buffer_validator,
     const absl::optional<size_t>& spatial_idx,
     const absl::optional<size_t>& temporal_idx,
+    size_t num_spatial_layers,
     SVCInterLayerPredMode inter_layer_pred_mode)
     : spatial_idx(spatial_idx),
       temporal_idx(temporal_idx),
+      num_spatial_layers_(num_spatial_layers),
       inter_layer_pred_mode(inter_layer_pred_mode),
       psnr_validator(psnr_validator),
       ssim_validator(ssim_validator),
@@ -459,9 +463,11 @@
                                      uint32_t actual_bitrate) {
   std::string svc_text;
   if (spatial_idx) {
-    svc_text +=
-        (inter_layer_pred_mode == SVCInterLayerPredMode::kOff ? "S" : "L") +
-        base::NumberToString(*spatial_idx + 1);
+    svc_text += (inter_layer_pred_mode == SVCInterLayerPredMode::kOff &&
+                         num_spatial_layers_ > 1
+                     ? "S"
+                     : "L") +
+                base::NumberToString(*spatial_idx + 1);
   }
   if (temporal_idx)
     svc_text += "T" + base::NumberToString(*temporal_idx + 1);
@@ -709,7 +715,8 @@
         psnr_validator.get(), ssim_validator.get(),
         bottom_row_psnr_validator.get(), log_likelihood_validator.get(),
         decoder_buffer_validator, spatial_layer_index_to_decode,
-        temporal_layer_index_to_decode, inter_layer_pred_mode));
+        temporal_layer_index_to_decode, spatial_layer_resolutions.size(),
+        inter_layer_pred_mode));
     video_frame_processors.push_back(std::move(ssim_validator));
     video_frame_processors.push_back(std::move(psnr_validator));
     video_frame_processors.push_back(std::move(bottom_row_psnr_validator));
diff --git a/media/gpu/test/video_encode_accelerator_tests.cc b/media/gpu/test/video_encode_accelerator_tests.cc
index 8dc8008..dcd6c36 100644
--- a/media/gpu/test/video_encode_accelerator_tests.cc
+++ b/media/gpu/test/video_encode_accelerator_tests.cc
@@ -191,7 +191,8 @@
       base::FilePath::StringType output_file_prefix;
       if (spatial_layer_index_to_decode) {
         output_file_prefix +=
-            (inter_layer_pred_mode == SVCInterLayerPredMode::kOff
+            (inter_layer_pred_mode == SVCInterLayerPredMode::kOff &&
+                     spatial_layer_resolutions.size() > 1
                  ? FILE_PATH_LITERAL("S")
                  : FILE_PATH_LITERAL("L")) +
             base::NumberToString(*spatial_layer_index_to_decode);
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc
index e4c8d8d..f1bd758 100644
--- a/net/cookies/canonical_cookie_unittest.cc
+++ b/net/cookies/canonical_cookie_unittest.cc
@@ -4026,7 +4026,7 @@
       CookieSameSite::NO_RESTRICTION, COOKIE_PRIORITY_DEFAULT,
       false /*same_party*/, absl::nullopt /*partition_key*/, &status));
   EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
-      {CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE}));
+      {CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT}));
 
   // Check that value can contain an equal sign, even when no name is present.
   // Note that in newer drafts of RFC6265bis, it is specified that a cookie with
@@ -4362,7 +4362,8 @@
       COOKIE_PRIORITY_DEFAULT, true /*same_party*/,
       absl::nullopt /*partition_key*/, &status));
   EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting(
-      {CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE,
+      {CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT,
+       CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE,
        CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN}));
 
   // Check that RFC6265bis name + value string length limits are enforced.
diff --git a/net/cookies/cookie_inclusion_status.cc b/net/cookies/cookie_inclusion_status.cc
index 368a4ef..b18464e 100644
--- a/net/cookies/cookie_inclusion_status.cc
+++ b/net/cookies/cookie_inclusion_status.cc
@@ -231,6 +231,7 @@
       {EXCLUDE_SHADOWING_DOMAIN, "EXCLUDE_SHADOWING_DOMAIN"},
       {EXCLUDE_DISALLOWED_CHARACTER, "EXCLUDE_DISALLOWED_CHARACTER"},
       {EXCLUDE_THIRD_PARTY_PHASEOUT, "EXCLUDE_THIRD_PARTY_PHASEOUT"},
+      {EXCLUDE_NO_COOKIE_CONTENT, "EXCLUDE_NO_COOKIE_CONTENT"},
   };
   static_assert(
       std::size(exclusion_reasons) == ExclusionReason::NUM_EXCLUSION_REASONS,
diff --git a/net/cookies/cookie_inclusion_status.h b/net/cookies/cookie_inclusion_status.h
index e197c98..6ef4bd77 100644
--- a/net/cookies/cookie_inclusion_status.h
+++ b/net/cookies/cookie_inclusion_status.h
@@ -107,6 +107,8 @@
     EXCLUDE_DISALLOWED_CHARACTER = 24,
     // Cookie is blocked for third-party cookie phaseout.
     EXCLUDE_THIRD_PARTY_PHASEOUT = 25,
+    // Cookie contains no content or only whitespace.
+    EXCLUDE_NO_COOKIE_CONTENT = 26,
 
     // This should be kept last.
     NUM_EXCLUSION_REASONS
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc
index 9d01b106..359bb32 100644
--- a/net/cookies/parsed_cookie.cc
+++ b/net/cookies/parsed_cookie.cc
@@ -477,9 +477,8 @@
   // Ignore cookies with neither name nor value.
   if (name.empty() && value.empty()) {
     if (status_out != nullptr) {
-      // TODO(crbug.com/1228815): Apply more specific exclusion reasons.
       status_out->AddExclusionReason(
-          CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE);
+          CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT);
     }
     // TODO(crbug.com/1228815) Note - if the exclusion reasons change to no
     // longer be the same, we'll need to not return right away and evaluate all
@@ -554,9 +553,8 @@
 
   // Exit early for an empty cookie string.
   if (it == end) {
-    // TODO(crbug.com/1228815): Apply more specific exclusion reasons.
     status_out.AddExclusionReason(
-        CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE);
+        CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT);
     return;
   }
 
diff --git a/net/cookies/parsed_cookie_unittest.cc b/net/cookies/parsed_cookie_unittest.cc
index ddd6b3990..d089b25 100644
--- a/net/cookies/parsed_cookie_unittest.cc
+++ b/net/cookies/parsed_cookie_unittest.cc
@@ -62,9 +62,11 @@
 }
 
 TEST(ParsedCookieTest, TestSetEmptyNameValue) {
-  ParsedCookie empty("");
+  CookieInclusionStatus status;
+  ParsedCookie empty("", /*block_truncated=*/false, &status);
   EXPECT_FALSE(empty.IsValid());
-  EXPECT_FALSE(empty.SetName(""));
+  EXPECT_TRUE(status.HasExclusionReason(
+      CookieInclusionStatus::ExclusionReason::EXCLUDE_NO_COOKIE_CONTENT));
   EXPECT_FALSE(empty.SetValue(""));
   EXPECT_FALSE(empty.IsValid());
 
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index 5750915..4637d0a3 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -559,6 +559,10 @@
 }
 
 PDFiumEngine::~PDFiumEngine() {
+  // Clear all the containers that can prevent unloading.
+  find_results_.clear();
+  selection_.clear();
+
   for (auto& page : pages_)
     page->Unload();
 
diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc
index 96b85c16..18e0c52 100644
--- a/pdf/pdfium/pdfium_page.cc
+++ b/pdf/pdfium/pdfium_page.cc
@@ -384,7 +384,8 @@
 }
 
 void PDFiumPage::Unload() {
-  // Do not unload while in the middle of a load.
+  // Do not unload while in the middle of a load, or if some external source
+  // expects `this` to stay loaded.
   if (preventing_unload_count_)
     return;
 
@@ -1760,6 +1761,20 @@
   page_->preventing_unload_count_++;
 }
 
+PDFiumPage::ScopedUnloadPreventer::ScopedUnloadPreventer(
+    const ScopedUnloadPreventer& that)
+    : ScopedUnloadPreventer(that.page_) {}
+
+PDFiumPage::ScopedUnloadPreventer& PDFiumPage::ScopedUnloadPreventer::operator=(
+    const ScopedUnloadPreventer& that) {
+  if (page_ != that.page_) {
+    page_->preventing_unload_count_--;
+    page_ = that.page_;
+    page_->preventing_unload_count_++;
+  }
+  return *this;
+}
+
 PDFiumPage::ScopedUnloadPreventer::~ScopedUnloadPreventer() {
   page_->preventing_unload_count_--;
 }
diff --git a/pdf/pdfium/pdfium_page.h b/pdf/pdfium/pdfium_page.h
index 05f348a..67fe82f 100644
--- a/pdf/pdfium/pdfium_page.h
+++ b/pdf/pdfium/pdfium_page.h
@@ -43,6 +43,17 @@
 // Wrapper around a page from the document.
 class PDFiumPage {
  public:
+  class ScopedUnloadPreventer {
+   public:
+    explicit ScopedUnloadPreventer(PDFiumPage* page);
+    ScopedUnloadPreventer(const ScopedUnloadPreventer& that);
+    ScopedUnloadPreventer& operator=(const ScopedUnloadPreventer& that);
+    ~ScopedUnloadPreventer();
+
+   private:
+    raw_ptr<PDFiumPage> page_;
+  };
+
   PDFiumPage(PDFiumEngine* engine, int i);
   PDFiumPage(const PDFiumPage&) = delete;
   PDFiumPage& operator=(const PDFiumPage&) = delete;
@@ -244,15 +255,6 @@
   FRIEND_TEST_ALL_PREFIXES(PDFiumPageOverlappingTest, CountPartialOverlaps);
   FRIEND_TEST_ALL_PREFIXES(PDFiumPageTextFieldTest, PopulateTextFields);
 
-  class ScopedUnloadPreventer {
-   public:
-    explicit ScopedUnloadPreventer(PDFiumPage* page);
-    ~ScopedUnloadPreventer();
-
-   private:
-    const raw_ptr<PDFiumPage> page_;
-  };
-
   struct Link {
     Link();
     Link(const Link& that);
diff --git a/pdf/pdfium/pdfium_page_unittest.cc b/pdf/pdfium/pdfium_page_unittest.cc
index 6c90911..7ecf983 100644
--- a/pdf/pdfium/pdfium_page_unittest.cc
+++ b/pdf/pdfium/pdfium_page_unittest.cc
@@ -46,6 +46,21 @@
   EXPECT_EQ(ToPDFiumRotation(PageOrientation::kClockwise270), 3);
 }
 
+TEST(PDFiumPageHelperTest, ScopedUnloadPreventer) {
+  // Should not DCHECK in its dtor due to ScopedUnloadPreventer usage.
+  PDFiumPage page1(/*engine=*/nullptr, 1);
+  PDFiumPage page2(/*engine=*/nullptr, 2);
+  PDFiumPage::ScopedUnloadPreventer prevent_unload1(&page1);
+  PDFiumPage::ScopedUnloadPreventer prevent_unload2(&page2);
+  PDFiumPage::ScopedUnloadPreventer prevent_unload3(prevent_unload2);
+  PDFiumPage::ScopedUnloadPreventer prevent_unload4(&page2);
+  prevent_unload2 = prevent_unload1;
+  prevent_unload1 = prevent_unload2;
+  prevent_unload1 = prevent_unload4;
+  prevent_unload4 = prevent_unload1;
+  prevent_unload3 = prevent_unload4;
+}
+
 void CompareTextRuns(const AccessibilityTextRunInfo& expected_text_run,
                      const AccessibilityTextRunInfo& actual_text_run) {
   EXPECT_EQ(expected_text_run.len, actual_text_run.len);
diff --git a/pdf/pdfium/pdfium_range.cc b/pdf/pdfium/pdfium_range.cc
index 4e057eb..88f6371 100644
--- a/pdf/pdfium/pdfium_range.cc
+++ b/pdf/pdfium/pdfium_range.cc
@@ -31,11 +31,18 @@
 }
 
 PDFiumRange::PDFiumRange(PDFiumPage* page, int char_index, int char_count)
-    : page_(page), char_index_(char_index), char_count_(char_count) {
+    : page_unload_preventer_(page),
+      page_(page),
+      char_index_(char_index),
+      char_count_(char_count) {
   DCHECK(page_);
+  // Ensure page load, while `page_unload_preventer_` prevents page unload.
+  // This prevents GetScreenRects() from triggering page loads, which can have
+  // surprising side effects, considering GetScreenRects() is const.
+  [[maybe_unused]] FPDF_TEXTPAGE text_page = page_->GetTextPage();
 #if DCHECK_IS_ON()
   AdjustForBackwardsRange(char_index, char_count);
-  DCHECK_LE(char_count, FPDFText_CountChars(page_->GetTextPage()));
+  DCHECK_LE(char_count, FPDFText_CountChars(text_page));
 #endif
 }
 
diff --git a/pdf/pdfium/pdfium_range.h b/pdf/pdfium/pdfium_range.h
index 5ce122a7..6c877e5 100644
--- a/pdf/pdfium/pdfium_range.h
+++ b/pdf/pdfium/pdfium_range.h
@@ -49,6 +49,8 @@
   std::u16string GetText() const;
 
  private:
+  PDFiumPage::ScopedUnloadPreventer page_unload_preventer_;
+
   // The page containing the range. Must outlive `this`.
   raw_ptr<PDFiumPage> page_;
   // Index of first character.
diff --git a/third_party/angle b/third_party/angle
index eb0d599..ecf11ec 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit eb0d59973d21f845b5785563f5d56b8ebb617478
+Subproject commit ecf11ecaea1a4ed9fd08180bc85f6f07dbc0e9b1
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index cafca57..c25cfabc 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -5783,6 +5783,8 @@
       # character if it appears in the middle of the cookie name, value, an
       # attribute name, or an attribute value.
       DisallowedCharacter
+      # Cookie contains no content or only whitespace.
+      NoCookieContent
 
   # Types of reasons why a cookie may not be sent with a request.
   experimental type CookieBlockedReason extends string
@@ -9335,8 +9337,6 @@
       loaded
       bid
       win
-      additionalBid
-      additionalBidWin
 
   # Ad advertising element inside an interest group.
   type InterestGroupAd extends object
diff --git a/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom b/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
index 32388d7..c823dca8 100644
--- a/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
+++ b/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
@@ -41,6 +41,12 @@
   kPerBuyerCumulativeTimeouts
 };
 
+// Coordinator which is conducting the auction.
+enum AdAuctionCoordinator {
+  kAWS,
+  kGCP,
+};
+
 // Used to provide a way of aborting a call to AdAuctionService.RunAdAuction
 interface AbortableAdAuction {
   // These methods should be called to provide a value for part of auction
@@ -237,6 +243,6 @@
 
   // Gets the ad auction data for running an external auction on a bidding and
   // auction server.
-  GetInterestGroupAdAuctionData(url.mojom.Origin seller)
+  GetInterestGroupAdAuctionData(url.mojom.Origin seller, AdAuctionCoordinator coordinator)
       => (mojo_base.mojom.BigBuffer request, mojo_base.mojom.Uuid? request_id);
 };
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 ad15ed0ce..3b0ac05 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
@@ -3999,6 +3999,9 @@
   kPercentOrCalcStickyUsedOffset = 4659,
   kPercentOrCalcRelativeUsedOffset = 4660,
   kAutoRelativeUsedOffset = 4661,
+  kViewportFitContain = 4662,
+  kViewportFitCover = 4663,
+  kViewportFitCoverOrSafeAreaInsetBottom = 4664,
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
   // Also, run update_use_counter_feature_enum.py in
diff --git a/third_party/blink/public/platform/web_theme_engine.h b/third_party/blink/public/platform/web_theme_engine.h
index c11dec4..14a48c2 100644
--- a/third_party/blink/public/platform/web_theme_engine.h
+++ b/third_party/blink/public/platform/web_theme_engine.h
@@ -271,6 +271,9 @@
     // NativeTheme so these fields are unused in non-Android WebThemeEngines.
   }
 
+  virtual bool IsFluentOverlayScrollbarEnabled() const { return false; }
+  virtual int GetPaintedScrollbarTrackInset() const { return 0; }
+
   // Paint the given the given theme part.
   virtual void Paint(
       cc::PaintCanvas*,
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni
index c0516b1c..1199581 100644
--- a/third_party/blink/renderer/bindings/generated_in_modules.gni
+++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -1198,6 +1198,8 @@
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_aac_bitstream_format.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_signals.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_signals.h",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_auction_coordinator.cc",
+  "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_auction_coordinator.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_alpha_option.cc",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_alpha_option.h",
   "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ancestor_status.cc",
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc
index 9f1099b4..af84a5db 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -555,7 +555,7 @@
     // DCHECK_GE(GetDocument().Lifecycle().GetState(),
     //           DocumentLifecycle::kPrePaintClean);
     bool has_direct_compositing_reasons = false;
-    if (layout_object->FirstFragment().NextFragment()) {
+    if (layout_object->IsFragmented()) {
       // Composited animation on multiple fragments is not supported.
       reasons |= kTargetHasInvalidCompositingState;
     } else if (const auto* paint_properties =
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
index b08d4a0..67be634 100644
--- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc
+++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -2552,7 +2552,7 @@
   Element* target = GetDocument().getElementById(AtomicString("target"));
   const Animation& animation =
       *target->GetElementAnimations()->Animations().begin()->key;
-  EXPECT_TRUE(target->GetLayoutObject()->FirstFragment().NextFragment());
+  EXPECT_TRUE(target->GetLayoutObject()->IsFragmented());
   EXPECT_EQ(CompositorAnimations::kTargetHasInvalidCompositingState,
             animation.CheckCanStartAnimationOnCompositor(
                 GetDocument().View()->GetPaintArtifactCompositor()));
diff --git a/third_party/blink/renderer/core/css/document_style_environment_variables.cc b/third_party/blink/renderer/core/css/document_style_environment_variables.cc
index 78f0c6b1..04eea6b1 100644
--- a/third_party/blink/renderer/core/css/document_style_environment_variables.cc
+++ b/third_party/blink/renderer/core/css/document_style_environment_variables.cc
@@ -7,6 +7,7 @@
 #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/execution_context/execution_context.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
 #include "third_party/blink/renderer/core/frame/web_feature.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h"
@@ -93,6 +94,13 @@
     case 0x898873a2:
       UseCounter::Count(
           document_, WebFeature::kCSSEnvironmentVariable_SafeAreaInsetBottom);
+      // Record usage for viewport-fit histogram.
+      // TODO(https://crbug.com/1482559) remove after data captured (end of
+      // 2023).
+      if (document_->GetFrame()->IsOutermostMainFrame()) {
+        UseCounter::Count(document_,
+                          WebFeature::kViewportFitCoverOrSafeAreaInsetBottom);
+      }
       break;
     case 0xd99fe75b:
       UseCounter::Count(document_,
diff --git a/third_party/blink/renderer/core/css/style_environment_variables_test.cc b/third_party/blink/renderer/core/css/style_environment_variables_test.cc
index 516f833..e9bc8edb 100644
--- a/third_party/blink/renderer/core/css/style_environment_variables_test.cc
+++ b/third_party/blink/renderer/core/css/style_environment_variables_test.cc
@@ -422,6 +422,18 @@
       WebFeature::kCSSEnvironmentVariable_SafeAreaInsetBottom));
 }
 
+// TODO(https://crbug.com/1430288) remove after data collected (end of '23)
+TEST_F(StyleEnvironmentVariablesTest,
+       RecordUseCounter_ViewportFitCoverOrSafeAreaInsetBottom) {
+  InitializeWithHTML(GetFrame(), "");
+  EXPECT_FALSE(GetDocument().IsUseCounted(
+      WebFeature::kViewportFitCoverOrSafeAreaInsetBottom));
+  InitializeTestPageWithVariableNamed(GetFrame(),
+                                      UADefinedVariable::kSafeAreaInsetBottom);
+  EXPECT_TRUE(GetDocument().IsUseCounted(
+      WebFeature::kViewportFitCoverOrSafeAreaInsetBottom));
+}
+
 TEST_F(StyleEnvironmentVariablesTest, RecordUseCounter_SafeAreaInsetLeft) {
   InitializeTestPageWithVariableNamed(GetFrame(),
                                       UADefinedVariable::kSafeAreaInsetLeft);
diff --git a/third_party/blink/renderer/core/frame/viewport_data.cc b/third_party/blink/renderer/core/frame/viewport_data.cc
index e9c36939..c136911 100644
--- a/third_party/blink/renderer/core/frame/viewport_data.cc
+++ b/third_party/blink/renderer/core/frame/viewport_data.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/core/frame/viewport_data.h"
 
+#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h"
+
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
@@ -113,6 +115,21 @@
       // Even though we bind the mojo interface above there still may be cases
       // where this will fail (e.g. unit tests).
       display_cutout_host_->NotifyViewportFitChanged(current_viewport_fit);
+
+      // Track usage of any non-default viewport-fit.
+      if (document_->GetFrame()->IsOutermostMainFrame()) {
+        if (current_viewport_fit == mojom::blink::ViewportFit::kContain) {
+          UseCounter::Count(document_, WebFeature::kViewportFitContain);
+        } else if (current_viewport_fit == mojom::blink::ViewportFit::kCover ||
+                   current_viewport_fit ==
+                       mojom::blink::ViewportFit::kCoverForcedByUserAgent) {
+          UseCounter::Count(document_, WebFeature::kViewportFitCover);
+          // TODO(https://crbug.com/1430288) remove tracking this union of
+          // features after data collected (end of '23)
+          UseCounter::Count(document_,
+                            WebFeature::kViewportFitCoverOrSafeAreaInsetBottom);
+        }
+      }
     }
 
     viewport_fit_ = current_viewport_fit;
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 ba84359..bfb3a70cd8 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
@@ -3324,12 +3324,6 @@
         !presentation_time.is_null() && (presentation_time > swap_time);
     UMA_HISTOGRAM_BOOLEAN("PageLoad.Internal.Renderer.PresentationTime.Valid",
                           presentation_time_is_valid);
-    if (presentation_time_is_valid) {
-      // This measures from 1ms to 10seconds.
-      UMA_HISTOGRAM_TIMES(
-          "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime",
-          presentation_time - swap_time);
-    }
     ReportTime(std::move(presentation_time_callback),
                presentation_time_is_valid ? presentation_time : swap_time);
   }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc
index e1f9f95..e1429897 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc
@@ -565,10 +565,6 @@
   EXPECT_THAT(histograms.GetAllSamples(
                   "PageLoad.Internal.Renderer.PresentationTime.Valid"),
               testing::ElementsAre(base::Bucket(true, 1)));
-  EXPECT_THAT(
-      histograms.GetAllSamples(
-          "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"),
-      testing::ElementsAre(base::Bucket(2, 1)));
 }
 
 TEST_F(NotifySwapTimesWebFrameWidgetTest, PresentationTimestampInvalid) {
@@ -579,10 +575,6 @@
   EXPECT_THAT(histograms.GetAllSamples(
                   "PageLoad.Internal.Renderer.PresentationTime.Valid"),
               testing::ElementsAre(base::Bucket(false, 1)));
-  EXPECT_THAT(
-      histograms.GetAllSamples(
-          "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"),
-      testing::IsEmpty());
 }
 
 TEST_F(NotifySwapTimesWebFrameWidgetTest,
@@ -594,10 +586,6 @@
   EXPECT_THAT(histograms.GetAllSamples(
                   "PageLoad.Internal.Renderer.PresentationTime.Valid"),
               testing::ElementsAre(base::Bucket(false, 1)));
-  EXPECT_THAT(
-      histograms.GetAllSamples(
-          "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"),
-      testing::IsEmpty());
 }
 
 // Verifies that the presentation callback is called after the first successful
@@ -693,12 +681,6 @@
   EXPECT_THAT(histograms.GetAllSamples(
                   "PageLoad.Internal.Renderer.PresentationTime.Valid"),
               testing::ElementsAre(base::Bucket(true, 1)));
-  const auto expected_sample = static_cast<base::HistogramBase::Sample>(
-      (swap_to_failed + failed_to_successful).InMilliseconds());
-  EXPECT_THAT(
-      histograms.GetAllSamples(
-          "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"),
-      testing::ElementsAre(base::Bucket(expected_sample, 1)));
 }
 
 // Tests that the presentation callback is only triggered if there’s
@@ -759,12 +741,9 @@
 
   // Wait for the presentation callback to be called.
   presentation_run_loop.Run();
-  const auto expected_sample = static_cast<base::HistogramBase::Sample>(
-      delta_from_swap_time.InMilliseconds());
-  EXPECT_THAT(
-      histograms.GetAllSamples(
-          "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"),
-      testing::ElementsAre(base::Bucket(expected_sample, 1)));
+  EXPECT_THAT(histograms.GetAllSamples(
+                  "PageLoad.Internal.Renderer.PresentationTime.Valid"),
+              testing::ElementsAre(base::Bucket(true, 1)));
 }
 
 // Tests that the value of VisualProperties::is_pinch_gesture_active is
diff --git a/third_party/blink/renderer/core/html/html_meta_element_test.cc b/third_party/blink/renderer/core/html/html_meta_element_test.cc
index bbed764..f76b5f3 100644
--- a/third_party/blink/renderer/core/html/html_meta_element_test.cc
+++ b/third_party/blink/renderer/core/html/html_meta_element_test.cc
@@ -97,6 +97,38 @@
             LoadTestPageAndReturnViewportFit("invalid"));
 }
 
+// TODO(https://crbug.com/1430288) remove after data collected (end of '23)
+TEST_F(HTMLMetaElementTest, ViewportFit_Auto_NotUseCounted) {
+  EXPECT_EQ(mojom::ViewportFit::kAuto,
+            LoadTestPageAndReturnViewportFit("auto"));
+  EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kViewportFitContain));
+  EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kViewportFitCover));
+  // TODO(https://crbug.com/1430288) remove tracking this union of features
+  // after data collected (end of '23)
+  EXPECT_FALSE(GetDocument().IsUseCounted(
+      WebFeature::kViewportFitCoverOrSafeAreaInsetBottom));
+}
+
+TEST_F(HTMLMetaElementTest, ViewportFit_Contain_IsUseCounted) {
+  EXPECT_EQ(mojom::ViewportFit::kContain,
+            LoadTestPageAndReturnViewportFit("contain"));
+  EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kViewportFitCover));
+  EXPECT_FALSE(GetDocument().IsUseCounted(
+      WebFeature::kViewportFitCoverOrSafeAreaInsetBottom));
+  EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kViewportFitContain));
+}
+
+// TODO(https://crbug.com/1430288) remove after data collected (end of '23)
+TEST_F(HTMLMetaElementTest, ViewportFit_Cover_IsUseCounted) {
+  EXPECT_EQ(mojom::ViewportFit::kCover,
+            LoadTestPageAndReturnViewportFit("cover"));
+  EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kViewportFitCover));
+  // TODO(https://crbug.com/1430288) remove tracking this union of features
+  // after data collected (end of '23)
+  EXPECT_TRUE(GetDocument().IsUseCounted(
+      WebFeature::kViewportFitCoverOrSafeAreaInsetBottom));
+}
+
 TEST_F(HTMLMetaElementTest, ColorSchemeProcessing_FirstWins) {
   GetDocument().head()->setInnerHTML(R"HTML(
     <meta name="color-scheme" content="dark">
diff --git a/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc b/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc
index 6937354..8dfa5c0 100644
--- a/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc
+++ b/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc
@@ -62,7 +62,7 @@
 
   // Dispatch out event
   if (event_handling_util::IsInDocument(exited_target))
-    DispatchOut(exited_target, entered_target);
+    Dispatch(exited_target, entered_target, out_event_, false);
 
   // Create lists of all exited/entered ancestors, locate the common ancestor
   // Based on httparchive, in more than 97% cases the depth of DOM is less
@@ -97,38 +97,38 @@
       &entered_ancestors_common_parent_index);
 
   bool exited_node_has_capturing_ancestor = false;
-  const AtomicString& leave_event = GetLeaveEvent();
   for (wtf_size_t j = 0; j < exited_ancestors.size(); j++) {
-    if (exited_ancestors[j]->HasCapturingEventListeners(leave_event)) {
+    if (exited_ancestors[j]->HasCapturingEventListeners(leave_event_)) {
       exited_node_has_capturing_ancestor = true;
       break;
     }
   }
 
   // Dispatch leave events, in child-to-parent order.
-  for (wtf_size_t j = 0; j < exited_ancestors_common_parent_index; j++)
-    DispatchLeave(exited_ancestors[j], entered_target,
-                  !exited_node_has_capturing_ancestor);
+  for (wtf_size_t j = 0; j < exited_ancestors_common_parent_index; j++) {
+    Dispatch(exited_ancestors[j], entered_target, leave_event_,
+             !exited_node_has_capturing_ancestor);
+  }
 
   // Dispatch over event
   if (event_handling_util::IsInDocument(entered_target))
-    DispatchOver(entered_target, exited_target);
+    Dispatch(entered_target, exited_target, over_event_, false);
 
   // Defer locating capturing enter listener until /after/ dispatching the leave
   // events because the leave handlers might set a capturing enter handler.
   bool entered_node_has_capturing_ancestor = false;
-  const AtomicString& enter_event = GetEnterEvent();
   for (wtf_size_t i = 0; i < entered_ancestors.size(); i++) {
-    if (entered_ancestors[i]->HasCapturingEventListeners(enter_event)) {
+    if (entered_ancestors[i]->HasCapturingEventListeners(enter_event_)) {
       entered_node_has_capturing_ancestor = true;
       break;
     }
   }
 
   // Dispatch enter events, in parent-to-child order.
-  for (wtf_size_t i = entered_ancestors_common_parent_index; i > 0; i--)
-    DispatchEnter(entered_ancestors[i - 1], exited_target,
-                  !entered_node_has_capturing_ancestor);
+  for (wtf_size_t i = entered_ancestors_common_parent_index; i > 0; i--) {
+    Dispatch(entered_ancestors[i - 1], exited_target, enter_event_,
+             !entered_node_has_capturing_ancestor);
+  }
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/input/boundary_event_dispatcher.h b/third_party/blink/renderer/core/input/boundary_event_dispatcher.h
index 411b58a..1278d6b 100644
--- a/third_party/blink/renderer/core/input/boundary_event_dispatcher.h
+++ b/third_party/blink/renderer/core/input/boundary_event_dispatcher.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_BOUNDARY_EVENT_DISPATCHER_H_
 
 #include "third_party/blink/renderer/core/dom/events/event_target.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 
 namespace blink {
 
@@ -16,23 +17,30 @@
   STACK_ALLOCATED();
 
  public:
-  BoundaryEventDispatcher() = default;
+  BoundaryEventDispatcher(AtomicString over_event,
+                          AtomicString out_event,
+                          AtomicString enter_event,
+                          AtomicString leave_event)
+      : over_event_(over_event),
+        out_event_(out_event),
+        enter_event_(enter_event),
+        leave_event_(leave_event) {}
   virtual ~BoundaryEventDispatcher() = default;
 
   void SendBoundaryEvents(EventTarget* exited_target,
                           EventTarget* entered_target);
 
  protected:
-  virtual void DispatchOut(EventTarget*, EventTarget* related_target) = 0;
-  virtual void DispatchOver(EventTarget*, EventTarget* related_target) = 0;
-  virtual void DispatchLeave(EventTarget*,
-                             EventTarget* related_target,
-                             bool check_for_listener) = 0;
-  virtual void DispatchEnter(EventTarget*,
-                             EventTarget* related_target,
-                             bool check_for_listener) = 0;
-  virtual AtomicString GetLeaveEvent() = 0;
-  virtual AtomicString GetEnterEvent() = 0;
+  virtual void Dispatch(EventTarget*,
+                        EventTarget* related_target,
+                        const AtomicString&,
+                        bool check_for_listener) = 0;
+
+ private:
+  AtomicString over_event_;
+  AtomicString out_event_;
+  AtomicString enter_event_;
+  AtomicString leave_event_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc
index d76ce9e9..cb097e5 100644
--- a/third_party/blink/renderer/core/input/mouse_event_manager.cc
+++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -167,20 +167,19 @@
 MouseEventManager::MouseEventBoundaryEventDispatcher::
     MouseEventBoundaryEventDispatcher(MouseEventManager* mouse_event_manager,
                                       const WebMouseEvent* web_mouse_event)
-    : mouse_event_manager_(mouse_event_manager),
+    : BoundaryEventDispatcher(event_type_names::kMouseover,
+                              event_type_names::kMouseout,
+                              event_type_names::kMouseenter,
+                              event_type_names::kMouseleave),
+      mouse_event_manager_(mouse_event_manager),
       web_mouse_event_(web_mouse_event) {}
 
-void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchOut(
+void MouseEventManager::MouseEventBoundaryEventDispatcher::Dispatch(
     EventTarget* target,
-    EventTarget* related_target) {
-  Dispatch(target, related_target, event_type_names::kMouseout,
-           *web_mouse_event_, false);
-}
-
-void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchOver(
-    EventTarget* target,
-    EventTarget* related_target) {
-  if (target) {
+    EventTarget* related_target,
+    const AtomicString& type,
+    bool check_for_listener) {
+  if (target && type == event_type_names::kMouseover) {
     HTMLImageElement* image_element =
         DynamicTo<HTMLImageElement>(target->ToNode());
     if (image_element && image_element->IsLCPElement()) {
@@ -189,43 +188,7 @@
       paint_timing.SetLCPMouseoverDispatched();
     }
   }
-  Dispatch(target, related_target, event_type_names::kMouseover,
-           *web_mouse_event_, false);
-}
-
-void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchLeave(
-    EventTarget* target,
-    EventTarget* related_target,
-    bool check_for_listener) {
-  Dispatch(target, related_target, event_type_names::kMouseleave,
-           *web_mouse_event_, check_for_listener);
-}
-
-void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchEnter(
-    EventTarget* target,
-    EventTarget* related_target,
-    bool check_for_listener) {
-  Dispatch(target, related_target, event_type_names::kMouseenter,
-           *web_mouse_event_, check_for_listener);
-}
-
-AtomicString
-MouseEventManager::MouseEventBoundaryEventDispatcher::GetLeaveEvent() {
-  return event_type_names::kMouseleave;
-}
-
-AtomicString
-MouseEventManager::MouseEventBoundaryEventDispatcher::GetEnterEvent() {
-  return event_type_names::kMouseenter;
-}
-
-void MouseEventManager::MouseEventBoundaryEventDispatcher::Dispatch(
-    EventTarget* target,
-    EventTarget* related_target,
-    const AtomicString& type,
-    const WebMouseEvent& web_mouse_event,
-    bool check_for_listener) {
-  mouse_event_manager_->DispatchMouseEvent(target, type, web_mouse_event,
+  mouse_event_manager_->DispatchMouseEvent(target, type, *web_mouse_event_,
                                            nullptr, related_target,
                                            check_for_listener);
 }
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.h b/third_party/blink/renderer/core/input/mouse_event_manager.h
index 45151662c..d9edbacb 100644
--- a/third_party/blink/renderer/core/input/mouse_event_manager.h
+++ b/third_party/blink/renderer/core/input/mouse_event_manager.h
@@ -161,23 +161,12 @@
         const MouseEventBoundaryEventDispatcher&) = delete;
 
    protected:
-    void DispatchOut(EventTarget*, EventTarget* related_target) override;
-    void DispatchOver(EventTarget*, EventTarget* related_target) override;
-    void DispatchLeave(EventTarget*,
-                       EventTarget* related_target,
-                       bool check_for_listener) override;
-    void DispatchEnter(EventTarget*,
-                       EventTarget* related_target,
-                       bool check_for_listener) override;
-    AtomicString GetLeaveEvent() override;
-    AtomicString GetEnterEvent() override;
-
-   private:
     void Dispatch(EventTarget*,
                   EventTarget* related_target,
                   const AtomicString&,
-                  const WebMouseEvent&,
-                  bool check_for_listener);
+                  bool check_for_listener) override;
+
+   private:
     MouseEventManager* mouse_event_manager_;
     const WebMouseEvent* web_mouse_event_;
   };
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc
index 24d399b..79c216f8 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -133,47 +133,13 @@
     PointerEventBoundaryEventDispatcher(
         PointerEventManager* pointer_event_manager,
         PointerEvent* pointer_event)
-    : pointer_event_manager_(pointer_event_manager),
+    : BoundaryEventDispatcher(event_type_names::kPointerover,
+                              event_type_names::kPointerout,
+                              event_type_names::kPointerenter,
+                              event_type_names::kPointerleave),
+      pointer_event_manager_(pointer_event_manager),
       pointer_event_(pointer_event) {}
 
-void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchOut(
-    EventTarget* target,
-    EventTarget* related_target) {
-  Dispatch(target, related_target, event_type_names::kPointerout, false);
-}
-
-void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchOver(
-    EventTarget* target,
-    EventTarget* related_target) {
-  Dispatch(target, related_target, event_type_names::kPointerover, false);
-}
-
-void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchLeave(
-    EventTarget* target,
-    EventTarget* related_target,
-    bool check_for_listener) {
-  Dispatch(target, related_target, event_type_names::kPointerleave,
-           check_for_listener);
-}
-
-void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchEnter(
-    EventTarget* target,
-    EventTarget* related_target,
-    bool check_for_listener) {
-  Dispatch(target, related_target, event_type_names::kPointerenter,
-           check_for_listener);
-}
-
-AtomicString
-PointerEventManager::PointerEventBoundaryEventDispatcher::GetLeaveEvent() {
-  return event_type_names::kPointerleave;
-}
-
-AtomicString
-PointerEventManager::PointerEventBoundaryEventDispatcher::GetEnterEvent() {
-  return event_type_names::kPointerenter;
-}
-
 void PointerEventManager::PointerEventBoundaryEventDispatcher::Dispatch(
     EventTarget* target,
     EventTarget* related_target,
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.h b/third_party/blink/renderer/core/input/pointer_event_manager.h
index 208cb3d0f..7ef25093a 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.h
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.h
@@ -132,22 +132,12 @@
         const PointerEventBoundaryEventDispatcher&) = delete;
 
    protected:
-    void DispatchOut(EventTarget*, EventTarget* related_target) override;
-    void DispatchOver(EventTarget*, EventTarget* related_target) override;
-    void DispatchLeave(EventTarget*,
-                       EventTarget* related_target,
-                       bool check_for_listener) override;
-    void DispatchEnter(EventTarget*,
-                       EventTarget* related_target,
-                       bool check_for_listener) override;
-    AtomicString GetLeaveEvent() override;
-    AtomicString GetEnterEvent() override;
-
-   private:
     void Dispatch(EventTarget*,
                   EventTarget* related_target,
                   const AtomicString&,
-                  bool check_for_listener);
+                  bool check_for_listener) override;
+
+   private:
     PointerEventManager* pointer_event_manager_;
     PointerEvent* pointer_event_;
   };
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
index 7cbe0ee..cb195c0 100644
--- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
@@ -189,14 +189,14 @@
 }
 
 Vector<String> InspectorMemoryAgent::Symbolize(
-    const WebVector<void*>& addresses) {
+    const WebVector<const void*>& addresses) {
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
   // TODO(alph): Move symbolization to the client.
-  Vector<void*> addresses_to_symbolize;
-  for (size_t i = 0; i < addresses.size(); i++) {
-    void* address = addresses[i];
-    if (!symbols_cache_.Contains(address))
+  Vector<const void*> addresses_to_symbolize;
+  for (const void* address : addresses) {
+    if (!symbols_cache_.Contains(address)) {
       addresses_to_symbolize.push_back(address);
+    }
   }
 
   String text(base::debug::StackTrace(addresses_to_symbolize.data(),
@@ -217,7 +217,7 @@
 #endif
 
   Vector<String> result;
-  for (void* address : addresses) {
+  for (const void* address : addresses) {
     char buffer[20];
     std::snprintf(buffer, sizeof(buffer), "0x%" PRIxPTR,
                   reinterpret_cast<uintptr_t>(address));
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.h b/third_party/blink/renderer/core/inspector/inspector_memory_agent.h
index 16f8af71..518ff13 100644
--- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.h
@@ -68,13 +68,13 @@
       std::unique_ptr<protocol::Memory::SamplingProfile>*) override;
 
  private:
-  Vector<String> Symbolize(const WebVector<void*>& addresses);
+  Vector<String> Symbolize(const WebVector<const void*>& addresses);
   std::unique_ptr<protocol::Memory::SamplingProfile> GetSamplingProfileById(
       uint32_t id);
 
   Member<InspectedFrames> frames_;
   uint32_t profile_id_ = 0;
-  HashMap<void*, String> symbols_cache_;
+  HashMap<const void*, String> symbols_cache_;
 
   InspectorAgentState::Integer sampling_profile_interval_;
 
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index 251c2204..2e119f70 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -1061,6 +1061,7 @@
 
 int LayoutBox::PixelSnappedClientWidth() const {
   NOT_DESTROYED();
+  DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled());
   LayoutUnit left = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled()
                         ? PhysicalLocation().left
                         : Location().X();
@@ -1070,6 +1071,7 @@
 DISABLE_CFI_PERF
 int LayoutBox::PixelSnappedClientHeight() const {
   NOT_DESTROYED();
+  DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled());
   LayoutUnit top = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled()
                        ? PhysicalLocation().top
                        : Location().Y();
@@ -1156,6 +1158,7 @@
 
 int LayoutBox::PixelSnappedScrollWidth() const {
   NOT_DESTROYED();
+  DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled());
   LayoutUnit left = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled()
                         ? PhysicalLocation().left
                         : Location().X();
@@ -1164,6 +1167,7 @@
 
 int LayoutBox::PixelSnappedScrollHeight() const {
   NOT_DESTROYED();
+  DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled());
   LayoutUnit top = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled()
                        ? PhysicalLocation().top
                        : Location().Y();
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h
index 7b5eb8b7..f487fae8 100644
--- a/third_party/blink/renderer/core/layout/layout_box.h
+++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -1011,11 +1011,17 @@
 
   bool HasScrollableOverflowX() const {
     NOT_DESTROYED();
+    if (RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()) {
+      return ScrollsOverflowX() && ScrollWidth() != ClientWidth();
+    }
     return ScrollsOverflowX() &&
            PixelSnappedScrollWidth() != PixelSnappedClientWidth();
   }
   bool HasScrollableOverflowY() const {
     NOT_DESTROYED();
+    if (RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()) {
+      return ScrollsOverflowY() && ScrollHeight() != ClientHeight();
+    }
     return ScrollsOverflowY() &&
            PixelSnappedScrollHeight() != PixelSnappedClientHeight();
   }
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc
index d208ec1..1a2eb86 100644
--- a/third_party/blink/renderer/core/layout/layout_inline.cc
+++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -602,7 +602,7 @@
     // Fragment traversal requires a target fragment to be specified,
     // unless there's only one.
     DCHECK(!CanTraversePhysicalFragments() || target_fragment_idx >= 0 ||
-           !FirstFragment().NextFragment());
+           !IsFragmented());
     // Convert from inline fragment index to container fragment index, as the
     // inline may not start in the first fragment generated for the inline
     // formatting context.
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index c6731c2..9bb8aa17 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2234,8 +2234,9 @@
   while (!property_container->FirstFragment().HasLocalBorderBoxProperties()) {
     property_container = property_container->Container(skip_info);
     if (!property_container || (skip_info && skip_info->AncestorSkipped()) ||
-        property_container->FirstFragment().NextFragment())
+        property_container->IsFragmented()) {
       return nullptr;
+    }
   }
   if (container_properties) {
     if (property_container == this) {
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
index f00b17da..0c0578bd 100644
--- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
+++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -337,7 +337,7 @@
 static void WritePaintProperties(WTF::TextStream& ts,
                                  const LayoutObject& o,
                                  int indent) {
-  bool has_fragments = o.FirstFragment().NextFragment();
+  bool has_fragments = o.IsFragmented();
   if (has_fragments) {
     WriteIndent(ts, indent);
     ts << "fragments:\n";
@@ -482,15 +482,14 @@
       ts << " scrollX " << scroll_position.x();
     if (scroll_position.y())
       ts << " scrollY " << scroll_position.y();
-    if (layer.GetLayoutBox() &&
-        layer.GetLayoutBox()->PixelSnappedClientWidth() !=
-            layer.GetLayoutBox()->PixelSnappedScrollWidth())
-      ts << " scrollWidth " << layer.GetLayoutBox()->PixelSnappedScrollWidth();
-    if (layer.GetLayoutBox() &&
-        layer.GetLayoutBox()->PixelSnappedClientHeight() !=
-            layer.GetLayoutBox()->PixelSnappedScrollHeight())
-      ts << " scrollHeight "
-         << layer.GetLayoutBox()->PixelSnappedScrollHeight();
+    if (layer.GetLayoutBox() && layer.GetLayoutBox()->ClientWidth() !=
+                                    layer.GetLayoutBox()->ScrollWidth()) {
+      ts << " scrollWidth " << layer.GetLayoutBox()->ScrollWidth();
+    }
+    if (layer.GetLayoutBox() && layer.GetLayoutBox()->ClientHeight() !=
+                                    layer.GetLayoutBox()->ScrollHeight()) {
+      ts << " scrollHeight " << layer.GetLayoutBox()->ScrollHeight();
+    }
   }
 
   if (paint_phase == kLayerPaintPhaseBackground)
diff --git a/third_party/blink/renderer/core/paint/link_highlight_impl.cc b/third_party/blink/renderer/core/paint/link_highlight_impl.cc
index 20fea98..23d68e6c 100644
--- a/third_party/blink/renderer/core/paint/link_highlight_impl.cc
+++ b/third_party/blink/renderer/core/paint/link_highlight_impl.cc
@@ -301,7 +301,7 @@
   bool use_rounded_rects = !node_->GetDocument()
                                 .GetSettings()
                                 ->GetMockGestureTapHighlightsEnabled() &&
-                           !object->FirstFragment().NextFragment();
+                           !object->IsFragmented();
 
   wtf_size_t index = 0;
   for (FragmentDataIterator iterator(*object); !iterator.IsDone(); index++) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index cb5c0db..7cb4572 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1686,8 +1686,7 @@
   // As an optimization, pass nullptr as the new container_fragment if this
   // layer has only one fragment.
   const auto* new_container_fragment =
-      GetLayoutObject().FirstFragment().NextFragment() ? &local_fragment
-                                                       : nullptr;
+      GetLayoutObject().IsFragmented() ? &local_fragment : nullptr;
   return HitTestLayer(*this, new_container_fragment, result, new_recursion_data,
                       /*applied_transform*/ true, &new_transform_state,
                       z_offset, overflow_controls_only);
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
index 92f0634a..9d9099161 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -171,7 +171,7 @@
       !paint_layer_.IsUnderSVGHiddenContainer() && is_self_painting_layer;
 
   PaintResult result = kFullyPainted;
-  if (object.FirstFragment().NextFragment() ||
+  if (object.IsFragmented() ||
       // When printing, the LayoutView's background should extend infinitely
       // regardless of LayoutView's visual rect, so don't check intersection
       // between the visual rect and the cull rect (custom for each page).
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 1168bda..f1c6fcc 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -3580,8 +3580,9 @@
 
   // This fast path does not support iterating over each fragment, so do not
   // run the fast path in the presence of fragmentation.
-  if (object.FirstFragment().NextFragment())
+  if (object.IsFragmented()) {
     return false;
+  }
 
   auto* properties = object.FirstFragment().PaintProperties();
   // Cannot directly update properties if they have not been created yet.
@@ -3606,8 +3607,9 @@
 
   // This fast path does not support iterating over each fragment, so do not
   // run the fast path in the presence of fragmentation.
-  if (object.FirstFragment().NextFragment())
+  if (object.IsFragmented()) {
     return false;
+  }
 
   auto* properties = object.FirstFragment().PaintProperties();
   // Cannot directly update properties if they have not been created yet.
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
index 577fc66c..0d2f069c 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -4302,12 +4302,12 @@
   // top-left of the border box.
   EXPECT_EQ(PhysicalOffset(8, 8), target1->FirstFragment().PaintOffset());
   // |target1| is only in the first column.
-  EXPECT_FALSE(target1->FirstFragment().NextFragment());
+  EXPECT_FALSE(target1->IsFragmented());
 
   LayoutObject* target2 = GetLayoutObjectByElementId("target2");
   EXPECT_EQ(PhysicalOffset(158, 8), target2->FirstFragment().PaintOffset());
   // |target2| is only in the second column.
-  EXPECT_FALSE(target2->FirstFragment().NextFragment());
+  EXPECT_FALSE(target2->IsFragmented());
 }
 
 TEST_P(PaintPropertyTreeBuilderTest,
@@ -4367,9 +4367,9 @@
     LayoutObject* first = GetLayoutObjectByElementId("first");
     LayoutObject* second = GetLayoutObjectByElementId("second");
     EXPECT_EQ(PhysicalOffset(), first->FirstFragment().PaintOffset());
-    EXPECT_FALSE(first->FirstFragment().NextFragment());
+    EXPECT_FALSE(first->IsFragmented());
     EXPECT_EQ(PhysicalOffset(70, 0), second->FirstFragment().PaintOffset());
-    EXPECT_FALSE(second->FirstFragment().NextFragment());
+    EXPECT_FALSE(second->IsFragmented());
   };
 
   test();
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 f069a96..7b49c6a5 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
@@ -139,11 +139,13 @@
 }  // namespace
 
 ScrollbarTheme& ScrollbarTheme::NativeTheme() {
-  if (OverlayScrollbarsEnabled())
+  if (OverlayScrollbarsEnabled()) {
     return ScrollbarThemeOverlay::GetInstance();
+  }
 
-  if (FluentScrollbarsEnabled())
+  if (FluentScrollbarsEnabled()) {
     return ScrollbarThemeFluent::GetInstance();
+  }
 
   DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ());
   return theme;
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc
index cfd4748..0220360 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc
+++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc
@@ -4,7 +4,9 @@
 
 #include "third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h"
 
+#include "base/numerics/safe_conversions.h"
 #include "third_party/blink/public/platform/web_theme_engine.h"
+#include "third_party/blink/renderer/core/scroll/scrollbar.h"
 #include "third_party/blink/renderer/platform/theme/web_theme_engine_helper.h"
 #include "third_party/blink/renderer/platform/web_test_support.h"
 #include "ui/gfx/geometry/rect.h"
@@ -30,6 +32,15 @@
           ? scrollbar_track_thickness_
           : theme_engine->GetSize(WebThemeEngine::kPartScrollbarUpArrow)
                 .height();
+
+  is_fluent_overlay_scrollbar_enabled_ =
+      theme_engine->IsFluentOverlayScrollbarEnabled();
+  if (!is_fluent_overlay_scrollbar_enabled_) {
+    return;
+  }
+  // Hit testable invisible border around the scrollbar's track.
+  scrollbar_track_inset_ = theme_engine->GetPaintedScrollbarTrackInset();
+  scrollbar_track_thickness_ -= 2 * scrollbar_track_inset_;
 }
 
 int ScrollbarThemeFluent::ScrollbarThickness(float scale_from_dip,
@@ -37,8 +48,12 @@
   // The difference between track's and thumb's thicknesses should always be
   // even to have equal thumb offsets from both sides so the thumb can remain
   // in the middle of the track. Add one pixel if the difference is odd.
-  const int scrollbar_thickness =
-      static_cast<int>(scrollbar_track_thickness_ * scale_from_dip);
+  // TODO(https://crbug.com/1479169): Use ClampRound instead of ClampFloor.
+  int scrollbar_thickness =
+      base::ClampFloor(scrollbar_track_thickness_ * scale_from_dip);
+  if (UsesOverlayScrollbars()) {
+    scrollbar_thickness += 2 * ScrollbarTrackInsetPx(scale_from_dip);
+  }
   return (scrollbar_thickness - ThumbThickness(scale_from_dip)) % 2 != 0
              ? scrollbar_thickness + 1
              : scrollbar_thickness;
@@ -99,4 +114,70 @@
   }
 }
 
+bool ScrollbarThemeFluent::UsesOverlayScrollbars() const {
+  return is_fluent_overlay_scrollbar_enabled_;
+}
+
+void ScrollbarThemeFluent::PaintTrack(GraphicsContext& context,
+                                      const Scrollbar& scrollbar,
+                                      const gfx::Rect& rect) {
+  if (rect.IsEmpty()) {
+    return;
+  }
+  ScrollbarThemeAura::PaintTrack(
+      context, scrollbar,
+      UsesOverlayScrollbars() ? InsetTrackRect(scrollbar, rect) : rect);
+}
+
+void ScrollbarThemeFluent::PaintButton(GraphicsContext& context,
+                                       const Scrollbar& scrollbar,
+                                       const gfx::Rect& rect,
+                                       ScrollbarPart part) {
+  ScrollbarThemeAura::PaintButton(
+      context, scrollbar,
+      UsesOverlayScrollbars() ? InsetButtonRect(scrollbar, rect, part) : rect,
+      part);
+}
+
+gfx::Rect ScrollbarThemeFluent::InsetTrackRect(const Scrollbar& scrollbar,
+                                               gfx::Rect rect) {
+  int scaled_track_inset = ScrollbarTrackInsetPx(scrollbar.ScaleFromDIP());
+  if (scrollbar.Orientation() == kHorizontalScrollbar) {
+    rect.Inset(gfx::Insets::TLBR(scaled_track_inset, 0, scaled_track_inset, 0));
+  } else {
+    rect.Inset(gfx::Insets::TLBR(0, scaled_track_inset, 0, scaled_track_inset));
+  }
+  return rect;
+}
+
+gfx::Rect ScrollbarThemeFluent::InsetButtonRect(const Scrollbar& scrollbar,
+                                                gfx::Rect rect,
+                                                ScrollbarPart part) {
+  int scaled_track_inset = ScrollbarTrackInsetPx(scrollbar.ScaleFromDIP());
+  // Inset all sides of the button *except* the one that borders with the
+  // scrollbar track.
+  if (scrollbar.Orientation() == kHorizontalScrollbar) {
+    if (part == kBackButtonStartPart) {
+      rect.Inset(gfx::Insets::TLBR(scaled_track_inset, scaled_track_inset,
+                                   scaled_track_inset, 0));
+    } else {
+      rect.Inset(gfx::Insets::TLBR(scaled_track_inset, 0, scaled_track_inset,
+                                   scaled_track_inset));
+    }
+  } else {
+    if (part == kBackButtonStartPart) {
+      rect.Inset(gfx::Insets::TLBR(scaled_track_inset, scaled_track_inset, 0,
+                                   scaled_track_inset));
+    } else {
+      rect.Inset(gfx::Insets::TLBR(0, scaled_track_inset, scaled_track_inset,
+                                   scaled_track_inset));
+    }
+  }
+  return rect;
+}
+
+int ScrollbarThemeFluent::ScrollbarTrackInsetPx(float scale) {
+  return base::ClampRound(scale * scrollbar_track_inset_);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h
index 73be1f0..0aa1b07 100644
--- a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h
+++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h
@@ -24,6 +24,7 @@
 
   int ScrollbarThickness(float scale_from_dip,
                          EScrollbarWidth scrollbar_width) override;
+  bool UsesOverlayScrollbars() const override;
 
  protected:
   ScrollbarThemeFluent();
@@ -31,14 +32,34 @@
   gfx::Rect ThumbRect(const Scrollbar&) override;
   gfx::Size ButtonSize(const Scrollbar&) const override;
 
+  void PaintTrack(GraphicsContext&,
+                  const Scrollbar&,
+                  const gfx::Rect&) override;
+  void PaintButton(GraphicsContext& context,
+                   const Scrollbar& scrollbar,
+                   const gfx::Rect& rect,
+                   ScrollbarPart part) override;
+
  private:
   friend class ScrollbarThemeFluentMock;
   int ThumbThickness(const float scale_from_dip) const;
 
+  // Overlay scrollbar tracks have a invisible length-wise inset to give them a
+  // floating appearance.
+  gfx::Rect InsetButtonRect(const Scrollbar& scrollbar,
+                            gfx::Rect rect,
+                            ScrollbarPart part);
+  gfx::Rect InsetTrackRect(const Scrollbar& scrollbar, gfx::Rect rect);
+  int ScrollbarTrackInsetPx(float scale);
+
   // Button's height for vertical and width for the horizontal scrollbar.
   int scrollbar_button_length_;
   int scrollbar_thumb_thickness_;
   int scrollbar_track_thickness_;
+
+  // Overlay scrollbar-related variables.
+  int scrollbar_track_inset_ = 0;
+  bool is_fluent_overlay_scrollbar_enabled_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc
index adc3d91..4538a04 100644
--- a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc
+++ b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc
@@ -88,19 +88,28 @@
                     target_size.height() / viewport_size.height());
 }
 
+AffineTransform FEImage::SourceToDestinationTransform(
+    const LayoutObject& layout_object,
+    const gfx::RectF& dest_rect) const {
+  gfx::SizeF viewport_scale(GetFilter()->Scale(), GetFilter()->Scale());
+  if (element_->HasRelativeLengths()) {
+    viewport_scale =
+        ComputeViewportAdjustmentScale(layout_object, dest_rect.size());
+  }
+  AffineTransform transform;
+  transform.Translate(dest_rect.x(), dest_rect.y());
+  transform.Scale(viewport_scale.width(), viewport_scale.height());
+  return transform;
+}
+
 gfx::RectF FEImage::MapInputs(const gfx::RectF&) const {
   gfx::RectF dest_rect =
       GetFilter()->MapLocalRectToAbsoluteRect(FilterPrimitiveSubregion());
   if (const LayoutObject* layout_object = ReferencedLayoutObject()) {
-    gfx::RectF src_rect = GetLayoutObjectRepaintRect(*layout_object);
-    if (element_->HasRelativeLengths()) {
-      const gfx::SizeF viewport_scale =
-          ComputeViewportAdjustmentScale(*layout_object, dest_rect.size());
-      src_rect.Scale(viewport_scale.width(), viewport_scale.height());
-    } else {
-      src_rect = GetFilter()->MapLocalRectToAbsoluteRect(src_rect);
-    }
-    src_rect.Offset(dest_rect.OffsetFromOrigin());
+    const AffineTransform transform =
+        SourceToDestinationTransform(*layout_object, dest_rect);
+    const gfx::RectF src_rect =
+        transform.MapRect(GetLayoutObjectRepaintRect(*layout_object));
     dest_rect.Intersect(src_rect);
     return dest_rect;
   }
@@ -140,18 +149,10 @@
     const LayoutObject& layout_object,
     const gfx::RectF& dst_rect,
     const gfx::RectF& crop_rect) {
-  gfx::RectF src_rect = GetLayoutObjectRepaintRect(layout_object);
-  AffineTransform transform;
-  transform.Translate(dst_rect.x(), dst_rect.y());
-  if (element_->HasRelativeLengths()) {
-    const gfx::SizeF viewport_scale =
-        ComputeViewportAdjustmentScale(layout_object, dst_rect.size());
-    src_rect.Scale(viewport_scale.width(), viewport_scale.height());
-    transform.Scale(viewport_scale.width(), viewport_scale.height());
-  } else {
-    src_rect = GetFilter()->MapLocalRectToAbsoluteRect(src_rect);
-  }
-  src_rect.Offset(dst_rect.OffsetFromOrigin());
+  const AffineTransform transform =
+      SourceToDestinationTransform(layout_object, dst_rect);
+  const gfx::RectF src_rect =
+      transform.MapRect(GetLayoutObjectRepaintRect(layout_object));
   // Intersect with the (transformed) source rect to remove "empty" bits of the
   // image.
   const gfx::RectF cull_rect = gfx::IntersectRects(crop_rect, src_rect);
diff --git a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h
index dad782fd..9dd98cd 100644
--- a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h
+++ b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h
@@ -28,6 +28,7 @@
 
 namespace blink {
 
+class AffineTransform;
 class Image;
 class LayoutObject;
 class SVGElement;
@@ -55,6 +56,9 @@
     return kFilterEffectTypeImage;
   }
 
+  AffineTransform SourceToDestinationTransform(
+      const LayoutObject& layout_object,
+      const gfx::RectF& dest_rect) const;
   gfx::RectF MapInputs(const gfx::RectF&) const override;
 
   sk_sp<PaintFilter> CreateImageFilter() override;
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc b/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc
index eb8e832..bc56df7d4 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc
@@ -20,7 +20,7 @@
   auto* input = MakeGarbageCollected<V8URLPatternInput>(
       String::FromUTF8(reinterpret_cast<const char*>(data), size));
   URLPattern::Create(input, exception_state);
-  V8PerIsolateData::MainThreadIsolate()->RequestGarbageCollectionForTesting(
+  test_support.GetIsolate()->RequestGarbageCollectionForTesting(
       v8::Isolate::kFullGarbageCollection);
   return 0;
 }
diff --git a/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl b/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl
index 9272dff..d0aa07a 100644
--- a/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl
+++ b/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl
@@ -5,8 +5,16 @@
 // Information about a Bidding and Auction server style auction.
 // https://github.com/WICG/turtledove/blob/main/FLEDGE_browser_bidding_and_auction_API.md
 
+enum AdAuctionCoordinator {
+// Add coordinators here in alphabetical order.
+  "aws",
+  "gcp",
+};
+
 dictionary AdAuctionDataConfig {
   required USVString seller;
+  // TODO(1473331): Make `coordinator` required.
+  AdAuctionCoordinator coordinator;
 };
 
 dictionary AdAuctionData {
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
index 9d4d26c6..0a761b13 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -3760,15 +3760,31 @@
     return ScriptPromise();
   }
 
+  mojom::blink::AdAuctionCoordinator coordinator =
+      mojom::blink::AdAuctionCoordinator::kGCP;
+  if (config->hasCoordinator()) {
+    if (config->coordinator() == blink::V8AdAuctionCoordinator::Enum::kGcp) {
+      coordinator = mojom::blink::AdAuctionCoordinator::kGCP;
+    } else if (config->coordinator() ==
+               blink::V8AdAuctionCoordinator::Enum::kAws) {
+      coordinator = mojom::blink::AdAuctionCoordinator::kAWS;
+    } else {
+      // This should never happen because the error will be thrown by the IDL
+      // parser.
+      NOTREACHED_NORETURN();
+    }
+  }
+
   auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(
       script_state, exception_state.GetContext());
 
   ScriptPromise promise = resolver->Promise();
 
   ad_auction_service_->GetInterestGroupAdAuctionData(
-      seller, resolver->WrapCallbackInScriptScope(WTF::BindOnce(
-                  &NavigatorAuction::GetInterestGroupAdAuctionDataComplete,
-                  WrapPersistent(this))));
+      seller, coordinator,
+      resolver->WrapCallbackInScriptScope(WTF::BindOnce(
+          &NavigatorAuction::GetInterestGroupAdAuctionDataComplete,
+          WrapPersistent(this))));
   return promise;
 }
 
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
index 32b75a98..e9be331 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
@@ -44,20 +44,20 @@
     : proxy_thread_(std::move(proxy_thread)),
       host_thread_(std::move(host_thread)),
       sctp_transport_(std::move(sctp_transport)),
-      delegate_(delegate) {}
+      delegate_(MakeUnwrappingCrossThreadHandle(delegate)) {}
 
 void SctpTransportProxy::StartOnHostThread() {
   DCHECK(host_thread_->BelongsToCurrentThread());
   sctp_transport_->RegisterObserver(this);
   PostCrossThreadTask(
       *proxy_thread_, FROM_HERE,
-      CrossThreadBindOnce(&Delegate::OnStartCompleted, delegate_,
+      CrossThreadBindOnce(&Delegate::OnStartCompleted,
+                          MakeUnwrappingCrossThreadHandle(delegate_),
                           sctp_transport_->Information()));
 }
 
 void SctpTransportProxy::OnStateChange(webrtc::SctpTransportInformation info) {
   DCHECK(host_thread_->BelongsToCurrentThread());
-  DCHECK(delegate_);
   // Closed is the last state that can happen, so unregister when we see this.
   // Unregistering allows us to safely delete the proxy independent of the
   // state of the webrtc::SctpTransport.
@@ -66,10 +66,11 @@
   }
   PostCrossThreadTask(
       *proxy_thread_, FROM_HERE,
-      CrossThreadBindOnce(&Delegate::OnStateChange, delegate_, info));
+      CrossThreadBindOnce(&Delegate::OnStateChange,
+                          MakeUnwrappingCrossThreadHandle(delegate_), info));
   if (info.state() == webrtc::SctpTransportState::kClosed) {
     // Don't hold on to |delegate| any more.
-    delegate_ = nullptr;
+    delegate_.Clear();
   }
 }
 
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h
index 3152f9b7..969d601 100644
--- a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h
+++ b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h
@@ -8,7 +8,7 @@
 
 #include "base/memory/scoped_refptr.h"
 #include "base/task/single_thread_task_runner.h"
-#include "third_party/blink/renderer/platform/heap/cross_thread_persistent.h"
+#include "third_party/blink/renderer/platform/heap/cross_thread_handle.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/heap/visitor.h"
 #include "third_party/webrtc/api/sctp_transport_interface.h"
@@ -77,7 +77,7 @@
   const scoped_refptr<base::SingleThreadTaskRunner> proxy_thread_;
   const scoped_refptr<base::SingleThreadTaskRunner> host_thread_;
   const rtc::scoped_refptr<webrtc::SctpTransportInterface> sctp_transport_;
-  CrossThreadPersistent<Delegate> delegate_;
+  UnwrappingCrossThreadHandle<Delegate> delegate_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc
index f02d2cf..306fe24 100644
--- a/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc
@@ -27,7 +27,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
   ScriptState* script_state =
       ToScriptStateForMainWorld(&page_holder->GetFrame());
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc
index c9831883..ebb181f7 100644
--- a/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc
@@ -37,7 +37,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
   //
   // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc
index e5ef975..8ac0b3a 100644
--- a/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc
@@ -157,7 +157,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
 #if HAS_AAC_ENCODER
   base::test::ScopedFeatureList platform_aac(media::kPlatformAudioEncoder);
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
index a48dfcc8..6e7d0e2 100644
--- a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
+++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
@@ -57,18 +57,21 @@
 
 }  // namespace
 
-base::ScopedClosureRunner MakeScopedGarbageCollectionRequest() {
-  return base::ScopedClosureRunner(WTF::BindOnce([]() {
-    // Request a V8 GC. Oilpan will be invoked by the GC epilogue.
-    //
-    // Multiple GCs may be required to ensure everything is collected (due to
-    // a chain of persistent handles), so some objects may not be collected
-    // until a subsequent iteration. This is slow enough as is, so we compromise
-    // on one major GC, as opposed to the 5 used in V8GCController for unit
-    // tests.
-    V8PerIsolateData::MainThreadIsolate()->RequestGarbageCollectionForTesting(
-        v8::Isolate::kFullGarbageCollection);
-  }));
+base::ScopedClosureRunner MakeScopedGarbageCollectionRequest(
+    v8::Isolate* isolate) {
+  return base::ScopedClosureRunner(WTF::BindOnce(
+      [](v8::Isolate* isolate) {
+        // Request a V8 GC. Oilpan will be invoked by the GC epilogue.
+        //
+        // Multiple GCs may be required to ensure everything is collected (due
+        // to a chain of persistent handles), so some objects may not be
+        // collected until a subsequent iteration. This is slow enough as is, so
+        // we compromise on one major GC, as opposed to the 5 used in
+        // V8GCController for unit tests.
+        isolate->RequestGarbageCollectionForTesting(
+            v8::Isolate::kFullGarbageCollection);
+      },
+      WTF::Unretained(isolate)));
 }
 
 FakeFunction::FakeFunction(std::string name) : name_(std::move(name)) {}
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h
index a630bf4..87d4356 100644
--- a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h
+++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h
@@ -21,6 +21,7 @@
 #include "third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.pb.h"
 #include "third_party/blink/renderer/modules/webcodecs/video_frame.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "v8/include/v8-forward.h"
 
 #include <string>
 
@@ -33,7 +34,7 @@
 class DOMRectInit;
 class PlaneLayout;
 
-base::ScopedClosureRunner MakeScopedGarbageCollectionRequest();
+base::ScopedClosureRunner MakeScopedGarbageCollectionRequest(v8::Isolate*);
 
 class FakeFunction : public ScriptFunction::Callable {
  public:
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
index 8ceab1a..cde1f68 100644
--- a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
@@ -86,7 +86,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
   //
   // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc
index 7c9ac92..c12e61e 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc
@@ -37,7 +37,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
   //
   // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc
index 942510a..1a66890 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc
@@ -39,7 +39,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
   //
   // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc
index 39106c70..3a5db4f 100644
--- a/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc
+++ b/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc
@@ -29,7 +29,8 @@
   }();
 
   // Request a full GC upon returning.
-  auto scoped_gc = MakeScopedGarbageCollectionRequest();
+  auto scoped_gc =
+      MakeScopedGarbageCollectionRequest(test_support.GetIsolate());
 
   ScriptState* script_state =
       ToScriptStateForMainWorld(&page_holder->GetFrame());
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 54bdd442..3bdd9c4 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2169,6 +2169,10 @@
       status: "stable",
     },
     {
+      name: "LayoutNewOverflowLogic",
+      status: "stable",
+    },
+    {
       name: "LayoutNewSnapLogic",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc
index f48628cc..9cdc441 100644
--- a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc
+++ b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc
@@ -36,4 +36,8 @@
 #endif  // defined(ADDRESS_SANITIZER)
 }
 
+v8::Isolate* BlinkFuzzerTestSupport::GetIsolate() {
+  return content::GetMainThreadIsolateForTestEnvironment();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h
index 083316e..449cbcc0 100644
--- a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h
+++ b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h
@@ -7,6 +7,7 @@
 
 #include "base/at_exit.h"
 #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
+#include "v8/include/v8-forward.h"
 
 namespace blink {
 
@@ -23,6 +24,8 @@
   BlinkFuzzerTestSupport(int argc, char** argv);
   ~BlinkFuzzerTestSupport();
 
+  v8::Isolate* GetIsolate();
+
  private:
   base::AtExitManager at_exit_;
 };
diff --git a/third_party/blink/renderer/platform/text/platform_locale.cc b/third_party/blink/renderer/platform/text/platform_locale.cc
index 088b3b8..768191f 100644
--- a/third_party/blink/renderer/platform/text/platform_locale.cc
+++ b/third_party/blink/renderer/platform/text/platform_locale.cc
@@ -371,16 +371,9 @@
   DCHECK_EQ(input.Find(IsASCIISpace), WTF::kNotFound);
   start_index = 0;
   end_index = input.length();
-  if (negative_prefix_.empty() && negative_suffix_.empty()) {
-    if (input.StartsWith(positive_prefix_) &&
-        input.EndsWith(positive_suffix_)) {
-      is_negative = false;
-      start_index = positive_prefix_.length();
-      end_index -= positive_suffix_.length();
-    } else {
-      is_negative = true;
-    }
-  } else {
+  const bool negative_empty =
+      negative_prefix_.empty() && negative_suffix_.empty();
+  if (!negative_empty) {
     // For some locales the negative prefix and/or suffix are preceded or
     // followed by whitespace. Exclude that for the purposes of this search
     // since the input string has already been stripped of whitespace.
@@ -393,18 +386,21 @@
       is_negative = true;
       start_index = negative_prefix_without_whitespace.length();
       end_index -= negative_suffix_without_whitespace.length();
-    } else {
-      is_negative = false;
-      if (input.StartsWith(positive_prefix_) &&
-          input.EndsWith(positive_suffix_)) {
-        start_index = positive_prefix_.length();
-        end_index -= positive_suffix_.length();
-      } else {
-        return false;
-      }
+      return true;
     }
   }
-  return true;
+
+  // Note: Positive prefix and suffix may be empty, in which case this will
+  // always succeed.
+  if (input.StartsWith(positive_prefix_) && input.EndsWith(positive_suffix_)) {
+    is_negative = false;
+    start_index = positive_prefix_.length();
+    end_index -= positive_suffix_.length();
+    return true;
+  }
+
+  is_negative = negative_empty;
+  return is_negative;
 }
 
 unsigned Locale::MatchedDecimalSymbolIndex(const String& input,
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc
index a249f5b68..d707761f 100644
--- a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc
+++ b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc
@@ -14,6 +14,7 @@
 #include "ui/color/color_provider_utils.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/native_theme/native_theme.h"
+#include "ui/native_theme/native_theme_features.h"
 #include "ui/native_theme/overlay_scrollbar_constants_aura.h"
 
 namespace blink {
@@ -278,6 +279,14 @@
       NativeThemePart(part));
 }
 
+bool WebThemeEngineDefault::IsFluentOverlayScrollbarEnabled() const {
+  return ui::IsFluentOverlayScrollbarEnabled();
+}
+
+int WebThemeEngineDefault::GetPaintedScrollbarTrackInset() const {
+  return ui::NativeTheme::GetInstanceForWeb()->GetPaintedScrollbarTrackInset();
+}
+
 absl::optional<SkColor> WebThemeEngineDefault::GetSystemColor(
     WebThemeEngine::SystemThemeColor system_theme_color) const {
   return ui::NativeTheme::GetInstanceForWeb()->GetSystemThemeColor(
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_default.h b/third_party/blink/renderer/platform/theme/web_theme_engine_default.h
index 2b753be..a432fa7 100644
--- a/third_party/blink/renderer/platform/theme/web_theme_engine_default.h
+++ b/third_party/blink/renderer/platform/theme/web_theme_engine_default.h
@@ -51,6 +51,8 @@
   bool UpdateColorProviders(const ui::RendererColorMap& light_colors,
                             const ui::RendererColorMap& dark_colors) override;
   void EmulateForcedColors(bool is_dark_theme, bool is_web_test) override;
+  bool IsFluentOverlayScrollbarEnabled() const override;
+  int GetPaintedScrollbarTrackInset() const override;
 
  protected:
   const ui::ColorProvider* GetColorProviderForPainting(
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc
index 6dd6faea..d6e8852 100644
--- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc
+++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc
@@ -307,7 +307,6 @@
     bool is_threaded,
     bool is_for_embedded_frame,
     bool is_for_scalable_page,
-    bool is_for_web_test,
     const gfx::Size& initial_screen_size,
     float initial_device_scale_factor) {
   const base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess();
@@ -679,8 +678,6 @@
   settings.enable_variable_refresh_rate =
       ::features::IsVariableRefreshRateEnabled();
 
-  settings.is_threaded_web_test = is_for_web_test && is_threaded;
-
   std::tie(settings.tiling_interest_area_padding,
            settings.skewport_extrapolation_limit_in_screen_pixels) =
       GetTilingInterestAreaSizes();
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h
index 7b9b0d26e..7db7809 100644
--- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h
+++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h
@@ -20,7 +20,6 @@
     bool has_compositor,
     bool is_for_embedded_frame,
     bool is_for_scalable_page,
-    bool is_for_web_test,
     const gfx::Size& initial_screen_size,
     float initial_device_scale_factor);
 
diff --git a/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h b/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h
index d4a4886..9eca4f59 100644
--- a/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h
+++ b/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h
@@ -281,8 +281,6 @@
   void HandleInputEventWithLatencyOnInputHandlingThread(
       std::unique_ptr<WebCoalescedInputEvent>);
 
-  void QueueInputProcessedClosure();
-
   // The kInputBlocking task runner is for tasks which are on the critical path
   // of showing the effect of an already-received input event, and should be
   // prioritized above handling new input.
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index 7f66450c..23ebb09 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -196,8 +196,7 @@
     const display::ScreenInfo& screen_info = screen_infos.current();
     default_settings = GenerateLayerTreeSettings(
         compositing_thread_scheduler, is_embedded_, is_for_scalable_page_,
-        WebTestMode(), screen_info.rect.size(),
-        screen_info.device_scale_factor);
+        screen_info.rect.size(), screen_info.device_scale_factor);
     settings = &default_settings.value();
   }
   screen_infos_ = screen_infos;
@@ -644,8 +643,7 @@
   // state changes.
   const cc::LayerTreeSettings& settings = LayerTreeHost()->GetSettings();
   if (settings.disable_frame_rate_limit ||
-      settings.enable_variable_refresh_rate ||
-      (for_web_tests && ThreadScheduler::CompositorThreadScheduler())) {
+      settings.enable_variable_refresh_rate) {
     params->use_begin_frame_presentation_feedback =
         base::FeatureList::IsEnabled(
             features::kUseBeginFramePresentationFeedback);
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt
index 50f74a76..b42d5e5 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt
@@ -1,9 +1,9 @@
-Verifies that receiving a set-cookie header with invalid syntax sends a Network.ResponseReceivedExtraInfo event with the blocked cookie.
+Verifies that receiving a set-cookie header with only whitespace sends a Network.ResponseReceivedExtraInfo event with the blocked cookie.
 
-Invalid syntax blocked set-cookies:[
+NoCookieContent blocked set-cookies:[
     [0] : {
         blockedReasons : [
-            [0] : SyntaxError
+            [0] : NoCookieContent
         ]
         cookieLine : 
     }
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js
index 2461bd6..a18de796 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js
@@ -1,14 +1,14 @@
 (async function(testRunner) {
   const {page, session, dp} = await testRunner.startBlank(
-      `Verifies that receiving a set-cookie header with invalid syntax sends a Network.ResponseReceivedExtraInfo event with the blocked cookie.\n`);
+      `Verifies that receiving a set-cookie header with only whitespace sends a Network.ResponseReceivedExtraInfo event with the blocked cookie.\n`);
   await dp.Network.enable();
 
-  const setCookieInvalidSyntax = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie-invalid-syntax.php';
+  const setCookieInvalidSyntax = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie-no-cookie-content.php';
 
   const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session);
 
   const {requestExtraInfo, responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieInvalidSyntax);
-  testRunner.log(responseExtraInfo.params.blockedCookies, 'Invalid syntax blocked set-cookies:');
+  testRunner.log(responseExtraInfo.params.blockedCookies, 'NoCookieContent blocked set-cookies:');
 
   testRunner.completeTest();
 })
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-invalid-syntax.php b/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-no-cookie-content.php
similarity index 100%
rename from third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-invalid-syntax.php
rename to third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-no-cookie-content.php
diff --git a/third_party/catapult b/third_party/catapult
index 693c3fa..c9ccea1 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit 693c3fa3c2b617718dbbe1abd2ef0fc0910380b6
+Subproject commit c9ccea1a729cb6952cabdb42c192b87a9a08ba3a
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index c7a1ed2..6099a97 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit c7a1ed20f78b82abdad55681d847beb9b965a3eb
+Subproject commit 6099a9750a5666fa63898f7d004b36783d28e64e
diff --git a/third_party/depot_tools b/third_party/depot_tools
index 4dac5d6..50b27a5 160000
--- a/third_party/depot_tools
+++ b/third_party/depot_tools
@@ -1 +1 @@
-Subproject commit 4dac5d6b4b39a26d72698e701e59c47278d66fec
+Subproject commit 50b27a5308a405646b627691b48c55e007eb5418
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index 616289d..69e043f 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit 616289d464d11fbcc8c8b063af4d2b6c372f5e14
+Subproject commit 69e043f071f8ff003d40c9fe6ca3f266087119a5
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 614e1c8..257cb64 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 614e1c8242dfa60a241368d72c31384c14afaba3
+Subproject commit 257cb6402543b90ddd45043d94242b1824238e48
diff --git a/third_party/libavif/src b/third_party/libavif/src
index d1c26fa..3669d47 160000
--- a/third_party/libavif/src
+++ b/third_party/libavif/src
@@ -1 +1 @@
-Subproject commit d1c26facaf5a8a97919ceee06814d05d10e25622
+Subproject commit 3669d47e1f9f3ea5ab0e3a923b15fad185ac2209
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium
index 5b22fdf..403bb36 100644
--- a/third_party/nearby/README.chromium
+++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@
 Name: Nearby Connections Library
 Short Name: Nearby
 URL: https://github.com/google/nearby
-Version: 94df1ffc4c00ff142d2f1f7c6c603f80d922bca4
+Version: 8846f8b57e53276687955562f58d2bfdbf63b3a9
 License: Apache 2.0
 License File: LICENSE
 Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src
index 94df1ff..8846f8b 160000
--- a/third_party/nearby/src
+++ b/third_party/nearby/src
@@ -1 +1 @@
-Subproject commit 94df1ffc4c00ff142d2f1f7c6c603f80d922bca4
+Subproject commit 8846f8b57e53276687955562f58d2bfdbf63b3a9
diff --git a/third_party/skia b/third_party/skia
index c641367..0577d06 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit c6413673d2d4d6e3a4837d3cecfe152243042415
+Subproject commit 0577d064a86e401ad61ee1ea4203b97ce84cf50c
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py
index 518bc49..5b8248d9 100644
--- a/tools/binary_size/libsupersize/archive.py
+++ b/tools/binary_size/libsupersize/archive.py
@@ -538,6 +538,10 @@
                      help='Custom path to the root source directory.')
   group.add_argument('--output-directory',
                      help='Path to the root build directory.')
+  group.add_argument('--symbols-dir',
+                     default='lib.unstripped',
+                     help='Relative path containing unstripped .so files '
+                     '(for symbols) w.r.t. the output directory.')
   group.add_argument('--no-string-literals',
                      action='store_true',
                      help=('Do not create symbols for string literals '
@@ -684,8 +688,8 @@
   return map_path
 
 
-def _CreateNativeSpecs(*, tentative_output_dir, apk_infolist, elf_path,
-                       map_path, abi_filters, auto_abi_filters,
+def _CreateNativeSpecs(*, tentative_output_dir, symbols_dir, apk_infolist,
+                       elf_path, map_path, abi_filters, auto_abi_filters,
                        track_string_literals, ignore_linker_map, json_config,
                        on_config_error):
   if ignore_linker_map:
@@ -737,7 +741,7 @@
         # 'crazy.' when there is no longer interest in size comparisons for
         # these pre-N APKs.
         cur_elf_path = os.path.join(
-            tentative_output_dir, 'lib.unstripped',
+            tentative_output_dir, symbols_dir,
             posixpath.basename(apk_so_path.replace('crazy.', '')))
         if os.path.exists(cur_elf_path):
           logging.debug('Detected elf_path=%s', cur_elf_path)
@@ -910,6 +914,7 @@
     auto_abi_filters = not abi_filters and split_name == 'base'
     abi_filters, native_specs = _CreateNativeSpecs(
         tentative_output_dir=top_args.output_directory,
+        symbols_dir=sub_args.symbols_dir,
         apk_infolist=apk_infolist,
         elf_path=sub_args.elf_file or aux_elf_file,
         map_path=sub_args.map_file or aux_map_file,
diff --git a/tools/cast3p/runtime.version b/tools/cast3p/runtime.version
index a9d386a..ae9b866 100644
--- a/tools/cast3p/runtime.version
+++ b/tools/cast3p/runtime.version
@@ -1 +1 @@
-377328
+380696
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index da3c03d..bb231fd 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -104,7 +104,7 @@
     },
 
     'chromium.accessibility': {
-      'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient',
+      'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient_with_blink_symbol',
       'linux-blink-web-tests-force-accessibility-rel': 'release_bot_blink_accessibility_reclient',
     },
 
@@ -1048,7 +1048,7 @@
     },
 
     'tryserver.chromium.accessibility': {
-      'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient',
+      'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient_with_blink_symbol',
       'linux-blink-web-tests-force-accessibility-rel': 'release_bot_blink_accessibility_reclient',
     },
 
@@ -3621,6 +3621,10 @@
       'release_bot_reclient', 'fuchsia',
     ],
 
+    'release_bot_fuchsia_reclient_with_blink_symbol': [
+      'release_bot_reclient', 'fuchsia', 'blink_symbol', 'minimal_symbols',
+    ],
+
     'release_bot_mac_strip_minimal_symbols': [
       'release_bot', 'mac_strip', 'minimal_symbols',
     ],
@@ -3978,6 +3982,10 @@
       'gn_args': 'blink_enable_generated_code_formatting=true'
     },
 
+    'blink_symbol': {
+      'gn_args': 'blink_symbol_level=1'
+    },
+
     'brya': {
       'args_file': '//build/args/chromeos/brya.gni',
     },
diff --git a/tools/mb/mb_config_expectations/chromium.accessibility.json b/tools/mb/mb_config_expectations/chromium.accessibility.json
index ce2b5bf..11f9e6c 100644
--- a/tools/mb/mb_config_expectations/chromium.accessibility.json
+++ b/tools/mb/mb_config_expectations/chromium.accessibility.json
@@ -1,9 +1,11 @@
 {
   "fuchsia-x64-accessibility-rel": {
     "gn_args": {
+      "blink_symbol_level": 1,
       "dcheck_always_on": false,
       "is_component_build": false,
       "is_debug": false,
+      "symbol_level": 1,
       "target_os": "fuchsia",
       "use_remoteexec": true
     }
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json b/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json
index ce2b5bf..11f9e6c 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json
@@ -1,9 +1,11 @@
 {
   "fuchsia-x64-accessibility-rel": {
     "gn_args": {
+      "blink_symbol_level": 1,
       "dcheck_always_on": false,
       "is_component_build": false,
       "is_debug": false,
+      "symbol_level": 1,
       "target_os": "fuchsia",
       "use_remoteexec": true
     }
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index bc9124e..1594a51 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -39657,6 +39657,8 @@
   <suffix name="WebFeedFollow" label="For Web Feed follow recommendations."/>
   <suffix name="WebFeedPostFollowDialog"
       label="For Web Feed successful follow operations."/>
+  <suffix name="WebFeedPostFollowDialogWithUIUpdate"
+      label="For Web Feed successful follow operations after the UI update."/>
   <suffix name="WebUiHelpBubbleTest" label="For WebUiHelpBubbleTest feature."/>
   <suffix name="WebUITabStrip" label="For the WebUI tab strip."/>
   <affected-action name="InProductHelp.NotifyEvent.IPH"/>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index e2e0a6e..49c6b5c3 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -44082,6 +44082,9 @@
   <int value="4659" label="PercentOrCalcStickyUsedOffset"/>
   <int value="4660" label="PercentOrCalcRelativeUsedOffset"/>
   <int value="4661" label="AutoRelativeUsedOffset"/>
+  <int value="4662" label="ViewportFitContain"/>
+  <int value="4663" label="ViewportFitCover"/>
+  <int value="4664" label="ViewportFitCoverOrSafeAreaInsetBottom"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -61994,6 +61997,7 @@
       label="AutofillDoNotMigrateUnsupportedLocalCards:enabled"/>
   <int value="-1382918690" label="VirtualKeyboardApi:enabled"/>
   <int value="-1382671832" label="OmniboxUIExperimentVerticalMargin:enabled"/>
+  <int value="-1379844383" label="MacLoopbackAudioForCast:enabled"/>
   <int value="-1378071979" label="CroshSWA:enabled"/>
   <int value="-1377367284" label="SiteDataImprovements:disabled"/>
   <int value="-1377186702" label="DesktopIOSPromotion:disabled"/>
@@ -62510,6 +62514,7 @@
   <int value="-1134420065" label="CriticalPersistedTabData:disabled"/>
   <int value="-1134412904" label="PrivacySandboxSettings:disabled"/>
   <int value="-1134307340" label="stop-loading-in-background:enabled"/>
+  <int value="-1133285806" label="MacLoopbackAudioForScreenShare:disabled"/>
   <int value="-1132704128" label="AndroidPaymentAppsFilter:disabled"/>
   <int value="-1131726331" label="BackGestureRefactorAndroid:disabled"/>
   <int value="-1128981647" label="EnableOAuthIpp:enabled"/>
@@ -64211,6 +64216,7 @@
   <int value="-282770689"
       label="ExperimentalWebAppStoragePartitionIsolation:disabled"/>
   <int value="-281844827" label="AutofillCreditCardAblationExperiment:enabled"/>
+  <int value="-280129257" label="MacLoopbackAudioForScreenShare:enabled"/>
   <int value="-280064896" label="HelpAppAppsDiscovery:disabled"/>
   <int value="-279920685" label="affiliation-based-matching:enabled"/>
   <int value="-279493876" label="WebVRExperimentalRendering:enabled"/>
@@ -66766,6 +66772,7 @@
   <int value="996643125" label="EnableAppShortcutSearch:disabled"/>
   <int value="996701528" label="SystemKeyboardLock:enabled"/>
   <int value="996987392" label="SearchNavigationPrefetch:disabled"/>
+  <int value="997264173" label="MacLoopbackAudioForCast:disabled"/>
   <int value="998748600" label="SyncErrorInfoBarAndroid:disabled"/>
   <int value="998857679" label="DiscardExceptionsImprovements:enabled"/>
   <int value="1000045846" label="OverlayNewLayout:disabled"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index 740eca0..891d193 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -5217,67 +5217,6 @@
   </summary>
 </histogram>
 
-<histogram name="Android.WebView.Metrics.PackagesAllowList.ParseStatus"
-    enum="AppPackageNameAllowlistParseStatus" expires_after="2024-04-01">
-  <owner>avvall@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Records the result of parsing the apps package names allowlist used to
-    populate the &quot;app_package_name&quot; field in UMA metrics logs. This is
-    recorded when the AwAppsPackageNamesAllowlistComponentLoaderPolicy is
-    successfully loaded by EmbeddedComponentLoader, i.e when ComponentLoaded is
-    called by the loader.
-  </summary>
-</histogram>
-
-<histogram name="Android.WebView.Metrics.PackagesAllowList.RecordStatus"
-    enum="AppPackageNameLoggingRuleStatus" expires_after="2024-03-17">
-  <owner>avvall@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Records the status of the apps package names allowlist used to populate the
-    &quot;app_package_name&quot; field in UMA metrics log. The status tracks if
-    a new version is loaded, a cached one is used or if loading the allowlist
-    has failed. It's recorded everytime the app package name is queried when a
-    new metrics log is created.
-  </summary>
-</histogram>
-
-<histogram
-    name="Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay"
-    units="ms" expires_after="2024-04-01">
-  <owner>avvall@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Records the time delta between creating a AwMetricsServiceClient instance
-    during WebView startup and the time when the app package names allowlist is
-    loaded and looked up. This only records when a new version of the allowlist
-    is loaded successfully. i.e it's not recorded if the loading the allowlist
-    fails or if a cached version is used.
-  </summary>
-</histogram>
-
-<histogram name="Android.WebView.Metrics.PackagesAllowList.ThrottleStatus"
-    enum="Boolean" expires_after="2024-04-01">
-  <owner>avvall@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    Whether requests to query the app package names allowlist component is
-    throttled or not.
-  </summary>
-</histogram>
-
-<histogram name="Android.WebView.Metrics.PackagesAllowList.TimeToExpire"
-    units="hours" expires_after="2024-04-01">
-  <owner>avvall@chromium.org</owner>
-  <owner>src/android_webview/OWNERS</owner>
-  <summary>
-    How long before the app package names allowlist record cached in the client
-    expires. This is only recorded from Apps that are in the app package names
-    allowlist. Recorded every time a metrics log is being created.
-  </summary>
-</histogram>
-
 <histogram name="Android.WebView.MixedContent.Mode"
     enum="WebViewMixedContentMode" expires_after="2024-08-25">
   <owner>ntfschr@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index b342bc94..7b156b3 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -398,7 +398,7 @@
 </histogram>
 
 <histogram name="Enterprise.CBCMRealTimeReportEnqueue"
-    enum="EnterpriseCloudReportingStatusCode" expires_after="2023-10-01">
+    enum="EnterpriseCloudReportingStatusCode" expires_after="2024-10-01">
   <owner>zmin@chromium.org</owner>
   <owner>src/chrome/browser/enterprise/reporting/OWNERS</owner>
   <summary>
@@ -408,7 +408,7 @@
 </histogram>
 
 <histogram name="Enterprise.CBCMRemoteCommand.Executed"
-    enum="RemoteCommandExecutionStatus" expires_after="2023-10-01">
+    enum="RemoteCommandExecutionStatus" expires_after="2024-10-01">
   <owner>anthonyvd@chromium.org</owner>
   <owner>cbe-eng@google.com</owner>
   <summary>
@@ -419,7 +419,7 @@
 </histogram>
 
 <histogram name="Enterprise.CBCMRemoteCommand.Received"
-    enum="RemoteCommandReceivedStatus" expires_after="2023-12-31">
+    enum="RemoteCommandReceivedStatus" expires_after="2024-10-01">
   <owner>anthonyvd@chromium.org</owner>
   <owner>cbe-eng@google.com</owner>
   <summary>
@@ -431,7 +431,7 @@
 </histogram>
 
 <histogram name="Enterprise.CBCMRemoteCommandInvalidations"
-    enum="EnterprisePolicyInvalidations" expires_after="2023-10-01">
+    enum="EnterprisePolicyInvalidations" expires_after="2024-10-01">
   <owner>anthonyvd@chromium.org</owner>
   <owner>cbe-eng@google.com</owner>
   <summary>
@@ -454,7 +454,7 @@
 </histogram>
 
 <histogram name="Enterprise.CloudExtensionRequestUpdated"
-    enum="EnterpriseCloudExtensionRequestListUpdate" expires_after="2023-10-01">
+    enum="EnterpriseCloudExtensionRequestListUpdate" expires_after="2024-10-01">
   <owner>zmin@chromium.org</owner>
   <owner>src/chrome/browser/enterprise/reporting/OWNERS</owner>
   <summary>
@@ -3169,7 +3169,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.IsLocalMachine" enum="Boolean"
-    expires_after="2023-10-01">
+    expires_after="2024-10-01">
   <owner>zmin@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <owner>rogerta@chromium.org</owner>
@@ -3180,7 +3180,7 @@
 </histogram>
 
 <histogram name="EnterpriseCheck.IsLocalUser" enum="Boolean"
-    expires_after="2023-10-01">
+    expires_after="2024-10-01">
   <owner>zmin@chromium.org</owner>
   <owner>pastarmovj@chromium.org</owner>
   <owner>rogerta@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
index 076d204..869932a 100644
--- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
+++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -431,6 +431,8 @@
       summary="proactive Web Feed follow recommendations"/>
   <variant name="IPH_WebFeedPostFollowDialog"
       summary="Web Feed successful follow operations"/>
+  <variant name="IPH_WebFeedPostFollowDialogWithUIUpdate"
+      summary="Web Feed successful follow operations with UI update"/>
   <variant name="IPH_WebUiHelpBubbleTest"
       summary="testing the WebUI help bubble"/>
   <variant name="IPH_WebUITabStrip" summary="opening the WebUI tab strip"/>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 4106980..51c411e 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -581,6 +581,45 @@
   </summary>
 </histogram>
 
+<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimedOut"
+    enum="Boolean" expires_after="2024-08-09">
+  <owner>mfoltz@chromium.org</owner>
+  <owner>olka@chromium.org</owner>
+  <owner>webrtc-audio-uma@google.com</owner>
+  <summary>
+    Indicates if SCShareableContent enumeration has timed out during a call to
+    SCKAudioInputStream::Open(). The timeout exists to prevent a deadlock if the
+    API is misbehaving. We do not expect any timeouts under normal conditions.
+  </summary>
+</histogram>
+
+<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimeMs" units="ms"
+    expires_after="2024-08-09">
+  <owner>mfoltz@chromium.org</owner>
+  <owner>olka@chromium.org</owner>
+  <owner>webrtc-audio-uma@google.com</owner>
+  <summary>
+    Measures the time required for SCShareableContent enumeration (displays and
+    open applications/windows) when calling SCKAudioInputStream::Open(). The
+    duration can vary based on the amount of applications and windows open on
+    the system. This enumeration is a blocking operation, and as such should
+    complete as fast as possible. If metrics show long times, the operation
+    might have to be made asynchronous.
+  </summary>
+</histogram>
+
+<histogram name="Media.Audio.Capture.SCK.StreamError" units="errorcode"
+    expires_after="2024-08-09">
+  <owner>mfoltz@chromium.org</owner>
+  <owner>olka@chromium.org</owner>
+  <owner>webrtc-audio-uma@google.com</owner>
+  <summary>
+    Error codes reported by ScreenCaptureKit in
+    SCKAudioInputStream::OnStreamError() during stream setup or while streaming
+    samples.
+  </summary>
+</histogram>
+
 <histogram name="Media.Audio.Capture.StreamCallbackError2"
     enum="AudioCaptureDeviceError" expires_after="never">
 <!-- expires-never: Audio pipeline health metric. -->
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index bc055b5d..31fdb63 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -2492,26 +2492,6 @@
   </summary>
 </histogram>
 
-<histogram name="PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"
-    units="ms" expires_after="2023-08-08">
-  <owner>jonross@chromium.org</owner>
-  <owner>graphics-dev@chromium.org</owner>
-  <summary>
-    'Swap time' is the timestamp of the renderer submitting a CompositorFrame,
-    and 'Presentation time' is the timestamp of the frame becoming visible on
-    screen. This metric measures the duration between the swap-time and the
-    presentation-time. This is recorded only if a valid presentation-timestamp
-    is available. See PageLoad.Internal.Renderer.PresentationTime.Valid for how
-    often the presentation-timestamp is valid. This is reported only for
-    compositor-frames that report a paint-timing metric (e.g.
-    FirstContentfulPaint etc.), and after that frame has been displayed on
-    screen.
-
-    The metric had expired on 2020-09-27, and re-enabled on 2021-03-17. So the
-    data within this period is incomplete.
-  </summary>
-</histogram>
-
 <histogram name="PageLoad.Internal.Renderer.PresentationTime.Valid"
     enum="Boolean" expires_after="2024-03-17">
   <owner>jonross@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml
index 8746371..13b4f23 100644
--- a/tools/metrics/histograms/metadata/power/histograms.xml
+++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -1118,6 +1118,41 @@
   </summary>
 </histogram>
 
+<histogram name="Power.BatteryLife.Detail.RollingAverage.{BatteryCapacityType}"
+    units="minute" expires_after="2024-05-12">
+  <owner>puthik@chromium.org</owner>
+  <owner>chromeos-platform-power@google.com</owner>
+  <summary>
+    ChromeOS rolling average of the battery life while in active state, measured
+    in minutes using the {BatteryCapacityType}.
+
+    This is calculated by taking the average of the last 10 samples of the
+    Power.BatteryLife.{BatteryCapacityType} metrics.
+
+    The detail version put the data outside of 5-13 hours in to the underflow
+    and overflow bucket to have more data resolution at the median range.
+  </summary>
+  <token key="BatteryCapacityType" variants="BatteryCapacityType"/>
+</histogram>
+
+<histogram name="Power.BatteryLife.Detail.{BatteryCapacityType}" units="minute"
+    expires_after="2024-05-12">
+  <owner>puthik@chromium.org</owner>
+  <owner>chromeos-platform-power@google.com</owner>
+  <summary>
+    Chrome OS battery life while in active state, measured in minutes using the
+    {BatteryCapacityType}.
+
+    This is calculated using size of the battery divided by the battery
+    discharge rate sampling, i.e., Power.BatteryDischargeRate. Note that the
+    size of the battery is derated by the low battery shutdown percent.
+
+    The detail version put the data outside of 5-13 hours in to the underflow
+    and overflow bucket to have more data resolution at the median range.
+  </summary>
+  <token key="BatteryCapacityType" variants="BatteryCapacityType"/>
+</histogram>
+
 <histogram name="Power.BatteryLife.RollingAverage.{BatteryCapacityType}"
     units="minute" expires_after="2024-05-12">
   <owner>puthik@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml
index 01b5d9b..753fa42 100644
--- a/tools/metrics/histograms/metadata/printing/histograms.xml
+++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -92,6 +92,35 @@
   </summary>
 </histogram>
 
+<histogram name="Printing.CUPS.AutomaticIppSetupResultOfUsbPrinterWithPpd"
+    enum="PrinterSetupResult" expires_after="2024-04-01">
+  <owner>pawliczek@chromium.org</owner>
+  <owner>bmgordon@chromium.org</owner>
+  <owner>project-bolton@google.com</owner>
+  <summary>
+    The success or error code for the Ipp Everywhere setup of a USB printer. The
+    result is recorded only if all the following conditions are fulfilled: 1.
+    The setup procedure was initiated automatically when a USB printer was
+    physically connected to the device. 2. There is a matching PPD file that can
+    be used to setup the printer. 3. The printer supports IPP over USB protocol.
+  </summary>
+</histogram>
+
+<histogram
+    name="Printing.CUPS.AutomaticPpdSetupResultOfUsbPrinterSupportingIpp"
+    enum="PrinterSetupResult" expires_after="2024-04-01">
+  <owner>pawliczek@chromium.org</owner>
+  <owner>bmgordon@chromium.org</owner>
+  <owner>project-bolton@google.com</owner>
+  <summary>
+    The success or error code for the PPD-based setup of a USB printer. The
+    result is recorded only if all the following conditions are fulfilled: 1.
+    The setup procedure was initiated automatically when a USB printer was
+    physically connected to the device. 2. There is a matching PPD file that can
+    be used to setup the printer. 3. The printer supports IPP over USB protocol.
+  </summary>
+</histogram>
+
 <histogram name="Printing.CUPS.HighestIppVersion" enum="IppVersion"
     expires_after="2022-04-17">
   <owner>skau@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml
index 852074c..99192c5 100644
--- a/tools/metrics/histograms/metadata/uma/histograms.xml
+++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -783,9 +783,10 @@
   <summary>
     Sample rate applied to this client, expressed as number of clients per 1000
     that are in the sample. Recorded on every log upload but only if the client
-    is eligible for sampling. (As of September 2019, the only clients eligible
-    for sampling are Windows and Android installs on which the UMA checkbox was
-    enabled by default.)
+    is eligible for sampling. (As of February 2021, all clients on Android and
+    Windows are eligible for sampling. Prior to Jan 26 2021, only Windows and
+    Android installs on which the UMA checkbox was enabled by default were
+    eligible, see b/161848997).
 
     Clients not eligible for sampling will not have this histogram recorded.
 
diff --git a/ui/aura/screen_ozone.cc b/ui/aura/screen_ozone.cc
index 7c0c498b2..5d95311a 100644
--- a/ui/aura/screen_ozone.cc
+++ b/ui/aura/screen_ozone.cc
@@ -19,13 +19,7 @@
 ScreenOzone::ScreenOzone() {
   DCHECK(!display::Screen::HasScreen());
   display::Screen::SetScreenInstance(this);
-}
 
-ScreenOzone::~ScreenOzone() {
-  display::Screen::SetScreenInstance(nullptr);
-}
-
-void ScreenOzone::Initialize() {
   auto* platform = ui::OzonePlatform::GetInstance();
   platform_screen_ = platform->CreateScreen();
   if (platform_screen_) {
@@ -40,6 +34,10 @@
   }
 }
 
+ScreenOzone::~ScreenOzone() {
+  display::Screen::SetScreenInstance(nullptr);
+}
+
 // static
 bool ScreenOzone::IsOzoneInitialized() {
   return ui::OzonePlatform::IsInitialized();
@@ -179,17 +177,4 @@
 
 void ScreenOzone::OnBeforePlatformScreenInit() {}
 
-ScopedScreenOzone::ScopedScreenOzone(const base::Location& location)
-    : ScopedNativeScreen(/*call_maybe_init=*/false, location) {
-  MaybeInit();
-}
-
-ScopedScreenOzone::~ScopedScreenOzone() = default;
-
-display::Screen* ScopedScreenOzone::CreateScreen() {
-  auto* screen = new ScreenOzone();
-  screen->Initialize();
-  return screen;
-}
-
 }  // namespace aura
diff --git a/ui/aura/screen_ozone.h b/ui/aura/screen_ozone.h
index 0e0ad353..73ffb221 100644
--- a/ui/aura/screen_ozone.h
+++ b/ui/aura/screen_ozone.h
@@ -27,8 +27,6 @@
 
   ~ScreenOzone() override;
 
-  void Initialize();
-
   // display::Screen interface.
   gfx::Point GetCursorScreenPoint() override;
   bool IsWindowUnderCursor(gfx::NativeWindow window) override;
@@ -101,19 +99,6 @@
   std::unique_ptr<ui::PlatformScreen> platform_screen_;
 };
 
-// ScopedScreenOzone creates a ScreenOzone instead of NativeScreen
-// (created by `CreateNativeScreen()`) if the screen hasn't been set.
-class AURA_EXPORT ScopedScreenOzone : public display::ScopedNativeScreen {
- public:
-  explicit ScopedScreenOzone(const base::Location& location = FROM_HERE);
-  ScopedScreenOzone(const ScopedScreenOzone&) = delete;
-  ScopedScreenOzone operator=(const ScopedScreenOzone&) = delete;
-  ~ScopedScreenOzone() override;
-
- private:
-  display::Screen* CreateScreen() override;
-};
-
 }  // namespace aura
 
 #endif  // UI_AURA_SCREEN_OZONE_H_
diff --git a/ui/display/display.cc b/ui/display/display.cc
index 5200e03..96eb41e 100644
--- a/ui/display/display.cc
+++ b/ui/display/display.cc
@@ -350,7 +350,16 @@
           color_space = GetForcedDisplayColorProfile();
         }
 #endif
-        return new DisplayColorSpacesRef(gfx::DisplayColorSpaces(color_space));
+        // The default format on Mac is BGRA in screen_mac.cc, so we set it here
+        // too so that it matches with --ensure-forced-color-profile.
+        const gfx::BufferFormat format =
+#if BUILDFLAG(IS_MAC)
+            gfx::BufferFormat::BGRA_8888;
+#else
+            gfx::BufferFormat::RGBA_8888;
+#endif
+        return base::MakeRefCounted<DisplayColorSpacesRef>(
+            gfx::DisplayColorSpaces(color_space, format));
       }();
   return default_color_spaces_ref;
 }
diff --git a/ui/display/mac/screen_mac.mm b/ui/display/mac/screen_mac.mm
index 18d1dbb..074d92bd 100644
--- a/ui/display/mac/screen_mac.mm
+++ b/ui/display/mac/screen_mac.mm
@@ -128,7 +128,7 @@
     }
   }
   gfx::DisplayColorSpaces display_color_spaces(icc_profile.GetColorSpace(),
-                                               gfx::BufferFormat::RGBA_8888);
+                                               gfx::BufferFormat::BGRA_8888);
   if (HasForceDisplayColorProfile()) {
     if (Display::HasEnsureForcedColorProfile()) {
       if (display_color_spaces != display.GetColorSpaces()) {
diff --git a/ui/display/screen.cc b/ui/display/screen.cc
index b74a058..5e8e23a 100644
--- a/ui/display/screen.cc
+++ b/ui/display/screen.cc
@@ -217,38 +217,20 @@
   return result;
 }
 
-#if !BUILDFLAG(IS_ANDROID)
+#if BUILDFLAG(IS_APPLE)
 
 ScopedNativeScreen::ScopedNativeScreen(const base::Location& location) {
-  MaybeInit(location);
-}
-
-ScopedNativeScreen::ScopedNativeScreen(bool call_maybe_init,
-                                       const base::Location& location) {
-  if (call_maybe_init)
-    MaybeInit(location);
-}
-
-ScopedNativeScreen::~ScopedNativeScreen() {
-  Shutdown();
-}
-
-void ScopedNativeScreen::MaybeInit(const base::Location& location) {
-  maybe_init_called_ = true;
   if (!Screen::HasScreen()) {
 #if BUILDFLAG(IS_IOS)
     Screen::GetScreen();
 #else
-    screen_ = base::WrapUnique(CreateScreen());
-    // ScreenOzone and DesktopScreenWin sets the instance by itself.
-    if (Screen::GetScreen() != screen_.get())
-      Screen::SetScreenInstance(screen_.get(), location);
+    screen_ = base::WrapUnique(CreateNativeScreen());
+    Screen::SetScreenInstance(screen_.get(), location);
 #endif
   }
 }
 
-void ScopedNativeScreen::Shutdown() {
-  DCHECK(maybe_init_called_);
+ScopedNativeScreen::~ScopedNativeScreen() {
   if (screen_) {
     DCHECK_EQ(screen_.get(), Screen::GetScreen());
     Screen::SetScreenInstance(nullptr);
@@ -256,10 +238,6 @@
   }
 }
 
-Screen* ScopedNativeScreen::CreateScreen() {
-  return CreateNativeScreen();
-}
-
 #endif
 
 }  // namespace display
diff --git a/ui/display/screen.h b/ui/display/screen.h
index 71f50d32..04753f8 100644
--- a/ui/display/screen.h
+++ b/ui/display/screen.h
@@ -237,37 +237,24 @@
 #endif  // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
 };
 
+#if BUILDFLAG(IS_APPLE)
+
+// TODO(oshima): move this to separate apple specific file.
+
 // TODO(crbug.com/1317416): Make this static private member of
 // ScopedNativeScreen.
 DISPLAY_EXPORT Screen* CreateNativeScreen();
 
-// Android does not have `CreateNativeScreen()`.
-#if !BUILDFLAG(IS_ANDROID)
-
 // ScopedNativeScreen creates a native screen if there is no screen created yet
 // (e.g. by a unit test).
-class DISPLAY_EXPORT ScopedNativeScreen {
+class DISPLAY_EXPORT ScopedNativeScreen final {
  public:
   explicit ScopedNativeScreen(const base::Location& location = FROM_HERE);
   ScopedNativeScreen(const ScopedNativeScreen&) = delete;
   ScopedNativeScreen& operator=(const ScopedNativeScreen&) = delete;
-  virtual ~ScopedNativeScreen();
-
-  // Create and initialize the screen instance if the screen instance does not
-  // exist yet.
-  void MaybeInit(const base::Location& location = FROM_HERE);
-  void Shutdown();
-
-  Screen* screen() { return screen_.get(); }
-
-  virtual Screen* CreateScreen();
-
- protected:
-  explicit ScopedNativeScreen(bool call_maybe_init,
-                              const base::Location& location = FROM_HERE);
+  ~ScopedNativeScreen();
 
  private:
-  bool maybe_init_called_{false};
   std::unique_ptr<Screen> screen_;
 };
 
diff --git a/ui/display/screen_aura.cc b/ui/display/screen_aura.cc
index f880e318..dadad80b 100644
--- a/ui/display/screen_aura.cc
+++ b/ui/display/screen_aura.cc
@@ -13,9 +13,4 @@
   return view;
 }
 
-Screen* CreateNativeScreen() {
-  NOTREACHED() << "Implementation should be installed at higher level.";
-  return NULL;
-}
-
 }  // namespace display
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc
index d017d73c..18722961 100644
--- a/ui/native_theme/native_theme.cc
+++ b/ui/native_theme/native_theme.cc
@@ -349,4 +349,7 @@
   return ShouldUseDarkColors() ? ColorScheme::kDark : ColorScheme::kLight;
 }
 
+int NativeTheme::GetPaintedScrollbarTrackInset() const {
+  return 0;
+}
 }  // namespace ui
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h
index 341248a..ddfd9e4 100644
--- a/ui/native_theme/native_theme.h
+++ b/ui/native_theme/native_theme.h
@@ -381,6 +381,7 @@
   virtual gfx::Size GetPartSize(Part part,
                                 State state,
                                 const ExtraParams& extra) const = 0;
+  virtual int GetPaintedScrollbarTrackInset() const;
 
   virtual float GetBorderRadiusForPart(Part part,
                                        float width,
diff --git a/ui/native_theme/native_theme_constants_fluent.h b/ui/native_theme/native_theme_constants_fluent.h
index 8cfb69e..d76bd242 100644
--- a/ui/native_theme/native_theme_constants_fluent.h
+++ b/ui/native_theme/native_theme_constants_fluent.h
@@ -61,6 +61,11 @@
 constexpr char kFluentScrollbarLeftArrow[] = "\uEDD9";
 constexpr char kFluentScrollbarRightArrow[] = "\uEDDA";
 
+// Track and button inset to be applied at the time of painting overlay
+// scrollbars. This will yield a 1dp border around the track that is
+// transparent yet interactive.
+constexpr int kFluentPaintedScrollbarTrackInset = 1;
+
 }  // namespace ui
 
 #endif  // UI_NATIVE_THEME_NATIVE_THEME_CONSTANTS_FLUENT_H_
diff --git a/ui/native_theme/native_theme_fluent.cc b/ui/native_theme/native_theme_fluent.cc
index d1234e9..3c59bdc 100644
--- a/ui/native_theme/native_theme_fluent.cc
+++ b/ui/native_theme/native_theme_fluent.cc
@@ -5,6 +5,7 @@
 #include "ui/native_theme/native_theme_fluent.h"
 
 #include "base/no_destructor.h"
+#include "base/notreached.h"
 #include "cc/paint/paint_canvas.h"
 #include "cc/paint/paint_flags.h"
 #include "third_party/skia/include/core/SkFont.h"
@@ -16,6 +17,7 @@
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/rrect_f.h"
 #include "ui/native_theme/native_theme_constants_fluent.h"
+#include "ui/native_theme/native_theme_features.h"
 
 namespace ui {
 
@@ -338,9 +340,11 @@
     case Part::kScrollbarRightArrow:
       return kFluentScrollbarRightArrow;
     default:
-      NOTREACHED();
-      return nullptr;
+      NOTREACHED_NORETURN();
   }
 }
 
+int NativeThemeFluent::GetPaintedScrollbarTrackInset() const {
+  return kFluentPaintedScrollbarTrackInset;
+}
 }  // namespace ui
diff --git a/ui/native_theme/native_theme_fluent.h b/ui/native_theme/native_theme_fluent.h
index 90d097a..18945a2 100644
--- a/ui/native_theme/native_theme_fluent.h
+++ b/ui/native_theme/native_theme_fluent.h
@@ -59,6 +59,7 @@
   gfx::Size GetPartSize(Part part,
                         State state,
                         const ExtraParams& extra) const override;
+  int GetPaintedScrollbarTrackInset() const override;
 
  private:
   friend class NativeThemeFluentTest;
diff --git a/ui/views/test/test_desktop_screen_ozone.cc b/ui/views/test/test_desktop_screen_ozone.cc
index f5ba433..bb9fa210 100644
--- a/ui/views/test/test_desktop_screen_ozone.cc
+++ b/ui/views/test/test_desktop_screen_ozone.cc
@@ -11,9 +11,7 @@
 
 // static
 std::unique_ptr<display::Screen> TestDesktopScreenOzone::Create() {
-  auto screen = std::make_unique<TestDesktopScreenOzone>();
-  screen->Initialize();
-  return screen;
+  return std::make_unique<TestDesktopScreenOzone>();
 }
 
 TestDesktopScreenOzone* TestDesktopScreenOzone::GetInstance() {
diff --git a/ui/views/widget/desktop_aura/desktop_screen_ozone.cc b/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
index 13fe3b7..a6f4fea 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
@@ -27,9 +27,7 @@
 
 #if !BUILDFLAG(IS_LINUX)
 std::unique_ptr<display::Screen> CreateDesktopScreen() {
-  auto screen = std::make_unique<DesktopScreenOzone>();
-  screen->Initialize();
-  return screen;
+  return std::make_unique<DesktopScreenOzone>();
 }
 #endif
 
diff --git a/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc b/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc
index ca6f442..687eff5 100644
--- a/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc
@@ -50,9 +50,7 @@
 };
 
 std::unique_ptr<display::Screen> CreateDesktopScreen() {
-  auto screen = std::make_unique<DesktopScreenOzoneLinux>();
-  screen->Initialize();
-  return screen;
+  return std::make_unique<DesktopScreenOzoneLinux>();
 }
 
 }  // namespace views
diff --git a/ui/webui/resources/cr_components/omnibox/realbox_match.ts b/ui/webui/resources/cr_components/omnibox/realbox_match.ts
index 7548a3d0..c353d64 100644
--- a/ui/webui/resources/cr_components/omnibox/realbox_match.ts
+++ b/ui/webui/resources/cr_components/omnibox/realbox_match.ts
@@ -244,14 +244,12 @@
       // Only handle main (generally left) button presses.
       return;
     }
-    this.dispatchEvent(new CustomEvent('match-remove', {
-      bubbles: true,
-      composed: true,
-      detail: this.matchIndex,
-    }));
 
     e.preventDefault();   // Prevents default browser action (navigation).
     e.stopPropagation();  // Prevents <iron-selector> from selecting the match.
+
+    this.pageHandler_.deleteAutocompleteMatch(
+        this.matchIndex, this.match.destinationUrl);
   }
 
   private onRemoveButtonMouseDown_(e: Event) {
diff --git a/v8 b/v8
index 160c55f..cf3e1f0 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 160c55f1d4b89c8a9e249130838d9e729325b528
+Subproject commit cf3e1f0da09e0b0f79590acafeca0ce554a4b16b