diff --git a/BUILD.gn b/BUILD.gn
index 1f1f8c29..9f9e1e42 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1749,22 +1749,16 @@
   }
 }
 
-if (enable_js_type_check) {
+if (is_chromeos_ash && enable_js_type_check) {
   group("webui_closure_compile") {
     testonly = true
-    if (is_ios) {
-      data_deps = [ "ui/webui/resources/js/ios:closure_compile" ]
-    } else if (is_chromeos_ash) {
-      data_deps = [
-        "ash/webui:closure_compile",
-        "chrome/browser/resources:closure_compile",
-        "chrome/test/data/webui:closure_compile",
-        "mojo/public/tools/bindings/generators/js_templates/lite/test:closure_compile",
-        "ui/file_manager:closure_compile",
-      ]
-    } else if (is_android) {
-      data_deps = [ "chrome/browser/resources:closure_compile" ]
-    }
+    data_deps = [
+      "ash/webui:closure_compile",
+      "chrome/browser/resources:closure_compile",
+      "chrome/test/data/webui:closure_compile",
+      "mojo/public/tools/bindings/generators/js_templates/lite/test:closure_compile",
+      "ui/file_manager:closure_compile",
+    ]
   }
 }
 
diff --git a/DEPS b/DEPS
index 3f6ea12..d240a87 100644
--- a/DEPS
+++ b/DEPS
@@ -304,15 +304,15 @@
   # 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': 'b1398c9c64a878e4d3e5d8268b0a01bbda060857',
+  'skia_revision': '787feb9bce958b384ed5ac3540f66ccee995799f',
   # 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': '38e076c60d6ac36430c76eba09b84b106ea27fb7',
+  'v8_revision': 'bae471798c44a9c74535d84763f8df0783f3984c',
   # 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': 'f7b5d5d1e0b6b4a9263c56a83e6cacf87904fdee',
+  'angle_revision': 'e960355a9a22876559e251953080349a755bb497',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -375,7 +375,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '1a41c2d59d33afe322a9d0aca8ea5534950ff4cc',
+  'catapult_revision': '4d42668497b0dfda68985c15abd012ec68135325',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -383,7 +383,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': '3824ca8aaded14e253339720d3450c8db6a1a5c0',
+  'devtools_frontend_revision': '9ce7b48e6fe5aeb2a5585da4490ff2f76911b6fa',
   # 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.
@@ -419,11 +419,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '73735fde955fd6f6d052ef5c73d43d69ccf03a48',
+  'dawn_revision': '0f72763efd10050192de79255504265985c4a4f2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '78c9c138bee400ca95aefc10f2ae7c7b72c8d103',
+  'quiche_revision': 'ba1faf0cdc7ae5aed79f907d16eacaeac22b98f2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -770,7 +770,7 @@
 
   'src/clank': {
     'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
-    '714a601d098526f9822b1c87b3b7713725b814b9',
+    '546fb1c936ae81f7cea8b3c521af866b303229be',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1204,13 +1204,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'bf7eb5292ca16f46a77a4ca35a944c3397cb5d9d',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'c8f23e26bee90ce6b02211c9489d4e4e947af02a',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'a14f5b6c7095a09f2527649b685947b5a56b9f7f',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '8463f321ba6713c0929ae6840ffdee703b1e3ccc',
     'condition': 'checkout_src_internal',
   },
 
@@ -1593,7 +1593,7 @@
     Var('chromium_git') + '/external/github.com/intel/ARM_NEON_2_x86_SSE.git' + '@' + 'a15b489e1222b2087007546b4912e21293ea86ff',
 
   'src/third_party/netty-tcnative/src': {
-      'url': Var('chromium_git') + '/external/netty-tcnative.git' + '@' + '7b6c4ac18e823ba463085d1e44968773e2a82c02',
+      'url': Var('chromium_git') + '/external/netty-tcnative.git' + '@' + '035726f76293d142ec3c4464be0703605feb4d02',
       'condition': 'checkout_android',
   },
 
@@ -1644,7 +1644,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '0d57f4770c40738e610deac22a59efc71ea4f329',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '53971a4039d33587dcf88762c85c92b0faab412b',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1789,7 +1789,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@347cc0ed748250ff5cead2c9e446764ed0c8ddc2',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@2b7580bdd49e1c60961d7632e5898cc33ef57fc9',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907',
@@ -1899,7 +1899,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2780fa67c5a8fc6665d2406dabdf795ddc7bfe27',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@51b9a57e687a853b77dc0060d944f95d28693ea3',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 6afccf3..9aaeb29 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -3104,6 +3104,7 @@
     "system/message_center/inactive_user_notification_blocker_unittest.cc",
     "system/message_center/message_center_ui_controller_unittest.cc",
     "system/message_center/message_center_utils_unittest.cc",
+    "system/message_center/message_popup_animation_waiter_unittest.cc",
     "system/message_center/metrics_utils_unittest.cc",
     "system/message_center/notification_grouping_controller_unittest.cc",
     "system/message_center/notification_swipe_control_view_unittest.cc",
@@ -3475,6 +3476,7 @@
     "//components/viz/test:test_support",
     "//device/bluetooth",
     "//device/bluetooth:mocks",
+    "//device/udev_linux:test_support",
     "//extensions/common:common_constants",
     "//google_apis/calendar",
     "//mojo/core/embedder",
@@ -3577,6 +3579,7 @@
     "shelf/shelf_layout_manager_pixeltest.cc",
     "system/accessibility/accessibility_detailed_view_pixeltest.cc",
     "system/bluetooth/bluetooth_detailed_view_legacy_pixeltest.cc",
+    "system/channel_indicator/channel_indicator_quick_settings_view_pixeltest.cc",
     "system/message_center/ash_notification_view_pixeltest.cc",
     "system/time/calendar_unittest_utils.cc",
     "system/time/calendar_unittest_utils.h",
@@ -3592,6 +3595,7 @@
     "//ash/app_list",
     "//ash/app_list:test_support",
     "//ash/public/cpp",
+    "//ash/public/cpp:test_support",
     "//base/test:test_support",
     "//chromeos/ash/services/bluetooth_config:test_support",
     "//chromeos/dbus/power:power",
@@ -3730,6 +3734,10 @@
     "system/diagnostics/log_test_helpers.h",
     "system/geolocation/test_geolocation_url_loader_factory.cc",
     "system/geolocation/test_geolocation_url_loader_factory.h",
+    "system/message_center/message_center_test_util.cc",
+    "system/message_center/message_center_test_util.h",
+    "system/message_center/message_popup_animation_waiter.cc",
+    "system/message_center/message_popup_animation_waiter.h",
     "system/test_system_sounds_delegate.cc",
     "system/test_system_sounds_delegate.h",
     "system/tray/system_nudge_label.cc",
diff --git a/ash/DEPS b/ash/DEPS
index be05602..6f75cbff 100644
--- a/ash/DEPS
+++ b/ash/DEPS
@@ -124,6 +124,9 @@
 ]
 
 specific_include_rules = {
+  "keyboard_capability_unittest\.cc": [
+    "+device/udev_linux/fake_udev_loader.h",
+  ],
   "policy_recommendation_restorer_unittest.cc": [
     "+components/sync_preferences/testing_pref_service_syncable.h"
   ],
diff --git a/ash/accelerators/keyboard_code_util.cc b/ash/accelerators/keyboard_code_util.cc
index 52a5961..f247085 100644
--- a/ash/accelerators/keyboard_code_util.cc
+++ b/ash/accelerators/keyboard_code_util.cc
@@ -6,11 +6,11 @@
 
 #include "ash/public/cpp/accelerators_util.h"
 #include "ash/resources/vector_icons/vector_icons.h"
+#include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "base/logging.h"
 #include "ui/base/l10n/l10n_util.h"
-#include "ui/chromeos/events/keyboard_layout_util.h"
-#include "ui/events/devices/device_data_manager.h"
+#include "ui/chromeos/events/keyboard_capability.h"
 
 namespace ash {
 
@@ -34,11 +34,9 @@
       msg_id = IDS_KSV_MODIFIER_SHIFT;
       break;
     case ui::VKEY_COMMAND:
-      // DeviceUsesKeyboardLayout2() relies on DeviceDataManager.
-      DCHECK(ui::DeviceDataManager::HasInstance());
-      DCHECK(ui::DeviceDataManager::GetInstance()->AreDeviceListsComplete());
-      msg_id = ui::DeviceUsesKeyboardLayout2() ? IDS_KSV_MODIFIER_LAUNCHER
-                                               : IDS_KSV_MODIFIER_SEARCH;
+      msg_id = Shell::Get()->keyboard_capability()->HasLauncherButton()
+                   ? IDS_KSV_MODIFIER_LAUNCHER
+                   : IDS_KSV_MODIFIER_SEARCH;
       break;
     case ui::VKEY_ESCAPE:
       msg_id = IDS_KSV_KEY_ESCAPE;
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 8f1c203..961f244 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -3213,7 +3213,7 @@
 }
 
 bool IsWallpaperGooglePhotosSharedAlbumsEnabled() {
-  return base::FeatureList::IsEnabled(kWallpaperFullScreenPreview);
+  return base::FeatureList::IsEnabled(kWallpaperGooglePhotosSharedAlbums);
 }
 
 bool IsWallpaperPerDeskEnabled() {
diff --git a/ash/events/keyboard_capability_unittest.cc b/ash/events/keyboard_capability_unittest.cc
index 06c22169..977c5ac 100644
--- a/ash/events/keyboard_capability_unittest.cc
+++ b/ash/events/keyboard_capability_unittest.cc
@@ -4,17 +4,59 @@
 
 #include "ui/chromeos/events/keyboard_capability.h"
 
+#include <memory>
+
 #include "ash/constants/ash_pref_names.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "components/prefs/pref_service.h"
+#include "device/udev_linux/fake_udev_loader.h"
+#include "ui/events/devices/device_data_manager_test_api.h"
+#include "ui/events/devices/input_device.h"
 #include "ui/events/keycodes/keyboard_codes_posix.h"
 
 namespace ash {
 
 namespace {
 
+constexpr char kKbdTopRowPropertyName[] = "CROS_KEYBOARD_TOP_ROW_LAYOUT";
+constexpr char kKbdTopRowLayout1Tag[] = "1";
+constexpr char kKbdTopRowLayout2Tag[] = "2";
+
+class FakeDeviceManager {
+ public:
+  FakeDeviceManager() = default;
+  FakeDeviceManager(const FakeDeviceManager&) = delete;
+  FakeDeviceManager& operator=(const FakeDeviceManager&) = delete;
+  ~FakeDeviceManager() = default;
+
+  // Add a fake keyboard to DeviceDataManagerTestApi and provide layout info to
+  // fake udev.
+  void AddFakeKeyboard(const ui::InputDevice& fake_keyboard,
+                       const std::string& layout) {
+    fake_keyboard_devices_.push_back(fake_keyboard);
+
+    ui::DeviceDataManagerTestApi().SetKeyboardDevices({});
+    ui::DeviceDataManagerTestApi().SetKeyboardDevices(fake_keyboard_devices_);
+    ui::DeviceDataManagerTestApi().OnDeviceListsComplete();
+
+    std::map<std::string, std::string> sysfs_properties;
+    std::map<std::string, std::string> sysfs_attributes;
+    sysfs_properties[kKbdTopRowPropertyName] = layout;
+    fake_udev_.Reset();
+    fake_udev_.AddFakeDevice(fake_keyboard.name, fake_keyboard.sys_path.value(),
+                             /*subsystem=*/"input", /*devnode=*/absl::nullopt,
+                             /*devtype=*/absl::nullopt,
+                             std::move(sysfs_attributes),
+                             std::move(sysfs_properties));
+  }
+
+ private:
+  testing::FakeUdevLoader fake_udev_;
+  std::vector<ui::InputDevice> fake_keyboard_devices_;
+};
+
 class TestObserver : public ui::KeyboardCapability::Observer {
  public:
   TestObserver() = default;
@@ -45,6 +87,7 @@
     AshTestBase::SetUp();
     keyboard_capability_ = Shell::Get()->keyboard_capability();
     test_observer_ = std::make_unique<TestObserver>();
+    fake_keyboard_manager_ = std::make_unique<FakeDeviceManager>();
     keyboard_capability_->AddObserver(test_observer_.get());
   }
 
@@ -56,6 +99,7 @@
  protected:
   ui::KeyboardCapability* keyboard_capability_;
   std::unique_ptr<TestObserver> test_observer_;
+  std::unique_ptr<FakeDeviceManager> fake_keyboard_manager_;
 };
 
 TEST_F(KeyboardCapabilityTest, TestObserver) {
@@ -118,4 +162,31 @@
   EXPECT_FALSE(keyboard_capability_->IsTopRowKey(ui::KeyboardCode::VKEY_A));
 }
 
+TEST_F(KeyboardCapabilityTest, TestHasLauncherButton) {
+  // Add a non-layout2 keyboard.
+  ui::InputDevice fake_keyboard1(
+      /*id=*/1, /*type=*/ui::InputDeviceType::INPUT_DEVICE_INTERNAL,
+      /*name=*/"Keyboard1");
+  fake_keyboard1.sys_path = base::FilePath("path1");
+  fake_keyboard_manager_->AddFakeKeyboard(fake_keyboard1, kKbdTopRowLayout1Tag);
+
+  // Provide specific keyboard. Launcher button depends on if the keyboard is
+  // layout2 type.
+  EXPECT_FALSE(keyboard_capability_->HasLauncherButton(fake_keyboard1));
+  // Do not provide specific keyboard. Launcher button depends on if any one
+  // of the keyboards is layout2 type.
+  EXPECT_FALSE(keyboard_capability_->HasLauncherButton());
+
+  // Add a layout2 keyboard.
+  ui::InputDevice fake_keyboard2(
+      /*id=*/2, /*type=*/ui::InputDeviceType::INPUT_DEVICE_INTERNAL,
+      /*name=*/"Keyboard2");
+  fake_keyboard1.sys_path = base::FilePath("path2");
+  fake_keyboard_manager_->AddFakeKeyboard(fake_keyboard2, kKbdTopRowLayout2Tag);
+
+  EXPECT_FALSE(keyboard_capability_->HasLauncherButton(fake_keyboard1));
+  EXPECT_TRUE(keyboard_capability_->HasLauncherButton(fake_keyboard2));
+  EXPECT_TRUE(keyboard_capability_->HasLauncherButton());
+}
+
 }  // namespace ash
diff --git a/ash/projector/projector_metrics.cc b/ash/projector/projector_metrics.cc
index 61a77bbc..ec0a8f1 100644
--- a/ash/projector/projector_metrics.cc
+++ b/ash/projector/projector_metrics.cc
@@ -37,6 +37,10 @@
 constexpr char kProjectorPolicyChangeHandlingErrorHistogramName[] =
     "Ash.Projector.PolicyChangeHandlingError";
 
+constexpr char
+    kProjectorOnDeviceToServerSpeechRecognitionFallbackReasonHistogramName[] =
+        "Ash.Projector.OnDeviceToServerSpeechRecognitionFallbackReason";
+
 // Appends the proper suffix to |prefix| based on whether the user is in tablet
 // mode or not.
 std::string GetHistogramName(const std::string& prefix) {
@@ -114,4 +118,11 @@
       kProjectorPendingScreencastChangeIntervalHistogramName, interval);
 }
 
+ASH_EXPORT void RecordOnDeviceToServerSpeechRecognitionFallbackReason(
+    OnDeviceToServerSpeechRecognitionFallbackReason reason) {
+  base::UmaHistogramEnumeration(
+      kProjectorOnDeviceToServerSpeechRecognitionFallbackReasonHistogramName,
+      reason);
+}
+
 }  // namespace ash
diff --git a/ash/projector/projector_metrics.h b/ash/projector/projector_metrics.h
index 9c4ce731..a8b1b7f 100644
--- a/ash/projector/projector_metrics.h
+++ b/ash/projector/projector_metrics.h
@@ -107,6 +107,32 @@
   kMaxValue = kSyncBridge
 };
 
+// These enum values represent potential error that occurs at policy value
+// change handling and log to UMA. Entries should not be renumbered and numeric
+// values should never be reused. Please keep in sync with
+// "OnDeviceToServerSpeechRecognitionFallbackReason" in
+// src/tools/metrics/histograms/enums.xml.
+// This enum is the smiliar to the `OnDeviceRecognitionAvailability` because
+// all fallback reasons are related to on device recognition is not supported.
+enum class OnDeviceToServerSpeechRecognitionFallbackReason : int {
+  // Device does not support SODA (Speech on Device API)
+  kSodaNotAvailable = 0,
+  // User's language is not supported by SODA.
+  kUserLanguageNotAvailableForSoda = 1,
+  // SODA binary is not yet installed.
+  kSodaNotInstalled = 2,
+  // SODA binary and language packs are downloading.
+  kSodaInstalling = 3,
+  // SODA installation failed.
+  kSodaInstallationErrorUnspecified = 4,
+  // SODA installation error needs reboot
+  kSodaInstallationErrorNeedsReboot = 5,
+  // Server based speech recognition is enforced by flag for dev purpose.
+  kEnforcedByFlag = 6,
+
+  kMaxValue = kEnforcedByFlag,
+};
+
 // Records the buttons the user presses on the Projector toolbar.
 void RecordToolbarMetrics(ProjectorToolbar button);
 
@@ -134,6 +160,9 @@
 // occurs and the nullptr check is converted to DCEHCK.
 void RecordPolicyChangeHandlingError(ProjectorPolicyChangeHandlingError error);
 
+void RecordOnDeviceToServerSpeechRecognitionFallbackReason(
+    OnDeviceToServerSpeechRecognitionFallbackReason reason);
+
 }  // namespace ash
 
 #endif  // ASH_PROJECTOR_PROJECTOR_METRICS_H_
diff --git a/ash/system/camera/camera_effects_controller.cc b/ash/system/camera/camera_effects_controller.cc
index e9fe468..40c6f83 100644
--- a/ash/system/camera/camera_effects_controller.cc
+++ b/ash/system/camera/camera_effects_controller.cc
@@ -107,45 +107,6 @@
   return CameraEffectsController::BackgroundBlurEffectState::kLowest;
 }
 
-// Gets blur level from chrome flag.
-cros::mojom::BlurLevel GetBlurLevelFromFlag() {
-  std::string blur_level = GetFieldTrialParamValueByFeature(
-      ash::features::kVCBackgroundBlur, "blur_level");
-  if (blur_level == "lowest") {
-    return cros::mojom::BlurLevel::kLowest;
-  } else if (blur_level == "light") {
-    return cros::mojom::BlurLevel::kLight;
-  } else if (blur_level == "medium") {
-    return cros::mojom::BlurLevel::kMedium;
-  } else if (blur_level == "heavy") {
-    return cros::mojom::BlurLevel::kHeavy;
-  } else if (blur_level == "maximum") {
-    return cros::mojom::BlurLevel::kMaximum;
-  }
-  return cros::mojom::BlurLevel::kLowest;
-}
-
-// The default enable state for all camera effects should be false; but here we
-// use the IsCameraEffectsSupported instead until we are able to enable these
-// prefs from the ui.
-cros::mojom::EffectsConfigPtr GetInitialCameraEffects() {
-  cros::mojom::EffectsConfigPtr config = cros::mojom::EffectsConfig::New();
-  config->blur_enabled = CameraEffectsController::IsCameraEffectsSupported(
-      cros::mojom::CameraEffect::kBackgroundBlur);
-  config->blur_level = GetBlurLevelFromFlag();
-  // We don't want enable a conflict config, so kBackgroundReplace is set to
-  // enabled only if kBackgroundBlur is not.
-  config->replace_enabled =
-      CameraEffectsController::IsCameraEffectsSupported(
-          cros::mojom::CameraEffect::kBackgroundReplace) &&
-      !CameraEffectsController::IsCameraEffectsSupported(
-          cros::mojom::CameraEffect::kBackgroundBlur);
-  config->relight_enabled = CameraEffectsController::IsCameraEffectsSupported(
-      cros::mojom::CameraEffect::kPortraitRelight);
-
-  return config;
-}
-
 }  // namespace
 
 CameraEffectsController::CameraEffectsController() {
@@ -153,7 +114,7 @@
   DCHECK(session_controller);
   session_observation_.Observe(session_controller);
 
-  current_effects_ = GetInitialCameraEffects();
+  current_effects_ = cros::mojom::EffectsConfig::New();
 
   media::CameraHalDispatcherImpl::GetInstance()
       ->SetCameraEffectsControllerCallback(
@@ -196,8 +157,7 @@
 }
 
 cros::mojom::EffectsConfigPtr CameraEffectsController::GetCameraEffects() {
-  DCHECK(pref_change_registrar_->prefs());
-  return GetEffectsConfigFromPref();
+  return current_effects_.Clone();
 }
 
 void CameraEffectsController::AddObserver(Observer* observer) {
@@ -217,15 +177,11 @@
   // We have to register all camera effects prefs; because we need use them to
   // construct the cros::mojom::EffectsConfigPtr.
   registry->RegisterIntegerPref(prefs::kBackgroundBlur,
-                                GetInitialCameraEffects()->blur_enabled
-                                    ? static_cast<int>(GetBlurLevelFromFlag())
-                                    : BackgroundBlurEffectState::kOff);
+                                BackgroundBlurEffectState::kOff);
 
-  registry->RegisterBooleanPref(prefs::kBackgroundReplace,
-                                GetInitialCameraEffects()->replace_enabled);
+  registry->RegisterBooleanPref(prefs::kBackgroundReplace, false);
 
-  registry->RegisterBooleanPref(prefs::kPortraitRelighting,
-                                GetInitialCameraEffects()->relight_enabled);
+  registry->RegisterBooleanPref(prefs::kPortraitRelighting, false);
 }
 
 void CameraEffectsController::OnActiveUserPrefServiceChanged(
@@ -239,23 +195,6 @@
   pref_change_registrar_ = std::make_unique<PrefChangeRegistrar>();
   pref_change_registrar_->Init(pref_service);
 
-  auto callback =
-      effect_result_for_testing_.has_value()
-          ? base::BindRepeating(
-                &CameraEffectsController::OnCameraEffectsPrefChanged,
-                weak_factory_.GetWeakPtr())
-          : base::BindPostTask(
-                base::SequencedTaskRunner::GetCurrentDefault(),
-                base::BindRepeating(
-                    &CameraEffectsController::OnCameraEffectsPrefChanged,
-                    weak_factory_.GetWeakPtr()));
-
-  pref_change_registrar_->Add(prefs::kBackgroundBlur, callback);
-
-  pref_change_registrar_->Add(prefs::kBackgroundReplace, callback);
-
-  pref_change_registrar_->Add(prefs::kPortraitRelighting, callback);
-
   // Initialize camera effects for the first time. Set the expected initial
   // state in case camera server isn't registered.
   SetInitialCameraEffects(GetEffectsConfigFromPref());
@@ -271,23 +210,11 @@
 
 absl::optional<int> CameraEffectsController::GetEffectState(int effect_id) {
   switch (static_cast<cros::mojom::CameraEffect>(effect_id)) {
-    case cros::mojom::CameraEffect::kBackgroundBlur: {
-      DCHECK(pref_change_registrar_ && pref_change_registrar_->prefs());
-
-      int pref_value =
-          pref_change_registrar_->prefs()->GetInteger(prefs::kBackgroundBlur);
-      if (!IsValidBackgroundBlurState(pref_value)) {
-        LOG(ERROR)
-            << __FUNCTION__ << " value " << pref_value
-            << " is NOT a valid background blur effect state, returning kOff";
-        return static_cast<int>(BackgroundBlurEffectState::kOff);
-      }
-      return pref_value;
-    }
+    case cros::mojom::CameraEffect::kBackgroundBlur:
+      return MapBackgroundBlurCameraHalStateToEffectState(
+          current_effects_->blur_level, current_effects_->blur_enabled);
     case cros::mojom::CameraEffect::kPortraitRelight:
-      DCHECK(pref_change_registrar_ && pref_change_registrar_->prefs());
-      return pref_change_registrar_->prefs()->GetBoolean(
-          prefs::kPortraitRelighting);
+      return current_effects_->relight_enabled;
     case cros::mojom::CameraEffect::kBackgroundReplace:
     case cros::mojom::CameraEffect::kNone:
       return absl::nullopt;
@@ -301,60 +228,32 @@
     absl::optional<int> effect_id,
     absl::optional<int> state) {
   DCHECK(effect_id.has_value());
+
+  cros::mojom::EffectsConfigPtr new_effects = current_effects_.Clone();
+
   switch (effect_id.value()) {
     case static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur): {
-      DCHECK(pref_change_registrar_ && pref_change_registrar_->prefs());
+      // UI should not pass in any invalid state.
       if (!state.has_value() || !IsValidBackgroundBlurState(state.value())) {
-        pref_change_registrar_->prefs()->SetInteger(
-            prefs::kBackgroundBlur,
-            static_cast<int>(BackgroundBlurEffectState::kOff));
-        return;
+        state = static_cast<int>(
+            CameraEffectsController::BackgroundBlurEffectState::kOff);
       }
 
-      pref_change_registrar_->prefs()->SetInteger(prefs::kBackgroundBlur,
-                                                  state.value());
-      return;
+      auto [blur_level, blur_enabled] =
+          MapBackgroundBlurEffectStateToCameraHalState(state.value());
+      new_effects->blur_level = blur_level;
+      new_effects->blur_enabled = blur_enabled;
+      if (new_effects->blur_enabled) {
+        // background replace should be disabled since background blur is
+        // enabled.
+        new_effects->replace_enabled = false;
+      }
+      break;
     }
-    case static_cast<int>(cros::mojom::CameraEffect::kPortraitRelight):
-      DCHECK(pref_change_registrar_ && pref_change_registrar_->prefs());
-      pref_change_registrar_->prefs()->SetBoolean(
-          prefs::kPortraitRelighting,
-          !pref_change_registrar_->prefs()->GetBoolean(
-              prefs::kPortraitRelighting));
-      return;
-  }
-}
-
-void CameraEffectsController::OnCameraEffectsPrefChanged(
-    const std::string& pref_name) {
-  cros::mojom::EffectsConfigPtr new_effects = GetEffectsConfigFromPref();
-
-  if (pref_name == prefs::kBackgroundBlur) {
-    // Skip if current applied effect is already the same as new value.Supported
-    if (current_effects_->blur_enabled == new_effects->blur_enabled &&
-        current_effects_->blur_level == new_effects->blur_level) {
-      return;
-    }
-
-    if (new_effects->blur_enabled) {
-      // background replace should be disabled since background blur is enabled.
-      new_effects->replace_enabled = false;
-    }
-
-  } else if (pref_name == prefs::kBackgroundReplace) {
-    // Skip if current applied effect is already the same as new value.
-    if (current_effects_->replace_enabled == new_effects->replace_enabled) {
-      return;
-    }
-
-    if (new_effects->replace_enabled) {
-      // background blur should be disabled since background replace is enabled.
-      new_effects->blur_enabled = false;
-    }
-  } else if (pref_name == prefs::kPortraitRelighting) {
-    // Skip if current applied effect is already the same as new value.
-    if (current_effects_->relight_enabled == new_effects->relight_enabled) {
-      return;
+    case static_cast<int>(cros::mojom::CameraEffect::kPortraitRelight): {
+      new_effects->relight_enabled =
+          state.value_or(!new_effects->relight_enabled);
+      break;
     }
   }
 
@@ -403,23 +302,27 @@
   // does not happen very often, the only way to keep the pref to be consisitent
   // with the prefs is to reset everything.
   if (result == cros::mojom::SetEffectResult::kOk || new_config.is_null()) {
-    current_effects_ = new_config.is_null() ? GetInitialCameraEffects()
-                                            : std::move(new_config);
+    if (new_config.is_null()) {
+      new_config = cros::mojom::EffectsConfig::New();
+    }
+
+    SetEffectsConfigToPref(new_config.Clone());
+
+    current_effects_ = std::move(new_config);
 
     for (auto& ob : observers_) {
       ob.OnCameraEffectsChanged(current_effects_.Clone());
     }
   }
-
-  // Always update prefs with `current_effects_`.
-  // (1) For "result == kOk", the prefs are updated with the new effects.
-  // (2) Otherwise, the prefs changes are effectively reverted.
-  SetEffectsConfigToPref(current_effects_.Clone());
 }
 
 cros::mojom::EffectsConfigPtr
 CameraEffectsController::GetEffectsConfigFromPref() {
   cros::mojom::EffectsConfigPtr effects = cros::mojom::EffectsConfig::New();
+  if (!pref_change_registrar_ || !pref_change_registrar_->prefs()) {
+    return effects;
+  }
+
   int background_blur_state_in_pref =
       pref_change_registrar_->prefs()->GetInteger(prefs::kBackgroundBlur);
   if (!IsValidBackgroundBlurState(background_blur_state_in_pref)) {
@@ -445,22 +348,24 @@
 
 void CameraEffectsController::SetEffectsConfigToPref(
     cros::mojom::EffectsConfigPtr new_config) {
-  cros::mojom::EffectsConfigPtr old_effects = GetEffectsConfigFromPref();
+  if (!pref_change_registrar_ || !pref_change_registrar_->prefs()) {
+    return;
+  }
 
-  if (new_config->blur_enabled != old_effects->blur_enabled ||
-      new_config->blur_level != old_effects->blur_level) {
+  if (new_config->blur_enabled != current_effects_->blur_enabled ||
+      new_config->blur_level != current_effects_->blur_level) {
     pref_change_registrar_->prefs()->SetInteger(
         prefs::kBackgroundBlur,
         MapBackgroundBlurCameraHalStateToEffectState(new_config->blur_level,
                                                      new_config->blur_enabled));
   }
 
-  if (new_config->replace_enabled != old_effects->replace_enabled) {
+  if (new_config->replace_enabled != current_effects_->replace_enabled) {
     pref_change_registrar_->prefs()->SetBoolean(prefs::kBackgroundReplace,
                                                 new_config->replace_enabled);
   }
 
-  if (new_config->relight_enabled != old_effects->relight_enabled) {
+  if (new_config->relight_enabled != current_effects_->relight_enabled) {
     pref_change_registrar_->prefs()->SetBoolean(prefs::kPortraitRelighting,
                                                 new_config->relight_enabled);
   }
diff --git a/ash/system/camera/camera_effects_controller_unittest.cc b/ash/system/camera/camera_effects_controller_unittest.cc
index e00a103..9a9c071 100644
--- a/ash/system/camera/camera_effects_controller_unittest.cc
+++ b/ash/system/camera/camera_effects_controller_unittest.cc
@@ -38,8 +38,9 @@
   // NoSessionAshTestBase:
   void SetUp() override {
     scoped_feature_list_.InitWithFeatures(
-        {features::kVcControlsUi, features::kVCBackgroundBlur},
-        {features::kVCBackgroundReplace, features::kVCPortraitRelighting});
+        {features::kVcControlsUi, features::kVCBackgroundBlur,
+         features::kVCBackgroundReplace, features::kVCPortraitRelighting},
+        {});
 
     // Here we have to create the global instance of `CrasAudioHandler` before
     // `FakeVideoConferenceTrayController`, so we do it here and not in
@@ -70,24 +71,10 @@
     CrasAudioClient::Shutdown();
   }
 
-  // Enables/Disables pref values.
-  void SetEnabledPref(const std::string& perf_name, bool enabled) {
-    Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean(
-        perf_name, enabled);
-  }
-
-  // Updates prefs::kBackgroundBlur pref values.
-  void SetBackgroundBlurPref(int level) {
-    Shell::Get()->session_controller()->GetActivePrefService()->SetInteger(
-        prefs::kBackgroundBlur, level);
-  }
-
-  // Retrieves the value of `prefs::kBackgroundBlur`.
-  int GetBackgroundBlurPref() {
-    return Shell::Get()
-        ->session_controller()
-        ->GetActivePrefService()
-        ->GetInteger(prefs::kBackgroundBlur);
+  // Sets background blur state.
+  void SetBackgroundBlurEffectState(int state) {
+    camera_effects_controller_->OnEffectControlActivated(
+        static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur), state);
   }
 
   // Gets the state of the background blur effect from the effect's host,
@@ -100,18 +87,12 @@
     return effect_state.value();
   }
 
-  // Updates prefs::kPortraitRelighting pref values.
-  void SetPortraitRelightingPref(bool active) {
-    Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean(
-        prefs::kPortraitRelighting, active);
-  }
-
-  // Retrieves the value of `prefs::kPortraitRelighting`.
-  bool GetPortraitRelightingPref() {
+  // Retrieves the value of `prefs::kBackgroundBlur`.
+  int GetBackgroundBlurPref() {
     return Shell::Get()
         ->session_controller()
         ->GetActivePrefService()
-        ->GetBoolean(prefs::kPortraitRelighting);
+        ->GetInteger(prefs::kBackgroundBlur);
   }
 
   // Gets the state of the portrait relighting effect from the effect's host,
@@ -124,6 +105,14 @@
     return static_cast<bool>(effect_state.value());
   }
 
+  // Retrieves the value of `prefs::kPortraitRelighting`.
+  bool GetPortraitRelightingPref() {
+    return Shell::Get()
+        ->session_controller()
+        ->GetActivePrefService()
+        ->GetBoolean(prefs::kPortraitRelighting);
+  }
+
   CameraEffectsController* camera_effects_controller() {
     return camera_effects_controller_;
   }
@@ -138,392 +127,79 @@
        IsCameraEffectsSupportedShouldBeConsistentWithFlags) {
   {
     base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {}, {features::kVCBackgroundBlur, features::kVCBackgroundReplace,
-             features::kVCPortraitRelighting});
-
-    // No CameraEffects is supported if all flags are disabled.
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported());
+    scoped_feature_list.InitWithFeatures({}, {features::kVCBackgroundBlur});
     EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
         cros::mojom::CameraEffect::kBackgroundBlur));
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundReplace));
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kPortraitRelight));
-
-    // No camera effects supported and VC controls UI not enabled, no camera
-    // effects UI controls available.
-    EXPECT_TRUE(camera_effects_controller());
-    EXPECT_FALSE(camera_effects_controller()->IsEffectControlAvailable());
     EXPECT_FALSE(camera_effects_controller()->IsEffectControlAvailable(
         cros::mojom::CameraEffect::kBackgroundBlur));
-    EXPECT_FALSE(camera_effects_controller()->IsEffectControlAvailable(
-        cros::mojom::CameraEffect::kPortraitRelight));
   }
 
   {
     base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVcControlsUi, features::kVCBackgroundBlur},
-        {features::kVCBackgroundReplace, features::kVCPortraitRelighting});
-
-    // BackgroundBlur should be supported.
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported());
+    scoped_feature_list.InitWithFeatures({features::kVCBackgroundBlur}, {});
     EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported(
         cros::mojom::CameraEffect::kBackgroundBlur));
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundReplace));
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kPortraitRelight));
-
-    // Camera effects are supported, VC controls UI enabled, so camera effects
-    // UI controls are available, and background blur UI is available.
-    EXPECT_TRUE(camera_effects_controller());
-    EXPECT_TRUE(camera_effects_controller()->IsEffectControlAvailable());
     EXPECT_TRUE(camera_effects_controller()->IsEffectControlAvailable(
         cros::mojom::CameraEffect::kBackgroundBlur));
   }
 
   {
     base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVCBackgroundReplace},
-        {features::kVCBackgroundBlur, features::kVCPortraitRelighting});
-
-    // BackgroundReplace should be supported.
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported());
+    scoped_feature_list.InitWithFeatures({}, {features::kVCPortraitRelighting});
     EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundBlur));
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundReplace));
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
+        cros::mojom::CameraEffect::kPortraitRelight));
+    EXPECT_FALSE(camera_effects_controller()->IsEffectControlAvailable(
         cros::mojom::CameraEffect::kPortraitRelight));
   }
 
   {
     base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVcControlsUi, features::kVCPortraitRelighting},
-        {features::kVCBackgroundBlur, features::kVCBackgroundReplace});
-
-    // PortraitRelight should be supported.
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported());
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundBlur));
-    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundReplace));
+    scoped_feature_list.InitWithFeatures({features::kVCPortraitRelighting}, {});
     EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported(
         cros::mojom::CameraEffect::kPortraitRelight));
-
-    // Camera effects are supported, VC controls UI enabled, so camera effects
-    // UI controls are available, and portrait relighting UI is available.
-    EXPECT_TRUE(camera_effects_controller());
-    EXPECT_TRUE(camera_effects_controller()->IsEffectControlAvailable());
     EXPECT_TRUE(camera_effects_controller()->IsEffectControlAvailable(
         cros::mojom::CameraEffect::kPortraitRelight));
   }
 
   {
     base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVCBackgroundBlur, features::kVCBackgroundReplace,
-         features::kVCPortraitRelighting},
-        {});
+    scoped_feature_list.InitWithFeatures({}, {features::kVCBackgroundReplace});
+    EXPECT_FALSE(CameraEffectsController::IsCameraEffectsSupported(
+        cros::mojom::CameraEffect::kBackgroundReplace));
+    EXPECT_FALSE(camera_effects_controller()->IsEffectControlAvailable(
+        cros::mojom::CameraEffect::kBackgroundReplace));
+  }
 
-    // All camera effects should be supported.
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported());
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kBackgroundBlur));
+  {
+    base::test::ScopedFeatureList scoped_feature_list;
+    scoped_feature_list.InitWithFeatures({features::kVCBackgroundReplace}, {});
     EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported(
         cros::mojom::CameraEffect::kBackgroundReplace));
-    EXPECT_TRUE(CameraEffectsController::IsCameraEffectsSupported(
-        cros::mojom::CameraEffect::kPortraitRelight));
+    EXPECT_FALSE(camera_effects_controller()->IsEffectControlAvailable(
+        cros::mojom::CameraEffect::kBackgroundReplace));
   }
 }
 
-TEST_F(CameraEffectsControllerTest,
-       DefaultCameraEffectsShouldBeConsistentWithFlags) {
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVCBackgroundBlur},
-        {features::kVCBackgroundReplace, features::kVCPortraitRelighting});
-
-    SimulateUserLogin("testuser1@gmail.com");
-
-    // BackgroundBlur should be enabled.
-    cros::mojom::EffectsConfigPtr camera_effects =
-        camera_effects_controller_->GetCameraEffects();
-    EXPECT_TRUE(camera_effects->blur_enabled);
-    EXPECT_FALSE(camera_effects->replace_enabled);
-    EXPECT_FALSE(camera_effects->relight_enabled);
-  }
-
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVCBackgroundReplace},
-        {features::kVCBackgroundBlur, features::kVCPortraitRelighting});
-
-    SimulateUserLogin("testuser2@gmail.com");
-
-    // BackgroundReplace should be enabled.
-    cros::mojom::EffectsConfigPtr camera_effects =
-        camera_effects_controller_->GetCameraEffects();
-    EXPECT_FALSE(camera_effects->blur_enabled);
-    EXPECT_TRUE(camera_effects->replace_enabled);
-    EXPECT_FALSE(camera_effects->relight_enabled);
-  }
-
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVCPortraitRelighting},
-        {features::kVCBackgroundBlur, features::kVCBackgroundReplace});
-
-    SimulateUserLogin("testuser3@gmail.com");
-
-    // PortraintRelighting should be enabled.
-    cros::mojom::EffectsConfigPtr camera_effects =
-        camera_effects_controller_->GetCameraEffects();
-    EXPECT_FALSE(camera_effects->blur_enabled);
-    EXPECT_FALSE(camera_effects->replace_enabled);
-    EXPECT_TRUE(camera_effects->relight_enabled);
-  }
-
-  {
-    base::test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.InitWithFeatures(
-        {features::kVCBackgroundBlur, features::kVCBackgroundReplace,
-         features::kVCPortraitRelighting},
-        {});
-
-    SimulateUserLogin("testuser4@gmail.com");
-
-    // BackgroundReplace should be not enabled when all flags are enabled.
-    cros::mojom::EffectsConfigPtr camera_effects =
-        camera_effects_controller_->GetCameraEffects();
-    EXPECT_TRUE(camera_effects->blur_enabled);
-    EXPECT_FALSE(camera_effects->replace_enabled);
-    EXPECT_TRUE(camera_effects->relight_enabled);
-  }
-}
-
-TEST_F(CameraEffectsControllerTest, EnableBackgroundBlurTest) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      {features::kVCBackgroundReplace},
-      {features::kVCBackgroundBlur, features::kVCPortraitRelighting});
-
-  SimulateUserLogin("testuser@gmail.com");
-
-  // Check default pref values.
-  cros::mojom::EffectsConfigPtr camera_effects =
-      camera_effects_controller_->GetCameraEffects();
-  EXPECT_FALSE(camera_effects->blur_enabled);
-  EXPECT_TRUE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // Set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetBackgroundBlurPref(1);
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_FALSE(camera_effects->blur_enabled);
-  EXPECT_TRUE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // Set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetBackgroundBlurPref(1);
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetBackgroundBlurPref(-1);
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetBackgroundBlurPref(-1);
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_FALSE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-}
-
-TEST_F(CameraEffectsControllerTest, EnableBackgroundReplaceTest) {
-  SimulateUserLogin("testuser@gmail.com");
-
-  cros::mojom::EffectsConfigPtr camera_effects =
-      camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetEnabledPref(prefs::kBackgroundReplace, true);
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetEnabledPref(prefs::kBackgroundReplace, true);
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_FALSE(camera_effects->blur_enabled);
-  EXPECT_TRUE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetEnabledPref(prefs::kBackgroundReplace, false);
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_FALSE(camera_effects->blur_enabled);
-  EXPECT_TRUE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetEnabledPref(prefs::kBackgroundReplace, false);
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_FALSE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-}
-
-TEST_F(CameraEffectsControllerTest, EnablePortraitRelightingTest) {
-  SimulateUserLogin("testuser@gmail.com");
-
-  cros::mojom::EffectsConfigPtr camera_effects =
-      camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetEnabledPref(prefs::kPortraitRelighting, true);
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-
-  // set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetEnabledPref(prefs::kPortraitRelighting, true);
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_TRUE(camera_effects->relight_enabled);
-
-  // set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetEnabledPref(prefs::kPortraitRelighting, false);
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_TRUE(camera_effects->relight_enabled);
-
-  // set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetEnabledPref(prefs::kPortraitRelighting, false);
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_FALSE(camera_effects->replace_enabled);
-  EXPECT_FALSE(camera_effects->relight_enabled);
-}
-
-TEST_F(CameraEffectsControllerTest, BlurLevelChangeTest) {
-  SimulateUserLogin("testuser@gmail.com");
-
-  cros::mojom::EffectsConfigPtr camera_effects =
-      camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_EQ(camera_effects->blur_level, cros::mojom::BlurLevel::kLowest);
-
-  // set camera effect error should revert the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kError);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kMaximum));
-
-  // Pref values should be reverted.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_EQ(camera_effects->blur_level, cros::mojom::BlurLevel::kLowest);
-
-  // set camera effect success should modify the perf.
-  camera_effects_controller_->set_effect_result_for_testing(
-      cros::mojom::SetEffectResult::kOk);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kMaximum));
-
-  // Pref values should be updated.
-  camera_effects = camera_effects_controller_->GetCameraEffects();
-  EXPECT_TRUE(camera_effects->blur_enabled);
-  EXPECT_EQ(camera_effects->blur_level, cros::mojom::BlurLevel::kMaximum);
-}
-
 TEST_F(CameraEffectsControllerTest, NotifyObserverTest) {
   SimulateUserLogin("testuser@gmail.com");
 
   FakeCameraEffectsControllerObserver observer;
   camera_effects_controller_->AddObserver(&observer);
 
-  // set camera effect error should revert the perf.
+  // Mock the case where setting the effect state encounters an error.
   camera_effects_controller_->set_effect_result_for_testing(
       cros::mojom::SetEffectResult::kError);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kMaximum));
+  SetBackgroundBlurEffectState(
+      static_cast<int>(cros::mojom::BlurLevel::kMaximum));
 
   // Observers should not be notified if the SetCameraEffects fails.
   EXPECT_EQ(observer.num_of_calls(), 0);
 
-  // set camera effect error should revert the perf.
+  // Now mock the case where setting the effect state succeeds.
   camera_effects_controller_->set_effect_result_for_testing(
       cros::mojom::SetEffectResult::kOk);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kMaximum));
+  SetBackgroundBlurEffectState(
+      static_cast<int>(cros::mojom::BlurLevel::kMaximum));
 
   // Observers should be notified if the SetCameraEffects succeeds.
   EXPECT_EQ(observer.num_of_calls(), 1);
@@ -536,132 +212,108 @@
   camera_effects_controller_->RemoveObserver(&observer);
 }
 
-TEST_F(CameraEffectsControllerTest, BackgroundBlurGetEffectState) {
-  SimulateUserLogin("testuser@gmail.com");
-
-  // Pref value is `kBackgroundBlurLevelForDisabling` (off).
-  SetBackgroundBlurPref(-1);
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kOff);
-
-  // Test all values of `cros::mojom::BlurLevel`.
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kLowest));
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kLowest);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kLight));
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kLight);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kMedium));
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kMedium);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kHeavy));
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kHeavy);
-  SetBackgroundBlurPref(static_cast<int>(cros::mojom::BlurLevel::kMaximum));
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kMaximum);
-
-  // Now verify with a pref value that isn't recognized as a valid background
-  // blur state.
-  SetBackgroundBlurPref(-999);
-  EXPECT_EQ(GetBackgroundBlurEffectState(),
-            CameraEffectsController::BackgroundBlurEffectState::kOff);
-}
-
 TEST_F(CameraEffectsControllerTest, BackgroundBlurOnEffectControlActivated) {
   SimulateUserLogin("testuser@gmail.com");
 
   // Activate the possible values of
   // `CameraEffectsController::BackgroundBlurEffectState`, verify that the pref
-  // value is the expected value of
-  // `CameraEffectsController::BackgroundBlurEffectState`.
+  //  and internal state are all set properly.
+  for (const auto state :
+       {CameraEffectsController::BackgroundBlurEffectState::kOff,
+        CameraEffectsController::BackgroundBlurEffectState::kLowest,
+        CameraEffectsController::BackgroundBlurEffectState::kLight,
+        CameraEffectsController::BackgroundBlurEffectState::kMedium,
+        CameraEffectsController::BackgroundBlurEffectState::kHeavy,
+        CameraEffectsController::BackgroundBlurEffectState::kMaximum}) {
+    camera_effects_controller_->OnEffectControlActivated(
+        static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur), state);
+    EXPECT_EQ(GetBackgroundBlurPref(), state);
+    EXPECT_EQ(GetBackgroundBlurEffectState(), state);
+  }
+
+  // Invalid background blur effect state should set the state to kOff.
   camera_effects_controller_->OnEffectControlActivated(
       static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
-      CameraEffectsController::BackgroundBlurEffectState::kOff);
+      static_cast<int>(
+          CameraEffectsController::BackgroundBlurEffectState::kMaximum) +
+          1);
   EXPECT_EQ(GetBackgroundBlurPref(),
             CameraEffectsController::BackgroundBlurEffectState::kOff);
-  camera_effects_controller_->OnEffectControlActivated(
-      static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
-      CameraEffectsController::BackgroundBlurEffectState::kLowest);
-  EXPECT_EQ(GetBackgroundBlurPref(),
-            static_cast<int>(cros::mojom::BlurLevel::kLowest));
-  camera_effects_controller_->OnEffectControlActivated(
-      static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
-      CameraEffectsController::BackgroundBlurEffectState::kLight);
-  EXPECT_EQ(GetBackgroundBlurPref(),
-            static_cast<int>(cros::mojom::BlurLevel::kLight));
-  camera_effects_controller_->OnEffectControlActivated(
-      static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
-      CameraEffectsController::BackgroundBlurEffectState::kMedium);
-  EXPECT_EQ(GetBackgroundBlurPref(),
-            static_cast<int>(cros::mojom::BlurLevel::kMedium));
-  camera_effects_controller_->OnEffectControlActivated(
-      static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
-      CameraEffectsController::BackgroundBlurEffectState::kHeavy);
-  EXPECT_EQ(GetBackgroundBlurPref(),
-            static_cast<int>(cros::mojom::BlurLevel::kHeavy));
+  EXPECT_EQ(GetBackgroundBlurEffectState(),
+            CameraEffectsController::BackgroundBlurEffectState::kOff);
+
+  // Set the background blur state to be kMaximum.
   camera_effects_controller_->OnEffectControlActivated(
       static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
       CameraEffectsController::BackgroundBlurEffectState::kMaximum);
-  EXPECT_EQ(GetBackgroundBlurPref(),
-            static_cast<int>(cros::mojom::BlurLevel::kMaximum));
-
-  // Passing an invalid background blur state is the same as activating
-  // `kOff`.
+  // Setting the background blur state to null will reset the effects as
+  // kOff.
   camera_effects_controller_->OnEffectControlActivated(
       static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur),
       absl::nullopt);
-  EXPECT_EQ(GetBackgroundBlurPref(), -1);
-}
+  EXPECT_EQ(GetBackgroundBlurPref(),
+            CameraEffectsController::BackgroundBlurEffectState::kOff);
+  EXPECT_EQ(GetBackgroundBlurEffectState(),
+            CameraEffectsController::BackgroundBlurEffectState::kOff);
 
-TEST_F(CameraEffectsControllerTest, PortraitRelightingGetEffectState) {
-  // Make `kVCPortraitRelighting` enabled by default.
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      {features::kVCPortraitRelighting},
-      {features::kVCBackgroundBlur, features::kVCBackgroundReplace});
-
-  SimulateUserLogin("testuser@gmail.com");
-
-  // Pref value is "off."
-  SetPortraitRelightingPref(false);
-  EXPECT_FALSE(GetPortraitRelightingEffectState());
-
-  // Pref value is "on."
-  SetPortraitRelightingPref(true);
-  EXPECT_TRUE(GetPortraitRelightingEffectState());
+  // Now verify that each of the pref and effect state is set to kOff if any
+  // error is encountered while setting the state.
+  camera_effects_controller_->set_effect_result_for_testing(
+      cros::mojom::SetEffectResult::kError);
+  for (const auto state :
+       {CameraEffectsController::BackgroundBlurEffectState::kOff,
+        CameraEffectsController::BackgroundBlurEffectState::kLowest,
+        CameraEffectsController::BackgroundBlurEffectState::kLight,
+        CameraEffectsController::BackgroundBlurEffectState::kMedium,
+        CameraEffectsController::BackgroundBlurEffectState::kHeavy,
+        CameraEffectsController::BackgroundBlurEffectState::kMaximum}) {
+    camera_effects_controller_->OnEffectControlActivated(
+        static_cast<int>(cros::mojom::CameraEffect::kBackgroundBlur), state);
+    EXPECT_EQ(GetBackgroundBlurPref(),
+              CameraEffectsController::BackgroundBlurEffectState::kOff);
+    EXPECT_EQ(GetBackgroundBlurEffectState(),
+              CameraEffectsController::BackgroundBlurEffectState::kOff);
+  }
 }
 
 TEST_F(CameraEffectsControllerTest,
        PortraitRelightingOnEffectControlActivated) {
-  // Make `kVCPortraitRelighting` enabled by default.
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      {features::kVCPortraitRelighting},
-      {features::kVCBackgroundBlur, features::kVCBackgroundReplace});
-
   SimulateUserLogin("testuser@gmail.com");
 
-  // Pref value is "off" initially.
-  SetPortraitRelightingPref(false);
+  // Initial state should be "off".
+  EXPECT_FALSE(GetPortraitRelightingEffectState());
+  EXPECT_FALSE(GetPortraitRelightingPref());
 
   // Activating the effect should toggle it to "true." The `value` argument
   // doesn't matter for toggle effects.
   camera_effects_controller_->OnEffectControlActivated(
       static_cast<int>(cros::mojom::CameraEffect::kPortraitRelight),
       absl::nullopt);
+  EXPECT_TRUE(GetPortraitRelightingEffectState());
   EXPECT_TRUE(GetPortraitRelightingPref());
 
   // Another toggle should set it to "false."
   camera_effects_controller_->OnEffectControlActivated(
       static_cast<int>(cros::mojom::CameraEffect::kPortraitRelight),
       absl::nullopt);
+  EXPECT_FALSE(GetPortraitRelightingEffectState());
   EXPECT_FALSE(GetPortraitRelightingPref());
 
   // And one more toggle should set it back to "true."
   camera_effects_controller_->OnEffectControlActivated(
       static_cast<int>(cros::mojom::CameraEffect::kPortraitRelight),
       absl::nullopt);
+  EXPECT_TRUE(GetPortraitRelightingEffectState());
+  EXPECT_TRUE(GetPortraitRelightingPref());
+
+  // Verify that the effect state and pref remain in the previous state (true)
+  // if attempt encounters an error.
+  camera_effects_controller_->set_effect_result_for_testing(
+      cros::mojom::SetEffectResult::kError);
+  camera_effects_controller_->OnEffectControlActivated(
+      static_cast<int>(cros::mojom::CameraEffect::kPortraitRelight),
+      absl::nullopt);
+  EXPECT_TRUE(GetPortraitRelightingEffectState());
   EXPECT_TRUE(GetPortraitRelightingPref());
 }
 
diff --git a/ash/system/channel_indicator/channel_indicator_quick_settings_view.cc b/ash/system/channel_indicator/channel_indicator_quick_settings_view.cc
index ec1ca22..336daed 100644
--- a/ash/system/channel_indicator/channel_indicator_quick_settings_view.cc
+++ b/ash/system/channel_indicator/channel_indicator_quick_settings_view.cc
@@ -309,9 +309,7 @@
                          ->client()
                          ->ShowChannelInfoGiveFeedback();
                    }),
-                   features::IsQsRevampEnabled()
-                       ? IconButton::Type::kMediumFloating
-                       : IconButton::Type::kMedium,
+                   IconButton::Type::kMediumFloating,
                    &kRequestFeedbackIcon,
                    IDS_ASH_STATUS_TRAY_REPORT_FEEDBACK),
         channel_(channel) {
@@ -371,7 +369,6 @@
       views::InkDrop::Get(this)->SetBaseColor(ink_drop_base_color);
     } else {
       SetIconColor(channel_indicator_utils::GetFgColor(channel_));
-      SetBackgroundColor(channel_indicator_utils::GetBgColor(channel_));
       views::InkDrop::Get(this)->SetBaseColor(color_provider->GetColor(
           channel_indicator_utils::GetBgColor(channel_)));
     }
diff --git a/ash/system/channel_indicator/channel_indicator_quick_settings_view_pixeltest.cc b/ash/system/channel_indicator/channel_indicator_quick_settings_view_pixeltest.cc
new file mode 100644
index 0000000..41c3a8b
--- /dev/null
+++ b/ash/system/channel_indicator/channel_indicator_quick_settings_view_pixeltest.cc
@@ -0,0 +1,116 @@
+// 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/system/channel_indicator/channel_indicator_quick_settings_view.h"
+
+#include "ash/constants/ash_features.h"
+#include "ash/public/cpp/test/test_system_tray_client.h"
+#include "ash/system/unified/quick_settings_header.h"
+#include "ash/system/unified/unified_system_tray_controller.h"
+#include "ash/system/unified/unified_system_tray_model.h"
+#include "ash/test/ash_test_base.h"
+#include "ash/test/pixel/ash_pixel_differ.h"
+#include "ash/test_shell_delegate.h"
+#include "base/test/scoped_feature_list.h"
+#include "components/version_info/channel.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+
+// Parameterized by feature QsRevamp.
+class ChannelIndicatorQuickSettingsViewPixelTest
+    : public AshTestBase,
+      public testing::WithParamInterface<bool> {
+ public:
+  ChannelIndicatorQuickSettingsViewPixelTest() = default;
+  ChannelIndicatorQuickSettingsViewPixelTest(
+      const ChannelIndicatorQuickSettingsViewPixelTest&) = delete;
+  ChannelIndicatorQuickSettingsViewPixelTest& operator=(
+      const ChannelIndicatorQuickSettingsViewPixelTest&) = delete;
+  ~ChannelIndicatorQuickSettingsViewPixelTest() override = default;
+
+  // AshTestBase:
+  void SetUp() override {
+    feature_list_.InitWithFeatureState(features::kQsRevamp, GetParam());
+
+    // Install a test delegate to allow overriding channel version.
+    auto delegate = std::make_unique<TestShellDelegate>();
+    delegate->set_channel(version_info::Channel::BETA);
+    AshTestBase::SetUp(std::move(delegate));
+
+    system_tray_client_ = GetSystemTrayClient();
+    system_tray_client_->set_user_feedback_enabled(true);
+
+    // Place the view in a large views::Widget so the buttons are clickable.
+    widget_ = CreateFramelessTestWidget();
+    widget_->SetFullscreen(true);
+    if (IsQsRevampEnabled()) {
+      // Implicitly instantiate the view by creating the quick settings header.
+      model_ = base::MakeRefCounted<UnifiedSystemTrayModel>(nullptr);
+      controller_ = std::make_unique<UnifiedSystemTrayController>(model_.get());
+      auto header = std::make_unique<QuickSettingsHeader>(controller_.get());
+      header_ = header.get();
+      widget_->SetContentsView(std::move(header));
+    } else {
+      // Explicitly instantiate view.
+      auto view = std::make_unique<ChannelIndicatorQuickSettingsView>(
+          version_info::Channel::BETA,
+          system_tray_client_->IsUserFeedbackEnabled());
+      view_ = view.get();
+      widget_->SetContentsView(std::move(view));
+    }
+  }
+
+  absl::optional<pixel_test::InitParams> CreatePixelTestInitParams()
+      const override {
+    return pixel_test::InitParams();
+  }
+
+  void TearDown() override {
+    controller_.reset();
+    model_.reset();
+    widget_.reset();
+    AshTestBase::TearDown();
+  }
+
+  bool IsQsRevampEnabled() const { return GetParam(); }
+
+  QuickSettingsHeader* header() { return header_; }
+  ChannelIndicatorQuickSettingsView* view() {
+    return IsQsRevampEnabled() ? header()->channel_view_for_test() : view_;
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+  TestSystemTrayClient* system_tray_client_ = nullptr;
+  scoped_refptr<UnifiedSystemTrayModel> model_;
+  std::unique_ptr<UnifiedSystemTrayController> controller_;
+  std::unique_ptr<views::Widget> widget_;
+  ChannelIndicatorQuickSettingsView* view_ = nullptr;
+  QuickSettingsHeader* header_ = nullptr;
+};
+
+INSTANTIATE_TEST_SUITE_P(QsRevampEnabled,
+                         ChannelIndicatorQuickSettingsViewPixelTest,
+                         testing::Bool());
+
+// Verifies the UI when the feedback button is visible.
+TEST_P(ChannelIndicatorQuickSettingsViewPixelTest, FeedbackButtonVisible) {
+  // Basic verification that buttons are visible before taking screenshot.
+  if (IsQsRevampEnabled()) {
+    ASSERT_TRUE(header()->GetVisible());
+  }
+  ASSERT_TRUE(view());
+  ASSERT_TRUE(view()->version_button_for_test());
+  ASSERT_TRUE(view()->version_button_for_test()->GetVisible());
+  ASSERT_TRUE(view()->feedback_button_for_test());
+  ASSERT_TRUE(view()->feedback_button_for_test()->GetVisible());
+
+  // Don't capture any part of the UI except for
+  // `ChannelIndicatorQuickSettingsView`.
+  EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen(
+      "feedback_button_visible.rev_0", view()));
+}
+
+}  // namespace ash
diff --git a/ash/system/message_center/ash_message_popup_collection.cc b/ash/system/message_center/ash_message_popup_collection.cc
index 95bbb4d..f23268f 100644
--- a/ash/system/message_center/ash_message_popup_collection.cc
+++ b/ash/system/message_center/ash_message_popup_collection.cc
@@ -202,10 +202,16 @@
 
 void AshMessagePopupCollection::AnimationFinished() {
   --popups_animating_;
-  // Stop when all animations are finished.
-  if (animation_tracker_ && popups_animating_ == 0) {
-    animation_tracker_->Stop();
-    animation_tracker_.reset();
+  if (!popups_animating_) {
+    // Stop tracking when all animations are finished.
+    if (animation_tracker_) {
+      animation_tracker_->Stop();
+      animation_tracker_.reset();
+    }
+
+    if (animation_idle_closure_) {
+      std::move(animation_idle_closure_).Run();
+    }
   }
 }
 
@@ -230,6 +236,13 @@
   ResetBounds();
 }
 
+void AshMessagePopupCollection::SetAnimationIdleClosureForTest(
+    base::OnceClosure closure) {
+  DCHECK(closure);
+  DCHECK(!animation_idle_closure_);
+  animation_idle_closure_ = std::move(closure);
+}
+
 void AshMessagePopupCollection::OnSlideOut(const std::string& notification_id) {
   metrics_utils::LogClosedByUser(notification_id, /*is_swipe=*/true,
                                  /*is_popup=*/true);
diff --git a/ash/system/message_center/ash_message_popup_collection.h b/ash/system/message_center/ash_message_popup_collection.h
index 4487b7e7..50cc4a1 100644
--- a/ash/system/message_center/ash_message_popup_collection.h
+++ b/ash/system/message_center/ash_message_popup_collection.h
@@ -12,6 +12,7 @@
 #include "ash/public/cpp/tablet_mode_observer.h"
 #include "ash/shelf/shelf_observer.h"
 #include "ash/shell_observer.h"
+#include "base/functional/callback_forward.h"
 #include "ui/compositor/throughput_tracker.h"
 #include "ui/display/display_observer.h"
 #include "ui/gfx/geometry/rect.h"
@@ -82,9 +83,14 @@
   void OnTabletModeStarted() override;
   void OnTabletModeEnded() override;
 
+  // Sets `animation_idle_closure_`.
+  void SetAnimationIdleClosureForTest(base::OnceClosure closure);
+
   // Returns the current tray bubble height or 0 if there is no bubble.
   int tray_bubble_height_for_test() const { return tray_bubble_height_; }
 
+  int popups_animating_for_test() const { return popups_animating_; }
+
  private:
   friend class AshMessagePopupCollectionTest;
   friend class NotificationGroupingControllerTest;
@@ -135,6 +141,9 @@
   // stop the throughput tracker only when all of these animations are finished.
   int popups_animating_ = 0;
 
+  // A closure called when all item animations complete. Used for tests only.
+  base::OnceClosure animation_idle_closure_;
+
   // Keeps track the last pop up added, used by throughout tracker. We only
   // record smoothness when this variable is in scope.
   message_center::MessagePopupView* last_pop_up_added_ = nullptr;
diff --git a/ash/system/message_center/ash_message_popup_collection_unittest.cc b/ash/system/message_center/ash_message_popup_collection_unittest.cc
index 3e4f977..517004fc 100644
--- a/ash/system/message_center/ash_message_popup_collection_unittest.cc
+++ b/ash/system/message_center/ash_message_popup_collection_unittest.cc
@@ -16,6 +16,7 @@
 #include "ash/root_window_controller.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shell.h"
+#include "ash/system/message_center/message_center_test_util.h"
 #include "ash/system/status_area_widget.h"
 #include "ash/system/unified/unified_system_tray.h"
 #include "ash/test/ash_test_base.h"
@@ -149,20 +150,10 @@
 
   gfx::Rect GetWorkArea() { return popup_collection_->work_area_; }
 
-  std::unique_ptr<message_center::Notification> CreateNotification(
-      const std::string& id) {
-    return std::make_unique<message_center::Notification>(
-        message_center::NOTIFICATION_TYPE_SIMPLE, id, u"test_title",
-        u"test message", ui::ImageModel(),
-        std::u16string() /* display_source */, GURL(),
-        message_center::NotifierId(), message_center::RichNotificationData(),
-        new message_center::NotificationDelegate());
-  }
-
   std::string AddNotification() {
     std::string id = base::NumberToString(notification_id_++);
     message_center::MessageCenter::Get()->AddNotification(
-        CreateNotification(id));
+        CreateSimpleNotification(id));
     return id;
   }
 
diff --git a/ash/system/message_center/message_center_test_util.cc b/ash/system/message_center/message_center_test_util.cc
new file mode 100644
index 0000000..a0e26d36
--- /dev/null
+++ b/ash/system/message_center/message_center_test_util.cc
@@ -0,0 +1,21 @@
+// 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/system/message_center/message_center_test_util.h"
+
+#include "ui/message_center/public/cpp/notification.h"
+
+namespace ash {
+
+std::unique_ptr<message_center::Notification> CreateSimpleNotification(
+    const std::string& id) {
+  return std::make_unique<message_center::Notification>(
+      message_center::NOTIFICATION_TYPE_SIMPLE, id, u"test_title",
+      u"test message", ui::ImageModel(), std::u16string() /* display_source */,
+      GURL(), message_center::NotifierId(),
+      message_center::RichNotificationData(),
+      new message_center::NotificationDelegate());
+}
+
+}  // namespace ash
diff --git a/ash/system/message_center/message_center_test_util.h b/ash/system/message_center/message_center_test_util.h
new file mode 100644
index 0000000..05f8b5e
--- /dev/null
+++ b/ash/system/message_center/message_center_test_util.h
@@ -0,0 +1,23 @@
+// 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_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_TEST_UTIL_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_TEST_UTIL_H_
+
+#include <memory>
+#include <string>
+
+namespace message_center {
+class Notification;
+}  // namespace message_center
+
+namespace ash {
+
+// Creates a simple notification with the given id.
+std::unique_ptr<message_center::Notification> CreateSimpleNotification(
+    const std::string& id);
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_CENTER_TEST_UTIL_H_
diff --git a/ash/system/message_center/message_popup_animation_waiter.cc b/ash/system/message_center/message_popup_animation_waiter.cc
new file mode 100644
index 0000000..1802542
--- /dev/null
+++ b/ash/system/message_center/message_popup_animation_waiter.cc
@@ -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.
+
+#include "ash/system/message_center/message_popup_animation_waiter.h"
+
+#include "ash/system/message_center/ash_message_popup_collection.h"
+#include "base/functional/bind.h"
+
+namespace ash {
+
+MessagePopupAnimationWaiter::MessagePopupAnimationWaiter(
+    AshMessagePopupCollection* message_popup_collection)
+    : message_popup_collection_(message_popup_collection) {
+  DCHECK(message_popup_collection_);
+}
+
+MessagePopupAnimationWaiter::~MessagePopupAnimationWaiter() = default;
+
+void MessagePopupAnimationWaiter::Wait() {
+  if (message_popup_collection_->popups_animating_for_test()) {
+    message_popup_collection_->SetAnimationIdleClosureForTest(  // IN-TEST
+        base::BindOnce(&MessagePopupAnimationWaiter::OnPopupAnimationFinished,
+                       weak_ptr_factory_.GetWeakPtr()));
+    run_loop_.Run();
+  }
+}
+
+void MessagePopupAnimationWaiter::OnPopupAnimationFinished() {
+  run_loop_.Quit();
+}
+
+}  // namespace ash
diff --git a/ash/system/message_center/message_popup_animation_waiter.h b/ash/system/message_center/message_popup_animation_waiter.h
new file mode 100644
index 0000000..f72580e76
--- /dev/null
+++ b/ash/system/message_center/message_popup_animation_waiter.h
@@ -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.
+
+#ifndef ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_POPUP_ANIMATION_WAITER_H_
+#define ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_POPUP_ANIMATION_WAITER_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/run_loop.h"
+
+namespace ash {
+class AshMessagePopupCollection;
+
+// A test helper that waits for all message popup animations to finish.
+class MessagePopupAnimationWaiter {
+ public:
+  explicit MessagePopupAnimationWaiter(
+      AshMessagePopupCollection* message_popup_collection);
+  MessagePopupAnimationWaiter(const MessagePopupAnimationWaiter&) = delete;
+  MessagePopupAnimationWaiter& operator=(const MessagePopupAnimationWaiter&) =
+      delete;
+  ~MessagePopupAnimationWaiter();
+
+  // Waits for the popup animations managed by `message_popup_collection_` to
+  // complete. No op if `message_popup_collection_` is already idle.
+  void Wait();
+
+ private:
+  // Called when all popup animations finish.
+  void OnPopupAnimationFinished();
+
+  // The message popup collection whose animations are being waited for.
+  AshMessagePopupCollection* const message_popup_collection_;
+
+  base::RunLoop run_loop_;
+
+  base::WeakPtrFactory<MessagePopupAnimationWaiter> weak_ptr_factory_{this};
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_MESSAGE_CENTER_MESSAGE_POPUP_ANIMATION_WAITER_H_
diff --git a/ash/system/message_center/message_popup_animation_waiter_unittest.cc b/ash/system/message_center/message_popup_animation_waiter_unittest.cc
new file mode 100644
index 0000000..3d87433
--- /dev/null
+++ b/ash/system/message_center/message_popup_animation_waiter_unittest.cc
@@ -0,0 +1,35 @@
+// 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/system/message_center/message_popup_animation_waiter.h"
+
+#include "ash/system/message_center/message_center_test_util.h"
+#include "ash/system/unified/unified_system_tray.h"
+#include "ash/test/ash_test_base.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/compositor/scoped_animation_duration_scale_mode.h"
+#include "ui/message_center/message_center.h"
+
+namespace ash {
+using MessagePopupAnimationWaiterTest = AshTestBase;
+
+TEST_F(MessagePopupAnimationWaiterTest, Basic) {
+  ui::ScopedAnimationDurationScaleMode scope_duration(
+      ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
+  message_center::MessageCenter::Get()->AddNotification(
+      CreateSimpleNotification(/*id=*/"id"));
+  MessagePopupAnimationWaiter(
+      GetPrimaryUnifiedSystemTray()->GetMessagePopupCollection())
+      .Wait();
+}
+
+// Verifies that `MessagePopupAnimationWaiter` works for an idle message
+// popup collection.
+TEST_F(MessagePopupAnimationWaiterTest, NoOperate) {
+  MessagePopupAnimationWaiter(
+      GetPrimaryUnifiedSystemTray()->GetMessagePopupCollection())
+      .Wait();
+}
+
+}  // namespace ash
diff --git a/ash/system/unified/feature_tile.cc b/ash/system/unified/feature_tile.cc
index 966af74..6130a7aa 100644
--- a/ash/system/unified/feature_tile.cc
+++ b/ash/system/unified/feature_tile.cc
@@ -97,6 +97,7 @@
   SetPreferredSize(is_compact ? kCompactSize : kDefaultSize);
 
   auto* icon_container = AddChildView(std::make_unique<FlexLayoutView>());
+  icon_container->SetCanProcessEventsWithinSubtree(false);
   icon_container->SetMainAxisAlignment(views::LayoutAlignment::kCenter);
   icon_container->SetCrossAxisAlignment(is_compact
                                             ? views::LayoutAlignment::kEnd
@@ -108,6 +109,7 @@
   icon_ = icon_container->AddChildView(std::make_unique<views::ImageView>());
 
   auto* title_container = AddChildView(std::make_unique<FlexLayoutView>());
+  title_container->SetCanProcessEventsWithinSubtree(false);
   title_container->SetOrientation(is_compact
                                       ? views::LayoutOrientation::kHorizontal
                                       : views::LayoutOrientation::kVertical);
@@ -116,8 +118,7 @@
   title_container->SetPreferredSize(is_compact ? kCompactTitleContainerSize
                                                : kTitlesContainerSize);
 
-  label_ = AddChildView(std::make_unique<views::Label>());
-  title_container->AddChildView(label_);
+  label_ = title_container->AddChildView(std::make_unique<views::Label>());
 
   if (is_compact) {
     label_->SetPreferredSize(kCompactTitleLabelSize);
@@ -129,12 +130,12 @@
     label_->SetFontList(views::Label::GetDefaultFontList().Derive(
         -1, gfx::Font::FontStyle::NORMAL, gfx::Font::Weight::NORMAL));
   } else {
-    sub_label_ = AddChildView(std::make_unique<views::Label>());
+    sub_label_ =
+        title_container->AddChildView(std::make_unique<views::Label>());
     // TODO(b/252873172): update FontList.
     sub_label_->SetFontList(views::Label::GetDefaultFontList().Derive(
         -1, gfx::Font::FontStyle::NORMAL, gfx::Font::Weight::NORMAL));
     sub_label_->SetLineHeight(kPrimarySubtitleLineHeight);
-    title_container->AddChildView(sub_label_);
   }
 }
 
@@ -160,9 +161,12 @@
   // `drill_in_button_` handle the button events.
   drill_in_arrow->SetCanProcessEventsWithinSubtree(false);
 
-  // Only buttons with Toggle + Drill-in behavior can focus the drill-in arrow.
-  if (!is_togglable_)
+  // Only buttons with Toggle + Drill-in behavior can focus the drill-in arrow
+  // and process drill-in button events.
+  if (!is_togglable_) {
+    drill_in_button->SetCanProcessEventsWithinSubtree(false);
     drill_in_arrow->SetFocusBehavior(FocusBehavior::NEVER);
+  }
 
   drill_in_button_ = AddChildView(std::move(drill_in_button));
   drill_in_button_->AddChildView(std::move(drill_in_arrow));
diff --git a/ash/wallpaper/OWNERS b/ash/wallpaper/OWNERS
index 083cafa..0cbdb87 100644
--- a/ash/wallpaper/OWNERS
+++ b/ash/wallpaper/OWNERS
@@ -1,2 +1,3 @@
 cowmoo@chromium.org
+jasontt@chromium.org
 xiaohuic@chromium.org
diff --git a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
index b643da0..4be7b1e 100644
--- a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
+++ b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
@@ -78,6 +78,8 @@
   bool from_assistant;
   // Whether or not the assistant debug info is allowed by user.
   bool assistant_debug_info_allowed;
+  // Whether or not the feedback app is opened from OS Settings Search.
+  bool from_settings_search;
   // The URL of the page that this issue was being experienced on.
   url.mojom.Url?  page_url;
   // Extra diagnostics information provided by source CrOS application by
diff --git a/ash/webui/os_feedback_ui/resources/fake_data.js b/ash/webui/os_feedback_ui/resources/fake_data.js
index 93d67dcd..e411fc70 100644
--- a/ash/webui/os_feedback_ui/resources/fake_data.js
+++ b/ash/webui/os_feedback_ui/resources/fake_data.js
@@ -83,6 +83,7 @@
   isInternalAccount: false,
   fromAssistant: false,
   assistantDebugInfoAllowed: false,
+  fromSettingsSearch: false,
   traceId: 1,
 };
 
@@ -93,6 +94,7 @@
   isInternalAccount: false,
   fromAssistant: false,
   assistantDebugInfoAllowed: false,
+  fromSettingsSearch: false,
   traceId: 0,
 };
 
@@ -103,6 +105,7 @@
   isInternalAccount: true,
   fromAssistant: true,
   assistantDebugInfoAllowed: false,
+  fromSettingsSearch: true,
   traceId: 1,
 };
 
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js
index 28b1a16f..75787113 100644
--- a/ash/webui/os_feedback_ui/resources/feedback_flow.js
+++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -58,6 +58,7 @@
   CATEGORY_TAG: 'category_tag',
   PAGE_URL: 'page_url',
   FROM_ASSISTANT: 'from_assistant',
+  FROM_SETTINGS_SEARCH: 'from_settings_search',
 };
 
 /**
@@ -185,7 +186,7 @@
     this.shouldShowBluetoothCheckbox_;
 
     /**
-     * Whether to show the bluetooth Logs checkbox in share data page.
+     * Whether to show the assistant checkbox in share data page.
      * @type {boolean}
      */
     this.shouldShowAssistantCheckbox_;
@@ -383,6 +384,9 @@
     const fromAssistant =
         params.get(AdditionalContextQueryParam.FROM_ASSISTANT);
     this.feedbackContext_.fromAssistant = !!fromAssistant;
+    const fromSettingsSearch =
+        params.get(AdditionalContextQueryParam.FROM_SETTINGS_SEARCH);
+    this.set('feedbackContext_.fromSettingsSearch', !!fromSettingsSearch);
   }
 
   /**
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html
index d40f91b..20aa18c0 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.html
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -262,7 +262,8 @@
       </div>
       <!-- System Information -->
       <div id="sysInfoContainer" class="checkbox-field-container">
-        <cr-checkbox id="sysInfoCheckbox" aria-labelledby="sysInfoCheckboxLabel" checked>
+        <cr-checkbox id="sysInfoCheckbox" aria-labelledby="sysInfoCheckboxLabel"
+            checked="[[checkSysInfoAndMetrics_(feedbackContext.fromSettingsSearch)]]">
           <div id="sysInfoCheckboxLabel" inner-h-t-m-l="[[sysInfoCheckboxLabel_]]"
               class="checkbox-label"></div>
         </cr-checkbox>
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js
index 59abb513..d533e19 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.js
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -145,6 +145,20 @@
   }
 
   /**
+   * If feedback app has been requested from settings search, we do not need to
+   * collect system info and metrics data by default.
+   *
+   * @return {boolean}
+   * @protected
+   */
+  checkSysInfoAndMetrics_() {
+    if (!this.feedbackContext) {
+      return true;
+    }
+    return !this.feedbackContext.fromSettingsSearch;
+  }
+
+  /**
    * @return {boolean}
    * @protected
    */
diff --git a/ash/webui/personalization_app/OWNERS b/ash/webui/personalization_app/OWNERS
index 33d7001..49078dc 100644
--- a/ash/webui/personalization_app/OWNERS
+++ b/ash/webui/personalization_app/OWNERS
@@ -1,3 +1,4 @@
 cowmoo@chromium.org
+jasontt@chromium.org
 
 file://chromeos/ash/components/assistant/OWNERS
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom
index 2c8d6f1f..ff5b2342 100644
--- a/ash/webui/personalization_app/mojom/personalization_app.mojom
+++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -236,6 +236,15 @@
     FetchGooglePhotosAlbums(string? resume_token) =>
         (FetchGooglePhotosAlbumsResponse response);
 
+    // Fetch the list of albums shared with the user or shared by the user in
+    // Google Photos. Albums with no photo assets will not be returned. On
+    // error, |response.albums| will be absent. |response.resume_token| will
+    // be present when there are more results to fetch; |resume_token| will
+    // be present when this is a follow-up query to one that indicated there
+    // were more results to fetch.
+    FetchGooglePhotosSharedAlbums(string? resume_token) =>
+        (FetchGooglePhotosAlbumsResponse response);
+
     // Fetch whether the user is allowed to access Google Photos data.
     FetchGooglePhotosEnabled() => (GooglePhotosEnablementState state);
 
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc
index d38d1cf7..3effdbc 100644
--- a/ash/webui/personalization_app/personalization_app_ui.cc
+++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -363,6 +363,9 @@
   source->AddBoolean("isGooglePhotosIntegrationEnabled",
                      wallpaper_provider_->IsEligibleForGooglePhotos());
 
+  source->AddBoolean("isGooglePhotosSharedAlbumsEnabled",
+                     features::IsWallpaperGooglePhotosSharedAlbumsEnabled());
+
   source->AddBoolean("isDarkLightModeEnabled",
                      features::IsDarkLightModeEnabled());
 
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts
index 6693827..86b095b5 100644
--- a/ash/webui/personalization_app/resources/js/personalization_app.ts
+++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -102,7 +102,7 @@
 export {isDefaultImage, isFilePath, isGooglePhotosPhoto, isWallpaperImage} from './wallpaper/utils.js';
 export * from './wallpaper/wallpaper_actions.js';
 export {WallpaperCollections} from './wallpaper/wallpaper_collections_element.js';
-export {selectGooglePhotosAlbum, cancelPreviewWallpaper, confirmPreviewWallpaper, fetchCollections, fetchGooglePhotosAlbum, fetchGooglePhotosAlbums, fetchGooglePhotosPhotos, fetchLocalData, getDefaultImageThumbnail, getLocalImages, initializeBackdropData, initializeGooglePhotosData, selectWallpaper, setCurrentWallpaperLayout, setDailyRefreshCollectionId, updateDailyRefreshWallpaper} from './wallpaper/wallpaper_controller.js';
+export {selectGooglePhotosAlbum, cancelPreviewWallpaper, confirmPreviewWallpaper, fetchCollections, fetchGooglePhotosAlbum, fetchGooglePhotosAlbums, fetchGooglePhotosPhotos, fetchGooglePhotosSharedAlbums, fetchLocalData, getDefaultImageThumbnail, getLocalImages, initializeBackdropData, initializeGooglePhotosData, selectWallpaper, setCurrentWallpaperLayout, setDailyRefreshCollectionId, updateDailyRefreshWallpaper} from './wallpaper/wallpaper_controller.js';
 export {WallpaperError} from './wallpaper/wallpaper_error_element.js';
 export {WallpaperFullscreen} from './wallpaper/wallpaper_fullscreen_element.js';
 export {WallpaperGridItem} from './wallpaper/wallpaper_grid_item_element.js';
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_albums_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_albums_element.ts
index 48fe6c0..00ae477 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_albums_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_albums_element.ts
@@ -11,6 +11,7 @@
 import '../../css/wallpaper.css.js';
 import '../../css/common.css.js';
 
+import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {IronScrollThresholdElement} from 'chrome://resources/polymer/v3_0/iron-scroll-threshold/iron-scroll-threshold.js';
@@ -25,7 +26,7 @@
 
 import {getTemplate} from './google_photos_albums_element.html.js';
 import {getLoadingPlaceholders} from './utils.js';
-import {fetchGooglePhotosAlbums} from './wallpaper_controller.js';
+import {fetchGooglePhotosAlbums, fetchGooglePhotosSharedAlbums} from './wallpaper_controller.js';
 import {getWallpaperProvider} from './wallpaper_interface_provider.js';
 
 const ERROR_ID = 'GooglePhotosAlbums';
@@ -62,10 +63,7 @@
         observer: 'onHiddenChanged_',
       },
 
-      albums_: {
-        type: Array,
-        observer: 'onAlbumsChanged_',
-      },
+      albums_: Array,
 
       albumsForDisplay_: {
         type: Array,
@@ -74,33 +72,59 @@
 
       albumsLoading_: Boolean,
 
-      albumsResumeToken_: {
-        type: String,
-        observer: 'onAlbumsResumeTokenChanged_',
-      },
+      albumsResumeToken_: String,
+
+      albumsShared_: Array,
+
+      albumsSharedLoading_: Boolean,
+
+      albumsSharedResumeToken_: String,
 
       error_: {
         type: Object,
         value: null,
       },
+
+      isSharedAlbumsEnabled_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('isGooglePhotosSharedAlbumsEnabled');
+        },
+      },
     };
   }
 
+  static get observers() {
+    return [
+      'onAlbumsChanged_(albums_, albumsShared_)',
+      'onAlbumsResumeTokenChanged_(albumsResumeToken_, albumsSharedResumeToken_)',
+    ];
+  }
+
   /** Whether or not this element is currently hidden. */
   override hidden: boolean;
 
-  /** The list of albums. */
+  /** The list of owned albums. */
   private albums_: GooglePhotosAlbum[]|null|undefined;
 
-  /** The list of |albums_| which is updated in place for display. */
+  /** The concatenation of |albums_| and |albumsShared_| for display. */
   private albumsForDisplay_: GooglePhotosAlbum[];
 
-  /** Whether the list of albums is currently loading. */
+  /** Whether the list of owned albums is currently loading. */
   private albumsLoading_: boolean;
 
-  /** The resume token needed to fetch the next page of albums. */
+  /** The resume token needed to fetch the next page of owned albums. */
   private albumsResumeToken_: string|null;
 
+  /** The list of shared albums. */
+  private albumsShared_: GooglePhotosAlbum[]|null|undefined;
+
+  /** Whether the list of shared albums is currently loading. */
+  private albumsSharedLoading_: boolean;
+
+  /** The resume token needed to fetch the next page of shared albums. */
+  private albumsSharedResumeToken_: string|null;
+
   /** The current personalization error state. */
   private error_: PersonalizationStateError|null;
 
@@ -108,6 +132,9 @@
   private wallpaperProvider_: WallpaperProviderInterface =
       getWallpaperProvider();
 
+  /** Whether feature flag |kGooglePhotosSharedAlbums| is enabled. */
+  private isSharedAlbumsEnabled_: boolean;
+
   override connectedCallback() {
     super.connectedCallback();
 
@@ -118,6 +145,16 @@
     this.watch<GooglePhotosAlbums['albumsResumeToken_']>(
         'albumsResumeToken_',
         state => state.wallpaper.googlePhotos.resumeTokens.albums);
+    if (this.isSharedAlbumsEnabled_) {
+      this.watch<GooglePhotosAlbums['albumsShared_']>(
+          'albumsShared_', state => state.wallpaper.googlePhotos.albumsShared);
+      this.watch<GooglePhotosAlbums['albumsSharedLoading_']>(
+          'albumsSharedLoading_',
+          state => state.wallpaper.loading.googlePhotos.albumsShared);
+      this.watch<GooglePhotosAlbums['albumsSharedResumeToken_']>(
+          'albumsSharedResumeToken_',
+          state => state.wallpaper.googlePhotos.resumeTokens.albumsShared);
+    }
     this.watch<GooglePhotosAlbums['error_']>('error_', state => state.error);
 
     this.updateFromStore();
@@ -131,11 +168,16 @@
     }
   }
 
-  /** Invoked on changes to |albums_|. */
-  private onAlbumsChanged_(albums: GooglePhotosAlbums['albums_']) {
+  /** Invoked on changes to |albums_| or |albumsShared_|. */
+  private onAlbumsChanged_(
+      albums: GooglePhotosAlbums['albums_'],
+      albumsShared: GooglePhotosAlbums['albumsShared_']) {
     // If the list of albums fails to load, display an error to the user that
     // allows them to make another attempt.
-    if (albums === null) {
+    // When shared albums flag is enabled, also need to make sure |albumsShared|
+    // fails to load.
+    if (albums === null &&
+        !(this.isSharedAlbumsEnabled_ && albumsShared !== null)) {
       if (!this.hidden) {
         this.dispatch(setErrorAction({
           id: ERROR_ID,
@@ -147,9 +189,14 @@
                 // Post the reattempt instead of performing it immediately to
                 // avoid updating the personalization store from the same
                 // sequence that generated this event.
-                setTimeout(
-                    () => fetchGooglePhotosAlbums(
-                        this.wallpaperProvider_, this.getStore()));
+                setTimeout(() => {
+                  fetchGooglePhotosAlbums(
+                      this.wallpaperProvider_, this.getStore());
+                  if (this.isSharedAlbumsEnabled_) {
+                    fetchGooglePhotosSharedAlbums(
+                        this.wallpaperProvider_, this.getStore());
+                  }
+                });
               }
             },
           },
@@ -158,20 +205,26 @@
       return;
     }
 
+    // Concatenate owned and shared albums.
+    const newAlbums = (albums || []).concat(albumsShared || []);
+
     // NOTE: |albumsForDisplay_| is updated in place to avoid resetting the
     // scroll position of the grid which would otherwise occur during
-    // reassignment but it will be deeply equal to |albums_| after updating.
+    // reassignment but it will be deeply equal to |newAlbums| after updating.
     this.updateList(
         /*propertyPath=*/ 'albumsForDisplay_',
         /*identityGetter=*/ (album: GooglePhotosAlbum) => album.id,
-        /*newList=*/ albums || [],
+        /*newList=*/ newAlbums,
         /*identityBasedUpdate=*/ true);
   }
 
-  /** Invoked on changes to |albumsResumeToken_|. */
+  /**
+   * Invoked on changes to |albumsResumeToken_| or |albumsSharedResumeToken_|.
+   */
   private onAlbumsResumeTokenChanged_(
-      albumsResumeToken: GooglePhotosAlbums['albumsResumeToken_']) {
-    if (albumsResumeToken) {
+      albumsResumeToken: GooglePhotosAlbums['albumsResumeToken_'],
+      albumsSharedResumeToken: GooglePhotosAlbums['albumsSharedResumeToken_']) {
+    if (albumsResumeToken || albumsSharedResumeToken) {
       this.$.gridScrollThreshold.clearTriggers();
     }
   }
@@ -186,12 +239,25 @@
 
     // Ignore this event if albums are already being loading or if there is no
     // resume token (indicating there are no additional albums to load).
-    if (this.albumsLoading_ === true || !this.albumsResumeToken_) {
+    const isLoading =
+        this.albumsLoading_ === true || this.albumsSharedLoading_ === true;
+    const albumResumeTokensPresent =
+        this.albumsResumeToken_ || this.albumsSharedResumeToken_;
+    if (isLoading || !albumResumeTokensPresent) {
       return;
     }
 
-    // Fetch the next page of albums.
+    // Fetch the next page of owned albums.
     fetchGooglePhotosAlbums(this.wallpaperProvider_, this.getStore());
+
+    // Fetch the next page of shared albums when needed.
+    if (this.isSharedAlbumsEnabled_) {
+      if (this.albumsSharedLoading_ === true ||
+          !this.albumsSharedResumeToken_) {
+        return;
+      }
+      fetchGooglePhotosSharedAlbums(this.wallpaperProvider_, this.getStore());
+    }
   }
 
   /** Invoked on changes to this element's |hidden| state. */
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.html b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.html
index 0f2abcf0..9802e3f 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.html
+++ b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.html
@@ -44,7 +44,7 @@
   }
 </style>
 <main id="main" aria-label="$i18n{googlePhotosLabel}" tabindex="-1">
-  <template is="dom-if" if="[[isTabStripVisible_(albumId, albums_)]]">
+  <template is="dom-if" if="[[isTabStripVisible_(albumId, albums_, albumsShared_)]]">
     <div id="tabStrip">
       <cr-button id="photosTab" aria-pressed="[[isPhotosTabSelected_(tab_)]]"
         on-click="onTabSelected_">
@@ -59,7 +59,7 @@
   <google-photos-photos id="photosContent"
     hidden="[[!isPhotosTabContentVisible_(hidden, photos_, tab_)]]">
   </google-photos-photos>
-  <template is="dom-if" if="[[!isAlbumsEmpty_(albums_)]]">
+  <template is="dom-if" if="[[!isAlbumsEmpty_(albums_, albumsShared_)]]">
     <google-photos-albums id="albumsContent"
       hidden="[[!isAlbumsTabContentVisible_(hidden, tab_)]]">
     </google-photos-albums>
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.ts
index 128b6f9e..ac12d38 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/google_photos_collection_element.ts
@@ -11,6 +11,7 @@
 import '../../css/wallpaper.css.js';
 import '../../css/common.css.js';
 
+import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
 
 import {GooglePhotosAlbum, GooglePhotosEnablementState, GooglePhotosPhoto, WallpaperProviderInterface} from '../personalization_app.mojom-webui.js';
@@ -19,7 +20,7 @@
 import {isNonEmptyArray} from '../utils.js';
 
 import {getTemplate} from './google_photos_collection_element.html.js';
-import {fetchGooglePhotosAlbums, fetchGooglePhotosPhotos, initializeGooglePhotosData} from './wallpaper_controller.js';
+import {fetchGooglePhotosAlbums, fetchGooglePhotosPhotos, fetchGooglePhotosSharedAlbums, initializeGooglePhotosData} from './wallpaper_controller.js';
 import {getWallpaperProvider} from './wallpaper_interface_provider.js';
 
 /** A Promise<T> which can be externally |resolve()|-ed. */
@@ -81,6 +82,8 @@
 
       albums_: Array,
       albumsLoading_: Boolean,
+      albumsShared_: Array,
+      albumsSharedLoading_: Boolean,
       enabled_: Number,
       photos_: Array,
       photosByAlbumId_: Object,
@@ -89,6 +92,13 @@
         type: String,
         value: Tab.PHOTOS,
       },
+
+      isSharedAlbumsEnabled_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('isGooglePhotosSharedAlbumsEnabled');
+        },
+      },
     };
   }
 
@@ -105,12 +115,18 @@
   /** The currently selected path. */
   path: string|undefined;
 
-  /** The list of albums. */
+  /** The list of owned albums. */
   private albums_: GooglePhotosAlbum[]|null|undefined;
 
-  /** Whether the list of albums is currently loading. */
+  /** Whether the list of owned albums is currently loading. */
   private albumsLoading_: boolean|undefined;
 
+  /** The list of shared albums. */
+  private albumsShared_: GooglePhotosAlbum[]|null|undefined;
+
+  /** Whether the list of shared albums is currently loading. */
+  private albumsSharedLoading_: boolean|undefined;
+
   /** Whether the user is allowed to access Google Photos. */
   private enabled_: GooglePhotosEnablementState|undefined;
 
@@ -140,6 +156,9 @@
   private wallpaperProvider_: WallpaperProviderInterface =
       getWallpaperProvider();
 
+  /** Whether feature flag |kGooglePhotosSharedAlbums| is enabled. */
+  private isSharedAlbumsEnabled_: boolean;
+
   override connectedCallback() {
     super.connectedCallback();
 
@@ -147,6 +166,13 @@
         'albums_', state => state.wallpaper.googlePhotos.albums);
     this.watch<GooglePhotosCollection['albumsLoading_']>(
         'albumsLoading_', state => state.wallpaper.loading.googlePhotos.albums);
+    if (this.isSharedAlbumsEnabled_) {
+      this.watch<GooglePhotosCollection['albumsShared_']>(
+          'albumsShared_', state => state.wallpaper.googlePhotos.albumsShared);
+      this.watch<GooglePhotosCollection['albumsSharedLoading_']>(
+          'albumsSharedLoading_',
+          state => state.wallpaper.loading.googlePhotos.albumsShared);
+    }
     this.watch<GooglePhotosCollection['enabled_']>(
         'enabled_', state => state.wallpaper.googlePhotos.enabled);
     this.watch<GooglePhotosCollection['photos_']>(
@@ -187,9 +213,14 @@
 
     // When the user first selects the Google Photos collection it should result
     // in a data fetch for the user's albums.
-    if (this.albums_ === undefined && !this.albumsLoading_) {
+    if (this.albums_ === undefined && !this.albumsLoading_ &&
+        this.albumsShared_ === undefined && !this.albumsSharedLoading_) {
       this.initializeGooglePhotosDataPromise_.then(() => {
         fetchGooglePhotosAlbums(this.wallpaperProvider_, this.getStore());
+        if (this.isSharedAlbumsEnabled_) {
+          fetchGooglePhotosSharedAlbums(
+              this.wallpaperProvider_, this.getStore());
+        }
       });
     }
   }
@@ -222,7 +253,14 @@
   }
 
   /** Whether the list of albums is empty. */
-  private isAlbumsEmpty_(albums: GooglePhotosCollection['albums_']): boolean {
+  private isAlbumsEmpty_(
+      albums: GooglePhotosCollection['albums_'],
+      albumsShared: GooglePhotosCollection['albumsShared_']): boolean {
+    if (this.isSharedAlbumsEnabled_) {
+      // The list of (owned+shared) albums is empty only if both albums are
+      // enpty.
+      return !isNonEmptyArray(albums) && !isNonEmptyArray(albumsShared);
+    }
     return !isNonEmptyArray(albums);
   }
 
@@ -289,8 +327,9 @@
   /** Whether the tab strip is currently visible. */
   private isTabStripVisible_(
       albumId: GooglePhotosCollection['albumId'],
-      albums: GooglePhotosCollection['albums_']): boolean {
-    return !albumId && !this.isAlbumsEmpty_(albums);
+      albums: GooglePhotosCollection['albums_'],
+      albumsShared: GooglePhotosCollection['albumsShared_']): boolean {
+    return !albumId && !this.isAlbumsEmpty_(albums, albumsShared);
   }
 
   /** Whether zero state is currently visible. */
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts
index d3216693..88fc793 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_actions.ts
@@ -18,9 +18,12 @@
 export enum WallpaperActionName {
   APPEND_GOOGLE_PHOTOS_ALBUM = 'append_google_photos_album',
   APPEND_GOOGLE_PHOTOS_ALBUMS = 'append_google_photos_albums',
+  APPEND_GOOGLE_PHOTOS_SHARED_ALBUMS = 'append_google_photos_shared_albums',
   APPEND_GOOGLE_PHOTOS_PHOTOS = 'append_google_photos_photos',
   BEGIN_LOAD_GOOGLE_PHOTOS_ALBUM = 'begin_load_google_photos_album',
   BEGIN_LOAD_GOOGLE_PHOTOS_ALBUMS = 'begin_load_google_photos_albums',
+  BEGIN_LOAD_GOOGLE_PHOTOS_SHARED_ALBUMS =
+      'begin_load_google_photos_shared_albums',
   BEGIN_LOAD_GOOGLE_PHOTOS_ENABLED = 'begin_load_google_photos_enabled',
   BEGIN_LOAD_GOOGLE_PHOTOS_PHOTOS = 'begin_load_google_photos_photos',
   BEGIN_LOAD_IMAGES_FOR_COLLECTIONS = 'begin_load_images_for_collections',
@@ -48,8 +51,9 @@
 
 export type WallpaperActions =
     AppendGooglePhotosAlbumAction|AppendGooglePhotosAlbumsAction|
-    AppendGooglePhotosPhotosAction|BeginLoadDefaultImageThumbnailAction|
-    BeginLoadGooglePhotosAlbumAction|BeginLoadGooglePhotosAlbumsAction|
+    AppendGooglePhotosSharedAlbumsAction|AppendGooglePhotosPhotosAction|
+    BeginLoadDefaultImageThumbnailAction|BeginLoadGooglePhotosAlbumAction|
+    BeginLoadGooglePhotosAlbumsAction|BeginLoadGooglePhotosSharedAlbumsAction|
     BeginLoadGooglePhotosEnabledAction|BeginLoadGooglePhotosPhotosAction|
     BeginLoadImagesForCollectionsAction|BeginLoadLocalImagesAction|
     BeginLoadLocalImageDataAction|BeginUpdateDailyRefreshImageAction|
@@ -90,8 +94,8 @@
 };
 
 /**
- * Appends to the list of Google Photos albums. May be called with null on
- * error.
+ * Appends to the list of Google Photos owned albums. May be called with
+ * null on error.
  */
 export function appendGooglePhotosAlbumsAction(
     albums: GooglePhotosAlbum[]|null,
@@ -103,6 +107,26 @@
   };
 }
 
+export type AppendGooglePhotosSharedAlbumsAction = Action&{
+  name: WallpaperActionName.APPEND_GOOGLE_PHOTOS_SHARED_ALBUMS,
+  albums: GooglePhotosAlbum[] | null,
+  resumeToken: string | null,
+};
+
+/**
+ * Appends to the list of Google Photos shared albums. May be called with
+ * null on error.
+ */
+export function appendGooglePhotosSharedAlbumsAction(
+    albums: GooglePhotosAlbum[]|null,
+    resumeToken: string|null): AppendGooglePhotosSharedAlbumsAction {
+  return {
+    albums,
+    resumeToken,
+    name: WallpaperActionName.APPEND_GOOGLE_PHOTOS_SHARED_ALBUMS,
+  };
+}
+
 export type AppendGooglePhotosPhotosAction = Action&{
   name: WallpaperActionName.APPEND_GOOGLE_PHOTOS_PHOTOS,
   photos: GooglePhotosPhoto[] | null,
@@ -149,6 +173,18 @@
   return {name: WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_ALBUMS};
 }
 
+export type BeginLoadGooglePhotosSharedAlbumsAction = Action&{
+  name: WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_SHARED_ALBUMS,
+};
+
+/**
+ * Notify that the app is loading the list of Google Photos albums.
+ */
+export function beginLoadGooglePhotosSharedAlbumsAction():
+    BeginLoadGooglePhotosSharedAlbumsAction {
+  return {name: WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_SHARED_ALBUMS};
+}
+
 export type BeginLoadGooglePhotosEnabledAction = Action&{
   name: WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_ENABLED,
 };
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_controller.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_controller.ts
index f1f06b88..87ab666 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_controller.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_controller.ts
@@ -119,13 +119,13 @@
       action.appendGooglePhotosAlbumAction(albumId, photos, resumeToken));
 }
 
-/** Fetches the list of Google Photos albums and saves it to the store. */
+/** Fetches the list of Google Photos owned albums and saves it to the store. */
 export async function fetchGooglePhotosAlbums(
     provider: WallpaperProviderInterface,
     store: PersonalizationStore): Promise<void> {
   // Albums should only be fetched after determining whether access is allowed.
   const enabled = store.data.wallpaper.googlePhotos.enabled;
-  assert(enabled !== undefined);
+  assert(enabled !== undefined, 'Google Photos albums not enabled.');
 
   store.dispatch(action.beginLoadGooglePhotosAlbumsAction());
 
@@ -144,7 +144,7 @@
     albums.push(...response.albums);
     resumeToken = response.resumeToken || null;
   } else {
-    console.warn('Failed to fetch Google Photos albums');
+    console.warn('Failed to fetch Google Photos owned albums');
     albums = null;
     // NOTE: `resumeToken` is intentionally *not* modified so that the request
     // which failed can be reattempted.
@@ -160,6 +160,51 @@
   store.dispatch(action.appendGooglePhotosAlbumsAction(albums, resumeToken));
 }
 
+/**
+ * Fetches the list of Google Photos shared albums and saves it to the store.
+ */
+export async function fetchGooglePhotosSharedAlbums(
+    provider: WallpaperProviderInterface,
+    store: PersonalizationStore): Promise<void> {
+  // Albums should only be fetched after determining whether access is allowed.
+  const enabled = store.data.wallpaper.googlePhotos.enabled;
+  assert(
+      enabled !== undefined, 'Google photos enablement state not initialized.');
+
+  store.dispatch(action.beginLoadGooglePhotosSharedAlbumsAction());
+
+  // If access is *not* allowed, short-circuit the request.
+  if (enabled !== GooglePhotosEnablementState.kEnabled) {
+    store.dispatch(action.appendGooglePhotosSharedAlbumsAction(
+        /*albums=*/ null, /*resumeToken=*/ null));
+    return;
+  }
+
+  let albums: GooglePhotosAlbum[]|null = [];
+  let resumeToken = store.data.wallpaper.googlePhotos.resumeTokens.albumsShared;
+
+  const {response} = await provider.fetchGooglePhotosSharedAlbums(resumeToken);
+  if (Array.isArray(response.albums)) {
+    albums.push(...response.albums);
+    resumeToken = response.resumeToken || null;
+  } else {
+    console.warn('Failed to fetch Google Photos shared albums');
+    albums = null;
+    // NOTE: `resumeToken` is intentionally *not* modified so that the request
+    // which failed can be reattempted.
+  }
+
+  // Impose max resolution.
+  if (albums !== null) {
+    albums = albums.map(
+        album =>
+            ({...album, preview: appendMaxResolutionSuffix(album.preview)}));
+  }
+
+  store.dispatch(
+      action.appendGooglePhotosSharedAlbumsAction(albums, resumeToken));
+}
+
 /** Fetches whether the user is allowed to access Google Photos. */
 async function fetchGooglePhotosEnabled(
     provider: WallpaperProviderInterface,
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_reducers.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_reducers.ts
index 4d33428..c75c3a5 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_reducers.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_reducers.ts
@@ -191,6 +191,24 @@
           albums: false,
         },
       };
+    case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_SHARED_ALBUMS:
+      assert(state.googlePhotos.albumsShared === false);
+      return {
+        ...state,
+        googlePhotos: {
+          ...state.googlePhotos,
+          albumsShared: true,
+        },
+      };
+    case WallpaperActionName.APPEND_GOOGLE_PHOTOS_SHARED_ALBUMS:
+      assert(state.googlePhotos.albumsShared === true);
+      return {
+        ...state,
+        googlePhotos: {
+          ...state.googlePhotos,
+          albumsShared: false,
+        },
+      };
     case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_ENABLED:
       assert(state.googlePhotos.enabled === false);
       return {
@@ -457,10 +475,12 @@
       };
     case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_ALBUMS:
       // The list of albums should be loaded only while additional albums exist.
-      assert(!state.albums || state.resumeTokens.albums);
+      assert(
+          !state.albums || state.resumeTokens.albums,
+          'Additional owned albums do not exist.');
       return state;
     case WallpaperActionName.APPEND_GOOGLE_PHOTOS_ALBUMS:
-      assert(action.albums !== undefined);
+      assert(action.albums !== undefined, 'No owned albums fetched.');
       // Case: First batch of albums.
       if (!Array.isArray(state.albums)) {
         return {
@@ -491,6 +511,43 @@
           albums: action.resumeToken,
         },
       };
+    case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_SHARED_ALBUMS:
+      assert(
+          !state.albumsShared || state.resumeTokens.albumsShared,
+          'Additional shared albums do not exist.');
+      return state;
+    case WallpaperActionName.APPEND_GOOGLE_PHOTOS_SHARED_ALBUMS:
+      assert(action.albums !== undefined, 'No shared albums fetched.');
+      // Case: First batch of albums.
+      if (!Array.isArray(state.albumsShared)) {
+        return {
+          ...state,
+          albumsShared: action.albums,
+          resumeTokens: {
+            ...state.resumeTokens,
+            albumsShared: action.resumeToken,
+          },
+        };
+      }
+      // Case: Subsequent batches of albums.
+      if (Array.isArray(action.albums)) {
+        return {
+          ...state,
+          albumsShared: [...state.albumsShared, ...action.albums],
+          resumeTokens: {
+            ...state.resumeTokens,
+            albumsShared: action.resumeToken,
+          },
+        };
+      }
+      // Case: Error.
+      return {
+        ...state,
+        resumeTokens: {
+          ...state.resumeTokens,
+          albumsShared: action.resumeToken,
+        },
+      };
     case WallpaperActionName.BEGIN_LOAD_GOOGLE_PHOTOS_ENABLED:
       // Whether the user is allowed to access Google Photos should be loaded
       // only once.
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_state.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_state.ts
index b64205c..d0571de 100644
--- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_state.ts
+++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_state.ts
@@ -21,8 +21,10 @@
  * Stores Google Photos state.
  * |enabled| is whether the user is allowed to access Google Photos. It is
  * undefined only until it has been initialized.
- * |albums| is the list of Google Photos albums. It is undefined only until it
- * has been initialized, then either null (in error state) or a valid Array.
+ * |albums| is the list of Google Photos owned albums. It is undefined only
+ * until it has been initialized, then either null (in error state) or a valid
+ * Array.
+ * |albumsShared| is the list of Google Photos shared albums.
  * |photos| is the list of Google Photos photos. It is undefined only until it
  * has been initialized, then either null (in error state) or a valid Array.
  * |photosByAlbumId| is the list of Google Photos photos keyed by album id. The
@@ -32,10 +34,12 @@
 export interface GooglePhotosState {
   enabled: GooglePhotosEnablementState|undefined;
   albums: GooglePhotosAlbum[]|null|undefined;
+  albumsShared: GooglePhotosAlbum[]|null|undefined;
   photos: GooglePhotosPhoto[]|null|undefined;
   photosByAlbumId: Record<string, GooglePhotosPhoto[]|null|undefined>;
   resumeTokens: {
     albums: string|null,
+    albumsShared: string|null,
     photos: string|null,
     photosByAlbumId: Record<string, string|null>,
   };
@@ -72,6 +76,7 @@
   googlePhotos: {
     enabled: boolean,
     albums: boolean,
+    albumsShared: boolean,
     photos: boolean,
     photosByAlbumId: Record<string, boolean>,
   };
@@ -126,6 +131,7 @@
       googlePhotos: {
         enabled: false,
         albums: false,
+        albumsShared: false,
         photos: false,
         photosByAlbumId: {},
       },
@@ -138,9 +144,11 @@
     googlePhotos: {
       enabled: undefined,
       albums: undefined,
+      albumsShared: undefined,
       photos: undefined,
       photosByAlbumId: {},
-      resumeTokens: {albums: null, photos: null, photosByAlbumId: {}},
+      resumeTokens:
+          {albums: null, albumsShared: null, photos: null, photosByAlbumId: {}},
     },
   };
 }
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
index 4308fbe..d45c7af 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
+++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
@@ -84,6 +84,13 @@
       ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponse::New());
 }
 
+void FakePersonalizationAppWallpaperProvider::FetchGooglePhotosSharedAlbums(
+    const absl::optional<std::string>& resume_token,
+    FetchGooglePhotosAlbumsCallback callback) {
+  std::move(callback).Run(
+      ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponse::New());
+}
+
 void FakePersonalizationAppWallpaperProvider::FetchGooglePhotosEnabled(
     FetchGooglePhotosEnabledCallback callback) {
   std::move(callback).Run(
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
index aca15bb..59b6b397 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
+++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
@@ -63,6 +63,10 @@
       const absl::optional<std::string>& resume_token,
       FetchGooglePhotosAlbumsCallback callback) override;
 
+  void FetchGooglePhotosSharedAlbums(
+      const absl::optional<std::string>& resume_token,
+      FetchGooglePhotosAlbumsCallback callback) override;
+
   void FetchGooglePhotosEnabled(
       FetchGooglePhotosEnabledCallback callback) override;
 
diff --git a/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc b/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc
index 061e1f7..1822af3 100644
--- a/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc
+++ b/ash/webui/personalization_app/test/personalization_app_mojom_banned_browsertest_fixture.cc
@@ -158,6 +158,11 @@
                FetchGooglePhotosAlbumsCallback callback),
               (override));
   MOCK_METHOD(void,
+              FetchGooglePhotosSharedAlbums,
+              (const absl::optional<std::string>& resume_token,
+               FetchGooglePhotosAlbumsCallback callback),
+              (override));
+  MOCK_METHOD(void,
               FetchGooglePhotosEnabled,
               (FetchGooglePhotosEnabledCallback callback),
               (override));
diff --git a/base/debug/asan_service_unittest.cc b/base/debug/asan_service_unittest.cc
index f4d9c7c..0571e065 100644
--- a/base/debug/asan_service_unittest.cc
+++ b/base/debug/asan_service_unittest.cc
@@ -40,10 +40,12 @@
 #define MAYBE_ErrorCallback DISABLED_ErrorCallback
 #define MAYBE_CrashInErrorCallback DISABLED_CrashInErrorCallback
 #define MAYBE_ShouldExitCleanly DISABLED_ShouldExitCleanly
+#define MAYBE_TaskTraceCallback DISABLED_TaskTraceCallback
 #else
 #define MAYBE_ErrorCallback ErrorCallback
 #define MAYBE_CrashInErrorCallback CrashInErrorCallback
 #define MAYBE_ShouldExitCleanly ShouldExitCleanly
+#define MAYBE_TaskTraceCallback TaskTraceCallback
 #endif
 
 TEST_F(AsanServiceTest, MAYBE_ErrorCallback) {
@@ -116,7 +118,7 @@
       *task_environment_.GetMainThreadTaskRunner();
 };
 
-TEST_F(AsanServiceTest, TaskTraceCallback) {
+TEST_F(AsanServiceTest, MAYBE_TaskTraceCallback) {
   AsanTaskTraceTest test;
   // We can't check the symbolization of the task trace, as this will fail on
   // build configurations that don't include symbols. We instead just check
diff --git a/base/functional/bind_internal.h b/base/functional/bind_internal.h
index c078a3a..ab58eac 100644
--- a/base/functional/bind_internal.h
+++ b/base/functional/bind_internal.h
@@ -133,13 +133,13 @@
   // Trick to only instantiate these constructors if they are used. Otherwise,
   // instantiating UnretainedWrapper with a T that is not supported by
   // raw_ptr would trigger raw_ptr<T>'s static_assert.
-  template <typename U = T, typename I>
-  explicit UnretainedWrapper(const raw_ptr<U, I>& o) : ptr_(o) {}
-  template <typename U = T, typename I>
-  explicit UnretainedWrapper(raw_ptr<U, I>&& o) : ptr_(std::move(o)) {}
+  template <typename U = T, typename Traits>
+  explicit UnretainedWrapper(const raw_ptr<U, Traits>& o) : ptr_(o) {}
+  template <typename U = T, typename Traits>
+  explicit UnretainedWrapper(raw_ptr<U, Traits>&& o) : ptr_(std::move(o)) {}
 
-  template <typename U, typename I>
-  static void ReportIfDangling(const raw_ptr<U, I>& ptr) {
+  template <typename U, typename Traits>
+  static void ReportIfDangling(const raw_ptr<U, Traits>& ptr) {
     if constexpr (std::is_same_v<Trait, unretained_traits::MayNotDangle>) {
       ptr.ReportIfDangling();
     }
@@ -229,10 +229,10 @@
                 "base/functional/disallow_unretained.h for alternatives.");
 
   explicit UnretainedRefWrapper(T& o) : ref_(o) {}
-  template <typename U = T, typename I>
-  explicit UnretainedRefWrapper(const raw_ref<U, I>& o) : ref_(o.get()) {}
-  template <typename U = T, typename I>
-  explicit UnretainedRefWrapper(raw_ref<U, I>&& o) : ref_(o.get()) {}
+  template <typename U = T, typename Traits>
+  explicit UnretainedRefWrapper(const raw_ref<U, Traits>& o) : ref_(o.get()) {}
+  template <typename U = T, typename Traits>
+  explicit UnretainedRefWrapper(raw_ref<U, Traits>&& o) : ref_(o.get()) {}
   T& get() const {
     // The ultimate goal is to crash when a callback is invoked with a
     // dangling pointer. This is checked here. For now, it is configured to
@@ -1396,8 +1396,8 @@
       template <bool is_method>
       // true if we are handling `this` parameter.
       static constexpr bool kParamIsThisPointer = is_method && i == 0;
-      // true if the current parameter is of type `raw_ptr<T, RawPtrMayDangle>`
-      // (or `MayBeDangling<T>`).
+      // true if the current parameter is of type `raw_ptr<T>` with
+      // raw_ptr_traits::MayDangle trait (e.g. `MayBeDangling<T>`).
       static constexpr bool kParamIsDanglingRawPtr =
           IsRawPtrMayDangleV<FunctionParamType>;
       // true if the bound parameter is of type
diff --git a/base/memory/raw_ptr.h b/base/memory/raw_ptr.h
index f8707cd..1660a76 100644
--- a/base/memory/raw_ptr.h
+++ b/base/memory/raw_ptr.h
@@ -80,30 +80,132 @@
 // NOTE: All methods should be `PA_ALWAYS_INLINE`. raw_ptr is meant to be a
 // lightweight replacement of a raw pointer, hence performance is critical.
 
-// The following types are the different RawPtrType template option possible for
-// a `raw_ptr`:
-// - RawPtrMayDangle disables dangling pointers check when the object is
-//   released.
-// - RawPtrBanDanglingIfSupported may enable dangling pointers check on object
-//   destruction.
-//
-// We describe those types here so that they can be used outside of `raw_ptr` as
-// object markers, and their meaning might vary depending on where those markers
-// are being used. For instance, we are using those in `UnretainedWrapper` to
-// change behavior depending on RawPtrType.
-struct RawPtrMayDangle {};
-struct RawPtrBanDanglingIfSupported {};
-
-struct RawPtrNoOp {};
-
 namespace raw_ptr_traits {
-template <typename T>
-struct RawPtrTypeToImpl;
 
-template <typename RawPtrType>
-inline constexpr bool IsValidRawPtrTypeV =
-    std::is_same_v<RawPtrType, RawPtrMayDangle> ||
-    std::is_same_v<RawPtrType, RawPtrBanDanglingIfSupported>;
+// Disables dangling pointer detection, but keeps other raw_ptr protections.
+// Don't use directly, use DisableDanglingPtrDetection or DanglingUntriaged
+// instead.
+struct MayDangle {};
+// Disables any protections when MTECheckedPtrImpl is requested, by switching to
+// NoOpImpl in that case.
+// Don't use directly, use DegradeToNoOpWhenMTE instead.
+struct DisableMTECheckedPtr {};
+// Disables any hooks, by switching to NoOpImpl in that case.
+// Internal use only.
+struct DisableHooks {};
+// Adds accounting, on top of the chosen implementation, for test purposes.
+// raw_ptr/raw_ref with this trait perform extra bookkeeping, e.g. to track the
+// number of times the raw_ptr is wrapped, unrwapped, etc.
+// Test only.
+struct UseCountingWrapperForTest {};
+// Very internal use only.
+using EmptyTrait = void;
+
+template <typename Trait>
+inline constexpr bool IsValidTraitV =
+    std::is_same_v<Trait, MayDangle> ||
+    std::is_same_v<Trait, DisableMTECheckedPtr> ||
+    std::is_same_v<Trait, DisableHooks> ||
+    std::is_same_v<Trait, UseCountingWrapperForTest> ||
+    std::is_same_v<Trait, EmptyTrait>;
+
+template <typename... Traits>
+struct TraitPack {
+  static_assert((IsValidTraitV<Traits> && ...), "Unknown raw_ptr trait");
+
+  template <typename TraitToSearch>
+  static inline constexpr bool HasV =
+      (std::is_same_v<TraitToSearch, Traits> || ...);
+};
+
+// Replaces an unwanted trait with EmptyTrait.
+template <typename TraitToExclude>
+struct ExcludeTrait {
+  template <typename Trait>
+  using Filter = std::
+      conditional_t<std::is_same_v<TraitToExclude, Trait>, EmptyTrait, Trait>;
+};
+
+// Use TraitBundle alias, instead of TraitBundleInt, so that traits in different
+// order and duplicates resolve to the same underlying type. For example,
+// TraitBundle<A,B> is the same C++ type as TraitBundle<B,A,B,A>. This also
+// allows to entirely ignore a trait under some build configurations, to prevent
+// it from turning TraitBundle into a different C++ type.
+//
+// It'd be easier to just pass bools into TraitBundleInt, instead of echo'ing
+// the trait, but that would lead to less readable compiler messages that spit
+// out the type. TraitBundleInt<MayDangle,EmptyTrait,DisableHooks,EmptyTrait> is
+// more readable than TraitBundleInt<true,false,true,false>.
+template <typename... Traits>
+struct TraitBundleInt;
+template <typename... Traits>
+using TraitBundle = TraitBundleInt<
+    std::conditional_t<TraitPack<Traits...>::template HasV<MayDangle>,
+                       MayDangle,
+                       EmptyTrait>,
+#if PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
+    std::conditional_t<
+        TraitPack<Traits...>::template HasV<DisableMTECheckedPtr>,
+        DisableMTECheckedPtr,
+        EmptyTrait>,
+#else
+    // Entirely ignore DisableMTECheckedPtr on non-MTECheckedPtr builds, so that
+    // TraitBundle (and thus raw_ptr/raw_ref) with that trait is considered
+    // exactly the same type as without it. This matches the long standing
+    // behavior prior to crrev.com/c/4113514.
+    EmptyTrait,
+#endif  // PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
+#if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
+    std::conditional_t<TraitPack<Traits...>::template HasV<DisableHooks>,
+                       DisableHooks,
+                       EmptyTrait>,
+#else
+    // Entirely ignore DisableHooks on non-ASanBRP builds, so that
+    // TraitBundle (and thus raw_ptr/raw_ref) with that trait is considered
+    // exactly the same type as without it. This matches the long standing
+    // behavior prior to crrev.com/c/4113514.
+    EmptyTrait,
+#endif  // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
+    std::conditional_t<
+        TraitPack<Traits...>::template HasV<UseCountingWrapperForTest>,
+        UseCountingWrapperForTest,
+        EmptyTrait>>;
+
+template <typename... Traits>
+struct TraitBundleInt {
+  static constexpr bool kMayDangle =
+      TraitPack<Traits...>::template HasV<MayDangle>;
+  static constexpr bool kDisableMTECheckedPtr =
+      TraitPack<Traits...>::template HasV<DisableMTECheckedPtr>;
+  static constexpr bool kDisableHooks =
+      TraitPack<Traits...>::template HasV<DisableHooks>;
+  static constexpr bool kUseCountingWrapperForTest =
+      TraitPack<Traits...>::template HasV<UseCountingWrapperForTest>;
+
+  // Assert that on certain build configurations, the related traits are not
+  // even used. If they were, they'd result in a different C++ type, and would
+  // trigger more costly cross-type raw_ptr/raw_ref conversions.
+#if !PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
+  static_assert(!kDisableMTECheckedPtr);
+#endif
+#if !BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
+  static_assert(!kDisableHooks);
+#endif
+
+  // Use TraitBundle, instead of TraitBundleInt, to re-normalize trait list
+  // (i.e. order canonically and remove duplicates).
+  template <typename TraitToAdd>
+  using AddTraitT = TraitBundle<Traits..., TraitToAdd>;
+  // Unlike AddTraitT, no need to re-normalize because ExcludeTrait preserves
+  // the trait list structure.
+  template <typename TraitToRemove>
+  using RemoveTraitT = TraitBundleInt<
+      typename ExcludeTrait<TraitToRemove>::template Filter<Traits>...>;
+};
+
+template <typename TraitBundle>
+struct TraitsToImpl;
+
 }  // namespace raw_ptr_traits
 
 namespace internal {
@@ -1005,10 +1107,19 @@
 
 #endif  // BUILDFLAG(USE_HOOKABLE_RAW_PTR)
 
-template <class Super>
+// Wraps a raw_ptr/raw_ref implementation, with a class of the same interface
+// that provides accounting, for test purposes. raw_ptr/raw_ref that use it
+// perform extra bookkeeping, e.g. to track the number of times the raw_ptr is
+// wrapped, unrwapped, etc.
+//
+// Test only.
+template <typename Traits>
 struct RawPtrCountingImplWrapperForTest
-    : public raw_ptr_traits::RawPtrTypeToImpl<Super>::Impl {
-  using SuperImpl = typename raw_ptr_traits::RawPtrTypeToImpl<Super>::Impl;
+    : public raw_ptr_traits::TraitsToImpl<Traits>::Impl {
+  static_assert(!Traits::kUseCountingWrapperForTest);
+
+  using SuperImpl = typename raw_ptr_traits::TraitsToImpl<Traits>::Impl;
+
   template <typename T>
   static PA_ALWAYS_INLINE T* WrapRawPtr(T* ptr) {
     ++wrap_raw_ptr_cnt;
@@ -1127,16 +1238,6 @@
   static constexpr bool value = false;
 };
 
-// IsRawPtrCountingImpl<T>::value answers whether T is a specialization of
-// RawPtrCountingImplWrapperForTest, to know whether Impl is for testing
-// purposes.
-template <typename T>
-struct IsRawPtrCountingImpl : std::false_type {};
-
-template <typename T>
-struct IsRawPtrCountingImpl<internal::RawPtrCountingImplWrapperForTest<T>>
-    : std::true_type {};
-
 #if __OBJC__
 // raw_ptr<T> is not compatible with pointers to Objective-C classes for a
 // multitude of reasons. They may fail to compile in many cases, and wouldn't
@@ -1175,51 +1276,45 @@
 #undef PA_WINDOWS_HANDLE_TYPE
 #endif
 
-template <typename T>
-struct RawPtrTypeToImpl {};
-
-template <typename T>
-struct RawPtrTypeToImpl<internal::RawPtrCountingImplWrapperForTest<T>> {
-  using Impl = internal::RawPtrCountingImplWrapperForTest<T>;
-};
-
-template <>
-struct RawPtrTypeToImpl<RawPtrMayDangle> {
+template <typename Traits>
+struct TraitsToImpl {
+ private:
+  // UnderlyingImpl is the struct that provides the implementation of the
+  // protections related to raw_ptr.
 #if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
-  using Impl = internal::BackupRefPtrImpl</*AllowDangling=*/true>;
+  using UnderlyingImpl = internal::BackupRefPtrImpl<
+      /*AllowDangling=*/Traits::kMayDangle>;
 #elif BUILDFLAG(USE_ASAN_UNOWNED_PTR)
-  // No special bookkeeping required for this case, just treat these
-  // as ordinary pointers.
-  using Impl = internal::RawPtrNoOpImpl;
+  using UnderlyingImpl =
+      std::conditional_t<Traits::kMayDangle,
+                         // No special bookkeeping required for this case,
+                         // just treat these as ordinary pointers.
+                         internal::RawPtrNoOpImpl,
+                         internal::AsanUnownedPtrImpl>;
 #elif PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
-  using Impl = internal::MTECheckedPtrImpl<
-      internal::MTECheckedPtrImplPartitionAllocSupport>;
+  using UnderlyingImpl =
+      std::conditional_t<Traits::kDisableMTECheckedPtr,
+                         internal::RawPtrNoOpImpl,
+                         internal::MTECheckedPtrImpl<
+                             internal::MTECheckedPtrImplPartitionAllocSupport>>;
 #elif BUILDFLAG(USE_HOOKABLE_RAW_PTR)
-  using Impl = internal::RawPtrHookableImpl;
+  using UnderlyingImpl = std::conditional_t<Traits::kDisableHooks,
+                                            internal::RawPtrNoOpImpl,
+                                            internal::RawPtrHookableImpl>;
 #else
-  using Impl = internal::RawPtrNoOpImpl;
+  using UnderlyingImpl = internal::RawPtrNoOpImpl;
 #endif
-};
 
-template <>
-struct RawPtrTypeToImpl<RawPtrBanDanglingIfSupported> {
-#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
-  using Impl = internal::BackupRefPtrImpl</*AllowDangling=*/false>;
-#elif BUILDFLAG(USE_ASAN_UNOWNED_PTR)
-  using Impl = internal::AsanUnownedPtrImpl;
-#elif PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
-  using Impl = internal::MTECheckedPtrImpl<
-      internal::MTECheckedPtrImplPartitionAllocSupport>;
-#elif BUILDFLAG(USE_HOOKABLE_RAW_PTR)
-  using Impl = internal::RawPtrHookableImpl;
-#else
-  using Impl = internal::RawPtrNoOpImpl;
-#endif
-};
-
-template <>
-struct RawPtrTypeToImpl<RawPtrNoOp> {
-  using Impl = internal::RawPtrNoOpImpl;
+ public:
+  // Impl is the struct that implements raw_ptr functions. Think of raw_ptr as a
+  // thin wrapper, that directs calls to Impl.
+  // Impl may be different from UnderlyingImpl, because it may include a
+  // wrapper.
+  using Impl = std::conditional_t<
+      Traits::kUseCountingWrapperForTest,
+      internal::RawPtrCountingImplWrapperForTest<
+          typename Traits::template RemoveTraitT<UseCountingWrapperForTest>>,
+      UnderlyingImpl>;
 };
 
 }  // namespace raw_ptr_traits
@@ -1250,23 +1345,22 @@
 // non-default move constructor/assignment. Thus, it's possible to get an error
 // where the pointer is not actually dangling, and have to work around the
 // compiler. We have not managed to construct such an example in Chromium yet.
-
-using DefaultRawPtrType = RawPtrBanDanglingIfSupported;
-
-template <typename T, typename RawPtrType = DefaultRawPtrType>
+template <typename T, typename Traits = raw_ptr_traits::TraitBundle<>>
 class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr {
-  using Impl = typename raw_ptr_traits::RawPtrTypeToImpl<RawPtrType>::Impl;
-  using DanglingRawPtr = std::conditional_t<
-      raw_ptr_traits::IsRawPtrCountingImpl<Impl>::value,
-      raw_ptr<T, internal::RawPtrCountingImplWrapperForTest<RawPtrMayDangle>>,
-      raw_ptr<T, RawPtrMayDangle>>;
+  // Type to return from ExtractAsDangling(), which is identical except
+  // MayDangle trait is added (if one isn't there already).
+  using DanglingRawPtrType =
+      raw_ptr<T,
+              typename Traits::template AddTraitT<raw_ptr_traits::MayDangle>>;
+
+ public:
+  using Impl = typename raw_ptr_traits::TraitsToImpl<Traits>::Impl;
 
 #if !BUILDFLAG(USE_PARTITION_ALLOC)
   // See comment at top about `PA_RAW_PTR_CHECK()`.
   static_assert(std::is_same_v<Impl, internal::RawPtrNoOpImpl>);
 #endif  // !BUILDFLAG(USE_PARTITION_ALLOC)
 
- public:
   static_assert(raw_ptr_traits::IsSupportedType<T>::value,
                 "raw_ptr<T> doesn't work with this kind of pointee type T");
 
@@ -1339,23 +1433,22 @@
 #endif  // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) ||
         // BUILDFLAG(USE_ASAN_UNOWNED_PTR)
 
-  template <typename PassedRawPtrType,
-            typename Unused =
-                std::enable_if_t<!std::is_same_v<RawPtrType, PassedRawPtrType>>>
-  PA_ALWAYS_INLINE explicit raw_ptr(
-      const raw_ptr<T, PassedRawPtrType>& p) noexcept
+  template <
+      typename PassedTraits,
+      typename Unused = std::enable_if_t<!std::is_same_v<Traits, PassedTraits>>>
+  PA_ALWAYS_INLINE explicit raw_ptr(const raw_ptr<T, PassedTraits>& p) noexcept
       : wrapped_ptr_(Impl::WrapRawPtrForDuplication(
-            raw_ptr_traits::RawPtrTypeToImpl<PassedRawPtrType>::Impl::
+            raw_ptr_traits::TraitsToImpl<PassedTraits>::Impl::
                 UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_))) {}
 
-  template <typename PassedRawPtrType,
-            typename Unused =
-                std::enable_if_t<!std::is_same_v<RawPtrType, PassedRawPtrType>>>
+  template <
+      typename PassedTraits,
+      typename Unused = std::enable_if_t<!std::is_same_v<Traits, PassedTraits>>>
   PA_ALWAYS_INLINE raw_ptr& operator=(
-      const raw_ptr<T, PassedRawPtrType>& p) noexcept {
+      const raw_ptr<T, PassedTraits>& p) noexcept {
     Impl::ReleaseWrappedPtr(wrapped_ptr_);
     wrapped_ptr_ = Impl::WrapRawPtrForDuplication(
-        raw_ptr_traits::RawPtrTypeToImpl<PassedRawPtrType>::Impl::
+        raw_ptr_traits::TraitsToImpl<PassedTraits>::Impl::
             UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_));
     return *this;
   }
@@ -1375,7 +1468,7 @@
                 std::is_convertible<U*, T*>::value &&
                 !std::is_void<typename std::remove_cv<T>::type>::value>>
   // NOLINTNEXTLINE(google-explicit-constructor)
-  PA_ALWAYS_INLINE raw_ptr(const raw_ptr<U, RawPtrType>& ptr) noexcept
+  PA_ALWAYS_INLINE raw_ptr(const raw_ptr<U, Traits>& ptr) noexcept
       : wrapped_ptr_(
             Impl::Duplicate(Impl::template Upcast<T, U>(ptr.wrapped_ptr_))) {}
   // Deliberately implicit in order to support implicit upcast.
@@ -1384,7 +1477,7 @@
                 std::is_convertible<U*, T*>::value &&
                 !std::is_void<typename std::remove_cv<T>::type>::value>>
   // NOLINTNEXTLINE(google-explicit-constructor)
-  PA_ALWAYS_INLINE raw_ptr(raw_ptr<U, RawPtrType>&& ptr) noexcept
+  PA_ALWAYS_INLINE raw_ptr(raw_ptr<U, Traits>&& ptr) noexcept
       : wrapped_ptr_(Impl::template Upcast<T, U>(ptr.wrapped_ptr_)) {
 #if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT)
     ptr.wrapped_ptr_ = nullptr;
@@ -1407,8 +1500,7 @@
             typename Unused = std::enable_if_t<
                 std::is_convertible<U*, T*>::value &&
                 !std::is_void<typename std::remove_cv<T>::type>::value>>
-  PA_ALWAYS_INLINE raw_ptr& operator=(
-      const raw_ptr<U, RawPtrType>& ptr) noexcept {
+  PA_ALWAYS_INLINE raw_ptr& operator=(const raw_ptr<U, Traits>& ptr) noexcept {
     // Make sure that pointer isn't assigned to itself (look at pointer address,
     // not its value).
 #if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS)
@@ -1424,7 +1516,7 @@
             typename Unused = std::enable_if_t<
                 std::is_convertible<U*, T*>::value &&
                 !std::is_void<typename std::remove_cv<T>::type>::value>>
-  PA_ALWAYS_INLINE raw_ptr& operator=(raw_ptr<U, RawPtrType>&& ptr) noexcept {
+  PA_ALWAYS_INLINE raw_ptr& operator=(raw_ptr<U, Traits>&& ptr) noexcept {
     // Make sure that pointer isn't assigned to itself (look at pointer address,
     // not its value).
 #if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS)
@@ -1555,18 +1647,18 @@
   // variable (or worse, a field)! It's meant to be used as a temporary, to be
   // passed into a cleanup & freeing function, and destructed at the end of the
   // statement.
-  PA_ALWAYS_INLINE DanglingRawPtr ExtractAsDangling() noexcept {
+  PA_ALWAYS_INLINE DanglingRawPtrType ExtractAsDangling() noexcept {
     if constexpr (std::is_same_v<
                       typename std::remove_reference<decltype(*this)>::type,
-                      DanglingRawPtr>) {
-      DanglingRawPtr res(std::move(*this));
+                      DanglingRawPtrType>) {
+      DanglingRawPtrType res(std::move(*this));
       // Not all implementation clear the source pointer on move, so do it
       // here just in case. Should be cheap.
       operator=(nullptr);
       return res;
     } else {
       T* ptr = GetForExtraction();
-      DanglingRawPtr res(ptr);
+      DanglingRawPtrType res(ptr);
       operator=(nullptr);
       return res;
     }
@@ -1585,26 +1677,26 @@
   // `raw_ptr` and `raw_ptr<U>` in the friend declaration itself does not work,
   // because a comparison operator defined inline would not be allowed to call
   // `raw_ptr<U>`'s private `GetForComparison()` method.
-  template <typename U, typename V, typename I, typename J>
-  friend PA_ALWAYS_INLINE bool operator==(const raw_ptr<U, I>& lhs,
-                                          const raw_ptr<V, J>& rhs);
+  template <typename U, typename V, typename R1, typename R2>
+  friend PA_ALWAYS_INLINE bool operator==(const raw_ptr<U, R1>& lhs,
+                                          const raw_ptr<V, R2>& rhs);
   template <typename U>
   friend PA_ALWAYS_INLINE bool operator!=(const raw_ptr& lhs,
-                                          const raw_ptr<U, Impl>& rhs) {
+                                          const raw_ptr<U, Traits>& rhs) {
     return !(lhs == rhs);
   }
-  template <typename U, typename V, typename I>
-  friend PA_ALWAYS_INLINE bool operator<(const raw_ptr<U, I>& lhs,
-                                         const raw_ptr<V, I>& rhs);
-  template <typename U, typename V, typename I>
-  friend PA_ALWAYS_INLINE bool operator>(const raw_ptr<U, I>& lhs,
-                                         const raw_ptr<V, I>& rhs);
-  template <typename U, typename V, typename I>
-  friend PA_ALWAYS_INLINE bool operator<=(const raw_ptr<U, I>& lhs,
-                                          const raw_ptr<V, I>& rhs);
-  template <typename U, typename V, typename I>
-  friend PA_ALWAYS_INLINE bool operator>=(const raw_ptr<U, I>& lhs,
-                                          const raw_ptr<V, I>& rhs);
+  template <typename U, typename V, typename R>
+  friend PA_ALWAYS_INLINE bool operator<(const raw_ptr<U, R>& lhs,
+                                         const raw_ptr<V, R>& rhs);
+  template <typename U, typename V, typename R>
+  friend PA_ALWAYS_INLINE bool operator>(const raw_ptr<U, R>& lhs,
+                                         const raw_ptr<V, R>& rhs);
+  template <typename U, typename V, typename R>
+  friend PA_ALWAYS_INLINE bool operator<=(const raw_ptr<U, R>& lhs,
+                                          const raw_ptr<V, R>& rhs);
+  template <typename U, typename V, typename R>
+  friend PA_ALWAYS_INLINE bool operator>=(const raw_ptr<U, R>& lhs,
+                                          const raw_ptr<V, R>& rhs);
 
   // Comparisons with U*. These operators also handle the case where the RHS is
   // T*.
@@ -1712,45 +1804,45 @@
   // #union, #global-scope, #constexpr-ctor-field-initializer
   RAW_PTR_EXCLUSION T* wrapped_ptr_;
 
-  template <typename U, typename V>
+  template <typename U, typename R>
   friend class raw_ptr;
 };
 
-template <typename U, typename V, typename I, typename J>
-PA_ALWAYS_INLINE bool operator==(const raw_ptr<U, I>& lhs,
-                                 const raw_ptr<V, J>& rhs) {
+template <typename U, typename V, typename Traits1, typename Traits2>
+PA_ALWAYS_INLINE bool operator==(const raw_ptr<U, Traits1>& lhs,
+                                 const raw_ptr<V, Traits2>& rhs) {
   return lhs.GetForComparison() == rhs.GetForComparison();
 }
 
-template <typename U, typename V, typename I>
-PA_ALWAYS_INLINE bool operator<(const raw_ptr<U, I>& lhs,
-                                const raw_ptr<V, I>& rhs) {
+template <typename U, typename V, typename Traits>
+PA_ALWAYS_INLINE bool operator<(const raw_ptr<U, Traits>& lhs,
+                                const raw_ptr<V, Traits>& rhs) {
   return lhs.GetForComparison() < rhs.GetForComparison();
 }
 
-template <typename U, typename V, typename I>
-PA_ALWAYS_INLINE bool operator>(const raw_ptr<U, I>& lhs,
-                                const raw_ptr<V, I>& rhs) {
+template <typename U, typename V, typename Traits>
+PA_ALWAYS_INLINE bool operator>(const raw_ptr<U, Traits>& lhs,
+                                const raw_ptr<V, Traits>& rhs) {
   return lhs.GetForComparison() > rhs.GetForComparison();
 }
 
-template <typename U, typename V, typename I>
-PA_ALWAYS_INLINE bool operator<=(const raw_ptr<U, I>& lhs,
-                                 const raw_ptr<V, I>& rhs) {
+template <typename U, typename V, typename Traits>
+PA_ALWAYS_INLINE bool operator<=(const raw_ptr<U, Traits>& lhs,
+                                 const raw_ptr<V, Traits>& rhs) {
   return lhs.GetForComparison() <= rhs.GetForComparison();
 }
 
-template <typename U, typename V, typename I>
-PA_ALWAYS_INLINE bool operator>=(const raw_ptr<U, I>& lhs,
-                                 const raw_ptr<V, I>& rhs) {
+template <typename U, typename V, typename Traits>
+PA_ALWAYS_INLINE bool operator>=(const raw_ptr<U, Traits>& lhs,
+                                 const raw_ptr<V, Traits>& rhs) {
   return lhs.GetForComparison() >= rhs.GetForComparison();
 }
 
 template <typename T>
 struct IsRawPtr : std::false_type {};
 
-template <typename T, typename I>
-struct IsRawPtr<raw_ptr<T, I>> : std::true_type {};
+template <typename T, typename Traits>
+struct IsRawPtr<raw_ptr<T, Traits>> : std::true_type {};
 
 template <typename T>
 inline constexpr bool IsRawPtrV = IsRawPtr<T>::value;
@@ -1758,8 +1850,9 @@
 template <typename T>
 inline constexpr bool IsRawPtrMayDangleV = false;
 
-template <typename T>
-inline constexpr bool IsRawPtrMayDangleV<raw_ptr<T, RawPtrMayDangle>> = true;
+template <typename T, typename Traits>
+inline constexpr bool IsRawPtrMayDangleV<raw_ptr<T, Traits>> =
+    Traits::kMayDangle;
 
 // Template helpers for working with T* or raw_ptr<T>.
 template <typename T>
@@ -1768,8 +1861,8 @@
 template <typename T>
 struct IsPointer<T*> : std::true_type {};
 
-template <typename T, typename I>
-struct IsPointer<raw_ptr<T, I>> : std::true_type {};
+template <typename T, typename Traits>
+struct IsPointer<raw_ptr<T, Traits>> : std::true_type {};
 
 template <typename T>
 inline constexpr bool IsPointerV = IsPointer<T>::value;
@@ -1784,8 +1877,8 @@
   using type = T;
 };
 
-template <typename T, typename I>
-struct RemovePointer<raw_ptr<T, I>> {
+template <typename T, typename Traits>
+struct RemovePointer<raw_ptr<T, Traits>> {
   using type = T;
 };
 
@@ -1803,21 +1896,25 @@
 // Usage:
 // raw_ptr<T, DisableDanglingPtrDetection> dangling_ptr;
 //
-// When using it, please provide a justification about what guarantees it will
-// never be dereferenced after becoming dangling.
-using DisableDanglingPtrDetection = base::RawPtrMayDangle;
+// When using it, please provide a justification about what guarantees that it
+// will never be dereferenced after becoming dangling.
+using DisableDanglingPtrDetection =
+    base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::MayDangle>;
 
 // See `docs/dangling_ptr.md`
 // Annotates known dangling raw_ptr. Those haven't been triaged yet. All the
 // occurrences are meant to be removed. See https://crbug.com/1291138.
-using DanglingUntriaged = base::RawPtrMayDangle;
+using DanglingUntriaged =
+    base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::MayDangle>;
 
 // This type is to be used in callbacks arguments when it is known that they
 // might receive dangling pointers. In any other cases, please use one of:
 // - raw_ptr<T, DanglingUntriaged>
 // - raw_ptr<T, DisableDanglingPtrDetection>
 template <typename T>
-using MayBeDangling = base::raw_ptr<T, base::RawPtrMayDangle>;
+using MayBeDangling = base::raw_ptr<
+    T,
+    base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::MayDangle>>;
 
 // The following template parameters are only meaningful when `raw_ptr`
 // is `MTECheckedPtr` (never the case unless a particular GN arg is set
@@ -1828,54 +1925,45 @@
 // When `MTECheckedPtr` is in play, we need to augment this
 // implementation setting with another layer that allows the `raw_ptr`
 // to degrade into the no-op version.
-#if PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
+//
+// See `base/memory/raw_ptr_mtecheckedptr.md`
 
 // Direct pass-through to no-op implementation.
-using DegradeToNoOpWhenMTE = base::RawPtrNoOp;
+using DegradeToNoOpWhenMTE = base::raw_ptr_traits::TraitBundle<
+    base::raw_ptr_traits::DisableMTECheckedPtr>;
 
 // As above, but with the "untriaged dangling" annotation.
-using DanglingUntriagedDegradeToNoOpWhenMTE = base::RawPtrNoOp;
+using DanglingUntriagedDegradeToNoOpWhenMTE = base::raw_ptr_traits::TraitBundle<
+    base::raw_ptr_traits::MayDangle,
+    base::raw_ptr_traits::DisableMTECheckedPtr>;
 
 // As above, but with the "explicitly disable protection" annotation.
-using DisableDanglingPtrDetectionDegradeToNoOpWhenMTE = base::RawPtrNoOp;
-
-#else
-
-// Direct pass-through to default implementation specified by `raw_ptr`
-// template.
-using DegradeToNoOpWhenMTE = base::RawPtrBanDanglingIfSupported;
-
-// Direct pass-through to `DanglingUntriaged`.
-using DanglingUntriagedDegradeToNoOpWhenMTE = DanglingUntriaged;
-
-// Direct pass-through to `DisableDanglingPtrDetection`.
 using DisableDanglingPtrDetectionDegradeToNoOpWhenMTE =
-    DisableDanglingPtrDetection;
-
-#endif  // PA_CONFIG(ENABLE_MTE_CHECKED_PTR_SUPPORT_WITH_64_BITS_POINTERS)
+    base::raw_ptr_traits::TraitBundle<
+        base::raw_ptr_traits::MayDangle,
+        base::raw_ptr_traits::DisableMTECheckedPtr>;
 
 namespace std {
 
 // Override so set/map lookups do not create extra raw_ptr. This also allows
 // dangling pointers to be used for lookup.
-template <typename T, typename RawPtrType>
-struct less<raw_ptr<T, RawPtrType>> {
-  using Impl =
-      typename base::raw_ptr_traits::RawPtrTypeToImpl<RawPtrType>::Impl;
+template <typename T, typename Traits>
+struct less<raw_ptr<T, Traits>> {
+  using Impl = typename raw_ptr<T, Traits>::Impl;
   using is_transparent = void;
 
-  bool operator()(const raw_ptr<T, RawPtrType>& lhs,
-                  const raw_ptr<T, RawPtrType>& rhs) const {
+  bool operator()(const raw_ptr<T, Traits>& lhs,
+                  const raw_ptr<T, Traits>& rhs) const {
     Impl::IncrementLessCountForTest();
     return lhs < rhs;
   }
 
-  bool operator()(T* lhs, const raw_ptr<T, RawPtrType>& rhs) const {
+  bool operator()(T* lhs, const raw_ptr<T, Traits>& rhs) const {
     Impl::IncrementLessCountForTest();
     return lhs < rhs;
   }
 
-  bool operator()(const raw_ptr<T, RawPtrType>& lhs, T* rhs) const {
+  bool operator()(const raw_ptr<T, Traits>& lhs, T* rhs) const {
     Impl::IncrementLessCountForTest();
     return lhs < rhs;
   }
@@ -1884,8 +1972,8 @@
 // Define for cases where raw_ptr<T> holds a pointer to an array of type T.
 // This is consistent with definition of std::iterator_traits<T*>.
 // Algorithms like std::binary_search need that.
-template <typename T, typename Impl>
-struct iterator_traits<raw_ptr<T, Impl>> {
+template <typename T, typename Traits>
+struct iterator_traits<raw_ptr<T, Traits>> {
   using difference_type = ptrdiff_t;
   using value_type = std::remove_cv_t<T>;
   using pointer = T*;
diff --git a/base/memory/raw_ptr_unittest.cc b/base/memory/raw_ptr_unittest.cc
index 3c1caa2b..b40db68 100644
--- a/base/memory/raw_ptr_unittest.cc
+++ b/base/memory/raw_ptr_unittest.cc
@@ -8,7 +8,6 @@
 #include <cstddef>
 #include <string>
 #include <thread>
-#include <tuple>
 #include <type_traits>
 #include <utility>
 
@@ -94,16 +93,32 @@
 // this namespace calls the correct functions from this namespace.
 namespace {
 
-using RawPtrCountingImpl =
-    base::internal::RawPtrCountingImplWrapperForTest<base::DefaultRawPtrType>;
+// TraitBundle<> matches what CountingRawPtr does internally.
+// UseCountingWrapperForTest is removed.
+using RawPtrCountingImpl = base::internal::RawPtrCountingImplWrapperForTest<
+    base::raw_ptr_traits::TraitBundle<>>;
+
+// TraitBundle<MayDangle> matches what CountingRawPtrMayDangle does internally.
+// UseCountingWrapperForTest is removed, and MayDangle is kept.
 using RawPtrCountingMayDangleImpl =
-    base::internal::RawPtrCountingImplWrapperForTest<base::RawPtrMayDangle>;
+    base::internal::RawPtrCountingImplWrapperForTest<
+        base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::MayDangle>>;
 
 template <typename T>
-using CountingRawPtr = raw_ptr<T, RawPtrCountingImpl>;
+using CountingRawPtr =
+    raw_ptr<T,
+            base::raw_ptr_traits::TraitBundle<
+                base::raw_ptr_traits::UseCountingWrapperForTest>>;
+static_assert(std::is_same_v<CountingRawPtr<int>::Impl, RawPtrCountingImpl>);
 
 template <typename T>
-using CountingRawPtrMayDangle = raw_ptr<T, RawPtrCountingMayDangleImpl>;
+using CountingRawPtrMayDangle =
+    raw_ptr<T,
+            base::raw_ptr_traits::TraitBundle<
+                base::raw_ptr_traits::MayDangle,
+                base::raw_ptr_traits::UseCountingWrapperForTest>>;
+static_assert(std::is_same_v<CountingRawPtrMayDangle<int>::Impl,
+                             RawPtrCountingMayDangleImpl>);
 
 struct MyStruct {
   int x;
@@ -392,63 +407,39 @@
 TEST_F(RawPtrTest, ExtractAsDangling) {
   CountingRawPtr<int> ptr(new int);
 
-  if constexpr (std::is_same_v<RawPtrCountingImpl,
-                               RawPtrCountingMayDangleImpl>) {
-    auto expectations = CountingRawPtrExpectations{
-        .wrap_raw_ptr_cnt = 1,
-        .release_wrapped_ptr_cnt = 0,
-        .get_for_dereference_cnt = 0,
-        .wrapped_ptr_swap_cnt = 0,
-    };
-    EXPECT_THAT((expectations), CountingRawPtrHasCounts());
-    EXPECT_THAT((expectations), MayDangleCountingRawPtrHasCounts());
-  } else {
-    EXPECT_THAT((CountingRawPtrExpectations{
-                    .wrap_raw_ptr_cnt = 1,
-                    .release_wrapped_ptr_cnt = 0,
-                    .get_for_dereference_cnt = 0,
-                    .wrapped_ptr_swap_cnt = 0,
-                }),
-                CountingRawPtrHasCounts());
-    EXPECT_THAT((CountingRawPtrExpectations{
-                    .wrap_raw_ptr_cnt = 0,
-                    .release_wrapped_ptr_cnt = 0,
-                    .get_for_dereference_cnt = 0,
-                    .wrapped_ptr_swap_cnt = 0,
-                }),
-                MayDangleCountingRawPtrHasCounts());
-  }
+  EXPECT_THAT((CountingRawPtrExpectations{
+                  .wrap_raw_ptr_cnt = 1,
+                  .release_wrapped_ptr_cnt = 0,
+                  .get_for_dereference_cnt = 0,
+                  .wrapped_ptr_swap_cnt = 0,
+              }),
+              CountingRawPtrHasCounts());
+  EXPECT_THAT((CountingRawPtrExpectations{
+                  .wrap_raw_ptr_cnt = 0,
+                  .release_wrapped_ptr_cnt = 0,
+                  .get_for_dereference_cnt = 0,
+                  .wrapped_ptr_swap_cnt = 0,
+              }),
+              MayDangleCountingRawPtrHasCounts());
 
   EXPECT_TRUE(ptr.get());
 
   CountingRawPtrMayDangle<int> dangling = ptr.ExtractAsDangling();
 
-  if constexpr (std::is_same_v<RawPtrCountingImpl,
-                               RawPtrCountingMayDangleImpl>) {
-    auto expectations = CountingRawPtrExpectations{
-        .wrap_raw_ptr_cnt = 1,
-        .release_wrapped_ptr_cnt = 1,
-        .get_for_dereference_cnt = 0,
-        .wrapped_ptr_swap_cnt = 0,
-    };
-    EXPECT_THAT((expectations), CountingRawPtrHasCounts());
-    EXPECT_THAT((expectations), MayDangleCountingRawPtrHasCounts());
-  } else {
-    EXPECT_THAT((CountingRawPtrExpectations{
-                    .wrap_raw_ptr_cnt = 1,
-                    .release_wrapped_ptr_cnt = 1,
-                    .get_for_dereference_cnt = 0,
-                    .wrapped_ptr_swap_cnt = 0,
-                }),
-                CountingRawPtrHasCounts());
-    EXPECT_THAT((CountingRawPtrExpectations{
-                    .wrap_raw_ptr_cnt = 1,
-                    .release_wrapped_ptr_cnt = 0,
-                    .get_for_dereference_cnt = 0,
-                    .wrapped_ptr_swap_cnt = 0,
-                }),
-                MayDangleCountingRawPtrHasCounts());
-  }
+  EXPECT_THAT((CountingRawPtrExpectations{
+                  .wrap_raw_ptr_cnt = 1,
+                  .release_wrapped_ptr_cnt = 1,
+                  .get_for_dereference_cnt = 0,
+                  .wrapped_ptr_swap_cnt = 0,
+              }),
+              CountingRawPtrHasCounts());
+  EXPECT_THAT((CountingRawPtrExpectations{
+                  .wrap_raw_ptr_cnt = 1,
+                  .release_wrapped_ptr_cnt = 0,
+                  .get_for_dereference_cnt = 0,
+                  .wrapped_ptr_swap_cnt = 0,
+              }),
+              MayDangleCountingRawPtrHasCounts());
 
   EXPECT_FALSE(ptr.get());
   EXPECT_TRUE(dangling.get());
diff --git a/base/memory/raw_ptr_unittest.nc b/base/memory/raw_ptr_unittest.nc
index ba54d7b..6b53941c 100644
--- a/base/memory/raw_ptr_unittest.nc
+++ b/base/memory/raw_ptr_unittest.nc
@@ -25,7 +25,21 @@
   int Func(char, double) const { return 11; }
 };
 
-#if defined(NCTEST_AUTO_DOWNCAST)  // [r"no viable conversion from 'raw_ptr<Producer>' to 'raw_ptr<DerivedProducer>'"]
+#if defined(NCTEST_INVALID_RAW_PTR_TRAIT)  // [r"Unknown raw_ptr trait"]
+
+void WontCompile() {
+  struct InvalidRawPtrTrait {};
+  raw_ptr<int, base::raw_ptr_traits::TraitBundle<InvalidRawPtrTrait>> p;
+}
+
+#elif defined(NCTEST_INVALID_RAW_PTR_TRAIT_OF_MANY)  // [r"Unknown raw_ptr trait"]
+
+void WontCompile() {
+  struct InvalidRawPtrTrait {};
+  raw_ptr<int, base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::MayDangle, InvalidRawPtrTrait, base::raw_ptr_traits::DisableMTECheckedPtr>> p;
+}
+
+#elif defined(NCTEST_AUTO_DOWNCAST)  // [r"no viable conversion from 'raw_ptr<Producer>' to 'raw_ptr<DerivedProducer>'"]
 
 void WontCompile() {
   Producer f;
diff --git a/base/memory/raw_ref.h b/base/memory/raw_ref.h
index a122b76..e32bbbf 100644
--- a/base/memory/raw_ref.h
+++ b/base/memory/raw_ref.h
@@ -17,7 +17,7 @@
 
 namespace base {
 
-template <class T, class RawPtrType>
+template <class T, typename Traits>
 class raw_ref;
 
 namespace internal {
@@ -25,8 +25,8 @@
 template <class T>
 struct is_raw_ref : std::false_type {};
 
-template <class T, class I>
-struct is_raw_ref<::base::raw_ref<T, I>> : std::true_type {};
+template <class T, typename Traits>
+struct is_raw_ref<::base::raw_ref<T, Traits>> : std::true_type {};
 
 template <class T>
 constexpr inline bool is_raw_ref_v = is_raw_ref<T>::value;
@@ -53,7 +53,7 @@
 // Unlike a native `T&` reference, a mutable `raw_ref<T>` can be changed
 // independent of the underlying `T`, similar to `std::reference_wrapper`. That
 // means the reference inside it can be moved and reassigned.
-template <class T, class RawPtrType = DefaultRawPtrType>
+template <class T, typename Traits = raw_ptr_traits::TraitBundle<>>
 class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ref {
   // operator* is used with the expectation of GetForExtraction semantics:
   //
@@ -62,14 +62,14 @@
   //
   // The implementation of operator* provides GetForDereference semantics, and
   // this results in spurious crashes in BRP-ASan builds, so we need to disable
-  // BRP-ASan instrumentation for raw_ref.
-#if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
-  using Inner = raw_ptr<T, RawPtrNoOp>;
-#else
-  using Inner = raw_ptr<T, RawPtrType>;
-#endif  // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
+  // hooks that provide BRP-ASan instrumentation for raw_ref.
+  using Inner = raw_ptr<
+      T,
+      typename Traits::template AddTraitT<raw_ptr_traits::DisableHooks>>;
 
-  using Impl = typename raw_ptr_traits::RawPtrTypeToImpl<RawPtrType>::Impl;
+ public:
+  using Impl = typename Inner::Impl;
+
   // These impls do not clear on move, which produces an inconsistent behaviour.
   // We want consistent behaviour such that using a raw_ref after move is caught
   // and aborts. Failure to clear would be indicated by the related death tests
@@ -85,7 +85,6 @@
 #endif  // BUILDFLAG(USE_ASAN_UNOWNED_PTR)
       std::is_same_v<Impl, internal::RawPtrNoOpImpl>;
 
- public:
   PA_ALWAYS_INLINE explicit raw_ref(T& p) noexcept
       : inner_(std::addressof(p)) {}
 
@@ -127,14 +126,14 @@
   // Deliberately implicit in order to support implicit upcast.
   template <class U, class = std::enable_if_t<std::is_convertible_v<U&, T&>>>
   // NOLINTNEXTLINE(google-explicit-constructor)
-  PA_ALWAYS_INLINE raw_ref(const raw_ref<U, RawPtrType>& p) noexcept
+  PA_ALWAYS_INLINE raw_ref(const raw_ref<U, Traits>& p) noexcept
       : inner_(p.inner_) {
     PA_RAW_PTR_CHECK(inner_.get());  // Catch use-after-move.
   }
   // Deliberately implicit in order to support implicit upcast.
   template <class U, class = std::enable_if_t<std::is_convertible_v<U&, T&>>>
   // NOLINTNEXTLINE(google-explicit-constructor)
-  PA_ALWAYS_INLINE raw_ref(raw_ref<U, RawPtrType>&& p) noexcept
+  PA_ALWAYS_INLINE raw_ref(raw_ref<U, Traits>&& p) noexcept
       : inner_(std::move(p.inner_)) {
     PA_RAW_PTR_CHECK(inner_.get());  // Catch use-after-move.
     if constexpr (need_clear_after_move) {
@@ -149,14 +148,13 @@
 
   // Upcast assignment
   template <class U, class = std::enable_if_t<std::is_convertible_v<U&, T&>>>
-  PA_ALWAYS_INLINE raw_ref& operator=(
-      const raw_ref<U, RawPtrType>& p) noexcept {
+  PA_ALWAYS_INLINE raw_ref& operator=(const raw_ref<U, Traits>& p) noexcept {
     PA_RAW_PTR_CHECK(p.inner_.get());  // Catch use-after-move.
     inner_.operator=(p.inner_);
     return *this;
   }
   template <class U, class = std::enable_if_t<std::is_convertible_v<U&, T&>>>
-  PA_ALWAYS_INLINE raw_ref& operator=(raw_ref<U, RawPtrType>&& p) noexcept {
+  PA_ALWAYS_INLINE raw_ref& operator=(raw_ref<U, Traits>&& p) noexcept {
     PA_RAW_PTR_CHECK(p.inner_.get());  // Catch use-after-move.
     inner_.operator=(std::move(p.inner_));
     if constexpr (need_clear_after_move) {
@@ -200,42 +198,42 @@
 
   template <class U>
   friend PA_ALWAYS_INLINE bool operator==(const raw_ref& lhs,
-                                          const raw_ref<U, RawPtrType>& rhs) {
+                                          const raw_ref<U, Traits>& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_.get());  // Catch use-after-move.
     PA_RAW_PTR_CHECK(rhs.inner_.get());  // Catch use-after-move.
     return lhs.inner_ == rhs.inner_;
   }
   template <class U>
   friend PA_ALWAYS_INLINE bool operator!=(const raw_ref& lhs,
-                                          const raw_ref<U, RawPtrType>& rhs) {
+                                          const raw_ref<U, Traits>& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_.get());  // Catch use-after-move.
     PA_RAW_PTR_CHECK(rhs.inner_.get());  // Catch use-after-move.
     return lhs.inner_ != rhs.inner_;
   }
   template <class U>
   friend PA_ALWAYS_INLINE bool operator<(const raw_ref& lhs,
-                                         const raw_ref<U, RawPtrType>& rhs) {
+                                         const raw_ref<U, Traits>& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_.get());  // Catch use-after-move.
     PA_RAW_PTR_CHECK(rhs.inner_.get());  // Catch use-after-move.
     return lhs.inner_ < rhs.inner_;
   }
   template <class U>
   friend PA_ALWAYS_INLINE bool operator>(const raw_ref& lhs,
-                                         const raw_ref<U, RawPtrType>& rhs) {
+                                         const raw_ref<U, Traits>& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_.get());  // Catch use-after-move.
     PA_RAW_PTR_CHECK(rhs.inner_.get());  // Catch use-after-move.
     return lhs.inner_ > rhs.inner_;
   }
   template <class U>
   friend PA_ALWAYS_INLINE bool operator<=(const raw_ref& lhs,
-                                          const raw_ref<U, RawPtrType>& rhs) {
+                                          const raw_ref<U, Traits>& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_.get());  // Catch use-after-move.
     PA_RAW_PTR_CHECK(rhs.inner_.get());  // Catch use-after-move.
     return lhs.inner_ <= rhs.inner_;
   }
   template <class U>
   friend PA_ALWAYS_INLINE bool operator>=(const raw_ref& lhs,
-                                          const raw_ref<U, RawPtrType>& rhs) {
+                                          const raw_ref<U, Traits>& rhs) {
     PA_RAW_PTR_CHECK(lhs.inner_.get());  // Catch use-after-move.
     PA_RAW_PTR_CHECK(rhs.inner_.get());  // Catch use-after-move.
     return lhs.inner_ >= rhs.inner_;
@@ -304,7 +302,7 @@
   }
 
  private:
-  template <class U, class J>
+  template <class U, typename R>
   friend class raw_ref;
 
   Inner inner_;
@@ -320,8 +318,8 @@
 template <typename T>
 struct IsRawRef : std::false_type {};
 
-template <typename T, typename I>
-struct IsRawRef<raw_ref<T, I>> : std::true_type {};
+template <typename T, typename Traits>
+struct IsRawRef<raw_ref<T, Traits>> : std::true_type {};
 
 template <typename T>
 inline constexpr bool IsRawRefV = IsRawRef<T>::value;
@@ -331,8 +329,8 @@
   using type = T;
 };
 
-template <typename T, typename I>
-struct RemoveRawRef<raw_ref<T, I>> {
+template <typename T, typename Traits>
+struct RemoveRawRef<raw_ref<T, Traits>> {
   using type = T;
 };
 
@@ -347,24 +345,23 @@
 
 // Override so set/map lookups do not create extra raw_ref. This also
 // allows C++ references to be used for lookup.
-template <typename T, typename RawPtrType>
-struct less<raw_ref<T, RawPtrType>> {
-  using Impl =
-      typename base::raw_ptr_traits::RawPtrTypeToImpl<RawPtrType>::Impl;
+template <typename T, typename Traits>
+struct less<raw_ref<T, Traits>> {
+  using Impl = typename raw_ref<T, Traits>::Impl;
   using is_transparent = void;
 
-  bool operator()(const raw_ref<T, RawPtrType>& lhs,
-                  const raw_ref<T, RawPtrType>& rhs) const {
+  bool operator()(const raw_ref<T, Traits>& lhs,
+                  const raw_ref<T, Traits>& rhs) const {
     Impl::IncrementLessCountForTest();
     return lhs < rhs;
   }
 
-  bool operator()(T& lhs, const raw_ref<T, RawPtrType>& rhs) const {
+  bool operator()(T& lhs, const raw_ref<T, Traits>& rhs) const {
     Impl::IncrementLessCountForTest();
     return lhs < rhs;
   }
 
-  bool operator()(const raw_ref<T, RawPtrType>& lhs, T& rhs) const {
+  bool operator()(const raw_ref<T, Traits>& lhs, T& rhs) const {
     Impl::IncrementLessCountForTest();
     return lhs < rhs;
   }
diff --git a/base/memory/raw_ref_unittest.cc b/base/memory/raw_ref_unittest.cc
index 884da5d..be5b5ee 100644
--- a/base/memory/raw_ref_unittest.cc
+++ b/base/memory/raw_ref_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h"
 #include "base/allocator/partition_allocator/partition_alloc_buildflags.h"
+#include "base/memory/raw_ptr.h"
 #include "base/test/gtest_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR)
@@ -758,11 +759,17 @@
   EXPECT_EQ(&*s2.r, &str);
 }
 
-using RawPtrCountingImpl =
-    base::internal::RawPtrCountingImplWrapperForTest<base::DefaultRawPtrType>;
+// TraitBundle<DisableHooks> matches what CountingRawRef does internally.
+// UseCountingWrapperForTest is removed, and DisableHooks is added.
+using RawPtrCountingImpl = base::internal::RawPtrCountingImplWrapperForTest<
+    base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::DisableHooks>>;
 
 template <typename T>
-using CountingRawRef = raw_ref<T, RawPtrCountingImpl>;
+using CountingRawRef =
+    raw_ref<T,
+            base::raw_ptr_traits::TraitBundle<
+                base::raw_ptr_traits::UseCountingWrapperForTest>>;
+static_assert(std::is_same_v<CountingRawRef<int>::Impl, RawPtrCountingImpl>);
 
 TEST(RawRef, StdLess) {
   int i[] = {1, 1};
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.cc b/base/sampling_heap_profiler/sampling_heap_profiler.cc
index 8c7da26..6b259919 100644
--- a/base/sampling_heap_profiler/sampling_heap_profiler.cc
+++ b/base/sampling_heap_profiler/sampling_heap_profiler.cc
@@ -271,7 +271,12 @@
     return;
   }
   RecordString(sample.context);
-  samples_.emplace(address, std::move(sample));
+
+  // If a sample is already present with the same address, then that means that
+  // the sampling heap profiler failed to observe the destruction -- possibly
+  // because the sampling heap profiler was temporarily disabled. We should
+  // override the old entry.
+  samples_.insert_or_assign(address, std::move(sample));
 }
 
 void SamplingHeapProfiler::CaptureNativeStack(const char* context,
diff --git a/base/scoped_multi_source_observation.h b/base/scoped_multi_source_observation.h
index 61d8a34..70ed7c8 100644
--- a/base/scoped_multi_source_observation.h
+++ b/base/scoped_multi_source_observation.h
@@ -95,7 +95,7 @@
 
   const raw_ptr<Observer> observer_;
 
-  std::vector<Source*> sources_;
+  std::vector<raw_ptr<Source>> sources_;
 };
 
 }  // namespace base
diff --git a/build/clobber.py b/build/clobber.py
index 91927774..e886737 100755
--- a/build/clobber.py
+++ b/build/clobber.py
@@ -35,22 +35,30 @@
   return ''  # We got to EOF and didn't find what we were looking for.
 
 
-def delete_dir(build_dir):
-  if os.path.islink(build_dir):
-    return
+def _rmtree(d):
   # For unknown reasons (anti-virus?) rmtree of Chromium build directories
   # often fails on Windows.
   if sys.platform.startswith('win'):
-    subprocess.check_call(['rmdir', '/s', '/q', build_dir], shell=True)
+    subprocess.check_call(['rmdir', '/s', '/q', d], shell=True)
   else:
-    shutil.rmtree(build_dir)
+    shutil.rmtree(d)
+
+
+def _clean_dir(build_dir):
+  # Remove files/sub directories individually instead of recreating the build
+  # dir because it fails when the build dir is symlinked or mounted.
+  for e in os.scandir(build_dir):
+    if e.is_dir():
+      _rmtree(e.path)
+    else:
+      os.remove(e.path)
 
 
 def delete_build_dir(build_dir):
   # GN writes a build.ninja.d file. Note that not all GN builds have args.gn.
   build_ninja_d_file = os.path.join(build_dir, 'build.ninja.d')
   if not os.path.exists(build_ninja_d_file):
-    delete_dir(build_dir)
+    _clean_dir(build_dir)
     return
 
   # GN builds aren't automatically regenerated when you sync. To avoid
@@ -69,11 +77,12 @@
 
   exception_during_rm = None
   try:
-    # delete_dir and os.mkdir() may fail, such as when chrome.exe is running,
+    # _clean_dir() may fail, such as when chrome.exe is running,
     # and we still want to restore args.gn/build.ninja/build.ninja.d, so catch
     # the exception and rethrow it later.
-    delete_dir(build_dir)
-    os.mkdir(build_dir)
+    # We manually rm files inside the build dir rather than using "gn clean/gen"
+    # since we may not have run all necessary DEPS hooks yet at this point.
+    _clean_dir(build_dir)
   except Exception as e:
     exception_during_rm = e
 
diff --git a/build/clobber_unittest.py b/build/clobber_unittest.py
index bad503b..e136c5c6 100755
--- a/build/clobber_unittest.py
+++ b/build/clobber_unittest.py
@@ -124,10 +124,23 @@
   def test_delete_build_dir_fail(self):
     # Make delete_dir() throw to ensure it's handled gracefully.
 
-    with mock.patch('clobber.delete_dir', side_effect=OSError):
+    with mock.patch('clobber._clean_dir', side_effect=OSError):
       with self.assertRaises(OSError):
         clobber.delete_build_dir(self.build_dir)
 
+  def test_delete_build_dir_link(self):
+    with tempfile.TemporaryDirectory() as tmpdir:
+      # create a symlink.
+      build_dir = os.path.join(tmpdir, 'link')
+      os.symlink(self.build_dir, build_dir)
+
+      # create a dummy file.
+      dummy_file = os.path.join(build_dir, 'dummy')
+      pathlib.Path(dummy_file).touch()
+      clobber.delete_build_dir(build_dir)
+
+      self.assertFalse(os.path.exists(dummy_file))
+
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index cc7e92d..e675e08 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -398,6 +398,11 @@
 # Static libraries and source sets use only the compiler ones.
 set_defaults("static_library") {
   configs = default_compiler_configs
+
+  # For Rust, a static library involves linking in all dependencies, and it
+  # performs LTO. But since we will perform LTO in the C++ linker which
+  # consumes the library, we defer LTO from Rust into the linker.
+  configs += [ "//build/config/compiler:rust_defer_lto_to_linker" ]
 }
 set_defaults("source_set") {
   configs = default_compiler_configs
@@ -405,9 +410,6 @@
 set_defaults("rust_library") {
   configs = default_compiler_configs
 }
-set_defaults("rust_proc_macro") {
-  configs = default_compiler_configs
-}
 
 # Compute the set of configs common to all linked targets (shared libraries,
 # loadable modules, executables) to avoid duplication below.
@@ -472,6 +474,22 @@
   }
 }
 
+default_rust_proc_macro_configs =
+    default_shared_library_configs + [ "//build/rust:proc_macro_extern" ] +
+    # Rust proc macros don't support (Thin)LTO, so always remove it.
+    [
+      "//build/config/compiler:thinlto_optimize_default",
+      "//build/config/compiler:thinlto_optimize_max",
+    ] -
+    [
+      "//build/config/compiler:thinlto_optimize_default",
+      "//build/config/compiler:thinlto_optimize_max",
+    ]
+
+set_defaults("rust_proc_macro") {
+  configs = default_rust_proc_macro_configs
+}
+
 # A helper for forwarding testonly and visibility.
 # Forwarding "*" does not include variables from outer scopes (to avoid copying
 # all globals into each template invocation), so it will not pick up
diff --git a/build/config/c++/c++.gni b/build/config/c++/c++.gni
index e4dae41..a1164a0 100644
--- a/build/config/c++/c++.gni
+++ b/build/config/c++/c++.gni
@@ -2,7 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//build/config/chromeos/ui_mode.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 
 declare_args() {
@@ -11,10 +10,8 @@
   # standard library support.
   # Don't check in changes that set this to false for more platforms; doing so
   # is not supported.
-  use_custom_libcxx =
-      is_fuchsia || is_android || is_apple || is_linux || is_chromeos_lacros ||
-      (is_win && is_clang) ||
-      (is_chromeos && default_toolchain != "//build/toolchain/cros:target")
+  use_custom_libcxx = is_fuchsia || is_android || is_apple || is_linux ||
+                      is_chromeos || (is_win && is_clang)
 
   # Use libc++ instead of stdlibc++ when using the host_cpu toolchain, even if
   # use_custom_libcxx is false. This is useful for cross-compiles where a custom
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 02cb739..8651ba1b 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -887,9 +887,6 @@
   if (rust_abi_target != "") {
     rustflags += [ "--target=$rust_abi_target" ]
   }
-  if (use_lto_in_rustc_linking) {
-    rustflags += [ "-Clinker-plugin-lto" ]
-  }
   if (!use_thin_lto || !use_chromium_rust_toolchain) {
     # Don't include bitcode if it won't be used, or can't be used. When
     # use_thin_lto is true, we will try to apply LTO to any objects that have
@@ -903,6 +900,21 @@
   }
 }
 
+# Defers LTO optimization to the linker, for use when:
+# * Having the C++ toolchain do the linking against Rust staticlibs, and it
+#   will be using LTO.
+# * Having Rust toolchain invoke the linker, and you're linking Rust and C++
+#   together, so this defers LTO to the linker.
+#
+# Otherwise, Rust does LTO during compilation.
+#
+# https://doc.rust-lang.org/rustc/linker-plugin-lto.html
+config("rust_defer_lto_to_linker") {
+  if (!is_debug && use_thin_lto && is_a_target_toolchain) {
+    rustflags = [ "-Clinker-plugin-lto" ]
+  }
+}
+
 # The BUILDCONFIG file sets this config on targets by default, which means when
 # building with ThinLTO, no optimization is performed in the link step.
 config("thinlto_optimize_default") {
@@ -914,6 +926,8 @@
     } else {
       ldflags = [ "-Wl,--lto-O" + lto_opt_level ]
     }
+
+    rustflags = [ "-Clto=thin" ]
   }
 }
 
@@ -938,6 +952,8 @@
     } else {
       ldflags = [ "-Wl,--lto-O" + lto_opt_level ]
     }
+
+    rustflags = [ "-Clto=thin" ]
   }
 }
 
diff --git a/build/config/rust.gni b/build/config/rust.gni
index e7032a6c..ae4ee24f 100644
--- a/build/config/rust.gni
+++ b/build/config/rust.gni
@@ -52,12 +52,6 @@
   # Rust toolchain. Typically used with 'use_unverified_rust_toolchain' = true
   removed_rust_stdlib_libs = []
 
-  # Use LTO when using rustc to link binaries. Experimental. Currently
-  # incompatible with the options we use in our C++ toolchain to split LTO
-  # units. This has no effect on the production of normal Chrome binaries, which
-  # are linked by clang/lld rather than rustc. https://crbug.com/1229419
-  use_lto_in_rustc_linking = false
-
   # Use goma for Rust builds. Experimental. The only known problem is
   # b/193072381, but then again, we don't expect a build speedup before much
   # more work is done.
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 2616017e..03d1e05e 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-11.20230118.2.1
+11.20230119.1.1
diff --git a/build/fuchsia/update_product_bundles.py b/build/fuchsia/update_product_bundles.py
index 22be929e..d9790a3 100755
--- a/build/fuchsia/update_product_bundles.py
+++ b/build/fuchsia/update_product_bundles.py
@@ -224,7 +224,8 @@
   update_repositories_list(ffx_runner)
 
   try:
-    ffx_runner.run_ffx(('product-bundle', 'get', product_bundle))
+    ffx_runner.run_ffx(
+        ('product-bundle', 'get', product_bundle, '--force-repo'))
   except subprocess.CalledProcessError as cpe:
     logging.error('Product bundle download has failed. ' +
                   _PRODUCT_BUNDLE_FIX_INSTRUCTIONS)
diff --git a/build/fuchsia/update_product_bundles_test.py b/build/fuchsia/update_product_bundles_test.py
index 8c65e55..524e8ac 100755
--- a/build/fuchsia/update_product_bundles_test.py
+++ b/build/fuchsia/update_product_bundles_test.py
@@ -216,7 +216,8 @@
 
     mock_sequence.assert_has_calls([
         mock.call.update_repo_list(ffx_runner),
-        mock.call.run_ffx(('product-bundle', 'get', 'some-bundle'))
+        mock.call.run_ffx(
+            ('product-bundle', 'get', 'some-bundle', '--force-repo'))
     ])
 
   @mock.patch('update_product_bundles.get_product_bundle_urls')
diff --git a/build/rust/BUILD.gn b/build/rust/BUILD.gn
index 29f8a1a..b6ad5f19 100644
--- a/build/rust/BUILD.gn
+++ b/build/rust/BUILD.gn
@@ -57,13 +57,23 @@
   group("cxx_rustdeps") {
     public_deps = [ "//third_party/rust/cxx/v1:lib" ]
   }
+}
 
-  # Enables code behind #[cfg(test)]. This should only be used for targets where
-  # testonly=true.
-  config("test") {
-    rustflags = [
-      "--cfg",
-      "test",
-    ]
-  }
+# Enables code behind #[cfg(test)]. This should only be used for targets where
+# testonly=true.
+config("test") {
+  rustflags = [
+    "--cfg",
+    "test",
+  ]
+}
+
+# TODO(crbug.com/gn/104): GN rust_proc_macro targets are missing this
+# command line flag, for the proc_macro crate which is provided by rustc for
+# compiling proc-macros.
+config("proc_macro_extern") {
+  rustflags = [
+    "--extern",
+    "proc_macro",
+  ]
 }
diff --git a/build/rust/rust_target.gni b/build/rust/rust_target.gni
index bfc71aa1..b0106b77 100644
--- a/build/rust/rust_target.gni
+++ b/build/rust/rust_target.gni
@@ -116,6 +116,10 @@
     if (defined(invoker.executable_configs)) {
       _configs += invoker.executable_configs
     }
+  } else if (invoker.target_type == "rust_proc_macro") {
+    if (defined(invoker.proc_macro_configs)) {
+      _configs += invoker.proc_macro_configs
+    }
   } else {
     if (defined(invoker.library_configs)) {
       _configs += invoker.library_configs
@@ -123,14 +127,6 @@
   }
   _forward_to_host_toolchain = false
   if (invoker.target_type == "rust_proc_macro") {
-    # TODO(crbug.com/gn/104): GN rust_proc_macro targets are missing this
-    # command line flag, for the proc_macro crate which is provided by rustc for
-    # compiling proc-macros.
-    _rustflags += [
-      "--extern",
-      "proc_macro",
-    ]
-
     if (current_toolchain != host_toolchain) {
       _forward_to_host_toolchain = true
     }
@@ -214,6 +210,7 @@
                  "_out_dir",
                  "_public_deps",
                  "_rustenv",
+                 "_rustflags",
                  "_support_use_from_cpp",
                  "_test_deps",
                  "_testonly",
@@ -375,4 +372,5 @@
 set_defaults("rust_target") {
   executable_configs = default_executable_configs
   library_configs = default_compiler_configs
+  proc_macro_configs = default_rust_proc_macro_configs
 }
diff --git a/cc/paint/paint_canvas.h b/cc/paint/paint_canvas.h
index 66e2624..1b2e032 100644
--- a/cc/paint/paint_canvas.h
+++ b/cc/paint/paint_canvas.h
@@ -74,8 +74,8 @@
   virtual int save() = 0;
   virtual int saveLayer(const PaintFlags& flags) = 0;
   virtual int saveLayer(const SkRect& bounds, const PaintFlags& flags) = 0;
-  virtual int saveLayerAlpha(uint8_t alpha) = 0;
-  virtual int saveLayerAlpha(const SkRect& bounds, uint8_t alpha) = 0;
+  virtual int saveLayerAlphaf(float alpha) = 0;
+  virtual int saveLayerAlphaf(const SkRect& bounds, float alpha) = 0;
 
   virtual void restore() = 0;
   virtual int getSaveCount() const = 0;
diff --git a/cc/paint/paint_flags.h b/cc/paint/paint_flags.h
index bf199e69..f843536 100644
--- a/cc/paint/paint_flags.h
+++ b/cc/paint/paint_flags.h
@@ -163,8 +163,8 @@
   }
 
   // Returns true if this (of a drawOp) allows the sequence
-  // saveLayerAlpha/drawOp/restore to be folded into a single drawOp by baking
-  // the alpha in the saveLayerAlpha into the flags of the drawOp.
+  // saveLayerAlphaf/drawOp/restore to be folded into a single drawOp by baking
+  // the alpha in the saveLayerAlphaf into the flags of the drawOp.
   bool SupportsFoldingAlpha() const;
 
   // SkPaint does not support loopers, so callers of SkToPaint need
diff --git a/cc/paint/record_paint_canvas.cc b/cc/paint/record_paint_canvas.cc
index bfbbbf2..16138b19 100644
--- a/cc/paint/record_paint_canvas.cc
+++ b/cc/paint/record_paint_canvas.cc
@@ -83,13 +83,13 @@
   return save_count_++;
 }
 
-int RecordPaintCanvas::saveLayerAlpha(uint8_t alpha) {
-  push<SaveLayerAlphaOp>(static_cast<float>(alpha / 255.0f));
+int RecordPaintCanvas::saveLayerAlphaf(float alpha) {
+  push<SaveLayerAlphaOp>(alpha);
   return save_count_++;
 }
 
-int RecordPaintCanvas::saveLayerAlpha(const SkRect& bounds, uint8_t alpha) {
-  push<SaveLayerAlphaOp>(bounds, static_cast<float>(alpha / 255.0f));
+int RecordPaintCanvas::saveLayerAlphaf(const SkRect& bounds, float alpha) {
+  push<SaveLayerAlphaOp>(bounds, alpha);
   return save_count_++;
 }
 
@@ -354,15 +354,16 @@
   return CheckSaveCount(RecordPaintCanvas::saveLayer(bounds, flags),
                         canvas_.saveLayer(&bounds, &paint));
 }
-int InspectableRecordPaintCanvas::saveLayerAlpha(uint8_t alpha) {
-  return CheckSaveCount(RecordPaintCanvas::saveLayerAlpha(alpha),
-                        canvas_.saveLayerAlpha(nullptr, alpha));
+
+int InspectableRecordPaintCanvas::saveLayerAlphaf(float alpha) {
+  return CheckSaveCount(RecordPaintCanvas::saveLayerAlphaf(alpha),
+                        canvas_.saveLayerAlphaf(nullptr, alpha));
 }
 
-int InspectableRecordPaintCanvas::saveLayerAlpha(const SkRect& bounds,
-                                                 uint8_t alpha) {
-  return CheckSaveCount(RecordPaintCanvas::saveLayerAlpha(bounds, alpha),
-                        canvas_.saveLayerAlpha(&bounds, alpha));
+int InspectableRecordPaintCanvas::saveLayerAlphaf(const SkRect& bounds,
+                                                  float alpha) {
+  return CheckSaveCount(RecordPaintCanvas::saveLayerAlphaf(bounds, alpha),
+                        canvas_.saveLayerAlphaf(&bounds, alpha));
 }
 
 void InspectableRecordPaintCanvas::restore() {
diff --git a/cc/paint/record_paint_canvas.h b/cc/paint/record_paint_canvas.h
index 97db043b..418ce7d 100644
--- a/cc/paint/record_paint_canvas.h
+++ b/cc/paint/record_paint_canvas.h
@@ -46,8 +46,8 @@
   int save() override;
   int saveLayer(const PaintFlags& flags) override;
   int saveLayer(const SkRect& bounds, const PaintFlags& flags) override;
-  int saveLayerAlpha(uint8_t alpha) override;
-  int saveLayerAlpha(const SkRect& bounds, uint8_t alpha) override;
+  int saveLayerAlphaf(float alpha) override;
+  int saveLayerAlphaf(const SkRect& bounds, float alpha) override;
   void restore() override;
   int getSaveCount() const final;
   void restoreToCount(int save_count) override;
@@ -205,8 +205,8 @@
   int save() override;
   int saveLayer(const PaintFlags& flags) override;
   int saveLayer(const SkRect& bounds, const PaintFlags& flags) override;
-  int saveLayerAlpha(uint8_t alpha) override;
-  int saveLayerAlpha(const SkRect& bounds, uint8_t alpha) override;
+  int saveLayerAlphaf(float alpha) override;
+  int saveLayerAlphaf(const SkRect& bounds, float alpha) override;
   void restore() override;
 
   void translate(SkScalar dx, SkScalar dy) override;
diff --git a/cc/paint/skia_paint_canvas.cc b/cc/paint/skia_paint_canvas.cc
index accfce5..2117a2d 100644
--- a/cc/paint/skia_paint_canvas.cc
+++ b/cc/paint/skia_paint_canvas.cc
@@ -83,12 +83,12 @@
   return canvas_->saveLayer(&bounds, &paint);
 }
 
-int SkiaPaintCanvas::saveLayerAlpha(uint8_t alpha) {
-  return canvas_->saveLayerAlpha(nullptr, alpha);
+int SkiaPaintCanvas::saveLayerAlphaf(float alpha) {
+  return canvas_->saveLayerAlphaf(nullptr, alpha);
 }
 
-int SkiaPaintCanvas::saveLayerAlpha(const SkRect& bounds, uint8_t alpha) {
-  return canvas_->saveLayerAlpha(&bounds, alpha);
+int SkiaPaintCanvas::saveLayerAlphaf(const SkRect& bounds, float alpha) {
+  return canvas_->saveLayerAlphaf(&bounds, alpha);
 }
 
 void SkiaPaintCanvas::restore() {
diff --git a/cc/paint/skia_paint_canvas.h b/cc/paint/skia_paint_canvas.h
index 0098bf4d..263b8976 100644
--- a/cc/paint/skia_paint_canvas.h
+++ b/cc/paint/skia_paint_canvas.h
@@ -73,8 +73,8 @@
   int save() override;
   int saveLayer(const PaintFlags& flags) override;
   int saveLayer(const SkRect& bounds, const PaintFlags& flags) override;
-  int saveLayerAlpha(uint8_t alpha) override;
-  int saveLayerAlpha(const SkRect& bounds, uint8_t alpha) override;
+  int saveLayerAlphaf(float alpha) override;
+  int saveLayerAlphaf(const SkRect& bounds, float alpha) override;
 
   void restore() override;
   int getSaveCount() const override;
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index c7cc7df3..06b717e 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1105,7 +1105,6 @@
   "java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java",
   "java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java",
   "java/src/org/chromium/chrome/browser/tabmodel/document/TabDelegate.java",
-  "java/src/org/chromium/chrome/browser/tasks/ConditionalTabStripUtils.java",
   "java/src/org/chromium/chrome/browser/tasks/EngagementTimeUtil.java",
   "java/src/org/chromium/chrome/browser/tasks/JourneyManager.java",
   "java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java",
diff --git a/chrome/android/expectations/lint-suppressions.xml b/chrome/android/expectations/lint-suppressions.xml
index 9f4f1fc..25a0abd 100644
--- a/chrome/android/expectations/lint-suppressions.xml
+++ b/chrome/android/expectations/lint-suppressions.xml
@@ -151,11 +151,6 @@
     <ignore regexp="The resource `R.string.tab_suggestion_close_stale_message` appears to be unused"/>
     <ignore regexp="The resource `R.string.tab_suggestion_close_tab_action_button` appears to be unused"/>
     <ignore regexp="The resource `R.string.tab_suggestion_review_button` appears to be unused"/>
-    <!-- crbug.com/1076295 remove this line and the following four lines after the bug is resolved -->
-    <ignore regexp="The resource `R.string.undo_tab_strip_closure_message` appears to be unused"/>
-    <ignore regexp="The resource `R.string.tab_strip_info_bar_question` appears to be unused"/>
-    <ignore regexp="The resource `R.string.tab_strip_info_bar_no_reshow` appears to be unused"/>
-    <ignore regexp="The resource `R.string.tab_strip_info_bar_reshow` appears to be unused"/>
     <!-- crbug.com/1117145 remove this line and the following 23 lines after the bug is resolved -->
     <ignore regexp="The resource `R.layout.language_picker` appears to be unused"/>
     <ignore regexp="The resource `R.string.video_tutorials_accessibility_close` appears to be unused"/>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java
index 1bcbd8c..3ece2bcf 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtils.java
@@ -44,12 +44,8 @@
     public static void maybeShowIPH(@FeatureConstants String featureName, View view,
             @Nullable BottomSheetController bottomSheetController) {
         if (view == null) return;
-        // For tab group, all three IPHs are valid. For conditional tab strip, the only valid IPH
-        // below is TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE.
-        if (!TabUiFeatureUtilities.isTabGroupsAndroidEnabled(view.getContext())
-                && !(TabUiFeatureUtilities.isConditionalTabStripEnabled()
-                        && featureName.equals(
-                                FeatureConstants.TAB_GROUPS_TAP_TO_SEE_ANOTHER_TAB_FEATURE))) {
+        // For tab group, all three IPHs are valid.
+        if (!TabUiFeatureUtilities.isTabGroupsAndroidEnabled(view.getContext())) {
             return;
         }
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
index 9aa0d3e..2a9a4bb 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiCoordinator.java
@@ -141,9 +141,8 @@
                         "Downloaded_Enabled");
             }
 
-            boolean actionOnAllRelatedTabs = TabUiFeatureUtilities.isConditionalTabStripEnabled();
             mTabStripCoordinator = new TabListCoordinator(TabListCoordinator.TabListMode.STRIP,
-                    mContext, mTabModelSelector, null, null, actionOnAllRelatedTabs, null, null,
+                    mContext, mTabModelSelector, null, null, false, null, null,
                     TabProperties.UiType.STRIP, null, null, mTabListContainerView, true,
                     COMPONENT_NAME, mRootView, onModelTokenChange);
             mTabStripCoordinator.initWithNative(mDynamicResourceLoaderSupplier.get());
@@ -169,13 +168,10 @@
 
             mMediator = new TabGroupUiMediator(mActivity, visibilityController, this, mModel,
                     mTabModelSelector, mTabCreatorManager, mLayoutStateProviderSupplier,
-                    mIncognitoStateProvider, dialogController, mActivityLifecycleDispatcher,
-                    mSnackbarManager, mOmniboxFocusStateSupplier);
+                    mIncognitoStateProvider, dialogController, mOmniboxFocusStateSupplier);
 
             TabGroupUtils.startObservingForCreationIPH();
 
-            if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) return;
-
             // TODO(meiliang): Potential leak if the observer is added after restoreCompleted. Fix
             // it. Record the group count after all tabs are being restored. This only happen once
             // per life cycle, therefore remove the observer after recording. We only focus on
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
index 80ec2e1..59e8c3b 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediator.java
@@ -4,8 +4,6 @@
 
 package org.chromium.chrome.browser.tasks.tab_management;
 
-import static org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.UNDO_DISMISS_SNACKBAR_DURATION;
-
 import android.content.Context;
 import android.os.Handler;
 import android.view.View;
@@ -23,8 +21,6 @@
 import org.chromium.chrome.browser.layouts.LayoutStateProvider;
 import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver;
 import org.chromium.chrome.browser.layouts.LayoutType;
-import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
-import org.chromium.chrome.browser.lifecycle.PauseResumeWithNativeObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabCreationState;
 import org.chromium.chrome.browser.tab.TabLaunchType;
@@ -37,15 +33,11 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.FeatureStatus;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.ReasonToShow;
 import org.chromium.chrome.browser.tasks.ReturnToChromeUtil;
 import org.chromium.chrome.browser.tasks.tab_groups.EmptyTabGroupModelFilterObserver;
 import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
 import org.chromium.chrome.browser.toolbar.bottom.BottomControlsCoordinator;
-import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
-import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
+import org.chromium.chrome.browser.toolbar.bottom.BottomControlsCoordinator.BottomControlsVisibilityController;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.components.browser_ui.widget.gesture.BackPressHandler;
 import org.chromium.components.embedder_support.util.UrlConstants;
@@ -54,13 +46,12 @@
 import org.chromium.ui.modelutil.PropertyModel;
 import org.chromium.url.GURL;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
  * A mediator for the TabGroupUi. Responsible for managing the internal state of the component.
  */
-public class TabGroupUiMediator implements SnackbarManager.SnackbarController, BackPressHandler {
+public class TabGroupUiMediator implements BackPressHandler {
     /**
      * An interface to control the TabGroupUi component.
      */
@@ -112,9 +103,6 @@
     private final TabGridDialogMediator.DialogController mTabGridDialogController;
     private final IncognitoStateObserver mIncognitoStateObserver;
     private final TabModelSelectorObserver mTabModelSelectorObserver;
-    private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
-    private final SnackbarManager mSnackbarManager;
-    private final Snackbar mUndoClosureSnackBar;
     private final ObservableSupplier<Boolean> mOmniboxFocusStateSupplier;
 
     private CallbackController mCallbackController = new CallbackController();
@@ -122,22 +110,17 @@
     private LayoutStateProvider mLayoutStateProvider;
 
     private TabGroupModelFilter.Observer mTabGroupModelFilterObserver;
-    private PauseResumeWithNativeObserver mPauseResumeWithNativeObserver;
     private TabModelSelectorTabObserver mTabModelSelectorTabObserver;
     private Callback<Boolean> mOmniboxFocusObserver;
     private boolean mIsTabGroupUiVisible;
     private boolean mIsShowingOverViewMode;
-    private boolean mActivatedButNotShown;
 
-    TabGroupUiMediator(Context context,
-            BottomControlsCoordinator.BottomControlsVisibilityController visibilityController,
+    TabGroupUiMediator(Context context, BottomControlsVisibilityController visibilityController,
             ResetHandler resetHandler, PropertyModel model, TabModelSelector tabModelSelector,
             TabCreatorManager tabCreatorManager,
             OneshotSupplier<LayoutStateProvider> layoutStateProviderSupplier,
             IncognitoStateProvider incognitoStateProvider,
             @Nullable TabGridDialogMediator.DialogController dialogController,
-            ActivityLifecycleDispatcher activityLifecycleDispatcher,
-            SnackbarManager snackbarManager,
             ObservableSupplier<Boolean> omniboxFocusStateSupplier) {
         mContext = context;
         mResetHandler = resetHandler;
@@ -147,15 +130,7 @@
         mVisibilityController = visibilityController;
         mIncognitoStateProvider = incognitoStateProvider;
         mTabGridDialogController = dialogController;
-        mActivityLifecycleDispatcher = activityLifecycleDispatcher;
-        mSnackbarManager = snackbarManager;
         mOmniboxFocusStateSupplier = omniboxFocusStateSupplier;
-        mUndoClosureSnackBar =
-                Snackbar.make(context.getString(R.string.undo_tab_strip_closure_message), this,
-                                Snackbar.TYPE_ACTION,
-                                Snackbar.UMA_CONDITIONAL_TAB_STRIP_DISMISS_UNDO)
-                        .setAction(context.getString(R.string.undo), null)
-                        .setDuration(UNDO_DISMISS_SNACKBAR_DURATION);
 
         if (layoutStateProviderSupplier.get() != null
                 && layoutStateProviderSupplier.get().isLayoutVisible(LayoutType.TAB_SWITCHER)) {
@@ -167,36 +142,13 @@
 
         // register for tab model
         mTabModelObserver = new TabModelObserver() {
-            private int mAddedTabId = Tab.INVALID_TAB_ID;
             @Override
             public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
-                if (type == TabSelectionType.FROM_NEW) {
-                    mAddedTabId = tab.getId();
-                }
-                if (lastId != tab.getId() && mSnackbarManager.isShowing()) {
-                    // Dismiss undo snackbar when there is a selection of different tab.
-                    mSnackbarManager.dismissSnackbars(TabGroupUiMediator.this);
-                }
-                // Maybe activate conditional tab strip for selection from toolbar swipe, but skip
-                // the same tab selection that is probably due to partial toolbar swipe. Also, when
-                // a new tab is created and selected, there will be two didSelectTab calls, one as
-                // TabSelectionType.FROM_NEW and the other as TabSelectionType.FROM_USER. We skip
-                // this kind of didSelectTab signal since it may be from unintentional tab creation.
-                if (type == TabSelectionType.FROM_USER) {
-                    if (tab.getId() == mAddedTabId || tab.getId() == lastId) {
-                        mAddedTabId = Tab.INVALID_TAB_ID;
-                    } else {
-                        maybeActivateConditionalTabStrip(ReasonToShow.TAB_SWITCHED);
-                    }
-                }
                 if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(mContext)
                         && getTabsToShowForId(lastId).contains(tab)) {
                     return;
                 }
 
-                if (TabUiFeatureUtilities.isConditionalTabStripEnabled() && mIsTabGroupUiVisible) {
-                    return;
-                }
                 // TODO(995956): Optimization we can do here if we decided always hide the strip if
                 // related tab size down to 1.
                 resetTabStripWithRelatedTabsForId(tab.getId());
@@ -205,26 +157,15 @@
             @Override
             public void willCloseTab(Tab tab, boolean animate, boolean didCloseAlone) {
                 if (!mIsTabGroupUiVisible) return;
-                // The strip should hide when users close the second-to-last tab in strip. The
-                // tabCountToHide for group is 1 because tab group status is updated with this
-                // closure before this method is called.
-                int tabCountToHide =
-                        TabUiFeatureUtilities.isTabGroupsAndroidEnabled(mContext) ? 1 : 2;
+
                 List<Tab> tabList = getTabsToShowForId(tab.getId());
-                if (tabList.size() == tabCountToHide) {
+                if (tabList.size() == 1) {
                     resetTabStripWithRelatedTabsForId(Tab.INVALID_TAB_ID);
                 }
             }
 
             @Override
             public void didAddTab(Tab tab, int type, @TabCreationState int creationState) {
-                if (type == TabLaunchType.FROM_CHROME_UI
-                        || type == TabLaunchType.FROM_LONGPRESS_BACKGROUND) {
-                    maybeActivateConditionalTabStrip(type == TabLaunchType.FROM_LONGPRESS_BACKGROUND
-                                    ? ReasonToShow.LONG_PRESS
-                                    : ReasonToShow.NEW_TAB);
-                }
-
                 if (type == TabLaunchType.FROM_CHROME_UI || type == TabLaunchType.FROM_RESTORE
                         || type == TabLaunchType.FROM_STARTUP) {
                     return;
@@ -256,8 +197,6 @@
                     return;
                 }
                 resetTabStripWithRelatedTabsForId(currentTab.getId());
-                RecordUserAction.record("TabStrip.SessionVisibility."
-                        + (mIsTabGroupUiVisible ? "Visible" : "Hidden"));
             }
 
             @Override
@@ -274,7 +213,6 @@
                     public void onStartedShowing(int layoutType, boolean showToolbar) {
                         assert layoutType == LayoutType.TAB_SWITCHER;
 
-                        maybeActivateConditionalTabStrip(ReasonToShow.TAB_SWITCHED);
                         mIsShowingOverViewMode = true;
                         resetTabStripWithRelatedTabsForId(Tab.INVALID_TAB_ID);
                     }
@@ -318,7 +256,6 @@
         mTabModelSelectorObserver = new TabModelSelectorObserver() {
             @Override
             public void onTabModelSelected(TabModel newModel, TabModel oldModel) {
-                mSnackbarManager.dismissSnackbars(TabGroupUiMediator.this);
                 resetTabStripWithRelatedTabsForId(mTabModelSelector.getCurrentTabId());
             }
         };
@@ -343,26 +280,6 @@
                     .addTabGroupObserver(mTabGroupModelFilterObserver);
         }
 
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-            mPauseResumeWithNativeObserver = new PauseResumeWithNativeObserver() {
-                @Override
-                public void onResumeWithNative() {
-                    resetTabStripWithRelatedTabsForId(mTabModelSelector.getCurrentTabId());
-                    if (!mTabModelSelector.isTabStateInitialized()) {
-                        return;
-                    }
-                    RecordUserAction.record("TabStrip.SessionVisibility."
-                            + (mIsTabGroupUiVisible ? "Visible" : "Hidden"));
-                }
-
-                @Override
-                public void onPauseWithNative() {
-                    resetTabStripWithRelatedTabsForId(Tab.INVALID_TAB_ID);
-                }
-            };
-            mActivityLifecycleDispatcher.register(mPauseResumeWithNativeObserver);
-        }
-
         if (TabUiFeatureUtilities.isLaunchBugFixEnabled()) {
             mOmniboxFocusObserver = isFocus -> {
                 // Hide tab strip when omnibox gains focus and try to re-show it when omnibox loses
@@ -406,27 +323,12 @@
     }
 
     private void setupToolbarButtons() {
-        View.OnClickListener leftButtonOnClickListener;
-        if (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(mContext)) {
-            // For tab group, the left button is to show the tab grid dialog.
-            leftButtonOnClickListener = view -> {
-                Tab currentTab = mTabModelSelector.getCurrentTab();
-                if (currentTab == null) return;
-                mResetHandler.resetGridWithListOfTabs(getTabsToShowForId(currentTab.getId()));
-                RecordUserAction.record("TabGroup.ExpandedFromStrip.TabGridDialog");
-            };
-        } else {
-            // For conditional tab strip, the left button is to dismiss the strip.
-            leftButtonOnClickListener = view -> {
-                resetTabStripWithRelatedTabsForId(Tab.INVALID_TAB_ID);
-                ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.FORBIDDEN);
-                RecordUserAction.record("TabStrip.UserDismissed");
-                if (ConditionalTabStripUtils.shouldShowSnackbarForDismissal()) {
-                    mSnackbarManager.showSnackbar(mUndoClosureSnackBar);
-                }
-            };
-            mModel.set(TabGroupUiProperties.LEFT_BUTTON_DRAWABLE_ID, R.drawable.btn_close);
-        }
+        View.OnClickListener leftButtonOnClickListener = view -> {
+            Tab currentTab = mTabModelSelector.getCurrentTab();
+            if (currentTab == null) return;
+            mResetHandler.resetGridWithListOfTabs(getTabsToShowForId(currentTab.getId()));
+            RecordUserAction.record("TabGroup.ExpandedFromStrip.TabGridDialog");
+        };
         mModel.set(TabGroupUiProperties.LEFT_BUTTON_ON_CLICK_LISTENER, leftButtonOnClickListener);
 
         View.OnClickListener rightButtonOnClickListener = view -> {
@@ -449,18 +351,9 @@
         };
         mModel.set(TabGroupUiProperties.RIGHT_BUTTON_ON_CLICK_LISTENER, rightButtonOnClickListener);
 
-        String leftButtonContentDescription;
-        String rightButtonContentDescription;
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-            leftButtonContentDescription =
-                    mContext.getString(R.string.accessibility_bottom_tab_strip_close_strip);
-            rightButtonContentDescription =
-                    mContext.getString(R.string.accessibility_toolbar_btn_new_tab);
-        } else {
-            leftButtonContentDescription =
-                    mContext.getString(R.string.accessibility_bottom_tab_strip_expand_tab_sheet);
-            rightButtonContentDescription = mContext.getString(R.string.bottom_tab_grid_new_tab);
-        }
+        String leftButtonContentDescription =
+                mContext.getString(R.string.accessibility_bottom_tab_strip_expand_tab_sheet);
+        String rightButtonContentDescription = mContext.getString(R.string.bottom_tab_grid_new_tab);
         mModel.set(
                 TabGroupUiProperties.LEFT_BUTTON_CONTENT_DESCRIPTION, leftButtonContentDescription);
         mModel.set(TabGroupUiProperties.RIGHT_BUTTON_CONTENT_DESCRIPTION,
@@ -476,13 +369,8 @@
         // TODO(crbug.com/1090655): We should be able to guard this call behind some checks so that
         // we can assert here that 1) mIsShowingOverViewMode is false 2) mIsTabGroupUiVisible with
         // valid id is false.
-        // When overview mode is showing or conditional tab strip feature is
-        // turned on but the feature is not activated (i.e. forbidden or default), keep the tab
-        // strip hidden.
-        if (mIsShowingOverViewMode
-                || (TabUiFeatureUtilities.isConditionalTabStripEnabled()
-                        && ConditionalTabStripUtils.getFeatureStatus()
-                                != FeatureStatus.ACTIVATED)) {
+        // When overview mode is showing keep the tab strip hidden.
+        if (mIsShowingOverViewMode) {
             id = Tab.INVALID_TAB_ID;
         }
         List<Tab> listOfTabs = getTabsToShowForId(id);
@@ -492,11 +380,6 @@
         } else {
             mResetHandler.resetStripWithListOfTabs(listOfTabs);
             mIsTabGroupUiVisible = true;
-            if (mActivatedButNotShown) {
-                mActivatedButNotShown = false;
-                RecordUserAction.record("TabStrip.ShownOnTabUse");
-                ConditionalTabStripUtils.updateLastShownTimeStamp();
-            }
         }
         if (mIsTabGroupUiVisible) {
             // Post to make sure that the recyclerView already knows how many visible items it has.
@@ -512,21 +395,10 @@
 
     /**
      * Get a list of tabs to show based on a tab ID. When tab group is enabled, it will return all
-     * tabs that are in the same group with target tab. When conditional tab strip is enabled, it
-     * will return all tabs in the same tab model as target tab.
+     * tabs that are in the same group with target tab.
      * @param id  The ID of the tab that will be used to decide the list of tabs to show.
      */
     private List<Tab> getTabsToShowForId(int id) {
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-            ArrayList<Tab> tabList = new ArrayList<>();
-            if (id == Tab.INVALID_TAB_ID) return tabList;
-            Tab tab = mTabModelSelector.getTabById(id);
-            TabModel tabModel = mTabModelSelector.getModel(tab.isIncognito());
-            for (int i = 0; i < tabModel.getCount(); i++) {
-                tabList.add(tabModel.getTabAt(i));
-            }
-            return tabList;
-        }
         return mTabModelSelector.getTabModelFilterProvider()
                 .getCurrentTabModelFilter()
                 .getRelatedTabList(id);
@@ -565,9 +437,7 @@
                         .removeTabGroupObserver(mTabGroupModelFilterObserver);
             }
         }
-        if (mPauseResumeWithNativeObserver != null) {
-            mActivityLifecycleDispatcher.unregister(mPauseResumeWithNativeObserver);
-        }
+
         if (mTabModelSelectorTabObserver != null) {
             mTabModelSelectorTabObserver.destroy();
         }
@@ -584,31 +454,8 @@
         mIncognitoStateProvider.removeObserver(mIncognitoStateObserver);
     }
 
-    private void maybeActivateConditionalTabStrip(@ReasonToShow int reason) {
-        if (ConditionalTabStripUtils.getFeatureStatus() == FeatureStatus.DEFAULT
-                && TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-            ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.ACTIVATED);
-            mActivatedButNotShown = true;
-            RecordHistogram.recordEnumeratedHistogram("TabStrip.ReasonToShow", reason,
-                    ConditionalTabStripUtils.ReasonToShow.NUM_ENTRIES);
-        }
-    }
-
-    // SnackbarManager.SnackbarController implementation.
-    @Override
-    public void onAction(Object actionData) {
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.ACTIVATED);
-        resetTabStripWithRelatedTabsForId(mTabModelSelector.getCurrentTabId());
-        RecordUserAction.record("TabStrip.UndoDismiss");
-    }
-
     @VisibleForTesting
     boolean getIsShowingOverViewModeForTesting() {
         return mIsShowingOverViewMode;
     }
-
-    @VisibleForTesting
-    int getConditionalTabStripFeatureStatusForTesting() {
-        return ConditionalTabStripUtils.getFeatureStatus();
-    }
 }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index 81c3a54..848c99f 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -369,7 +369,7 @@
 
             mNextTabId = tabId;
 
-            if (!mActionsOnAllRelatedTabs || TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
+            if (!mActionsOnAllRelatedTabs) {
                 Tab currentTab = mTabModelSelector.getCurrentTab();
                 Tab newlySelectedTab =
                         TabModelUtils.getTabById(mTabModelSelector.getCurrentModel(), tabId);
@@ -413,12 +413,6 @@
                                         .indexOf(toTab);
 
             RecordUserAction.record("MobileTabSwitched." + mComponentName);
-            if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-                assert fromFilterIndex != toFilterIndex;
-                RecordHistogram.recordSparseHistogram("Tabs.TabOffsetOfSwitch." + mComponentName,
-                        fromFilterIndex - toFilterIndex);
-                return;
-            }
 
             if (fromFilterIndex != toFilterIndex) return;
 
@@ -613,12 +607,7 @@
             @Override
             public void tabClosureUndone(Tab tab) {
                 onTabAdded(tab, !mActionsOnAllRelatedTabs);
-                if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-                    mTabModelSelector.getCurrentModel().setIndex(
-                            TabModelUtils.getTabIndexById(
-                                    mTabModelSelector.getCurrentModel(), tab.getId()),
-                            TabSelectionType.FROM_USER, false);
-                }
+
                 if (sTabClosedFromMapTabClosedFromMap.containsKey(tab.getId())) {
                     @TabClosedFrom
                     int from = sTabClosedFromMapTabClosedFromMap.get(tab.getId());
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
index 91b3e47..2f24bba 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -15,7 +15,6 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.DoubleCachedFieldTrialParameter;
 import org.chromium.chrome.browser.flags.IntCachedFieldTrialParameter;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
 import org.chromium.chrome.browser.tasks.ReturnToChromeUtil;
 import org.chromium.ui.base.DeviceFormFactor;
 
@@ -255,16 +254,6 @@
     }
 
     /**
-     * @return Whether the conditional tab strip feature is enabled and available for use.
-     */
-    public static boolean isConditionalTabStripEnabled() {
-        // TODO(crbug.com/1222946): Deprecate this feature.
-        return ChromeFeatureList.sConditionalTabStripAndroid.isEnabled()
-                && isTabManagementModuleSupported()
-                && !ConditionalTabStripUtils.getOptOutIndicator();
-    }
-
-    /**
      * @return Whether the thumbnail_aspect_ratio field trail is set.
      */
     public static boolean isTabThumbnailAspectRatioNotOne() {
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
index 973bf3b..6c4dc33 100644
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
+++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
@@ -210,9 +210,6 @@
       <message name="IDS_ACCESSIBILITY_BOTTOM_TAB_STRIP_EXPAND_TAB_SHEET" desc="Accessibility string for BottomTabStripToolbar button indicated visually by the '^' sign.">
         Show group's tabs in fullscreen grid
       </message>
-        <message name="IDS_ACCESSIBILITY_BOTTOM_TAB_STRIP_CLOSE_STRIP" desc="Accessibility string for BottomTabStripToolbar button indicated visually by the 'X' sign. When user clicks on it, the tab strip will be closed.">
-        Close tab strip
-      </message>
 
       <!-- Tab Group Tab Switcher strings -->
       <message name="IDS_TABSWITCHER_CREATE_GROUP" desc="This flat button is shown in the Tab Switcher, under an open tab. When the user taps the button, Chrome creates a new group of tabs that includes the existing tab. It's okay to use any of the following verbs in order to keep the text under 45 characters: Create, Make, Add.">
@@ -449,20 +446,6 @@
           Move tab down
       </message>
 
-      <!-- Strings for Conditional Tab Strip -->
-      <message name="IDS_UNDO_TAB_STRIP_CLOSURE_MESSAGE" desc="Message shown on the snack bar when the conditional tab strip is closed.">
-          Closed tab strip
-      </message>
-      <message name="IDS_TAB_STRIP_INFO_BAR_QUESTION" desc="This text is shown on the info bar when the user has dismissed the tab strip for multiple times. It is to ask whether users want the tab strip to hide permanently or they still want it to show sometime later.">
-          Don't show tab strip again?
-      </message>
-      <message name="IDS_TAB_STRIP_INFO_BAR_NO_RESHOW" desc="This text is shown on the info bar action button and serves as one answer to &quot;Don't show tab strip again?&quot;. When a user clicks this button, tab strip will never show again for this user.">
-          Don't show again
-      </message>
-      <message name="IDS_TAB_STRIP_INFO_BAR_RESHOW" desc="This text is shown on the info bar action button and serves as one answer to &quot;Don't show tab strip again?&quot;. When a user clicks this button, tab strip will keep showing for this user.">
-          Show later
-      </message>
-
       <!-- Price Drops Card strings -->
       <message name="IDS_PRICE_DROP_SPOTTED_TITLE" desc="This text shows on the price drop message card if any item in the open tabs has a price drop. It familiarizes users with the new track-prices-on-tabs UI.">
         Price drop spotted
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_NO_RESHOW.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_NO_RESHOW.png.sha1
deleted file mode 100644
index ec83edf..0000000
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_NO_RESHOW.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-64bf1e5e6f143d2592425b15c7e6e349cb736850
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_QUESTION.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_QUESTION.png.sha1
deleted file mode 100644
index ec83edf..0000000
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_QUESTION.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-64bf1e5e6f143d2592425b15c7e6e349cb736850
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_RESHOW.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_RESHOW.png.sha1
deleted file mode 100644
index ec83edf..0000000
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_STRIP_INFO_BAR_RESHOW.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-64bf1e5e6f143d2592425b15c7e6e349cb736850
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_UNDO_TAB_STRIP_CLOSURE_MESSAGE.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_UNDO_TAB_STRIP_CLOSURE_MESSAGE.png.sha1
deleted file mode 100644
index 97d2d04..0000000
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_UNDO_TAB_STRIP_CLOSURE_MESSAGE.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-49db40076204f20144f9b382eef687e28d32fd6b
\ No newline at end of file
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java
deleted file mode 100644
index bc6c2a547..0000000
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java
+++ /dev/null
@@ -1,220 +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.
-
-package org.chromium.chrome.browser.tasks.tab_management;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.junit.Assert.assertThat;
-
-import android.content.SharedPreferences;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.ContextUtils;
-import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.base.test.BaseRobolectricTestRunner;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.FeatureStatus;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.UserStatus;
-import org.chromium.chrome.test.util.browser.Features;
-
-/**
- * Tests for {@link org.chromium.chrome.browser.tasks.ConditionalTabStripUtils}.
- */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class ConditionalTabStripUtilsUnitTest {
-    @Rule
-    public TestRule mProcessor = new Features.JUnitProcessor();
-
-    private SharedPreferences mSharedPreference;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mSharedPreference = ContextUtils.getAppSharedPreferences();
-
-        // Initialize the feature status.
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.DEFAULT);
-        ConditionalTabStripUtils.setContinuousDismissCount(0);
-        ConditionalTabStripUtils.setOptOutIndicator(false);
-    }
-
-    @Test
-    public void testSetGetFeatureStatus() {
-        assertThat(mSharedPreference.getInt(ConditionalTabStripUtils.FEATURE_STATUS, -1),
-                equalTo(FeatureStatus.DEFAULT));
-
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.ACTIVATED);
-
-        assertThat(mSharedPreference.getInt(ConditionalTabStripUtils.FEATURE_STATUS, -1),
-                equalTo(FeatureStatus.ACTIVATED));
-        assertThat(ConditionalTabStripUtils.getFeatureStatus(), equalTo(FeatureStatus.ACTIVATED));
-    }
-
-    @Test
-    public void testSetGetContinuousDismissCount() {
-        assertThat(
-                mSharedPreference.getInt(ConditionalTabStripUtils.CONTINUOUS_DISMISS_COUNTER, -1),
-                equalTo(0));
-
-        ConditionalTabStripUtils.setContinuousDismissCount(2);
-
-        assertThat(
-                mSharedPreference.getInt(ConditionalTabStripUtils.FEATURE_STATUS, -1), equalTo(2));
-        assertThat(ConditionalTabStripUtils.getContinuousDismissCount(), equalTo(2));
-    }
-
-    @Test
-    public void testSetGetOptOutIndicator() {
-        assertThat(mSharedPreference.getBoolean(ConditionalTabStripUtils.OPT_OUT_INDICATOR, true),
-                equalTo(false));
-
-        ConditionalTabStripUtils.setOptOutIndicator(true);
-
-        assertThat(mSharedPreference.getBoolean(ConditionalTabStripUtils.OPT_OUT_INDICATOR, false),
-                equalTo(true));
-        assertThat(ConditionalTabStripUtils.getOptOutIndicator(), equalTo(true));
-    }
-
-    @Test
-    public void testUpdateDismissCounter_plusOne() {
-        ConditionalTabStripUtils.setContinuousDismissCount(0);
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.FORBIDDEN);
-
-        ConditionalTabStripUtils.updateFeatureExpiration(-1);
-
-        assertThat(ConditionalTabStripUtils.getContinuousDismissCount(), equalTo(1));
-    }
-
-    @Test
-    public void testUpdateDismissCounter_noUpdate() {
-        ConditionalTabStripUtils.setContinuousDismissCount(2);
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.DEFAULT);
-
-        ConditionalTabStripUtils.updateFeatureExpiration(-1);
-
-        assertThat(ConditionalTabStripUtils.getContinuousDismissCount(), equalTo(2));
-    }
-
-    @Test
-    public void testUpdateDismissCounter_reset() {
-        ConditionalTabStripUtils.setContinuousDismissCount(2);
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.ACTIVATED);
-
-        ConditionalTabStripUtils.updateFeatureExpiration(-1);
-
-        assertThat(ConditionalTabStripUtils.getContinuousDismissCount(), equalTo(0));
-    }
-
-    @Test
-    public void testUserStatusUMA_NoUser() {
-        assertThat(ConditionalTabStripUtils.getLastShownTimeStamp(), equalTo(-1L));
-
-        verifyUMAUserStatusRecord(UserStatus.NON_USER);
-    }
-
-    @Test
-    public void testUserStatusUMA_TabStripNotShown() {
-        ConditionalTabStripUtils.updateLastShownTimeStamp();
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.DEFAULT);
-
-        verifyUMAUserStatusRecord(UserStatus.TAB_STRIP_NOT_SHOWN);
-    }
-
-    @Test
-    public void testUserStatusUMA_TabStripShown() {
-        ConditionalTabStripUtils.updateLastShownTimeStamp();
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.ACTIVATED);
-
-        verifyUMAUserStatusRecord(UserStatus.TAB_STRIP_SHOWN);
-    }
-
-    @Test
-    public void testUserStatusUMA_TabStripShownAndDismissed() {
-        ConditionalTabStripUtils.updateLastShownTimeStamp();
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.FORBIDDEN);
-
-        verifyUMAUserStatusRecord(UserStatus.TAB_STRIP_SHOWN_AND_DISMISSED);
-    }
-
-    @Test
-    public void testUserStatusUMA_TabStripPermanentlyHidden() {
-        ConditionalTabStripUtils.updateLastShownTimeStamp();
-        ConditionalTabStripUtils.setOptOutIndicator(true);
-
-        verifyUMAUserStatusRecord(UserStatus.TAB_STRIP_PERMANENTLY_HIDDEN);
-    }
-
-    @Test
-    public void testShouldShowSnackbar_OptOut() {
-        ConditionalTabStripUtils.setContinuousDismissCount(
-                ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_DISMISS_COUNTER_ABANDONED);
-
-        assertThat(ConditionalTabStripUtils.shouldShowSnackbarForDismissal(), equalTo(true));
-    }
-
-    @Test
-    public void testShouldShowSnackbar_BeyondLimit() {
-        ConditionalTabStripUtils.setContinuousDismissCount(
-                ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_INFOBAR_LIMIT.getValue());
-
-        assertThat(ConditionalTabStripUtils.shouldShowSnackbarForDismissal(), equalTo(true));
-    }
-
-    @Test
-    public void testShouldNotShowSnackbar() {
-        ConditionalTabStripUtils.setContinuousDismissCount(
-                ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_INFOBAR_PERIOD.getValue() - 1);
-
-        assertThat(ConditionalTabStripUtils.shouldShowSnackbarForDismissal(), equalTo(false));
-    }
-
-    private void verifyUMAUserStatusRecord(@UserStatus int userStatus) {
-        int oldNoUserCount = getHistogramValueCountForUserStatus(UserStatus.NON_USER);
-        int oldTabStripNotShownCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_NOT_SHOWN);
-        int oldTabStripShownCount = getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_SHOWN);
-        int oldTabStripShownAndDismissedCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_SHOWN_AND_DISMISSED);
-        int oldTabStripPermanentlyHiddenCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_PERMANENTLY_HIDDEN);
-
-        // Trigger user action record.
-        ConditionalTabStripUtils.updateFeatureExpiration(-1);
-
-        int currentNoUserCount = getHistogramValueCountForUserStatus(UserStatus.NON_USER);
-        int currentTabStripNotShownCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_NOT_SHOWN);
-        int currentTabStripShownCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_SHOWN);
-        int currentTabStripShownAndDismissedCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_SHOWN_AND_DISMISSED);
-        int currentTabStripPermanentlyHiddenCount =
-                getHistogramValueCountForUserStatus(UserStatus.TAB_STRIP_PERMANENTLY_HIDDEN);
-
-        assertThat(currentNoUserCount - oldNoUserCount,
-                equalTo(userStatus == UserStatus.NON_USER ? 1 : 0));
-        assertThat(currentTabStripNotShownCount - oldTabStripNotShownCount,
-                equalTo(userStatus == UserStatus.TAB_STRIP_NOT_SHOWN ? 1 : 0));
-        assertThat(currentTabStripShownCount - oldTabStripShownCount,
-                equalTo(userStatus == UserStatus.TAB_STRIP_SHOWN ? 1 : 0));
-        assertThat(currentTabStripShownAndDismissedCount - oldTabStripShownAndDismissedCount,
-                equalTo(userStatus == UserStatus.TAB_STRIP_SHOWN_AND_DISMISSED ? 1 : 0));
-        assertThat(currentTabStripPermanentlyHiddenCount - oldTabStripPermanentlyHiddenCount,
-                equalTo(userStatus == UserStatus.TAB_STRIP_PERMANENTLY_HIDDEN ? 1 : 0));
-    }
-
-    private int getHistogramValueCountForUserStatus(@UserStatus int userStatus) {
-        return RecordHistogram.getHistogramValueCountForTesting(
-                ConditionalTabStripUtils.UMA_USER_STATUS_RESULT, userStatus);
-    }
-}
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
index 57e19aa..8a6b3d2 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiMediatorUnitTest.java
@@ -28,7 +28,6 @@
 
 import androidx.annotation.Nullable;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Rule;
@@ -51,8 +50,6 @@
 import org.chromium.chrome.browser.layouts.LayoutStateProvider;
 import org.chromium.chrome.browser.layouts.LayoutStateProvider.LayoutStateObserver;
 import org.chromium.chrome.browser.layouts.LayoutType;
-import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
-import org.chromium.chrome.browser.lifecycle.PauseResumeWithNativeObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabCreationState;
 import org.chromium.chrome.browser.tab.TabImpl;
@@ -69,8 +66,6 @@
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorImpl;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils.FeatureStatus;
 import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter;
 import org.chromium.chrome.browser.toolbar.bottom.BottomControlsCoordinator;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
@@ -132,8 +127,6 @@
     @Mock
     TabGridDialogMediator.DialogController mTabGridDialogController;
     @Mock
-    ActivityLifecycleDispatcher mActivityLifecycleDispatcher;
-    @Mock
     Context mContext;
     @Mock
     SnackbarManager mSnackbarManager;
@@ -152,8 +145,6 @@
     @Captor
     ArgumentCaptor<TabGroupModelFilter.Observer> mTabGroupModelFilterObserverArgumentCaptor;
     @Captor
-    ArgumentCaptor<PauseResumeWithNativeObserver> mPauseResumeWithNativeObserverArgumentCaptor;
-    @Captor
     ArgumentCaptor<TabObserver> mTabObserverCaptor;
     @Captor
     ArgumentCaptor<Callback<Boolean>> mOmniboxFocusObserverCaptor;
@@ -216,8 +207,7 @@
                                                                           : null;
         mTabGroupUiMediator = new TabGroupUiMediator(mContext, mVisibilityController, mResetHandler,
                 mModel, mTabModelSelector, mTabCreatorManager, mLayoutStateProviderSupplier,
-                mIncognitoStateProvider, controller, mActivityLifecycleDispatcher, mSnackbarManager,
-                mOmniboxFocusStateSupplier);
+                mIncognitoStateProvider, controller, mOmniboxFocusStateSupplier);
 
         if (currentTab == null) {
             verifyNeverReset();
@@ -225,26 +215,15 @@
         }
 
         // Verify strip button content description setup.
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-            verify(mContext).getString(R.string.accessibility_bottom_tab_strip_close_strip);
-            verify(mContext).getString(R.string.accessibility_toolbar_btn_new_tab);
-        } else {
-            verify(mContext).getString(R.string.accessibility_bottom_tab_strip_expand_tab_sheet);
-            verify(mContext).getString(R.string.bottom_tab_grid_new_tab);
-        }
+        verify(mContext).getString(R.string.accessibility_bottom_tab_strip_expand_tab_sheet);
+        verify(mContext).getString(R.string.bottom_tab_grid_new_tab);
 
         // Verify strip initial reset.
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
+        List<Tab> tabs = mTabGroupModelFilter.getRelatedTabList(currentTab.getId());
+        if (tabs.size() < 2) {
             verifyResetStrip(false, null);
-            assertThat(mTabGroupUiMediator.getConditionalTabStripFeatureStatusForTesting(),
-                    equalTo(FeatureStatus.DEFAULT));
         } else {
-            List<Tab> tabs = mTabGroupModelFilter.getRelatedTabList(currentTab.getId());
-            if (tabs.size() < 2) {
-                verifyResetStrip(false, null);
-            } else {
-                verifyResetStrip(true, tabs);
-            }
+            verifyResetStrip(true, tabs);
         }
     }
 
@@ -285,40 +264,19 @@
         doNothing().when(mTab2).addObserver(mTabObserverCaptor.capture());
         doNothing().when(mTab3).addObserver(mTabObserverCaptor.capture());
 
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()) {
-            doReturn(false).when(mTabModelFilter).isIncognito();
-            doReturn(3).when(mTabModelFilter).getCount();
-            doReturn(new ArrayList<>(Arrays.asList(mTab1)))
-                    .when(mTabModelFilter)
-                    .getRelatedTabList(TAB1_ID);
-            doReturn(new ArrayList<>(Arrays.asList(mTab1)))
-                    .when(mTabModelFilter)
-                    .getRelatedTabList(TAB2_ID);
-            doReturn(new ArrayList<>(Arrays.asList(mTab1)))
-                    .when(mTabModelFilter)
-                    .getRelatedTabList(TAB3_ID);
+        // Setup TabGroupModelFilter.
+        doReturn(false).when(mTabGroupModelFilter).isIncognito();
+        doReturn(2).when(mTabGroupModelFilter).getCount();
+        doReturn(mTabGroup1).when(mTabGroupModelFilter).getRelatedTabList(TAB1_ID);
+        doReturn(mTabGroup2).when(mTabGroupModelFilter).getRelatedTabList(TAB2_ID);
+        doReturn(mTabGroup2).when(mTabGroupModelFilter).getRelatedTabList(TAB3_ID);
 
-            doReturn(mTabModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
-            doReturn(mTabModelFilter).when(mTabModelFilterProvider).getTabModelFilter(true);
-            doReturn(mTabModelFilter).when(mTabModelFilterProvider).getTabModelFilter(false);
-            doNothing()
-                    .when(mActivityLifecycleDispatcher)
-                    .register(mPauseResumeWithNativeObserverArgumentCaptor.capture());
-        } else {
-            // Setup TabGroupModelFilter.
-            doReturn(false).when(mTabGroupModelFilter).isIncognito();
-            doReturn(2).when(mTabGroupModelFilter).getCount();
-            doReturn(mTabGroup1).when(mTabGroupModelFilter).getRelatedTabList(TAB1_ID);
-            doReturn(mTabGroup2).when(mTabGroupModelFilter).getRelatedTabList(TAB2_ID);
-            doReturn(mTabGroup2).when(mTabGroupModelFilter).getRelatedTabList(TAB3_ID);
-
-            doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
-            doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getTabModelFilter(true);
-            doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getTabModelFilter(false);
-            doNothing()
-                    .when(mTabGroupModelFilter)
-                    .addTabGroupObserver(mTabGroupModelFilterObserverArgumentCaptor.capture());
-        }
+        doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getCurrentTabModelFilter();
+        doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getTabModelFilter(true);
+        doReturn(mTabGroupModelFilter).when(mTabModelFilterProvider).getTabModelFilter(false);
+        doNothing()
+                .when(mTabGroupModelFilter)
+                .addTabGroupObserver(mTabGroupModelFilterObserverArgumentCaptor.capture());
 
         // Set up TabModelSelector and TabModelFilterProvider.
         List<TabModel> tabModelList = new ArrayList<>();
@@ -365,11 +323,6 @@
         mModel = new PropertyModel(TabGroupUiProperties.ALL_KEYS);
     }
 
-    @After
-    public void tearDown() {
-        ConditionalTabStripUtils.setFeatureStatus(FeatureStatus.DEFAULT);
-    }
-
     /*********************** Tab group related tests *************************/
 
     @Test
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni
index b1be7fac..d2cee08c 100644
--- a/chrome/android/features/tab_ui/tab_management_java_sources.gni
+++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -45,7 +45,6 @@
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/pseudotab/TabAttributeCacheUnitTest.java",
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupUtilsUnitTest.java",
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsDialogUnitTest.java",
-  "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ConditionalTabStripUtilsUnitTest.java",
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IncognitoReauthPromoMessageServiceUnitTest.java",
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageServiceUnitTest.java",
   "//chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/LargeMessageCardViewBinderUnitTest.java",
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 35d5ca48..86023f77 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -166,7 +166,6 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelUtils;
 import org.chromium.chrome.browser.tabmodel.TabWindowManager;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
 import org.chromium.chrome.browser.tasks.EngagementTimeUtil;
 import org.chromium.chrome.browser.tasks.JourneyManager;
 import org.chromium.chrome.browser.tasks.ReturnToChromeUtil;
@@ -1116,12 +1115,6 @@
             setInitialOverviewState();
         }
 
-        if (TabUiFeatureUtilities.isConditionalTabStripEnabled()
-                || ConditionalTabStripUtils.getOptOutIndicator()) {
-            ConditionalTabStripUtils.updateFeatureExpiration(
-                    mInactivityTracker.getLastBackgroundedTimeMs());
-        }
-
         Bundle savedInstanceState = getSavedInstanceState();
         if (savedInstanceState != null
                 && savedInstanceState.getBoolean(IS_INCOGNITO_SELECTED, false)) {
@@ -1817,8 +1810,8 @@
             };
         }
 
-        mUndoBarPopupController = new UndoBarController(this, mTabModelSelector,
-                this::getSnackbarManager, mLayoutStateProviderSupplier, dialogVisibilitySupplier);
+        mUndoBarPopupController = new UndoBarController(
+                this, mTabModelSelector, this::getSnackbarManager, dialogVisibilitySupplier);
 
         mInactivityTracker = new ChromeInactivityTracker(
                 ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
index 09eb9e8..e9a08fd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -25,7 +25,6 @@
 import org.chromium.chrome.browser.page_annotations.PageAnnotationsServiceConfig;
 import org.chromium.chrome.browser.tab.state.FilePersistedTabDataStorage;
 import org.chromium.chrome.browser.tabmodel.TabPersistentStore;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
 import org.chromium.chrome.features.start_surface.StartSurfaceConfiguration;
 
@@ -89,7 +88,6 @@
                 add(ChromeFeatureList.sCctToolbarCustomizations);
                 add(ChromeFeatureList.sCloseTabSuggestions);
                 add(ChromeFeatureList.sCommandLineOnNonRooted);
-                add(ChromeFeatureList.sConditionalTabStripAndroid);
                 add(ChromeFeatureList.sCommerceCoupons);
                 add(ChromeFeatureList.sCriticalPersistedTabData);
                 add(ChromeFeatureList.sDiscoverMultiColumn);
@@ -146,9 +144,6 @@
                         add(BrandingController.ANIMATE_TOOLBAR_ICON_TRANSITION);
                         add(ChimeFeatures.ALWAYS_REGISTER);
                         add(StartSurfaceConfiguration.BEHAVIOURAL_TARGETING);
-                        add(ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_INFOBAR_LIMIT);
-                        add(ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_INFOBAR_PERIOD);
-                        add(ConditionalTabStripUtils.CONDITIONAL_TAB_STRIP_SESSION_TIME_MS);
                         add(FeedPlaceholderLayout.ENABLE_INSTANT_START_ANIMATION);
                         add(FilePersistedTabDataStorage.DELAY_SAVES_UNTIL_DEFERRED_STARTUP_PARAM);
                         add(OptimizationGuidePushNotificationManager.MAX_CACHE_SIZE);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
index ae4e020..502d69a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchSelectionController.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.contextualsearch;
 
 import android.app.Activity;
-import android.graphics.Point;
 import android.text.TextUtils;
 
 import androidx.annotation.IntDef;
@@ -95,9 +94,6 @@
     private float mX;
     private float mY;
 
-    // The time of the most last scroll activity, or 0 if none.
-    private long mLastScrollTimeNs;
-
     // When the last tap gesture happened.
     private long mTapTimeNanoseconds;
 
@@ -128,18 +124,10 @@
 
         @Override
         public void onScrollEnded(int scrollOffsetY, int scrollExtentY) {
-            mLastScrollTimeNs = System.nanoTime();
             mHandler.handleScrollEnd();
         }
 
         @Override
-        public void onScrollUpdateGestureConsumed(Point rootScrollOffset) {
-            // The onScrollEnded notification is unreliable, so mark time during scroll updates too.
-            // See crbug.com/600863.
-            mLastScrollTimeNs = System.nanoTime();
-        }
-
-        @Override
         public void onTouchDown() {
             mTapTimeNanoseconds = System.nanoTime();
             mWasSelectionEmptyBeforeTap = TextUtils.isEmpty(mSelectedText);
@@ -245,13 +233,6 @@
     }
 
     /**
-     * @return The time of the most recent scroll, or 0 if none.
-     */
-    long getLastScrollTime() {
-        return mLastScrollTimeNs;
-    }
-
-    /**
      * Returns whether the current selection has been adjusted or not.
      * If it has been adjusted we must request a resolve for this exact term rather than anything
      * that overlaps as is the behavior with normal expanding resolves.
@@ -390,7 +371,6 @@
     private void resetAllStates() {
         resetSelectionStates();
         mLastTapState = null;
-        mLastScrollTimeNs = 0;
         mTapTimeNanoseconds = 0;
         mDidExpandSelection = false;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java
index b8a0460..81e8ce4b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java
@@ -149,10 +149,6 @@
                     ViewUtils.requestLayout(mControlContainer.getView(),
                             "BrowserControlsManager.mUpdateVisibilityRunnable Runnable");
                 }
-
-                for (BrowserControlsStateProvider.Observer observer : mControlsObservers) {
-                    observer.onAndroidVisibilityChanged(visibility);
-                }
             }
         }
     };
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
index c1255b44..a9149d80 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -517,8 +517,7 @@
         }
 
         if (!DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity)
-                && (TabUiFeatureUtilities.isTabGroupsAndroidEnabled(mActivity)
-                        || TabUiFeatureUtilities.isConditionalTabStripEnabled())) {
+                && TabUiFeatureUtilities.isTabGroupsAndroidEnabled(mActivity)) {
             getToolbarManager().enableBottomControls();
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ConditionalTabStripUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ConditionalTabStripUtils.java
deleted file mode 100644
index ea012b1d..0000000
--- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ConditionalTabStripUtils.java
+++ /dev/null
@@ -1,257 +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.
-
-package org.chromium.chrome.browser.tasks;
-
-import androidx.annotation.IntDef;
-import androidx.annotation.VisibleForTesting;
-
-import org.chromium.base.metrics.RecordHistogram;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.flags.IntCachedFieldTrialParameter;
-import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
-import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Helper class to handle conditional tab strip related utilities.
- */
-public class ConditionalTabStripUtils {
-    public static final int UNDO_DISMISS_SNACKBAR_DURATION = 5000;
-    public static final int CONDITIONAL_TAB_STRIP_DISMISS_COUNTER_ABANDONED = -1;
-    @VisibleForTesting
-    public static final String FEATURE_STATUS =
-            ChromePreferenceKeys.CONDITIONAL_TAB_STRIP_FEATURE_STATUS;
-    @VisibleForTesting
-    public static final String CONTINUOUS_DISMISS_COUNTER =
-            ChromePreferenceKeys.CONDITIONAL_TAB_STRIP_CONTINUOUS_DISMISS_COUNTER;
-    @VisibleForTesting
-    public static final String OPT_OUT_INDICATOR =
-            ChromePreferenceKeys.CONDITIONAL_TAB_STRIP_OPT_OUT;
-    private static final String LAST_SHOWN_TIMESTAMP =
-            ChromePreferenceKeys.CONDITIONAL_TAB_STRIP_LAST_SHOWN_TIMESTAMP;
-    @VisibleForTesting
-    public static final String UMA_USER_STATUS_RESULT = "TabStrip.UserStatus";
-    private static final String CONDITIONAL_TAB_STRIP_SESSION_TIME_MS_PARAM =
-            "conditional_tab_strip_session_time_ms";
-    private static final String CONDITIONAL_TAB_STRIP_INFOBAR_LIMIT_PARAM =
-            "conditional_tab_strip_infobar_limit";
-    private static final String CONDITIONAL_TAB_STRIP_INFOBAR_PERIOD_PARAM =
-            "conditional_tab_strip_infobar_period";
-    public static final IntCachedFieldTrialParameter CONDITIONAL_TAB_STRIP_SESSION_TIME_MS =
-            new IntCachedFieldTrialParameter(ChromeFeatureList.CONDITIONAL_TAB_STRIP_ANDROID,
-                    CONDITIONAL_TAB_STRIP_SESSION_TIME_MS_PARAM, 3600000);
-    public static final IntCachedFieldTrialParameter CONDITIONAL_TAB_STRIP_INFOBAR_LIMIT =
-            new IntCachedFieldTrialParameter(ChromeFeatureList.CONDITIONAL_TAB_STRIP_ANDROID,
-                    CONDITIONAL_TAB_STRIP_INFOBAR_LIMIT_PARAM, 6);
-    public static final IntCachedFieldTrialParameter CONDITIONAL_TAB_STRIP_INFOBAR_PERIOD =
-            new IntCachedFieldTrialParameter(ChromeFeatureList.CONDITIONAL_TAB_STRIP_ANDROID,
-                    CONDITIONAL_TAB_STRIP_INFOBAR_PERIOD_PARAM, 3);
-    /**
-     * A series of possible states of the conditional tab strip in a feature session. A feature
-     * session is defined as usage of Chrome without a gap of more than an hour, which may include
-     * multiple foregroundings/backgroundings. FeatureStatus.DEFAULT is the initial state for the
-     * feature when the previous feature session has expired. The strip will not show in this state
-     * until being activated. FeatureStatus.ACTIVATED is the status when conditional tab strip is
-     * activated and strip will show in this state. FeatureStatus.FORBIDDEN is the state when user
-     * explicitly dismisses the strip, and the strip will never reshow in this state until returning
-     * to FeatureStatus.Default after feature session expiration.
-     */
-    @IntDef({FeatureStatus.FORBIDDEN, FeatureStatus.ACTIVATED, FeatureStatus.DEFAULT})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FeatureStatus {
-        int FORBIDDEN = 0;
-        int ACTIVATED = 1;
-        int DEFAULT = 2;
-    }
-
-    /**
-     * A series of possible statuses of a user in a feature session of conditional tab strip (see
-     * feature session definition in {@link #FEATURE_STATUS}). It is recorded as a histogram once
-     * per feature session.
-     */
-    @IntDef({UserStatus.NON_USER, UserStatus.TAB_STRIP_NOT_SHOWN, UserStatus.TAB_STRIP_SHOWN,
-            UserStatus.TAB_STRIP_SHOWN_AND_DISMISSED, UserStatus.TAB_STRIP_PERMANENTLY_HIDDEN})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface UserStatus {
-        // User has never seen conditional tab strip in any previous feature sessions.
-        int NON_USER = 0;
-        // User has seen conditional tab strip in previous sessions before, but not in current
-        // feature session.
-        int TAB_STRIP_NOT_SHOWN = 1;
-        // User has seen conditional tab strip in current feature session.
-        int TAB_STRIP_SHOWN = 2;
-        // User has seen conditional tab strip in current feature session and dismissed it.
-        int TAB_STRIP_SHOWN_AND_DISMISSED = 3;
-        // User has opt-outed the conditional tab strip feature.
-        int TAB_STRIP_PERMANENTLY_HIDDEN = 4;
-        // Update TabStripUserStatus in enums.xml when adding new items.
-        int NUM_ENTRIES = 5;
-    }
-
-    /**
-     * A series of possible reasons that caused conditional tab strip to show.
-     */
-    @IntDef({ReasonToShow.TAB_SWITCHED, ReasonToShow.NEW_TAB, ReasonToShow.LONG_PRESS})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ReasonToShow {
-        int TAB_SWITCHED = 0;
-        int NEW_TAB = 1;
-        int LONG_PRESS = 2;
-        // Update TabStripReasonForShow in enums.xml when adding new items.
-        int NUM_ENTRIES = 3;
-    }
-
-    /**
-     * Update whether the current feature session for conditional tab strip is expired based on the
-     * last time when Chrome is in background and save the status in SharedPreference for future
-     * reference (see feature session definition in {@link #FEATURE_STATUS}).
-     *
-     * @param lastBackgroundedTimeMillis The last time the application was backgrounded. Set in
-     *                                   ChromeTabbedActivity::onStartWithNative
-     */
-    public static void updateFeatureExpiration(final long lastBackgroundedTimeMillis) {
-        long expirationTime =
-                lastBackgroundedTimeMillis + CONDITIONAL_TAB_STRIP_SESSION_TIME_MS.getValue();
-        if (lastBackgroundedTimeMillis == -1 || System.currentTimeMillis() > expirationTime) {
-            recordUserStatus();
-            updateContinuousDismissCounter();
-            setFeatureStatus(FeatureStatus.DEFAULT);
-        }
-    }
-
-    private static void recordUserStatus() {
-        long lastShownTimeStamp = getLastShownTimeStamp();
-        int previousFeatureStatus = getFeatureStatus();
-        // TODO(yuezhanggg@): Right now we only use the lastShownTimeStamp as a boolean indicator.
-        // We want to update the logic below so that these metrics can be recorded on a time window
-        // basis, e.g. 28 days.
-        if (getOptOutIndicator()) {
-            recordUserStatusEnums(UserStatus.TAB_STRIP_PERMANENTLY_HIDDEN);
-        } else if (lastShownTimeStamp == -1) {
-            recordUserStatusEnums(UserStatus.NON_USER);
-        } else if (previousFeatureStatus == FeatureStatus.DEFAULT) {
-            recordUserStatusEnums(UserStatus.TAB_STRIP_NOT_SHOWN);
-        } else if (previousFeatureStatus == FeatureStatus.ACTIVATED) {
-            recordUserStatusEnums(UserStatus.TAB_STRIP_SHOWN);
-        } else if (previousFeatureStatus == FeatureStatus.FORBIDDEN) {
-            recordUserStatusEnums(UserStatus.TAB_STRIP_SHOWN_AND_DISMISSED);
-        }
-    }
-
-    private static void updateContinuousDismissCounter() {
-        int count = getContinuousDismissCount();
-        // If the counter is set to -1, the counter is no longer needed and we should never update
-        // it.
-        if (count == CONDITIONAL_TAB_STRIP_DISMISS_COUNTER_ABANDONED) return;
-        if (getFeatureStatus() == FeatureStatus.ACTIVATED) {
-            // If the strip is activated in the previous session, we reset the counter to 0.
-            setContinuousDismissCount(0);
-        } else if (getFeatureStatus() == FeatureStatus.FORBIDDEN) {
-            // We no longer keep the counter when the number of sessions in which user has
-            // continuously dismissed the strip has reached the limit. Otherwise we update the
-            // counter.
-            count += 1;
-            setContinuousDismissCount(count >= CONDITIONAL_TAB_STRIP_INFOBAR_LIMIT.getValue()
-                            ? CONDITIONAL_TAB_STRIP_DISMISS_COUNTER_ABANDONED
-                            : count);
-        }
-    }
-
-    private static void recordUserStatusEnums(@UserStatus int userStatus) {
-        RecordHistogram.recordEnumeratedHistogram(
-                UMA_USER_STATUS_RESULT, userStatus, UserStatus.NUM_ENTRIES);
-    }
-
-    /**
-     * Update the status of the conditional tab strip feature in SharedPreference.
-     *
-     * @param featureStatus the target {@link FeatureStatus} to set.
-     */
-    public static void setFeatureStatus(@FeatureStatus int featureStatus) {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        sharedPreferencesManager.writeInt(FEATURE_STATUS, featureStatus);
-    }
-
-    /**
-     * Update the timestamp of last time that conditional tab strip shows in SharedPreference with
-     * current time.
-     */
-    public static void updateLastShownTimeStamp() {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        sharedPreferencesManager.writeLong(LAST_SHOWN_TIMESTAMP, System.currentTimeMillis());
-    }
-
-    /**
-     * Get the status of the conditional tab strip feature from SharedPreference.
-     *
-     * @return {@link FeatureStatus} that indicates the saved status of conditional tab strip
-     *         feature.
-     */
-    public static @FeatureStatus int getFeatureStatus() {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        return sharedPreferencesManager.readInt(FEATURE_STATUS, FeatureStatus.DEFAULT);
-    }
-
-    @VisibleForTesting
-    public static long getLastShownTimeStamp() {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        return sharedPreferencesManager.readLong(LAST_SHOWN_TIMESTAMP, -1);
-    }
-
-    /**
-     * Get the count that records how many sessions in which user has continuously dismissed the
-     * conditional tab strip from SharedPreference.
-     */
-    @VisibleForTesting
-    public static int getContinuousDismissCount() {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        return sharedPreferencesManager.readInt(CONTINUOUS_DISMISS_COUNTER, 0);
-    }
-
-    /**
-     * Set the count that records how many sessions in which user has continuously dismissed the
-     * conditional tab strip in SharedPreference.
-     *
-     * @param count the updated count to save into SharedPreference.
-     */
-    public static void setContinuousDismissCount(int count) {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        sharedPreferencesManager.writeInt(CONTINUOUS_DISMISS_COUNTER, count);
-    }
-
-    /**
-     * Get the boolean indicator that indicates whether this user has opt-outed the conditional tab
-     * strip feature from SharedPreference.
-     */
-    public static boolean getOptOutIndicator() {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        return sharedPreferencesManager.readBoolean(OPT_OUT_INDICATOR, false);
-    }
-
-    /**
-     * Set the boolean indicator that indicates whether this user has opt-outed the conditional tab
-     * strip feature in SharedPreference.
-     *
-     * @param isOptOut the boolean indicator to save into SharedPreference.
-     */
-    public static void setOptOutIndicator(boolean isOptOut) {
-        SharedPreferencesManager sharedPreferencesManager = SharedPreferencesManager.getInstance();
-        sharedPreferencesManager.writeBoolean(OPT_OUT_INDICATOR, isOptOut);
-    }
-
-    /**
-     * Get a boolean indicator that indicates whether the undo snackbar will show for a dismissal.
-     * If not, the opt-out infobar should show.
-     *
-     * @return whether the snackbar should show for this dismissal.
-     */
-    public static boolean shouldShowSnackbarForDismissal() {
-        int count = ConditionalTabStripUtils.getContinuousDismissCount();
-        return count == CONDITIONAL_TAB_STRIP_DISMISS_COUNTER_ABANDONED
-                || (count + 1) % CONDITIONAL_TAB_STRIP_INFOBAR_PERIOD.getValue() != 0;
-    }
-}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController.java b/chrome/android/java/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController.java
index c3482a8..004af78 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/undo_tab_close_snackbar/UndoBarController.java
@@ -8,21 +8,17 @@
 
 import androidx.annotation.Nullable;
 
-import org.chromium.base.CallbackController;
-import org.chromium.base.supplier.OneshotSupplier;
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.device.DeviceClassManager;
-import org.chromium.chrome.browser.layouts.LayoutStateProvider;
-import org.chromium.chrome.browser.layouts.LayoutType;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
-import org.chromium.chrome.browser.tasks.ConditionalTabStripUtils;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
 import org.chromium.chrome.browser.ui.messages.snackbar.Snackbar;
 import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager;
+import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager.SnackbarManageable;
 import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
 
 import java.util.List;
@@ -49,8 +45,6 @@
     private final TabModelObserver mTabModelObserver;
     private final SnackbarManager.SnackbarManageable mSnackbarManagable;
     private final Context mContext;
-    private CallbackController mCallbackController = new CallbackController();
-    private LayoutStateProvider mLayoutStateProvider;
 
     /**
      * Creates an instance of a {@link UndoBarController}.
@@ -58,19 +52,14 @@
      * @param selector The {@link TabModelSelector} that will be used to commit and undo tab
      *                 closures.
      * @param snackbarManageable The holder class to get the manager that helps to show up snackbar.
-     * @param layoutStateProviderSupplier The {@link LayoutStateProvider} to help check whether the
-     *                                    tab switcher is showing.
      * @param dialogVisibilitySupplier The {@link Supplier} to get the visibility of TabGridDialog.
      */
     public UndoBarController(Context context, TabModelSelector selector,
-            SnackbarManager.SnackbarManageable snackbarManageable,
-            OneshotSupplier<LayoutStateProvider> layoutStateProviderSupplier,
+            SnackbarManageable snackbarManageable,
             @Nullable Supplier<Boolean> dialogVisibilitySupplier) {
         mSnackbarManagable = snackbarManageable;
         mTabModelSelector = selector;
         mContext = context;
-        layoutStateProviderSupplier.onAvailable(mCallbackController.makeCancelable(
-                layoutStateProvider -> mLayoutStateProvider = layoutStateProvider));
 
         mTabModelObserver = new TabModelObserver() {
             /**
@@ -79,16 +68,6 @@
              *         show or dismiss the undo bar.
              */
             private boolean disableUndo(boolean showingUndoBar) {
-                // If the closure happens through conditional tab strip, show the undo snack bar
-                // regardless of whether accessibility mode is enabled.
-                if (TabUiFeatureUtilities.isConditionalTabStripEnabled()
-                        && ConditionalTabStripUtils.getFeatureStatus()
-                                == ConditionalTabStripUtils.FeatureStatus.ACTIVATED
-                        && (mLayoutStateProvider != null
-                                && !mLayoutStateProvider.isLayoutVisible(
-                                        LayoutType.TAB_SWITCHER))) {
-                    return false;
-                }
                 // When closure(s) happen and we are trying to show the undo bar, check whether the
                 // TabGridDialog is showing. If so, don't show the undo bar because TabGridDialog
                 // has its own undo bar. See crbug.com/1119899. Note that we don't disable attempts
@@ -168,10 +147,6 @@
     public void destroy() {
         TabModel model = mTabModelSelector.getModel(false);
         if (model != null) model.removeObserver(mTabModelObserver);
-        if (mCallbackController != null) {
-            mCallbackController.destroy();
-            mCallbackController = null;
-        }
     }
 
     /**
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
index 4f09189..24ddfab5 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
@@ -294,10 +294,10 @@
 
         int token = browserControlsManager.hideAndroidControlsAndClearOldToken(
                 TokenHolder.INVALID_TOKEN);
-        verify(mBrowserControlsStateProviderObserver).onAndroidVisibilityChanged(View.INVISIBLE);
+        verify(mContainerView).setVisibility(View.INVISIBLE);
 
         when(mContainerView.getVisibility()).thenReturn(View.INVISIBLE);
         browserControlsManager.releaseAndroidControlsHidingToken(token);
-        verify(mBrowserControlsStateProviderObserver).onAndroidVisibilityChanged(View.VISIBLE);
+        verify(mContainerView).setVisibility(View.VISIBLE);
     }
 }
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 55f69929..d1790e7 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-110.0.5464.0_rc-r2-merged.afdo.bz2
+chromeos-chrome-amd64-111.0.5544.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 88f4bb4..b3b825e 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3328,7 +3328,6 @@
       "//chrome/browser/touch_to_fill/payments/android:public",
       "//chrome/browser/ui:adaptive_toolbar_enums_java",
       "//chrome/browser/ui/android/layouts:android",
-      "//chrome/browser/ui/webui/explore_sites_internals:mojo_bindings",
       "//chrome/browser/ui/webui/feed_internals:mojo_bindings",
       "//chrome/browser/usb/android:jni_headers",
       "//chrome/browser/video_tutorials/internal",
@@ -7705,7 +7704,7 @@
   if (is_android) {
     deps += [
       "//chrome/browser/resources/offline_pages:build_ts",
-      "//chrome/browser/ui/webui/explore_sites_internals:mojo_bindings_js",
+      "//chrome/browser/resources/video_tutorials:build_ts",
     ]
   }
   if (!is_android) {
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 096adf7..7e760950 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2258,16 +2258,6 @@
      std::size(kFeedCloseRefresh_Interact), nullptr},
 };
 
-const FeatureEntry::FeatureParam kConditionalTabStripAndroid_Immediate[] = {
-    {"conditional_tab_strip_session_time_ms", "0"}};
-const FeatureEntry::FeatureParam kConditionalTabStripAndroid_60Minutes[] = {
-    {"conditional_tab_strip_session_time_ms", "3600000"}};
-const FeatureEntry::FeatureVariation kConditionalTabStripAndroidVariations[] = {
-    {"Immediate", kConditionalTabStripAndroid_Immediate,
-     std::size(kConditionalTabStripAndroid_Immediate), nullptr},
-    {"60 minutes", kConditionalTabStripAndroid_60Minutes,
-     std::size(kConditionalTabStripAndroid_60Minutes), nullptr},
-};
 #endif  // BUILDFLAG(IS_ANDROID)
 
 #if BUILDFLAG(IS_ANDROID)
@@ -6130,14 +6120,6 @@
                                     kTabStripRedesignVariations,
                                     "TabStripRedesignAndroid")},
 
-    {"enable-conditional-tabstrip",
-     flag_descriptions::kConditionalTabStripAndroidName,
-     flag_descriptions::kConditionalTabStripAndroidDescription, kOsAndroid,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(
-         chrome::android::kConditionalTabStripAndroid,
-         kConditionalTabStripAndroidVariations,
-         "ConditioanlTabStrip")},
-
     {"enable-foldable-jank-fix", flag_descriptions::kFoldableJankFixAndroidName,
      flag_descriptions::kFoldableJankFixAndroidDescription, kOsAndroid,
      FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kFoldableJankFix,
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.cc b/chrome/browser/android/tab_web_contents_delegate_android.cc
index be88e1e..595b419a 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.cc
+++ b/chrome/browser/android/tab_web_contents_delegate_android.cc
@@ -440,13 +440,12 @@
   return true;
 }
 
-bool TabWebContentsDelegateAndroid::IsPrerender2Supported(
+content::PreloadingEligibility
+TabWebContentsDelegateAndroid::IsPrerender2Supported(
     content::WebContents& web_contents) {
   Profile* profile =
       Profile::FromBrowserContext(web_contents.GetBrowserContext());
-  return prefetch::IsSomePreloadingEnabled(*profile->GetPrefs(),
-                                           &web_contents) ==
-         content::PreloadingEligibility::kEligible;
+  return prefetch::IsSomePreloadingEnabled(*profile->GetPrefs(), &web_contents);
 }
 
 std::unique_ptr<content::WebContents>
diff --git a/chrome/browser/android/tab_web_contents_delegate_android.h b/chrome/browser/android/tab_web_contents_delegate_android.h
index 0507b46..9941500 100644
--- a/chrome/browser/android/tab_web_contents_delegate_android.h
+++ b/chrome/browser/android/tab_web_contents_delegate_android.h
@@ -98,7 +98,8 @@
       content::WebContents* web_contents) override;
   void ExitPictureInPicture() override;
   bool IsBackForwardCacheSupported() override;
-  bool IsPrerender2Supported(content::WebContents& web_contents) override;
+  content::PreloadingEligibility IsPrerender2Supported(
+      content::WebContents& web_contents) override;
   std::unique_ptr<content::WebContents> ActivatePortalWebContents(
       content::WebContents* predecessor_contents,
       std::unique_ptr<content::WebContents> portal_contents) override;
diff --git a/chrome/browser/apps/app_preload_service/app_preload_service_browsertest.cc b/chrome/browser/apps/app_preload_service/app_preload_service_browsertest.cc
index 82a69d2..b96a8f2 100644
--- a/chrome/browser/apps/app_preload_service/app_preload_service_browsertest.cc
+++ b/chrome/browser/apps/app_preload_service/app_preload_service_browsertest.cc
@@ -27,22 +27,24 @@
 
 class AppPreloadServiceBrowserTest : public InProcessBrowserTest {
  public:
-  void SetUp() override {
+  AppPreloadServiceBrowserTest() {
     feature_list_.InitWithFeatures(
         {/*enabled_features=*/features::kAppPreloadService},
         /*disabled_features=*/{});
+  }
+
+  void SetUpOnMainThread() override {
+    // Note that App Preload Service runs as part of browser startup, so the
+    // browser test SetUp() method will trigger a call to APS before any test
+    // code runs. This call will fail as the EmbeddedTestServer will not be
+    // started.
+    InProcessBrowserTest::SetUpOnMainThread();
 
     https_server_.RegisterRequestHandler(base::BindRepeating(
         &AppPreloadServiceBrowserTest::HandleRequest, base::Unretained(this)));
     ASSERT_TRUE(https_server()->Start());
     base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
         ash::switches::kAlmanacApiUrl, https_server()->GetURL("/").spec());
-
-    // Note that App Preload Service runs as part of browser startup, so calling
-    // SetUp() will trigger a call to APS before any test code runs. This call
-    // will fail as the EmbeddedTestServer will 404 if no response has been
-    // configured.
-    InProcessBrowserTest::SetUp();
   }
 
   std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
diff --git a/chrome/browser/apps/app_preload_service/web_app_preload_installer.h b/chrome/browser/apps/app_preload_service/web_app_preload_installer.h
index 6c75920..9064bee3 100644
--- a/chrome/browser/apps/app_preload_service/web_app_preload_installer.h
+++ b/chrome/browser/apps/app_preload_service/web_app_preload_installer.h
@@ -10,15 +10,12 @@
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "base/values.h"
 #include "chrome/browser/apps/app_preload_service/preload_app_definition.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "components/webapps/browser/install_result_code.h"
 
 class Profile;
 
-struct WebAppInstallInfo;
-
 namespace network {
 class SimpleURLLoader;
 }  // namespace network
@@ -37,12 +34,6 @@
   WebAppPreloadInstaller(const WebAppPreloadInstaller&) = delete;
   WebAppPreloadInstaller& operator=(const WebAppPreloadInstaller&) = delete;
 
-  // This method is prototype quality and doesn't handle all edge cases.
-  static std::unique_ptr<WebAppInstallInfo> ManifestToWebAppInstallInfo(
-      GURL document_url,
-      GURL original_manifest_url,
-      base::Value::Dict& manifest);
-
   // Attempts to install the given web `app`, calling `callback` after
   // installation completes. Must only be called if `app.GetPlatform()` returns
   // `AppType::kWeb`.
diff --git a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
index d2ab3b5c..04dd9acd 100644
--- a/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
+++ b/chrome/browser/apps/app_service/publishers/extension_apps_chromeos.cc
@@ -651,12 +651,23 @@
   if (app_id == arc::kPlayStoreAppId)
     return true;
 
-  // If an extension runs in both ash and lacros, then don't publish it as that
-  // would conflict with lacros publishing it. This path is used for both
-  // extensions and extension apps.
-  return crosapi::browser_util::IsLacrosChromeAppsEnabled() &&
-         (extensions::ExtensionRunsInBothOSAndStandaloneBrowser(app_id) ||
-          extensions::ExtensionAppRunsInBothOSAndStandaloneBrowser(app_id));
+  // If lacros chrome apps is enabled, a small list of extension apps or
+  // extensions on ash extension keeplist is allowed to run in both ash and
+  // lacros, don't publish such app or extension if it is blocked for app
+  // service in ash.
+  if (crosapi::browser_util::IsLacrosChromeAppsEnabled()) {
+    if (extensions::ExtensionAppRunsInBothOSAndStandaloneBrowser(app_id) &&
+        extensions::ExtensionAppBlockListedForAppServiceInOS(app_id)) {
+      return true;
+    }
+
+    if (extensions::ExtensionRunsInBothOSAndStandaloneBrowser(app_id) &&
+        extensions::ExtensionBlockListedForAppServiceInOS(app_id)) {
+      return true;
+    }
+  }
+
+  return false;
 }
 
 void ExtensionAppsChromeOs::UpdateShowInFields(const std::string& app_id) {
diff --git a/chrome/browser/ash/app_list/app_service/app_service_app_icon_loader.h b/chrome/browser/ash/app_list/app_service/app_service_app_icon_loader.h
index 01cbd954..027b08a 100644
--- a/chrome/browser/ash/app_list/app_service/app_service_app_icon_loader.h
+++ b/chrome/browser/ash/app_list/app_service/app_service_app_icon_loader.h
@@ -44,7 +44,7 @@
   void OnAppRegistryCacheWillBeDestroyed(
       apps::AppRegistryCache* cache) override;
 
- private:
+ protected:
   using AppIDToIconMap = std::map<std::string, gfx::ImageSkia>;
   using AppIDToShelfAppId = std::map<std::string, std::set<std::string>>;
 
@@ -52,11 +52,13 @@
   void CallLoadIcon(const std::string& app_id, bool allow_placeholder_icon);
 
   // Callback invoked when the icon is loaded.
-  void OnLoadIcon(const std::string& app_id, apps::IconValuePtr icon_value);
+  virtual void OnLoadIcon(const std::string& app_id,
+                          apps::IconValuePtr icon_value);
 
   // Returns true if the app_id does exist in icon_map_.
   bool Exist(const std::string& app_id);
 
+ private:
   // Maps from an app id to shelf app ids.
   AppIDToShelfAppId shelf_app_id_map_;
 
diff --git a/chrome/browser/ash/app_list/search/keyboard_shortcut_provider_unittest.cc b/chrome/browser/ash/app_list/search/keyboard_shortcut_provider_unittest.cc
index dda3eeb..32bbc99 100644
--- a/chrome/browser/ash/app_list/search/keyboard_shortcut_provider_unittest.cc
+++ b/chrome/browser/ash/app_list/search/keyboard_shortcut_provider_unittest.cc
@@ -7,8 +7,8 @@
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ash/app_list/search/chrome_search_result.h"
 #include "chrome/browser/ash/app_list/search/test/test_search_controller.h"
+#include "chrome/test/base/chrome_ash_test_base.h"
 #include "chrome/test/base/testing_profile.h"
-#include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/events/devices/device_data_manager_test_api.h"
@@ -19,12 +19,13 @@
 constexpr double kResultRelevanceThreshold = 0.89;
 }
 
-class KeyboardShortcutProviderTest : public testing::Test {
+class KeyboardShortcutProviderTest : public ChromeAshTestBase {
  public:
   KeyboardShortcutProviderTest() = default;
 
  protected:
   void SetUp() override {
+    ChromeAshTestBase::SetUp();
     // A DCHECK inside a KSV metadata utility function relies on device lists
     // being complete.
     ui::DeviceDataManagerTestApi().OnDeviceListsComplete();
@@ -38,7 +39,7 @@
     Wait();
   }
 
-  void Wait() { task_environment_.RunUntilIdle(); }
+  void Wait() { task_environment()->RunUntilIdle(); }
 
   const SearchProvider::Results& results() {
     return search_controller_->last_results();
@@ -48,8 +49,6 @@
     search_controller_->StartSearch(query);
   }
 
-  content::BrowserTaskEnvironment task_environment_;
-
   std::unique_ptr<Profile> profile_;
   std::unique_ptr<TestSearchController> search_controller_;
   KeyboardShortcutProvider* provider_ = nullptr;
diff --git a/chrome/browser/ash/app_list/search/keyboard_shortcut_result_unittest.cc b/chrome/browser/ash/app_list/search/keyboard_shortcut_result_unittest.cc
index 4f241b03..b6ae04a49 100644
--- a/chrome/browser/ash/app_list/search/keyboard_shortcut_result_unittest.cc
+++ b/chrome/browser/ash/app_list/search/keyboard_shortcut_result_unittest.cc
@@ -8,6 +8,7 @@
 #include "ash/shortcut_viewer/keyboard_shortcut_viewer_metadata.h"
 #include "chrome/browser/ash/app_list/search/chrome_search_result.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/test/base/chrome_ash_test_base.h"
 #include "chromeos/ash/components/string_matching/tokenized_string.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -21,7 +22,7 @@
 using TextVector = ChromeSearchResult::TextVector;
 using TextType = ::ash::SearchResultTextItemType;
 
-class KeyboardShortcutResultTest : public testing::Test {
+class KeyboardShortcutResultTest : public ChromeAshTestBase {
  public:
   TextVector GetTextVectorFromTemplate(
       const std::u16string& template_string,
diff --git a/chrome/browser/ash/crosapi/chrome_app_window_tracker_ash.cc b/chrome/browser/ash/crosapi/chrome_app_window_tracker_ash.cc
index 2e44a04..5929e6d 100644
--- a/chrome/browser/ash/crosapi/chrome_app_window_tracker_ash.cc
+++ b/chrome/browser/ash/crosapi/chrome_app_window_tracker_ash.cc
@@ -101,13 +101,6 @@
   if (pending_window->second.app_id.empty() || !pending_window->second.window)
     return;
 
-  // If an extension app runs in both lacros and ash, then don't show a dock
-  // icon for lacros since there might also be a dock icon for ash which will
-  // cause crashes.
-  if (extensions::ExtensionAppRunsInBothOSAndStandaloneBrowser(
-          pending_window->second.app_id)) {
-    return;
-  }
 
   std::string app_id = std::move(pending_window->second.app_id);
   aura::Window* window = pending_window->second.window;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index f017b74a..8a2feb07 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -588,6 +588,9 @@
   params->extension_keep_list = extensions::BuildExtensionKeeplistInitParam();
 
   params->vc_controls_ui_enabled = ash::features::IsVcControlsUiEnabled();
+
+  params->standalone_browser_app_service_blocklist =
+      extensions::BuildStandaloneBrowserAppServiceBlockListInitParam();
 }
 
 template <typename BrowserParams>
diff --git a/chrome/browser/ash/video_conference/video_conference_app_service_client.cc b/chrome/browser/ash/video_conference/video_conference_app_service_client.cc
index 7e2c28c..89cf5aa 100644
--- a/chrome/browser/ash/video_conference/video_conference_app_service_client.cc
+++ b/chrome/browser/ash/video_conference/video_conference_app_service_client.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "components/services/app_service/public/cpp/app_capability_access_cache_wrapper.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
+#include "components/services/app_service/public/cpp/app_types.h"
 #include "components/user_manager/user_manager.h"
 
 namespace ash {
@@ -128,6 +129,14 @@
 
 void VideoConferenceAppServiceClient::OnCapabilityAccessUpdate(
     const apps::CapabilityAccessUpdate& update) {
+  const AppIdString& app_id = update.AppId();
+  // Only track Arc++ apps for now. All other apps are tracked by
+  // VideoConferenceManagerClientImpl. We should only expand to more types after
+  // confirming its compatibility with VideoConferenceManagerClientImpl.
+  if (GetAppType(app_id) != apps::AppType::kArc) {
+    return;
+  }
+
   // For now, we only care about camera/microphone accessing.
   if (!update.CameraChanged() && !update.MicrophoneChanged()) {
     return;
@@ -136,7 +145,6 @@
   const bool is_capturing_camera = update.Camera().value_or(false);
   const bool is_capturing_microphone = update.Microphone().value_or(false);
 
-  const AppIdString& app_id = update.AppId();
   // We only want to start tracking a app if it starts to accessing
   // microphone/camera.
   if (!is_capturing_camera && !is_capturing_microphone &&
@@ -259,6 +267,15 @@
   return permissions;
 }
 
+apps::AppType VideoConferenceAppServiceClient::GetAppType(
+    const AppIdString& app_id) {
+  apps::AppType type = apps::AppType::kUnknown;
+  app_registry_->ForOneApp(app_id, [&type](const apps::AppUpdate& update) {
+    type = update.AppType();
+  });
+  return type;
+}
+
 VideoConferenceAppServiceClient::AppState&
 VideoConferenceAppServiceClient::GetOrAddAppState(const std::string& app_id) {
   if (!base::Contains(id_to_app_state_, app_id)) {
diff --git a/chrome/browser/ash/video_conference/video_conference_app_service_client.h b/chrome/browser/ash/video_conference/video_conference_app_service_client.h
index be06fc5..af844ea 100644
--- a/chrome/browser/ash/video_conference/video_conference_app_service_client.h
+++ b/chrome/browser/ash/video_conference/video_conference_app_service_client.h
@@ -16,6 +16,7 @@
 #include "base/unguessable_token.h"
 #include "chromeos/crosapi/mojom/video_conference.mojom.h"
 #include "components/services/app_service/public/cpp/app_capability_access_cache.h"
+#include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
 
 namespace apps {
@@ -97,6 +98,9 @@
   // Returns the current camera/microphone permission status for `app_id`.
   VideoConferencePermissions GetAppPermission(const AppIdString& app_id);
 
+  // Returns the AppType of `app_id`.
+  apps::AppType GetAppType(const AppIdString& app_id);
+
   // Returns AppState of `app_id`; adds if doesn't exist yet.
   AppState& GetOrAddAppState(const AppIdString& app_id);
 
diff --git a/chrome/browser/ash/video_conference/video_conference_app_service_client_browsertest.cc b/chrome/browser/ash/video_conference/video_conference_app_service_client_browsertest.cc
index 5ae20ac..e809de0 100644
--- a/chrome/browser/ash/video_conference/video_conference_app_service_client_browsertest.cc
+++ b/chrome/browser/ash/video_conference/video_conference_app_service_client_browsertest.cc
@@ -11,6 +11,7 @@
 #include "ash/shell.h"
 #include "ash/system/video_conference/video_conference_media_state.h"
 #include "base/run_loop.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
@@ -26,6 +27,7 @@
 #include "chromeos/crosapi/mojom/video_conference.mojom.h"
 #include "components/services/app_service/public/cpp/app_capability_access_cache_wrapper.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
+#include "components/services/app_service/public/cpp/app_types.h"
 #include "components/services/app_service/public/cpp/capability_access_update.h"
 #include "components/services/app_service/public/cpp/instance_registry.h"
 #include "components/user_manager/user_manager.h"
@@ -45,9 +47,10 @@
 
 // Creates an app with given id and permissions.
 apps::AppPtr MakeApp(const AppIdString& app_id,
-                     bool has_camera_permission = false,
-                     bool has_microphone_permission = false) {
-  apps::AppPtr app = std::make_unique<apps::App>(apps::AppType::kArc, app_id);
+                     bool has_camera_permission,
+                     bool has_microphone_permission,
+                     apps::AppType app_type) {
+  apps::AppPtr app = std::make_unique<apps::App>(app_type, app_id);
   if (app_id == kAppId1) {
     app->name = kAppName1;
   }
@@ -149,9 +152,11 @@
 
   // This function creates an app with given id and name, and adds the app into
   // AppRegistryCache of current profile.
-  void InstallApp(const std::string& app_id) {
+  void InstallApp(const std::string& app_id,
+                  apps::AppType app_type = apps::AppType::kArc) {
     std::vector<apps::AppPtr> deltas;
-    deltas.push_back(MakeApp(app_id));
+    deltas.push_back(MakeApp(app_id, /*has_camera_permission=*/false,
+                             /*has_microphone_permission=*/false, app_type));
     app_registry_cache_->OnApps(std::move(deltas), apps::AppType::kUnknown,
                                 /*should_notify_initialized=*/false);
   }
@@ -161,8 +166,8 @@
                           bool has_camera_permission,
                           bool has_microphone_permission) {
     std::vector<apps::AppPtr> deltas;
-    deltas.push_back(
-        MakeApp(app_id, has_camera_permission, has_microphone_permission));
+    deltas.push_back(MakeApp(app_id, has_camera_permission,
+                             has_microphone_permission, GetAppType(app_id)));
     app_registry_cache_->OnApps(std::move(deltas), apps::AppType::kUnknown,
                                 /*should_notify_initialized=*/false);
   }
@@ -191,6 +196,10 @@
     return client_->GetAppName(app_id);
   }
 
+  apps::AppType GetAppType(const AppIdString& app_id) {
+    return client_->GetAppType(app_id);
+  }
+
   VideoConferenceAppServiceClient::VideoConferencePermissions GetAppPermission(
       const AppIdString& app_id) {
     return client_->GetAppPermission(app_id);
@@ -236,6 +245,16 @@
   EXPECT_EQ(GetAppName(kAppId1), kAppName1);
 }
 
+IN_PROC_BROWSER_TEST_F(VideoConferenceAppServiceClientTest, GetAppType) {
+  // AppType should be kUnknown if it is not installed.
+  EXPECT_EQ(GetAppType(kAppId1), apps::AppType::kUnknown);
+
+  InstallApp(kAppId1);
+
+  // AppType for the test app installed should be Arc.
+  EXPECT_EQ(GetAppType(kAppId1), apps::AppType::kArc);
+}
+
 IN_PROC_BROWSER_TEST_F(VideoConferenceAppServiceClientTest, GetAppPermission) {
   InstallApp(kAppId1);
 
@@ -552,4 +571,31 @@
   EXPECT_FALSE(state.is_capturing_screen);
 }
 
+IN_PROC_BROWSER_TEST_F(VideoConferenceAppServiceClientTest,
+                       OnlyCertainAppsAreTracked) {
+  for (const auto type :
+       {apps::AppType::kUnknown, apps::AppType::kBuiltIn,
+        apps::AppType::kCrostini, apps::AppType::kChromeApp,
+        apps::AppType::kWeb, apps::AppType::kMacOs, apps::AppType::kPluginVm,
+        apps::AppType::kStandaloneBrowser, apps::AppType::kRemote,
+        apps::AppType::kBorealis, apps::AppType::kSystemWeb,
+        apps::AppType::kStandaloneBrowserChromeApp, apps::AppType::kExtension,
+        apps::AppType::kStandaloneBrowserExtension,
+        apps::AppType::kBruschetta}) {
+    // Create a fake id.
+    const std::string app_id = base::NumberToString(static_cast<int>(type));
+    // Install the app with given type.
+    InstallApp(app_id, type);
+    // Start the app.
+    FakeAppInstance instance(instance_registry_, app_id);
+    instance.Start();
+
+    // has-camera, has-mic should not start tracking of the app only because
+    // that we are not tracking the AppType listed above.
+    SetAppCapabilityAccess(app_id, true, true);
+
+    EXPECT_TRUE(GetMediaApps().empty());
+  }
+}
+
 }  // namespace ash
diff --git a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
index 2ed53e0f..be9acbe 100644
--- a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
+++ b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
@@ -43,6 +43,37 @@
   return GooglePhotosAlbumsFetcher::GetResultCount(result);
 }
 
+MockGooglePhotosSharedAlbumsFetcher::MockGooglePhotosSharedAlbumsFetcher(
+    Profile* profile)
+    : GooglePhotosSharedAlbumsFetcher(profile) {
+  using ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponse;
+  using ash::personalization_app::mojom::GooglePhotosAlbumPtr;
+
+  ON_CALL(*this, AddRequestAndStartIfNecessary)
+      .WillByDefault(
+          [](const absl::optional<std::string>& resume_token,
+             base::OnceCallback<void(GooglePhotosAlbumsCbkArgs)> callback) {
+            auto response = FetchGooglePhotosAlbumsResponse::New(
+                std::vector<GooglePhotosAlbumPtr>(), absl::nullopt);
+            base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+                FROM_HERE,
+                base::BindOnce(std::move(callback), std::move(response)));
+          });
+
+  ON_CALL(*this, ParseResponse)
+      .WillByDefault([this](const base::Value::Dict* response) {
+        return GooglePhotosSharedAlbumsFetcher::ParseResponse(response);
+      });
+}
+
+MockGooglePhotosSharedAlbumsFetcher::~MockGooglePhotosSharedAlbumsFetcher() =
+    default;
+
+absl::optional<size_t> MockGooglePhotosSharedAlbumsFetcher::GetResultCount(
+    const GooglePhotosAlbumsCbkArgs& result) {
+  return GooglePhotosSharedAlbumsFetcher::GetResultCount(result);
+}
+
 MockGooglePhotosEnabledFetcher::MockGooglePhotosEnabledFetcher(Profile* profile)
     : GooglePhotosEnabledFetcher(profile) {
   ON_CALL(*this, AddRequestAndStartIfNecessary)
diff --git a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
index 40c5650..533c9cd0 100644
--- a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
+++ b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
@@ -41,6 +41,38 @@
       const GooglePhotosAlbumsCbkArgs& result) override;
 };
 
+// Fetcher that returns an empty album list and no resume token in response to a
+// request for the user's Google Photos shared albums. Used to avoid network
+// requests in unit tests.
+class MockGooglePhotosSharedAlbumsFetcher
+    : public GooglePhotosSharedAlbumsFetcher {
+ public:
+  explicit MockGooglePhotosSharedAlbumsFetcher(Profile* profile);
+
+  MockGooglePhotosSharedAlbumsFetcher(
+      const MockGooglePhotosSharedAlbumsFetcher&) = delete;
+  MockGooglePhotosSharedAlbumsFetcher& operator=(
+      const MockGooglePhotosSharedAlbumsFetcher&) = delete;
+
+  ~MockGooglePhotosSharedAlbumsFetcher() override;
+
+  // GooglePhotosSharedAlbumsFetcher:
+  MOCK_METHOD(void,
+              AddRequestAndStartIfNecessary,
+              (const absl::optional<std::string>& resume_token,
+               base::OnceCallback<void(GooglePhotosAlbumsCbkArgs)> callback),
+              (override));
+
+  MOCK_METHOD(GooglePhotosAlbumsCbkArgs,
+              ParseResponse,
+              (const base::Value::Dict* response),
+              (override));
+
+  // Overridden to increase visibility.
+  absl::optional<size_t> GetResultCount(
+      const GooglePhotosAlbumsCbkArgs& result) override;
+};
+
 // Fetcher that claims the user is allowed to access Google Photos data. Used to
 // avoid network requests in unit tests.
 class MockGooglePhotosEnabledFetcher : public GooglePhotosEnabledFetcher {
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
index 009c876..6d5584b6 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
@@ -82,11 +82,16 @@
 constexpr char kGooglePhotosAlbumCollectionOrder[] = "1";
 constexpr char kGooglePhotosAlbumShuffledOrder[] = "2";
 
-// The URL to download the albums in a user's Google Photos library.
+// The URL to download the owned albums in a user's Google Photos library.
 constexpr char kGooglePhotosAlbumsUrl[] =
     "https://photosfirstparty-pa.googleapis.com/v1/chromeos/"
     "userCollections:read";
 
+// The URL to download the shared albums in a user's Google Photos library.
+constexpr char kGooglePhotosSharedAlbumsUrl[] =
+    "https://photosfirstparty-pa.googleapis.com/v1/chromeos/"
+    "sharedCollections:read";
+
 constexpr net::NetworkTrafficAnnotationTag
     kGooglePhotosAlbumsTrafficAnnotation =
         net::DefineNetworkTrafficAnnotation("wallpaper_google_photos_albums",
@@ -95,8 +100,9 @@
         sender: "ChromeOS Wallpaper Picker"
         description:
           "Within the Google Photos tile, the ChromeOS Wallpaper Picker "
-          "shows the user the Google Photos albums they have created so that "
-          "they can pick a photo or turn on the surprise me feature from "
+          "shows the user the Google Photos albums they have created and "
+          "the Google Photos albums they shared with other users so that "
+          "they can pick a photo or turn on the daily refresh feature from "
           "within an album. This query fetches those albums."
         trigger: "When the user accesses the Google Photos tile within the "
                  "ChromeOS Wallpaper Picker app."
@@ -235,6 +241,9 @@
     return GooglePhotosApi::kGetAlbum;
   if (base::StartsWith(spec, kGooglePhotosAlbumsUrl))
     return GooglePhotosApi::kGetAlbums;
+  if (base::StartsWith(spec, kGooglePhotosSharedAlbumsUrl)) {
+    return GooglePhotosApi::kGetAlbums;
+  }
   if (base::StartsWith(spec, kGooglePhotosPhotoUrl))
     return GooglePhotosApi::kGetPhoto;
   if (base::StartsWith(spec, kGooglePhotosPhotosUrl))
@@ -771,6 +780,74 @@
                                   : absl::nullopt;
 }
 
+GooglePhotosSharedAlbumsFetcher::GooglePhotosSharedAlbumsFetcher(
+    Profile* profile)
+    : GooglePhotosFetcher(profile, kGooglePhotosAlbumsTrafficAnnotation) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+}
+
+GooglePhotosSharedAlbumsFetcher::~GooglePhotosSharedAlbumsFetcher() = default;
+
+void GooglePhotosSharedAlbumsFetcher::AddRequestAndStartIfNecessary(
+    const absl::optional<std::string>& resume_token,
+    base::OnceCallback<void(GooglePhotosAlbumsCbkArgs)> callback) {
+  GURL service_url = GURL(kGooglePhotosSharedAlbumsUrl);
+  if (resume_token.has_value()) {
+    service_url = net::AppendQueryParameter(service_url, "resume_token",
+                                            resume_token.value());
+  }
+  GooglePhotosFetcher::AddRequestAndStartIfNecessary(service_url,
+                                                     std::move(callback));
+}
+
+GooglePhotosAlbumsCbkArgs GooglePhotosSharedAlbumsFetcher::ParseResponse(
+    const base::Value::Dict* response) {
+  auto parsed_response =
+      ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponse::New();
+  if (!response) {
+    return parsed_response;
+  }
+
+  const auto* resume_token = response->FindString("resumeToken");
+  if (resume_token && !resume_token->empty()) {
+    parsed_response->resume_token = *resume_token;
+  }
+
+  const auto* response_albums = response->FindList("collection");
+  if (!response_albums) {
+    return parsed_response;
+  }
+
+  parsed_response->albums =
+      std::vector<ash::personalization_app::mojom::GooglePhotosAlbumPtr>();
+  for (const auto& untyped_response_album : *response_albums) {
+    DCHECK(untyped_response_album.is_dict());
+    const auto& response_album = untyped_response_album.GetDict();
+    const auto* album_id =
+        response_album.FindStringByDottedPath("collectionId.mediaKey");
+    const auto* title = response_album.FindString("name");
+    const auto* cover_photo_url =
+        response_album.FindString("coverItemServingUrl");
+
+    if (!album_id || !title || !cover_photo_url) {
+      LOG(ERROR) << "Failed to parse item in Google Photos albums response.";
+      continue;
+    }
+
+    // `num_image` is always 0 for shared albums.
+    parsed_response->albums->push_back(
+        ash::personalization_app::mojom::GooglePhotosAlbum::New(
+            *album_id, *title, /*num_image=*/0, GURL(*cover_photo_url)));
+  }
+  return parsed_response;
+}
+
+absl::optional<size_t> GooglePhotosSharedAlbumsFetcher::GetResultCount(
+    const GooglePhotosAlbumsCbkArgs& result) {
+  return result && result->albums ? absl::make_optional(result->albums->size())
+                                  : absl::nullopt;
+}
+
 GooglePhotosEnabledFetcher::GooglePhotosEnabledFetcher(Profile* profile)
     : GooglePhotosFetcher(profile, kGooglePhotosEnabledTrafficAnnotation) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
index ba2d1a47..d8ad5f3 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
@@ -241,6 +241,33 @@
       const GooglePhotosAlbumsCbkArgs& result) override;
 };
 
+using GooglePhotosAlbumsCbkArgs =
+    ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponsePtr;
+// Downloads the Google Photos albums a user has created.
+class GooglePhotosSharedAlbumsFetcher
+    : public GooglePhotosFetcher<GooglePhotosAlbumsCbkArgs> {
+ public:
+  explicit GooglePhotosSharedAlbumsFetcher(Profile* profile);
+
+  GooglePhotosSharedAlbumsFetcher(const GooglePhotosSharedAlbumsFetcher&) =
+      delete;
+  GooglePhotosSharedAlbumsFetcher& operator=(
+      const GooglePhotosSharedAlbumsFetcher&) = delete;
+
+  ~GooglePhotosSharedAlbumsFetcher() override;
+
+  virtual void AddRequestAndStartIfNecessary(
+      const absl::optional<std::string>& resume_token,
+      base::OnceCallback<void(GooglePhotosAlbumsCbkArgs)> callback);
+
+ protected:
+  // GooglePhotosFetcher:
+  GooglePhotosAlbumsCbkArgs ParseResponse(
+      const base::Value::Dict* response) override;
+  absl::optional<size_t> GetResultCount(
+      const GooglePhotosAlbumsCbkArgs& result) override;
+};
+
 using ash::personalization_app::mojom::GooglePhotosEnablementState;
 // Downloads whether the user is allowed to access Google Photos data.
 class GooglePhotosEnabledFetcher
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
index a58ad8b..0cb1762e 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
@@ -264,9 +264,6 @@
     wallpaper_receiver_.ReportBadMessage(
         "Cannot call `FetchGooglePhotosAlbums()` without confirming that the "
         "Google Photos enterprise setting is enabled.");
-    std::move(callback).Run(
-        ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponse::New(
-            absl::nullopt, absl::nullopt));
     return;
   }
 
@@ -279,6 +276,25 @@
       resume_token, std::move(callback));
 }
 
+void PersonalizationAppWallpaperProviderImpl::FetchGooglePhotosSharedAlbums(
+    const absl::optional<std::string>& resume_token,
+    FetchGooglePhotosAlbumsCallback callback) {
+  if (!is_google_photos_enterprise_enabled_) {
+    wallpaper_receiver_.ReportBadMessage(
+        "Cannot call `FetchGooglePhotosAlbums()` without confirming that the "
+        "Google Photos enterprise setting is enabled.");
+    return;
+  }
+
+  if (!google_photos_shared_albums_fetcher_) {
+    google_photos_shared_albums_fetcher_ =
+        std::make_unique<wallpaper_handlers::GooglePhotosSharedAlbumsFetcher>(
+            profile_);
+  }
+  google_photos_shared_albums_fetcher_->AddRequestAndStartIfNecessary(
+      resume_token, std::move(callback));
+}
+
 void PersonalizationAppWallpaperProviderImpl::FetchGooglePhotosEnabled(
     FetchGooglePhotosEnabledCallback callback) {
   if (!IsEligibleForGooglePhotos()) {
@@ -770,6 +786,15 @@
   return google_photos_albums_fetcher_.get();
 }
 
+wallpaper_handlers::GooglePhotosSharedAlbumsFetcher*
+PersonalizationAppWallpaperProviderImpl::
+    SetGooglePhotosSharedAlbumsFetcherForTest(
+        std::unique_ptr<wallpaper_handlers::GooglePhotosSharedAlbumsFetcher>
+            fetcher) {
+  google_photos_shared_albums_fetcher_ = std::move(fetcher);
+  return google_photos_shared_albums_fetcher_.get();
+}
+
 wallpaper_handlers::GooglePhotosEnabledFetcher*
 PersonalizationAppWallpaperProviderImpl::SetGooglePhotosEnabledFetcherForTest(
     std::unique_ptr<wallpaper_handlers::GooglePhotosEnabledFetcher> fetcher) {
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
index afb30d0..4dd59fd 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
@@ -47,6 +47,7 @@
 class BackdropCollectionInfoFetcher;
 class BackdropImageInfoFetcher;
 class GooglePhotosAlbumsFetcher;
+class GooglePhotosSharedAlbumsFetcher;
 class GooglePhotosEnabledFetcher;
 class GooglePhotosPhotosFetcher;
 }  // namespace wallpaper_handlers
@@ -109,6 +110,10 @@
       const absl::optional<std::string>& resume_token,
       FetchGooglePhotosAlbumsCallback callback) override;
 
+  void FetchGooglePhotosSharedAlbums(
+      const absl::optional<std::string>& resume_token,
+      FetchGooglePhotosAlbumsCallback callback) override;
+
   void FetchGooglePhotosEnabled(
       FetchGooglePhotosEnabledCallback callback) override;
 
@@ -181,6 +186,11 @@
   SetGooglePhotosAlbumsFetcherForTest(
       std::unique_ptr<wallpaper_handlers::GooglePhotosAlbumsFetcher> fetcher);
 
+  wallpaper_handlers::GooglePhotosSharedAlbumsFetcher*
+  SetGooglePhotosSharedAlbumsFetcherForTest(
+      std::unique_ptr<wallpaper_handlers::GooglePhotosSharedAlbumsFetcher>
+          fetcher);
+
   wallpaper_handlers::GooglePhotosEnabledFetcher*
   SetGooglePhotosEnabledFetcherForTest(
       std::unique_ptr<wallpaper_handlers::GooglePhotosEnabledFetcher> fetcher);
@@ -282,6 +292,13 @@
   std::unique_ptr<wallpaper_handlers::GooglePhotosAlbumsFetcher>
       google_photos_albums_fetcher_;
 
+  // Fetches the Google Photos albums shared with the user. Constructed lazily
+  // at the time of the first request and then persists for the rest of the
+  // delegate's lifetime, unless preemptively or subsequently replaced by a mock
+  // in a test.
+  std::unique_ptr<wallpaper_handlers::GooglePhotosSharedAlbumsFetcher>
+      google_photos_shared_albums_fetcher_;
+
   // Fetches the state of the user's permission to access Google Photos data.
   // Constructed lazily at the time of the first request and then persists for
   // the rest of the delegate's lifetime, unless preemptively or subsequently
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
index 8e8288e3..d0ca715 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
@@ -557,6 +557,14 @@
           std::make_unique<::testing::NiceMock<
               wallpaper_handlers::MockGooglePhotosAlbumsFetcher>>(profile())));
 
+  auto* const google_photos_shared_albums_fetcher =
+      static_cast<::testing::NiceMock<
+          wallpaper_handlers::MockGooglePhotosSharedAlbumsFetcher>*>(
+          delegate()->SetGooglePhotosSharedAlbumsFetcherForTest(
+              std::make_unique<::testing::NiceMock<
+                  wallpaper_handlers::MockGooglePhotosSharedAlbumsFetcher>>(
+                  profile())));
+
   // Simulate the client making multiple requests for the same information to
   // test that all callbacks for that query are called.
   EXPECT_CALL(*google_photos_albums_fetcher,
@@ -564,6 +572,11 @@
                                             ::testing::_))
       .Times(kNumFetches);
 
+  EXPECT_CALL(*google_photos_shared_albums_fetcher,
+              AddRequestAndStartIfNecessary(absl::make_optional(kResumeToken),
+                                            ::testing::_))
+      .Times(kNumFetches);
+
   // Test fetching Google Photos albums after fetching the enterprise setting.
   // Requests should be made if and only if the Google Photos wallpaper
   // integration is enabled.
@@ -575,6 +588,12 @@
                                  FetchGooglePhotosAlbumsResponsePtr response) {
                             EXPECT_TRUE(response->albums.has_value());
                           }));
+    wallpaper_provider_remote()->get()->FetchGooglePhotosSharedAlbums(
+        kResumeToken, base::BindLambdaForTesting(
+                          [](ash::personalization_app::mojom::
+                                 FetchGooglePhotosAlbumsResponsePtr response) {
+                            EXPECT_TRUE(response->albums.has_value());
+                          }));
   }
   wallpaper_provider_remote()->FlushForTesting();
 }
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider.java
index 2747ef4..525a6e9 100644
--- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider.java
+++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider.java
@@ -40,11 +40,6 @@
          * Called when the height of the top controls are changed.
          */
         default void onTopControlsHeightChanged(int topControlsHeight, int topControlsMinHeight) {}
-
-        /**
-         * Called whenever the controls' Android View visibility changes.
-         */
-        default void onAndroidVisibilityChanged(int visibility) {}
     }
 
     /**
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 151f110..df29f49 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -45,17 +45,13 @@
       </if>
       <if expr="is_android">
         <include name="IDR_DEV_UI_LOADER_ERROR_HTML" file="resources/dev_ui/dev_ui_loader_error.html" type="BINDATA" />
-        <include name="IDR_EXPLORE_SITES_INTERNALS_HTML" file="resources\explore_sites_internals\explore_sites_internals.html" allowexternalscript="true" type="BINDATA" />
-        <include name="IDR_EXPLORE_SITES_INTERNALS_CSS" file="resources\explore_sites_internals\explore_sites_internals.css" type="BINDATA" />
-        <include name="IDR_EXPLORE_SITES_INTERNALS_JS" file="resources\explore_sites_internals\explore_sites_internals.js" type="BINDATA" />
-        <include name="IDR_EXPLORE_SITES_INTERNALS_MOJO_JS" file="${root_gen_dir}\mojom-webui\chrome\browser\ui\webui\explore_sites_internals\explore_sites_internals.mojom-webui.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_OFFLINE_INTERNALS_HTML" file="resources\offline_pages\offline_internals.html" flattenhtml="true" allowexternalscript="true" type="BINDATA" />
         <include name="IDR_OFFLINE_INTERNALS_CSS" file="resources\offline_pages\offline_internals.css" type="BINDATA" />
         <include name="IDR_OFFLINE_INTERNALS_JS" file="${root_gen_dir}\chrome\browser\resources\offline_pages\tsc\offline_internals.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_OFFLINE_INTERNALS_BROWSER_PROXY_JS" file="${root_gen_dir}\chrome\browser\resources\offline_pages\tsc\offline_internals_browser_proxy.js" use_base_dir="false" type="BINDATA" />
         <include name="IDR_VIDEO_PLAYER_HTML" file="resources\video_tutorials\video_player.html" type="BINDATA" />
         <include name="IDR_VIDEO_PLAYER_CSS" file="resources\video_tutorials\video_player.css" type="BINDATA" />
-        <include name="IDR_VIDEO_PLAYER_JS" file="resources\video_tutorials\video_player.js" type="BINDATA" />
+        <include name="IDR_VIDEO_PLAYER_JS" file="${root_gen_dir}\chrome\browser\resources\video_tutorials\tsc\video_player.js" use_base_dir="false" type="BINDATA" />
       </if>
 
       <if expr="enable_hangout_services_extension">
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 59fdc240..c555948 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -127,8 +127,6 @@
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/android/dom_distiller/distiller_ui_handle_android.h"
 #include "chrome/browser/offline_pages/android/offline_page_auto_fetcher.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h"
 #include "chrome/browser/ui/webui/feed_internals/feed_internals.mojom.h"
 #include "chrome/browser/ui/webui/feed_internals/feed_internals_ui.h"
 #include "chrome/common/offline_page_auto_fetcher.mojom.h"
@@ -900,11 +898,7 @@
       app_management::mojom::PageHandlerFactory, WebAppSettingsUI>(map);
 #endif
 
-#if BUILDFLAG(IS_ANDROID)
-  RegisterWebUIControllerInterfaceBinder<
-      explore_sites_internals::mojom::PageHandler,
-      explore_sites::ExploreSitesInternalsUI>(map);
-#else
+#if !BUILDFLAG(IS_ANDROID)
   RegisterWebUIControllerInterfaceBinder<downloads::mojom::PageHandlerFactory,
                                          DownloadsUI>(map);
 
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc
index faf30ed3..4b354ef5 100644
--- a/chrome/browser/client_hints/client_hints_browsertest.cc
+++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -1979,6 +1979,15 @@
   histogram_tester.ExpectTotalCount("ClientHints.UpdateEventCount",
                                     update_event_count);
 
+  // One fetch when initially add the client hints head, one fetch for look up
+  // commit client hints when navigation commits.
+  histogram_tester.ExpectTotalCount("ClientHints.FetchLatency_Total", 2);
+  histogram_tester.ExpectTotalCount("ClientHints.FetchLatency_PrefRead", 2);
+  histogram_tester.ExpectTotalCount("ClientHints.FetchLatency_PrerenderHost",
+                                    2);
+  histogram_tester.ExpectTotalCount("ClientHints.FetchLatency_OriginTrialCheck",
+                                    2);
+
   EXPECT_EQ(2u, count_user_agent_hint_headers_seen());
   EXPECT_EQ(2u, count_ua_mobile_client_hints_headers_seen());
   EXPECT_EQ(2u, count_ua_platform_client_hints_headers_seen());
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn
index 6f0b67a..af78315 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn
@@ -105,7 +105,10 @@
   if (is_win) {
     sources = [ "win_key_rotation_command_unittest.cc" ]
 
-    deps += [ "//chrome/installer/util:constants" ]
+    deps += [
+      "//chrome/install_static/test:test_support",
+      "//chrome/installer/util:constants",
+    ]
   }
 
   if (is_linux) {
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h
index 73298f2..34512a8f 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h
@@ -25,6 +25,7 @@
     FAILED_KEY_CONFLICT,
     FAILED_OS_RESTRICTION,
     FAILED_INVALID_PERMISSIONS,
+    FAILED_INVALID_INSTALLATION,
   };
 
   // Trigger completion callback.  The single argument is the status of the
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc
index b53b2ee..08b8902e 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/common/device_trust_constants.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mojo_key_network_delegate.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/metrics_util.h"
 #include "chrome/common/channel_info.h"
 #include "components/version_info/channel.h"
@@ -39,8 +40,8 @@
 // Allows the key rotation maanger to be released in the correct worker thread.
 void OnBackgroundTearDown(
     std::unique_ptr<KeyRotationManager> key_rotation_manager,
-    base::OnceCallback<void(KeyRotationManager::Result)> result_callback,
-    KeyRotationManager::Result result) {
+    base::OnceCallback<void(KeyRotationResult)> result_callback,
+    KeyRotationResult result) {
   std::move(result_callback).Run(result);
 }
 
@@ -51,7 +52,7 @@
     const std::string& nonce,
     std::unique_ptr<network::PendingSharedURLLoaderFactory>
         pending_url_loader_factory,
-    base::OnceCallback<void(KeyRotationManager::Result)> result_callback) {
+    base::OnceCallback<void(KeyRotationResult)> result_callback) {
   DCHECK(pending_url_loader_factory);
   auto key_rotation_manager =
       KeyRotationManager::Create(std::make_unique<MojoKeyNetworkDelegate>(
@@ -123,7 +124,7 @@
                                 std::move(rotation_result_callback)));
 }
 
-void MacKeyRotationCommand::OnKeyRotated(KeyRotationManager::Result result) {
+void MacKeyRotationCommand::OnKeyRotated(KeyRotationResult result) {
   // Used to ensure that this function is being called on the main thread.
   SEQUENCE_CHECKER(sequence_checker_);
 
@@ -134,13 +135,13 @@
 
   timeout_timer_.Stop();
 
-  if (result == KeyRotationManager::Result::FAILED) {
+  if (result == KeyRotationResult::kFailed) {
     SYSLOG(ERROR) << "Device trust key rotation failed.";
     std::move(pending_callback_).Run(KeyRotationCommand::Status::FAILED);
     return;
   }
 
-  if (result == KeyRotationManager::Result::FAILED_KEY_CONFLICT) {
+  if (result == KeyRotationResult::kFailedKeyConflict) {
     SYSLOG(ERROR) << "Device trust key rotation failed. Conflict "
                      "with the key that exists on the server.";
     std::move(pending_callback_)
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h
index 5acc563..5177600 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h
@@ -14,6 +14,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 
 namespace network {
 class SharedURLLoaderFactory;
@@ -36,7 +37,7 @@
 
   // Processes the `result` of the key rotation and returns it to the currently
   // pending callback.
-  void OnKeyRotated(KeyRotationManager::Result result);
+  void OnKeyRotated(KeyRotationResult result);
 
   // Notifies the pending callback of a timeout.
   void OnKeyRotationTimeout();
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
index aeee956..a3f6b04 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
 #include "base/time/time.h"
+#include "build/branding_buildflags.h"
 #include "chrome/browser/enterprise/connectors/device_trust/common/device_trust_constants.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_client.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mock_key_network_delegate.h"
@@ -50,11 +51,7 @@
     "management_service?retry=false&agent=Chrome+1.2.3(456)&apptype=Chrome&"
     "critical=true&deviceid=fake-client-id&devicetype=2&platform=Test%7CUnit%"
     "7C1.2.3&request=browser_public_key_upload";
-constexpr char kInvalidDmServerUrl[] =
-    "https://example.com/"
-    "management_service?retry=false&agent=Chrome+1.2.3(456)&apptype=Chrome&"
-    "critical=true&deviceid=fake-client-id&devicetype=2&platform=Test%7CUnit%"
-    "7C1.2.3&request=browser_public_key_upload";
+
 constexpr HttpResponseCode kSuccessCode = 200;
 constexpr HttpResponseCode kFailureCode = 400;
 constexpr HttpResponseCode kKeyConflictCode = 409;
@@ -84,14 +81,13 @@
 
     mock_network_delegate_ = mock_network_delegate.get();
     mock_persistence_delegate_ = mock_persistence_delegate.get();
-    EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
-
-    rotation_command_ = absl::WrapUnique(
-        new MacKeyRotationCommand(test_shared_loader_factory_));
 
     KeyRotationManager::SetForTesting(KeyRotationManager::CreateForTesting(
         std::move(mock_network_delegate),
         std::move(mock_persistence_delegate)));
+
+    rotation_command_ = absl::WrapUnique(
+        new MacKeyRotationCommand(test_shared_loader_factory_));
   }
 
   void FastForwardBeyondTimeout() {
@@ -121,21 +117,9 @@
   EXPECT_EQ(KeyRotationCommand::Status::FAILED_OS_RESTRICTION, future.Get());
 }
 
-// Tests a failed key rotation due to an invalid command to rotate.
-TEST_F(MacKeyRotationCommandTest, RotateFailure_InvalidCommand) {
-  InSequence s;
-  EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
-      .WillOnce(Return(true));
-
-  params_.dm_server_url = kInvalidDmServerUrl;
-  base::test::TestFuture<KeyRotationCommand::Status> future;
-  rotation_command_->Trigger(params_, future.GetCallback());
-  EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get());
-}
-
 // Tests a failed key rotation due to failure creating a new signing key pair.
 TEST_F(MacKeyRotationCommandTest, RotateFailure_CreateKeyFailure) {
-  InSequence s;
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
@@ -150,7 +134,7 @@
 
 // Tests a failed key rotation due to a store key failure.
 TEST_F(MacKeyRotationCommandTest, RotateFailure_StoreKeyFailure) {
-  InSequence s;
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
@@ -170,6 +154,7 @@
   InSequence s;
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair());
@@ -197,6 +182,7 @@
   InSequence s;
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair());
@@ -220,7 +206,7 @@
 
 // Tests when the key rotation is successful.
 TEST_F(MacKeyRotationCommandTest, Rotate_Success) {
-  InSequence s;
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
@@ -236,6 +222,7 @@
                           base::OnceCallback<void(int)> callback) {
         std::move(callback).Run(kSuccessCode);
       }));
+  EXPECT_CALL(*mock_persistence_delegate_, CleanupTemporaryKeyData());
 
   base::test::TestFuture<KeyRotationCommand::Status> future;
   rotation_command_->Trigger(params_, future.GetCallback());
@@ -248,6 +235,7 @@
 // Tests what happens when the key rotation succeeds beyond the timeout limit
 // before the command object is destroyed.
 TEST_F(MacKeyRotationCommandTest, Rotate_Timeout_ReturnBeforeDestruction) {
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
@@ -284,6 +272,7 @@
 // Tests what happens when the key rotation succeeds beyond the timeout limit
 // after the command object is destroyed.
 TEST_F(MacKeyRotationCommandTest, Rotate_Timeout_ReturnAfterDestruction) {
+  EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair());
   EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
       .WillOnce(Return(true));
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
@@ -320,4 +309,25 @@
   task_environment_.RunUntilIdle();
 }
 
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+// Tests a failed key rotation due to an invalid command to rotate. Wrapping the
+// test in a branding buildflag as it depends on the current channel being
+// mocked as Stable, which only happens when branded.
+TEST_F(MacKeyRotationCommandTest, RotateFailure_InvalidCommand) {
+  static constexpr char kInvalidDmServerUrl[] =
+      "https://example.com/"
+      "management_service?retry=false&agent=Chrome+1.2.3(456)&apptype=Chrome&"
+      "critical=true&deviceid=fake-client-id&devicetype=2&platform=Test%7CUnit%"
+      "7C1.2.3&request=browser_public_key_upload";
+
+  EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported())
+      .WillOnce(Return(true));
+
+  params_.dm_server_url = kInvalidDmServerUrl;
+  base::test::TestFuture<KeyRotationCommand::Status> future;
+  rotation_command_->Trigger(params_, future.GetCallback());
+  EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get());
+}
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.cc
index 2641c7f..04b2268 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.cc
@@ -19,6 +19,18 @@
 
 }  // namespace
 
+void LogKeyRotationCommandError(KeyRotationCommandError error) {
+  static constexpr char kErrorHistogram[] =
+      "Enterprise.DeviceTrust.KeyRotationCommand.Error";
+  base::UmaHistogramEnumeration(kErrorHistogram, error);
+}
+
+void LogKeyRotationExitCode(int exit_code) {
+  static constexpr char kExitCodeHistogram[] =
+      "Enterprise.DeviceTrust.KeyRotationCommand.ExitCode";
+  base::UmaHistogramSparse(kExitCodeHistogram, exit_code);
+}
+
 void LogManagementServiceExitCode(int exit_code) {
   if (exit_code < 0) {
     base::UmaHistogramExactLinear(kNegativeExitCodeHistogramName, -exit_code,
@@ -29,4 +41,12 @@
   }
 }
 
+#if BUILDFLAG(IS_WIN)
+void LogUnexpectedHresult(HRESULT result) {
+  static constexpr char kHresultHistogram[] =
+      "Enterprise.DeviceTrust.KeyRotationCommand.Error.Hresult";
+  base::UmaHistogramSparse(kHresultHistogram, result);
+}
+#endif  // BUILDFLAG(IS_WIN)
+
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.h
index 994ffca..43f78eec 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.h
@@ -5,12 +5,45 @@
 #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_BROWSER_COMMANDS_METRICS_UTILS_H_
 #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_BROWSER_COMMANDS_METRICS_UTILS_H_
 
+#include "build/build_config.h"
+
+#if BUILDFLAG(IS_WIN)
+#include "base/win/windows_types.h"
+#endif  // BUILDFLAG(IS_WIN)
+
 namespace enterprise_connectors {
 
+// Superset of errors that can occur in key rotation commands on all platforms.
+// Do not change ordering. If adding a new value, also update
+// DTKeyRotationCommandError in enums.xml.
+enum class KeyRotationCommandError {
+  kUnknown = 0,
+  kTimeout = 1,
+  kClassNotRegistered = 2,
+  kNoInterface = 3,
+  kUpdaterConcurrency = 4,
+  kUserInstallation = 5,
+  kMaxValue = kUserInstallation,
+};
+
+// Logs the known key rotation command `error`.
+void LogKeyRotationCommandError(KeyRotationCommandError error);
+
+// Logs the given `exit_code` as result of a key rotation command. Handles both
+// positive and negative values.
+void LogKeyRotationExitCode(int exit_code);
+
 // Logs the `exit_code` of the management service process after a key rotation
 // was performed.
+// Deprecated: Use `LogKeyRotationExitCode` instead.
 void LogManagementServiceExitCode(int exit_code);
 
+#if BUILDFLAG(IS_WIN)
+// Logs the unexpected `result` code from trying to communicate with the
+// installer.
+void LogUnexpectedHresult(HRESULT result);
+#endif  // BUILDFLAG(IS_WIN)
+
 }  // namespace enterprise_connectors
 
 #endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_BROWSER_COMMANDS_METRICS_UTILS_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
index 5a288fd9..7a41fef59 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.cc
@@ -24,9 +24,11 @@
 #include "base/win/scoped_bstr.h"
 #include "base/win/windows_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/common/device_trust_constants.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.h"
 #include "chrome/install_static/install_util.h"
 #include "chrome/installer/util/util_constants.h"
 #include "google_update/google_update_idl.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace enterprise_connectors {
 
@@ -53,13 +55,13 @@
 // this code is duped in two places including this one.
 HRESULT RunGoogleUpdateElevatedCommand(const wchar_t* command,
                                        const std::vector<std::string>& args,
-                                       DWORD* return_code) {
+                                       absl::optional<DWORD>* return_code) {
   DCHECK(return_code);
   if (args.size() > kMaxCommandArgs)
     return E_INVALIDARG;
 
   Microsoft::WRL::ComPtr<IGoogleUpdate3Web> google_update;
-  HRESULT hr = ::CoCreateInstance(CLSID_GoogleUpdate3WebServiceClass, nullptr,
+  HRESULT hr = ::CoCreateInstance(CLSID_GoogleUpdate3WebMachineClass, nullptr,
                                   CLSCTX_ALL, IID_PPV_ARGS(&google_update));
   if (FAILED(hr))
     return hr;
@@ -136,7 +138,11 @@
   // command did not terminate in error, tell caller it timed out.
   if (SUCCEEDED(hr)) {
     if (status == COMMAND_STATUS_COMPLETE) {
-      hr = app_command->get_exitCode(return_code);
+      DWORD exit_code = 0;
+      hr = app_command->get_exitCode(&exit_code);
+      if (SUCCEEDED(hr)) {
+        *return_code = exit_code;
+      }
     } else if (status != COMMAND_STATUS_ERROR) {
       hr = E_ABORT;
     }
@@ -179,12 +185,20 @@
           [](const KeyRotationCommand::Params& params,
              RunGoogleUpdateElevatedCommandFn run_elevated_command,
              bool waiting_enabled) {
+            if (!install_static::IsSystemInstall()) {
+              SYSLOG(ERROR) << "Device trust key rotation failed, browser must "
+                               "be a system install.";
+              LogKeyRotationCommandError(
+                  KeyRotationCommandError::kUserInstallation);
+              return KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION;
+            }
+
             std::string token_base64;
             base::Base64Encode(params.dm_token, &token_base64);
             std::string nonce_base64;
             base::Base64Encode(params.nonce, &nonce_base64);
 
-            DWORD return_code = installer::ROTATE_DTKEY_FAILED;
+            absl::optional<DWORD> return_code;
 
             // Omaha does not support concurrent elevated commands.  If this
             // fails for that reason, wait a little and try again.  Retry count
@@ -202,20 +216,49 @@
                 base::PlatformThread::Sleep(base::Seconds(1));
             }
 
-            KeyRotationCommand::Status status =
-                KeyRotationCommand::Status::FAILED;
-            if (SUCCEEDED(hr) &&
-                return_code == installer::ROTATE_DTKEY_SUCCESS) {
-              status = KeyRotationCommand::Status::SUCCEEDED;
-              SYSLOG(INFO) << "Device trust key rotation successful.";
+            auto status = KeyRotationCommand::Status::FAILED;
+            if (SUCCEEDED(hr) && return_code) {
+              LogKeyRotationExitCode(return_code.value());
+              switch (return_code.value()) {
+                case installer::ROTATE_DTKEY_SUCCESS:
+                  status = KeyRotationCommand::Status::SUCCEEDED;
+                  break;
+                case installer::ROTATE_DTKEY_FAILED_PERMISSIONS:
+                  status =
+                      KeyRotationCommand::Status::FAILED_INVALID_PERMISSIONS;
+                  break;
+                case installer::ROTATE_DTKEY_FAILED_CONFLICT:
+                  status = KeyRotationCommand::Status::FAILED_KEY_CONFLICT;
+                  break;
+                default:
+                  // No-op, status is already marked as failed.
+                  break;
+              }
             } else if (hr == E_ABORT) {
               status = KeyRotationCommand::Status::TIMED_OUT;
               SYSLOG(ERROR) << "Device trust key rotation timed out.";
+              LogKeyRotationCommandError(KeyRotationCommandError::kTimeout);
             } else if (hr == GOOPDATE_E_APP_USING_EXTERNAL_UPDATER) {
               SYSLOG(ERROR) << "Device trust key rotation failed due to Google "
                                "Update concurrency.";
+              LogKeyRotationCommandError(
+                  KeyRotationCommandError::kUpdaterConcurrency);
+            } else if (hr == REGDB_E_CLASSNOTREG) {
+              status = KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION;
+              SYSLOG(ERROR) << "Device trust key rotation failed, updater "
+                               "class not registered.";
+              LogKeyRotationCommandError(
+                  KeyRotationCommandError::kClassNotRegistered);
+            } else if (hr == E_NOINTERFACE) {
+              status = KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION;
+              SYSLOG(ERROR) << "Device trust key rotation failed, updater "
+                               "class does not implement interface";
+              LogKeyRotationCommandError(KeyRotationCommandError::kNoInterface);
             } else {
-              SYSLOG(ERROR) << "Device trust key rotation failed.";
+              SYSLOG(ERROR)
+                  << "Device trust key rotation failed. HRESULT: " << hr;
+              LogKeyRotationCommandError(KeyRotationCommandError::kUnknown);
+              LogUnexpectedHresult(hr);
             }
             return status;
           },
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h
index 0f21f8d1..33cbb42 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h
@@ -9,6 +9,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/win/windows_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace base {
 class SingleThreadTaskRunner;
@@ -25,7 +26,7 @@
   using RunGoogleUpdateElevatedCommandFn =
       base::RepeatingCallback<HRESULT(const wchar_t* command,
                                       const std::vector<std::string>& args,
-                                      DWORD* return_code)>;
+                                      absl::optional<DWORD>* return_code)>;
 
   // The second constructor is used in tests to override the behaviour of
   // Google Update.
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc
index 218ba59..2f0f654 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command_unittest.cc
@@ -8,11 +8,17 @@
 
 #include "base/base64.h"
 #include "base/functional/bind.h"
+#include "base/notreached.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/metrics_utils.h"
+#include "chrome/install_static/test/scoped_install_details.h"
 #include "chrome/installer/util/util_constants.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace enterprise_connectors {
 
@@ -43,140 +49,128 @@
  protected:
   void RunUntilIdle() { task_environment_.RunUntilIdle(); }
 
- private:
+  void RunTest(
+      HRESULT command_hresult,
+      absl::optional<int> exit_code,
+      KeyRotationCommand::Status expected_status,
+      absl::optional<KeyRotationCommandError> logged_error = absl::nullopt,
+      bool skip_wait = false) {
+    install_static::ScopedInstallDetails install_details(true);
+
+    KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl,
+                                         kNonce};
+
+    WinKeyRotationCommand command(base::BindLambdaForTesting(
+        [&command_hresult, &exit_code](const wchar_t* command,
+                                       const std::vector<std::string>& args,
+                                       absl::optional<DWORD>* return_code) {
+          CheckCommandArgs(args);
+          if (exit_code) {
+            *return_code = exit_code.value();
+          }
+          return command_hresult;
+        }));
+
+    if (skip_wait) {
+      command.enable_waiting_for_testing(false);
+    }
+
+    base::test::TestFuture<KeyRotationCommand::Status> future_status;
+    command.Trigger(params, future_status.GetCallback());
+
+    EXPECT_EQ(future_status.Get(), expected_status);
+
+    VerifyHistograms(logged_error, exit_code);
+  }
+
+  void VerifyHistograms(absl::optional<KeyRotationCommandError> error,
+                        absl::optional<int> exit_code) {
+    if (error) {
+      histogram_tester_.ExpectUniqueSample(
+          "Enterprise.DeviceTrust.KeyRotationCommand.Error", error.value(), 1);
+    } else {
+      histogram_tester_.ExpectTotalCount(
+          "Enterprise.DeviceTrust.KeyRotationCommand.Error", 0);
+    }
+
+    if (exit_code) {
+      histogram_tester_.ExpectUniqueSample(
+          "Enterprise.DeviceTrust.KeyRotationCommand.ExitCode",
+          exit_code.value(), 1);
+    } else {
+      histogram_tester_.ExpectTotalCount(
+          "Enterprise.DeviceTrust.KeyRotationCommand.ExitCode", 0);
+    }
+  }
+
   base::test::TaskEnvironment task_environment_;
+  base::HistogramTester histogram_tester_;
 };
 
 TEST_F(WinKeyRotationCommandTest, RotateSuccess) {
-  KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl, kNonce};
-  bool was_called = false;
-  KeyRotationCommand::Status status = KeyRotationCommand::Status::TIMED_OUT;
-
-  WinKeyRotationCommand command(base::BindRepeating(
-      [](const wchar_t* command, const std::vector<std::string>& args,
-         DWORD* return_code) {
-        CheckCommandArgs(args);
-        *return_code = installer::ROTATE_DTKEY_SUCCESS;
-        return S_OK;
-      }));
-
-  command.Trigger(params, base::BindLambdaForTesting(
-                              [&was_called,
-                               &status](KeyRotationCommand::Status arg_status) {
-                                was_called = true;
-                                status = arg_status;
-                              }));
-
-  RunUntilIdle();
-
-  ASSERT_TRUE(was_called);
-  ASSERT_EQ(KeyRotationCommand::Status::SUCCEEDED, status);
+  RunTest(S_OK, installer::ROTATE_DTKEY_SUCCESS,
+          KeyRotationCommand::Status::SUCCEEDED);
 }
 
 TEST_F(WinKeyRotationCommandTest, RotateFailure) {
-  KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl, kNonce};
-  bool was_called = false;
-  KeyRotationCommand::Status status = KeyRotationCommand::Status::TIMED_OUT;
-
-  WinKeyRotationCommand command(base::BindRepeating(
-      [](const wchar_t* command, const std::vector<std::string>& args,
-         DWORD* return_code) {
-        CheckCommandArgs(args);
-        *return_code = installer::ROTATE_DTKEY_FAILED;
-        return S_OK;
-      }));
-
-  command.Trigger(params, base::BindLambdaForTesting(
-                              [&was_called,
-                               &status](KeyRotationCommand::Status arg_status) {
-                                was_called = true;
-                                status = arg_status;
-                              }));
-
-  RunUntilIdle();
-
-  ASSERT_TRUE(was_called);
-  ASSERT_EQ(KeyRotationCommand::Status::FAILED, status);
+  RunTest(S_OK, installer::ROTATE_DTKEY_FAILED,
+          KeyRotationCommand::Status::FAILED);
 }
 
 TEST_F(WinKeyRotationCommandTest, RotateTimeout) {
-  KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl, kNonce};
-  bool was_called = false;
-  KeyRotationCommand::Status status = KeyRotationCommand::Status::FAILED;
-
-  WinKeyRotationCommand command(base::BindRepeating(
-      [](const wchar_t* command, const std::vector<std::string>& args,
-         DWORD* return_code) {
-        CheckCommandArgs(args);
-        // Not setting return_code.
-        return E_ABORT;
-      }));
-
-  command.Trigger(params, base::BindLambdaForTesting(
-                              [&was_called,
-                               &status](KeyRotationCommand::Status arg_status) {
-                                was_called = true;
-                                status = arg_status;
-                              }));
-
-  RunUntilIdle();
-
-  ASSERT_TRUE(was_called);
-  ASSERT_EQ(KeyRotationCommand::Status::TIMED_OUT, status);
+  RunTest(E_ABORT, absl::nullopt, KeyRotationCommand::Status::TIMED_OUT,
+          KeyRotationCommandError::kTimeout);
 }
 
-TEST_F(WinKeyRotationCommandTest, GoogleUpdateIssue) {
-  KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl, kNonce};
-  bool was_called = false;
-  KeyRotationCommand::Status status = KeyRotationCommand::Status::SUCCEEDED;
-
-  WinKeyRotationCommand command(base::BindRepeating(
-      [](const wchar_t* command, const std::vector<std::string>& args,
-         DWORD* return_code) {
-        CheckCommandArgs(args);
-        // Not setting return_code.
-        return WinKeyRotationCommand::GOOPDATE_E_APP_USING_EXTERNAL_UPDATER;
-      }));
-
-  command.enable_waiting_for_testing(false);
-  command.Trigger(params, base::BindLambdaForTesting(
-                              [&was_called,
-                               &status](KeyRotationCommand::Status arg_status) {
-                                was_called = true;
-                                status = arg_status;
-                              }));
-
-  RunUntilIdle();
-
-  ASSERT_TRUE(was_called);
-  ASSERT_EQ(KeyRotationCommand::Status::FAILED, status);
+TEST_F(WinKeyRotationCommandTest, GoogleUpdateConcurrencyIssue) {
+  RunTest(WinKeyRotationCommand::GOOPDATE_E_APP_USING_EXTERNAL_UPDATER,
+          absl::nullopt, KeyRotationCommand::Status::FAILED,
+          KeyRotationCommandError::kUpdaterConcurrency, /*skip_wait=*/true);
 }
 
 TEST_F(WinKeyRotationCommandTest, GeneralFailure) {
-  KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl, kNonce};
-  bool was_called = false;
-  KeyRotationCommand::Status status = KeyRotationCommand::Status::SUCCEEDED;
+  RunTest(S_OK, absl::nullopt, KeyRotationCommand::Status::FAILED,
+          KeyRotationCommandError::kUnknown);
+}
 
-  WinKeyRotationCommand command(base::BindRepeating(
+TEST_F(WinKeyRotationCommandTest, COMClassNotRegistered) {
+  RunTest(REGDB_E_CLASSNOTREG, absl::nullopt,
+          KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION,
+          KeyRotationCommandError::kClassNotRegistered);
+}
+
+TEST_F(WinKeyRotationCommandTest, COMClassNoInterface) {
+  RunTest(E_NOINTERFACE, absl::nullopt,
+          KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION,
+          KeyRotationCommandError::kNoInterface);
+}
+
+TEST_F(WinKeyRotationCommandTest, UnknownHresult) {
+  RunTest(CLASS_E_NOAGGREGATION, absl::nullopt,
+          KeyRotationCommand::Status::FAILED,
+          KeyRotationCommandError::kUnknown);
+  histogram_tester_.ExpectUniqueSample(
+      "Enterprise.DeviceTrust.KeyRotationCommand.Error.Hresult",
+      static_cast<int>(CLASS_E_NOAGGREGATION), 1);
+}
+
+TEST_F(WinKeyRotationCommandTest, UserLevelInstall) {
+  install_static::ScopedInstallDetails install_details(false);
+  KeyRotationCommand::Params params = {kFakeDMToken, kFakeDmServerUrl, kNonce};
+
+  WinKeyRotationCommand command(base::BindLambdaForTesting(
       [](const wchar_t* command, const std::vector<std::string>& args,
-         DWORD* return_code) {
-        CheckCommandArgs(args);
-        // Not setting return_code.
-        return E_FAIL;
+         absl::optional<DWORD>* return_code) {
+        NOTREACHED() << "Should not get to launching the command.";
+        return S_OK;
       }));
 
-  command.enable_waiting_for_testing(false);
-  command.Trigger(params, base::BindLambdaForTesting(
-                              [&was_called,
-                               &status](KeyRotationCommand::Status arg_status) {
-                                was_called = true;
-                                status = arg_status;
-                              }));
+  base::test::TestFuture<KeyRotationCommand::Status> future_status;
+  command.Trigger(params, future_status.GetCallback());
 
-  RunUntilIdle();
-
-  ASSERT_TRUE(was_called);
-  ASSERT_EQ(KeyRotationCommand::Status::FAILED, status);
+  EXPECT_EQ(future_status.Get(),
+            KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION);
+  VerifyHistograms(KeyRotationCommandError::kUserInstallation, absl::nullopt);
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc
index 30ead70..fee0087 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.cc
@@ -59,6 +59,8 @@
       return DTKeyRotationResult::kFailedOSRestriction;
     case KeyRotationCommand::Status::FAILED_INVALID_PERMISSIONS:
       return DTKeyRotationResult::kFailedInvalidPermissions;
+    case KeyRotationCommand::Status::FAILED_INVALID_INSTALLATION:
+      return DTKeyRotationResult::kFailedInvalidInstallation;
   }
 }
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h
index 781733e..68ac698 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/metrics_utils.h
@@ -41,7 +41,8 @@
   kFailedKeyConflict = 3,
   kFailedOSRestriction = 4,
   kFailedInvalidPermissions = 5,
-  kMaxValue = kFailedInvalidPermissions,
+  kFailedInvalidInstallation = 6,
+  kMaxValue = kFailedInvalidInstallation,
 };
 
 // Possible client errors that can happen during key synchronization.
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h
index 4d30c73..dbbb5754 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h
@@ -18,13 +18,21 @@
 
   // When the process does not return correctly. This is 1
   // because the WaitForExitWithTimeout method returns
-  // false when the process does not correctly exit.
+  // false when the process does not correctly exit (e.g. crash).
   kUnknownFailure = 1,
 
   // When the management-service key rotation fails. This
   // differs from the kUnknownFailure because the process
   // correctly exited and returned a failure code.
   kFailure = 2,
+
+  // Special error code returned when the browser is missing required
+  // permissions.
+  kFailedInsufficientPermissions = 3,
+
+  // Special error code returned when a key upload resulted in a conflicting
+  // HTTP response (409).
+  kFailedKeyConflict = 4,
 };
 
 namespace constants {
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/BUILD.gn
index beb15d7..ab43e31 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/BUILD.gn
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/BUILD.gn
@@ -5,6 +5,7 @@
 source_set("elevated_rotation") {
   public = [
     "key_rotation_manager.h",
+    "key_rotation_types.h",
     "metrics_util.h",
   ]
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h
index 4eb22f8..f6619eee1 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/functional/callback_forward.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 
 class GURL;
 
@@ -21,13 +22,6 @@
 // installer.
 class KeyRotationManager {
  public:
-  //  Status of the key rotation.
-  enum class Result {
-    SUCCEEDED,
-    FAILED,
-    FAILED_KEY_CONFLICT,
-  };
-
   virtual ~KeyRotationManager() = default;
 
   static std::unique_ptr<KeyRotationManager> Create(
@@ -47,10 +41,11 @@
   // used when building the upload request result of the rotation is
   // returned via the `result_callback`. This function will fail on linux
   // and windows if not called with admin rights.
-  virtual void Rotate(const GURL& dm_server_url,
-                      const std::string& dm_token,
-                      const std::string& nonce,
-                      base::OnceCallback<void(Result)> result_callback) = 0;
+  virtual void Rotate(
+      const GURL& dm_server_url,
+      const std::string& dm_token,
+      const std::string& nonce,
+      base::OnceCallback<void(KeyRotationResult)> result_callback) = 0;
 };
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.cc
index 21e37e2..58c12152 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.cc
@@ -16,6 +16,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/key_upload_request.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/util.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/metrics_util.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "url/gurl.h"
@@ -49,7 +50,7 @@
     const GURL& dm_server_url,
     const std::string& dm_token,
     const std::string& nonce,
-    base::OnceCallback<void(Result)> result_callback) {
+    base::OnceCallback<void(KeyRotationResult)> result_callback) {
   // If an old key exists, then the `nonce` becomes a required parameter as
   // we're effectively going through a key rotation flow instead of key
   // creation.
@@ -59,7 +60,7 @@
     RecordRotationStatus(/*is_rotation=*/true,
                          RotationStatus::FAILURE_INVALID_ROTATION_PARAMS);
     SYSLOG(ERROR) << "Device trust key rotation failed. Missing a nonce.";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
 
@@ -67,14 +68,14 @@
     RecordRotationStatus(is_rotation,
                          RotationStatus::FAILURE_INVALID_DMSERVER_URL);
     SYSLOG(ERROR) << "DMServer URL invalid";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
 
   if (dm_token.size() > kMaxDMTokenLength) {
     RecordRotationStatus(is_rotation, RotationStatus::FAILURE_INVALID_DMTOKEN);
     SYSLOG(ERROR) << "DMToken length out of bounds";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
 
@@ -82,7 +83,7 @@
     RecordRotationStatus(is_rotation,
                          RotationStatus::FAILURE_INCORRECT_FILE_PERMISSIONS);
     SYSLOG(ERROR) << "Device trust key rotation failed. Incorrect permissions.";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kInsufficientPermissions);
     return;
   }
 
@@ -95,7 +96,7 @@
                          RotationStatus::FAILURE_CANNOT_GENERATE_NEW_KEY);
     SYSLOG(ERROR) << "Device trust key rotation failed. Could not generate a "
                      "new signing key.";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
 
@@ -111,7 +112,7 @@
                          RotationStatus::FAILURE_CANNOT_BUILD_REQUEST);
     SYSLOG(ERROR) << "Device trust key rotation failed. Could not build the "
                      "upload key request.";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
 
@@ -120,7 +121,7 @@
     RecordRotationStatus(is_rotation, RotationStatus::FAILURE_CANNOT_STORE_KEY);
     SYSLOG(ERROR) << "Device trust key rotation failed. Could not write to "
                      "signing key storage.";
-    std::move(result_callback).Run(Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
 
@@ -136,7 +137,7 @@
 
 void KeyRotationManagerImpl::OnDmServerResponse(
     std::unique_ptr<SigningKeyPair> old_key_pair,
-    base::OnceCallback<void(Result)> result_callback,
+    base::OnceCallback<void(KeyRotationResult)> result_callback,
     KeyNetworkDelegate::HttpResponseCode response_code) {
   const bool is_rotation = IsValidKey(old_key_pair.get());
   RecordUploadCode(is_rotation, response_code);
@@ -166,19 +167,18 @@
     SYSLOG(ERROR) << "Device trust key rotation failed. Could not send public "
                      "key to DM server.";
     if (upload_key_status == UploadKeyStatus::kFailedKeyConflict) {
-      std::move(result_callback)
-          .Run(KeyRotationManager::Result::FAILED_KEY_CONFLICT);
+      std::move(result_callback).Run(KeyRotationResult::kFailedKeyConflict);
       return;
     }
 
     // TODO(b:254072094): We should call CleanupTemporaryKeyData when failing
     // with a successful restore.
-    std::move(result_callback).Run(KeyRotationManager::Result::FAILED);
+    std::move(result_callback).Run(KeyRotationResult::kFailed);
     return;
   }
   persistence_delegate_->CleanupTemporaryKeyData();
   RecordRotationStatus(is_rotation, RotationStatus::SUCCESS);
-  std::move(result_callback).Run(KeyRotationManager::Result::SUCCEEDED);
+  std::move(result_callback).Run(KeyRotationResult::kSucceeded);
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.h b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.h
index cd7aa46..7e99b4e7 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_impl.h
@@ -26,19 +26,21 @@
   ~KeyRotationManagerImpl() override;
 
   // KeyRotationManager:
-  void Rotate(const GURL& dm_server_url,
-              const std::string& dm_token,
-              const std::string& nonce,
-              base::OnceCallback<void(Result)> result_callback) override;
+  void Rotate(
+      const GURL& dm_server_url,
+      const std::string& dm_token,
+      const std::string& nonce,
+      base::OnceCallback<void(KeyRotationResult)> result_callback) override;
 
  private:
   // Gets the `response_code` from the upload key request and continues
   // the key rotation process. `result_callback` returns the rotation result.
   // The `old_key_pair` is only required in key rotation flows and will be used
   // to restore local storage if upload failed.
-  void OnDmServerResponse(std::unique_ptr<SigningKeyPair> old_key_pair,
-                          base::OnceCallback<void(Result)> result_callback,
-                          KeyNetworkDelegate::HttpResponseCode response_code);
+  void OnDmServerResponse(
+      std::unique_ptr<SigningKeyPair> old_key_pair,
+      base::OnceCallback<void(KeyRotationResult)> result_callback,
+      KeyNetworkDelegate::HttpResponseCode response_code);
 
   std::unique_ptr<KeyNetworkDelegate> network_delegate_;
   std::unique_ptr<KeyPersistenceDelegate> persistence_delegate_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc
index ea8a902..77ebb08 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager_unittest.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mock_key_persistence_delegate.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/signing_key_pair.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/metrics_util.h"
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "crypto/scoped_mock_unexportable_key_provider.h"
@@ -68,29 +69,27 @@
 
 // All use-cases of upload failures resulting in the key rotation manager
 // attempting to rollback any local state.
-constexpr std::array<std::tuple<HttpResponseCode,
-                                RotationStatus,
-                                KeyRotationManager::Result,
-                                bool>,
-                     6>
+constexpr std::array<
+    std::tuple<HttpResponseCode, RotationStatus, KeyRotationResult, bool>,
+    6>
     kUploadFailureTestCases = {{
         {kHardFailureCode, RotationStatus::FAILURE_CANNOT_UPLOAD_KEY,
-         KeyRotationManager::Result::FAILED, true},
+         KeyRotationResult::kFailed, true},
         {kTransientFailureCode,
          RotationStatus::FAILURE_CANNOT_UPLOAD_KEY_TRIES_EXHAUSTED,
-         KeyRotationManager::Result::FAILED, true},
+         KeyRotationResult::kFailed, true},
         {kKeyConflictFailureCode, RotationStatus::FAILURE_CANNOT_UPLOAD_KEY,
-         KeyRotationManager::Result::FAILED_KEY_CONFLICT, true},
+         KeyRotationResult::kFailedKeyConflict, true},
         {kHardFailureCode,
          RotationStatus::FAILURE_CANNOT_UPLOAD_KEY_RESTORE_FAILED,
-         KeyRotationManager::Result::FAILED, false},
+         KeyRotationResult::kFailed, false},
         {kTransientFailureCode,
          RotationStatus::
              FAILURE_CANNOT_UPLOAD_KEY_TRIES_EXHAUSTED_RESTORE_FAILED,
-         KeyRotationManager::Result::FAILED, false},
+         KeyRotationResult::kFailed, false},
         {kKeyConflictFailureCode,
          RotationStatus::FAILURE_CANNOT_UPLOAD_KEY_RESTORE_FAILED,
-         KeyRotationManager::Result::FAILED_KEY_CONFLICT, false},
+         KeyRotationResult::kFailedKeyConflict, false},
     }};
 
 }  // namespace
@@ -190,9 +189,8 @@
         .WillOnce(Return(success));
   }
 
-  void RunRotate(KeyRotationManager::Result expected_result,
-                 bool with_nonce = false) {
-    base::test::TestFuture<KeyRotationManager::Result> future;
+  void RunRotate(KeyRotationResult expected_result, bool with_nonce = false) {
+    base::test::TestFuture<KeyRotationResult> future;
     key_rotation_manager_->Rotate(GURL(kDmServerUrl), kDmToken,
                                   with_nonce ? kFakeNonce : std::string(),
                                   future.GetCallback());
@@ -222,10 +220,10 @@
 TEST_F(KeyRotationManagerTest, Rotate_InvalidDMServerURL) {
   SetUpOldKey(/*exists=*/true);
 
-  base::test::TestFuture<KeyRotationManager::Result> future;
+  base::test::TestFuture<KeyRotationResult> future;
   key_rotation_manager_->Rotate(GURL(), kDmToken, kFakeNonce,
                                 future.GetCallback());
-  EXPECT_EQ(KeyRotationManager::Result::FAILED, future.Get());
+  EXPECT_EQ(KeyRotationResult::kFailed, future.Get());
 
   histogram_tester_->ExpectUniqueSample(
       kRotateStatusWithNonceHistogram,
@@ -241,10 +239,10 @@
   // Create a DM token that has 5000 characters.
   std::string long_dm_token(5000, 'a');
 
-  base::test::TestFuture<KeyRotationManager::Result> future;
+  base::test::TestFuture<KeyRotationResult> future;
   key_rotation_manager_->Rotate(GURL(kDmServerUrl), long_dm_token, kFakeNonce,
                                 future.GetCallback());
-  EXPECT_EQ(KeyRotationManager::Result::FAILED, future.Get());
+  EXPECT_EQ(KeyRotationResult::kFailed, future.Get());
 
   histogram_tester_->ExpectUniqueSample(kRotateStatusWithNonceHistogram,
                                         RotationStatus::FAILURE_INVALID_DMTOKEN,
@@ -257,7 +255,7 @@
 TEST_F(KeyRotationManagerTest, Rotate_MissingNonce) {
   SetUpOldKey(/*exists=*/true);
 
-  RunRotate(KeyRotationManager::Result::FAILED, /*with_nonce=*/false);
+  RunRotate(KeyRotationResult::kFailed, /*with_nonce=*/false);
 
   histogram_tester_->ExpectUniqueSample(
       kRotateStatusWithNonceHistogram,
@@ -271,7 +269,7 @@
   SetUpOldKey(/*exists=*/false);
   SetRotationPermissions(false);
 
-  RunRotate(KeyRotationManager::Result::FAILED);
+  RunRotate(KeyRotationResult::kInsufficientPermissions);
 
   histogram_tester_->ExpectUniqueSample(
       kRotateStatusNoNonceHistogram,
@@ -286,7 +284,7 @@
   SetRotationPermissions();
   SetUpNewKeyCreation(/*success=*/false);
 
-  RunRotate(KeyRotationManager::Result::FAILED);
+  RunRotate(KeyRotationResult::kFailed);
 
   histogram_tester_->ExpectUniqueSample(
       kRotateStatusNoNonceHistogram,
@@ -302,7 +300,7 @@
   SetUpNewKeyCreation();
   SetUpStoreKey(/*expect_new_key=*/true, /*success=*/false);
 
-  RunRotate(KeyRotationManager::Result::FAILED);
+  RunRotate(KeyRotationResult::kFailed);
 
   histogram_tester_->ExpectUniqueSample(
       kRotateStatusNoNonceHistogram, RotationStatus::FAILURE_CANNOT_STORE_KEY,
@@ -320,7 +318,7 @@
   SetUploadCode(kSuccessCode);
   ExpectFinalCleanup();
 
-  RunRotate(KeyRotationManager::Result::SUCCEEDED);
+  RunRotate(KeyRotationResult::kSucceeded);
 
   // Validate body.
   // TODO(b:254072094): Improve body content validation logic.
@@ -353,7 +351,7 @@
   SetUploadCode(kSuccessCode);
   ExpectFinalCleanup();
 
-  RunRotate(KeyRotationManager::Result::SUCCEEDED, /*with_nonce=*/true);
+  RunRotate(KeyRotationResult::kSucceeded, /*with_nonce=*/true);
 
   // Validate body.
   // TODO(b:254072094): Improve body content validation logic.
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h
new file mode 100644
index 0000000..97b5ff2
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h
@@ -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.
+
+#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_INSTALLER_KEY_ROTATION_TYPES_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_INSTALLER_KEY_ROTATION_TYPES_H_
+
+namespace enterprise_connectors {
+
+//  Status of the key rotation.
+enum class KeyRotationResult {
+  kSucceeded,
+  kFailed,
+  kInsufficientPermissions,
+  kFailedKeyConflict,
+};
+
+}  // namespace enterprise_connectors
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_INSTALLER_KEY_ROTATION_TYPES_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/chrome_management_service.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/chrome_management_service.cc
index 2ad516c..d05ba65 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/chrome_management_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/chrome_management_service.cc
@@ -77,6 +77,19 @@
   return true;
 }
 
+int KeyRotationResultToExitCode(KeyRotationResult result) {
+  switch (result) {
+    case KeyRotationResult::kSucceeded:
+      return kSuccess;
+    case KeyRotationResult::kFailed:
+      return kFailure;
+    case KeyRotationResult::kInsufficientPermissions:
+      return kFailedInsufficientPermissions;
+    case KeyRotationResult::kFailedKeyConflict:
+      return kFailedKeyConflict;
+  }
+}
+
 }  // namespace
 
 ChromeManagementService::ChromeManagementService()
@@ -168,10 +181,8 @@
       KeyRotationManager::Create(std::make_unique<MojoKeyNetworkDelegate>(
           base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
               remote_url_loader_factory_.get())));
-  return RotateDeviceTrustKey(std::move(key_rotation_manager), *command_line,
-                              chrome::GetChannel())
-             ? kSuccess
-             : kFailure;
+  return KeyRotationResultToExitCode(RotateDeviceTrustKey(
+      std::move(key_rotation_manager), *command_line, chrome::GetChannel()));
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.cc
index 39ee60a..67251fe 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.cc
@@ -52,14 +52,14 @@
 
 }  // namespace
 
-bool RotateDeviceTrustKey(
+KeyRotationResult RotateDeviceTrustKey(
     std::unique_ptr<KeyRotationManager> key_rotation_manager,
     const base::CommandLine& command_line,
     version_info::Channel channel) {
   auto dm_token =
       Decode(command_line.GetSwitchValueASCII(switches::kRotateDTKey));
   if (!dm_token)
-    return false;
+    return KeyRotationResult::kFailed;
 
   auto nonce = command_line.GetSwitchValueASCII(switches::kNonce);
   // The nonce command line argument is optional. If none is specified use
@@ -70,14 +70,14 @@
   } else {
     decoded_nonce = Decode(nonce);
     if (!decoded_nonce)
-      return false;
+      return KeyRotationResult::kFailed;
   }
 
   if (!command_line.HasSwitch(switches::kDmServerUrl)) {
     RecordFailure(
         ManagementServiceError::kCommandMissingDMServerUrl,
         "Device trust key rotation failed. Command missing dm server url.");
-    return false;
+    return KeyRotationResult::kFailed;
   }
   GURL dm_server_url(command_line.GetSwitchValueASCII(switches::kDmServerUrl));
 
@@ -89,19 +89,19 @@
     RecordFailure(
         ManagementServiceError::kInvalidRotateCommand,
         "Device trust key rotation failed. The server URL is invalid.");
-    return false;
+    return KeyRotationResult::kFailed;
   }
 
   base::RunLoop run_loop;
   base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
                                                 base::BlockingType::WILL_BLOCK);
-  bool rotation_result = false;
+  KeyRotationResult rotation_result = KeyRotationResult::kFailed;
   key_rotation_manager->Rotate(
       dm_server_url, *dm_token, *decoded_nonce,
       base::BindOnce(
-          [](bool& rotation_result, base::OnceClosure quit_closure,
-             KeyRotationManager::Result result) {
-            rotation_result = (result == KeyRotationManager::Result::SUCCEEDED);
+          [](KeyRotationResult& rotation_result, base::OnceClosure quit_closure,
+             KeyRotationResult result) {
+            rotation_result = result;
             std::move(quit_closure).Run();
           },
           std::ref(rotation_result), run_loop.QuitClosure()));
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h
index ea1073e..bafa431 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 #include "components/version_info/channel.h"
 
 namespace base {
@@ -19,11 +20,12 @@
 
 // Rotates the device trust signing key and saves it to a global location
 // on the machine accessible to all install modes of the browser (i.e.,
-// stable and all three side-by-side modes). Returns the result of the
-// rotation. `key_rotation_manager` is the rotation manager for the
-// current platform. The `command_line` is the command_line of the current
-// process and the `channel` is the build channel (i.e stable, dev, etc).
-bool RotateDeviceTrustKey(
+// stable and all three side-by-side modes). `key_rotation_manager` is the
+// rotation manager for the current platform. The `command_line` is the
+// command_line of the current process and the `channel` is the build channel
+// (i.e stable, dev, etc).
+// Returns the key rotation result.
+KeyRotationResult RotateDeviceTrustKey(
     std::unique_ptr<KeyRotationManager> key_rotation_manager,
     const base::CommandLine& command_line,
     version_info::Channel channel);
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc
index 809a140c..1c2f199 100644
--- a/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util_unittest.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/metrics_utils.h"
 #include "components/version_info/channel.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -55,6 +56,7 @@
     "7C1.2.3&request=browser_public_key_upload";
 constexpr HttpResponseCode kSuccessCode = 200;
 constexpr HttpResponseCode kFailureCode = 400;
+constexpr HttpResponseCode kConflictCode = 409;
 
 }  // namespace
 
@@ -112,10 +114,12 @@
         std::move(callback).Run(kSuccessCode);
       }));
 
-  EXPECT_TRUE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(
+      RotateDeviceTrustKey(
+          std::move(key_rotation_manager_),
+          GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
+          version_info::Channel::STABLE),
+      KeyRotationResult::kSucceeded);
 
   histogram_tester.ExpectTotalCount(kChromeManagementServiceStatusHistogramName,
                                     0);
@@ -126,10 +130,11 @@
 TEST_F(RotateUtilTest, RotateDTKeyFailure_InvalidDmToken) {
   base::HistogramTester histogram_tester;
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(RotateDeviceTrustKey(
+                std::move(key_rotation_manager_),
+                GetCommandLine(kFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
+                version_info::Channel::STABLE),
+            KeyRotationResult::kFailed);
 
   histogram_tester.ExpectUniqueSample(
       kChromeManagementServiceStatusHistogramName,
@@ -141,10 +146,11 @@
 TEST_F(RotateUtilTest, RotateDTKeyFailure_InvalidNonce) {
   base::HistogramTester histogram_tester;
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kNonce, kFakeDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(RotateDeviceTrustKey(
+                std::move(key_rotation_manager_),
+                GetCommandLine(kEncodedFakeDMToken, kNonce, kFakeDmServerUrl),
+                version_info::Channel::STABLE),
+            KeyRotationResult::kFailed);
 
   histogram_tester.ExpectUniqueSample(
       kChromeManagementServiceStatusHistogramName,
@@ -156,10 +162,11 @@
 TEST_F(RotateUtilTest, RotateDTKeyFailure_NoDMServerUrl) {
   base::HistogramTester histogram_tester;
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, ""),
-      version_info::Channel::DEV));
+  EXPECT_EQ(RotateDeviceTrustKey(
+                std::move(key_rotation_manager_),
+                GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, ""),
+                version_info::Channel::DEV),
+            KeyRotationResult::kFailed);
 
   histogram_tester.ExpectUniqueSample(
       kChromeManagementServiceStatusHistogramName,
@@ -171,10 +178,12 @@
 TEST_F(RotateUtilTest, RotateDTKeyFailure_InvalidDMServerUrl) {
   base::HistogramTester histogram_tester;
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kInvalidDmServerUrl),
-      version_info::Channel::DEV));
+  EXPECT_EQ(
+      RotateDeviceTrustKey(std::move(key_rotation_manager_),
+                           GetCommandLine(kEncodedFakeDMToken, kEncodedNonce,
+                                          kInvalidDmServerUrl),
+                           version_info::Channel::DEV),
+      KeyRotationResult::kFailed);
 
   histogram_tester.ExpectUniqueSample(
       kChromeManagementServiceStatusHistogramName,
@@ -186,10 +195,12 @@
 TEST_F(RotateUtilTest, RotateDTKeyFailure_InvalidCommand) {
   base::HistogramTester histogram_tester;
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kInvalidDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(
+      RotateDeviceTrustKey(std::move(key_rotation_manager_),
+                           GetCommandLine(kEncodedFakeDMToken, kEncodedNonce,
+                                          kInvalidDmServerUrl),
+                           version_info::Channel::STABLE),
+      KeyRotationResult::kFailed);
 
   histogram_tester.ExpectUniqueSample(
       kChromeManagementServiceStatusHistogramName,
@@ -204,10 +215,12 @@
   EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
       .WillOnce(Return(false));
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(
+      RotateDeviceTrustKey(
+          std::move(key_rotation_manager_),
+          GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
+          version_info::Channel::STABLE),
+      KeyRotationResult::kInsufficientPermissions);
 
   histogram_tester.ExpectTotalCount(kChromeManagementServiceStatusHistogramName,
                                     0);
@@ -224,10 +237,12 @@
   EXPECT_CALL(*mock_persistence_delegate_, StoreKeyPair(_, _))
       .WillOnce(Return(false));
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(
+      RotateDeviceTrustKey(
+          std::move(key_rotation_manager_),
+          GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
+          version_info::Channel::STABLE),
+      KeyRotationResult::kFailed);
 
   histogram_tester.ExpectTotalCount(kChromeManagementServiceStatusHistogramName,
                                     0);
@@ -254,10 +269,44 @@
         std::move(callback).Run(kFailureCode);
       }));
 
-  EXPECT_FALSE(RotateDeviceTrustKey(
-      std::move(key_rotation_manager_),
-      GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
-      version_info::Channel::STABLE));
+  EXPECT_EQ(
+      RotateDeviceTrustKey(
+          std::move(key_rotation_manager_),
+          GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
+          version_info::Channel::STABLE),
+      KeyRotationResult::kFailed);
+
+  histogram_tester.ExpectTotalCount(kChromeManagementServiceStatusHistogramName,
+                                    0);
+}
+
+// Tests when the chrome management services key rotation failed due to
+// an upload key conflict.
+TEST_F(RotateUtilTest, RotateDTKeyFailure_UploadKeyConflict) {
+  base::HistogramTester histogram_tester;
+
+  EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions())
+      .WillOnce(Return(true));
+
+  EXPECT_CALL(*mock_persistence_delegate_, StoreKeyPair(_, _))
+      .Times(2)
+      .WillRepeatedly(Return(true));
+
+  EXPECT_CALL(
+      *mock_network_delegate_,
+      SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _))
+      .WillOnce(Invoke([](const GURL& url, const std::string& dm_token,
+                          const std::string& body,
+                          base::OnceCallback<void(int)> callback) {
+        std::move(callback).Run(kConflictCode);
+      }));
+
+  EXPECT_EQ(
+      RotateDeviceTrustKey(
+          std::move(key_rotation_manager_),
+          GetCommandLine(kEncodedFakeDMToken, kEncodedNonce, kFakeDmServerUrl),
+          version_info::Channel::STABLE),
+      KeyRotationResult::kFailedKeyConflict);
 
   histogram_tester.ExpectTotalCount(kChromeManagementServiceStatusHistogramName,
                                     0);
diff --git a/chrome/browser/enterprise/connectors/device_trust/test/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/test/BUILD.gn
index 3f26c31..35cd799 100644
--- a/chrome/browser/enterprise/connectors/device_trust/test/BUILD.gn
+++ b/chrome/browser/enterprise/connectors/device_trust/test/BUILD.gn
@@ -23,6 +23,7 @@
       "//base/test:test_support",
       "//chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands:test_support",
       "//chrome/browser/enterprise/connectors/device_trust/key_management/core/network:test_support",
+      "//chrome/install_static/test:test_support",
       "//crypto:test_support",
     ]
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc b/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc
index 82e1dd9..a1f295e 100644
--- a/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.cc
@@ -25,6 +25,7 @@
 #include "components/policy/proto/device_management_backend.pb.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 using testing::_;
 using testing::Invoke;
@@ -43,7 +44,7 @@
     HttpResponseCode upload_response_code,
     const wchar_t* command,
     const std::vector<std::string>& args,
-    DWORD* return_code) {
+    absl::optional<DWORD>* return_code) {
   base::CommandLine cmd_line(base::CommandLine::NO_PROGRAM);
   CHECK(args.size() == 3);
   cmd_line.AppendSwitchASCII(switches::kRotateDTKey, args[0]);
@@ -58,18 +59,33 @@
                                  base::OnceCallback<void(int)> callback) {
             std::move(callback).Run(upload_response_code);
           }));
-  *return_code = enterprise_connectors::RotateDeviceTrustKey(
-                     enterprise_connectors::KeyRotationManager::Create(
-                         std::move(mock_network_delegate)),
-                     cmd_line, install_static::GetChromeChannel())
-                     ? installer::InstallStatus::ROTATE_DTKEY_SUCCESS
-                     : installer::InstallStatus::ROTATE_DTKEY_FAILED;
+  const auto result = enterprise_connectors::RotateDeviceTrustKey(
+      enterprise_connectors::KeyRotationManager::Create(
+          std::move(mock_network_delegate)),
+      cmd_line, install_static::GetChromeChannel());
+  switch (result) {
+    case enterprise_connectors::KeyRotationResult::kSucceeded:
+      *return_code = installer::ROTATE_DTKEY_SUCCESS;
+      break;
+    case enterprise_connectors::KeyRotationResult::kInsufficientPermissions:
+      *return_code = installer::ROTATE_DTKEY_FAILED_PERMISSIONS;
+      break;
+    case enterprise_connectors::KeyRotationResult::kFailedKeyConflict:
+      *return_code = installer::ROTATE_DTKEY_FAILED_CONFLICT;
+      break;
+    case enterprise_connectors::KeyRotationResult::kFailed:
+    default:
+      *return_code = installer::ROTATE_DTKEY_FAILED;
+      break;
+  }
+
   return S_OK;
 }
 
 DeviceTrustTestEnvironmentWin::DeviceTrustTestEnvironmentWin()
     : DeviceTrustTestEnvironment("device_trust_test_environment_win",
-                                 kSuccessCode) {
+                                 kSuccessCode),
+      install_details_(true) {
   registry_override_manager_.OverrideRegistry(HKEY_LOCAL_MACHINE);
   KeyRotationCommandFactory::SetFactoryInstanceForTesting(this);
 }
diff --git a/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.h b/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.h
index 1525bdb..113ab81 100644
--- a/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.h
+++ b/chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment_win.h
@@ -10,6 +10,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/scoped_key_rotation_command_factory.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mock_key_network_delegate.h"
 #include "chrome/browser/enterprise/connectors/device_trust/test/device_trust_test_environment.h"
+#include "chrome/install_static/test/scoped_install_details.h"
 #include "crypto/scoped_mock_unexportable_key_provider.h"
 
 namespace enterprise_connectors {
@@ -28,9 +29,14 @@
   // DeviceTrustTestEnvironment:
   void SetUpExistingKey() override;
 
+ private:
   // RegistryOverrideManager for testing with registry
   registry_util::RegistryOverrideManager registry_override_manager_;
+
   crypto::ScopedMockUnexportableKeyProvider scoped_key_provider_;
+
+  // Used to fake that the browser was a system-level installation.
+  install_static::ScopedInstallDetails install_details_;
 };
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.cc b/chrome/browser/extensions/extension_keeplist_chromeos.cc
index 49440a6c..5fc81a5e 100644
--- a/chrome/browser/extensions/extension_keeplist_chromeos.cc
+++ b/chrome/browser/extensions/extension_keeplist_chromeos.cc
@@ -36,6 +36,10 @@
 // M109).
 // TODO(crbug/1371661): Do not expose the static ash extension keeplist data
 // in Lacros build after M112.
+
+// For any extension running in both Ash and Lacros, if it needs to be published
+// in app service, it must be added to one of app service block lists (Ash or
+// Lacros), so that it won't be published by both.
 base::span<const base::StringPiece>
 ExtensionsRunInOSAndStandaloneBrowserAllowlist() {
   static const base::StringPiece kKeeplist[] = {
@@ -45,6 +49,9 @@
   return base::make_span(kKeeplist);
 }
 
+// For any extension apps running in both Ash and Lacros, it must be added to
+// one of app service block lists (Ash or Lacros), so that it won't be published
+// by both.
 base::span<const base::StringPiece>
 ExtensionAppsRunInOSAndStandaloneBrowserAllowlist() {
   static const base::StringPiece kKeeplist[] = {
@@ -91,6 +98,57 @@
   return base::make_span(kKeeplist);
 }
 
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// The list of the extension apps blocked for app service in Ash.
+// The app on the block list can run in Ash but can't be published to app
+// service by Ash. For an app running in both Ash and Lacros, if it should be
+// published by Lacros, it must be blocked in Ash.
+base::span<const base::StringPiece> ExtensionAppsAppServiceBlocklistInOS() {
+  // Note: gnubbyd chrome app is running in both Ash and Lacros, but only the
+  // app running in Lacros should be published in app service so that it can be
+  // launched by users, the one running in Ash is blocked from app service and
+  // is invisible to users.
+  static const base::StringPiece kBlocklist[] = {
+      extension_misc::kGnubbyAppId,
+  };
+
+  return base::make_span(kBlocklist);
+}
+
+// The list of the extensions blocked for app service in Ash.
+// The extension on the block list can run in Ash but can't be published to app
+// service by Ash. For an extension running in both Ash and Lacros, if it should
+// be published by Lacros, it must be blocked in Ash.
+const std::vector<base::StringPiece>& ExtensionsAppServiceBlocklistInOS() {
+  // Note: Add extensions to be blocked if there are any in the future.
+  static const base::NoDestructor<std::vector<base::StringPiece>> block_list;
+  return *block_list;
+}
+
+// The list of the extension apps blocked for app service in Lacros.
+// The app on the block list can run in Lacros but can't be published to app
+// service by Lacros. For an app running in both Ash and Lacros, if it should be
+// published by Ash, it must be blocked in Lacros.
+const std::vector<base::StringPiece>&
+ExtensionAppsAppServiceBlocklistInStandaloneBrowser() {
+  // Note: Add extension apps to be blocked if there are any in the future.
+  static const base::NoDestructor<std::vector<base::StringPiece>> block_list;
+  return *block_list;
+}
+
+// The list of the extensions blocked for app service in Lacros.
+// The extension on the block list can run in Lacros but can't be published to
+// app service by Lacros. For an extension running in both Ash and Lacros, if it
+// should be published by Ash, it must be blocked in Lacros.
+const std::vector<base::StringPiece>&
+ExtensionsAppServiceBlocklistInStandaloneBrowser() {
+  // Note: Add extensions to be blocked if there are any in the future.
+  static const base::NoDestructor<std::vector<base::StringPiece>> block_list;
+  return *block_list;
+}
+
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
 const std::vector<base::StringPiece>&
 ExtensionsRunInOSAndStandaloneBrowserFromBrowserInitParams() {
@@ -263,6 +321,20 @@
 
   return keep_list_param;
 }
+
+crosapi::mojom::StandaloneBrowserAppServiceBlockListPtr
+BuildStandaloneBrowserAppServiceBlockListInitParam() {
+  auto app_service_block_list =
+      crosapi::mojom::StandaloneBrowserAppServiceBlockList::New();
+  for (const auto& id : ExtensionAppsAppServiceBlocklistInStandaloneBrowser()) {
+    app_service_block_list->extension_apps.emplace_back(std::string(id));
+  }
+  for (const auto& id : ExtensionsAppServiceBlocklistInStandaloneBrowser()) {
+    app_service_block_list->extensions.emplace_back(std::string(id));
+  }
+
+  return app_service_block_list;
+}
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 base::span<const base::StringPiece>
@@ -329,6 +401,48 @@
          base::Contains(GetExtensionAppsRunInOSOnly(), app_id);
 }
 
+bool ExtensionAppRunsInOSOnly(const std::string& app_id) {
+  return base::Contains(GetExtensionAppsRunInOSOnly(), app_id);
+}
+
+bool ExtensionRunsInOSOnly(const std::string& extension_id) {
+  return base::Contains(GetExtensionsRunInOSOnly(), extension_id);
+}
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+bool IsAppServiceBlocklistCrosapiSupported() {
+  const auto& block_list = chromeos::BrowserParamsProxy::Get()
+                         ->StandaloneBrowserAppServiceBlockList();
+  return !block_list.is_null();
+}
+
+bool ExtensionAppBlockListedForAppServiceInStandaloneBrowser(
+    const std::string& app_id) {
+  const auto& block_list = chromeos::BrowserParamsProxy::Get()
+                         ->StandaloneBrowserAppServiceBlockList();
+  DCHECK(!block_list.is_null());
+  return base::Contains(block_list->extension_apps, app_id);
+}
+
+bool ExtensionBlockListedForAppServiceInStandaloneBrowser(
+    const std::string& extension_id) {
+  const auto& block_list = chromeos::BrowserParamsProxy::Get()
+                         ->StandaloneBrowserAppServiceBlockList();
+  DCHECK(!block_list.is_null());
+  return base::Contains(block_list->extensions, extension_id);
+}
+#endif
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+bool ExtensionAppBlockListedForAppServiceInOS(const std::string& app_id) {
+  return base::Contains(ExtensionAppsAppServiceBlocklistInOS(), app_id);
+}
+
+bool ExtensionBlockListedForAppServiceInOS(const std::string& extension_id) {
+  return base::Contains(ExtensionsAppServiceBlocklistInOS(), extension_id);
+}
+#endif
+
 size_t ExtensionsRunInOSAndStandaloneBrowserAllowlistSizeForTest() {
   return ExtensionsRunInOSAndStandaloneBrowserAllowlist().size();
 }
diff --git a/chrome/browser/extensions/extension_keeplist_chromeos.h b/chrome/browser/extensions/extension_keeplist_chromeos.h
index e5c6615..162a6ae 100644
--- a/chrome/browser/extensions/extension_keeplist_chromeos.h
+++ b/chrome/browser/extensions/extension_keeplist_chromeos.h
@@ -10,11 +10,14 @@
 
 #include "build/chromeos_buildflags.h"
 #include "chromeos/crosapi/mojom/crosapi.mojom.h"
+#include "chromeos/crosapi/mojom/extension_keeplist.mojom.h"
 
 namespace extensions {
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 crosapi::mojom::ExtensionKeepListPtr BuildExtensionKeeplistInitParam();
+crosapi::mojom::StandaloneBrowserAppServiceBlockListPtr
+BuildStandaloneBrowserAppServiceBlockListInitParam();
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 // Returns ids of the extensions that are allow to run in both Ash and Lacros.
@@ -54,6 +57,44 @@
 // extensions that are compiled into ash.
 bool ExtensionAppRunsInOS(const std::string& app_id);
 
+// Returns true if the extension app is kept to run in Ash ONLY. A small list of
+// 1st party extension apps will continue to run in Ash either since they are
+// used to support Chrome OS features such as text to speech or vox, or they are
+// not compatible with Lacros yet. When this method is invoked in Lacros, it may
+// not know about OS-specific extension apps that are compiled into ash.
+bool ExtensionAppRunsInOSOnly(const std::string& app_id);
+
+// Returns true if the extension is kept to run in Ash ONLY. A small list of
+// 1st party extensions will continue to run in Ash either since they are
+// used to support Chrome OS features such as text to speech or vox, or they are
+// not compatible with Lacros yet. When this method is invoked in Lacros, it may
+// not know about OS-specific extensions that are compiled into ash.
+bool ExtensionRunsInOSOnly(const std::string& extension_id);
+
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+bool IsAppServiceBlocklistCrosapiSupported();
+
+// Returns true if the app is on app service block list in Lacros, i.e.,
+// the app can't be published in app service by Lacros.
+bool ExtensionAppBlockListedForAppServiceInStandaloneBrowser(
+    const std::string& app_id);
+
+// Returns true if the extension is on app service block list in Lacros, i.e.,
+// the extension can't be published in app service by Lacros.
+bool ExtensionBlockListedForAppServiceInStandaloneBrowser(
+    const std::string& extension_id);
+#endif
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// Returns true if the app is on app service block list in Ash, i.e.,
+// the app can't be published in app service by Ash.
+bool ExtensionAppBlockListedForAppServiceInOS(const std::string& app_id);
+
+// Returns true if the extension is on app service block list in Ash, i.e.,
+// the extension can't be published in app service by Ash.
+bool ExtensionBlockListedForAppServiceInOS(const std::string& extension_id);
+#endif
+
 size_t ExtensionsRunInOSAndStandaloneBrowserAllowlistSizeForTest();
 size_t ExtensionAppsRunInOSAndStandaloneBrowserAllowlistSizeForTest();
 size_t ExtensionsRunInOSOnlyAllowlistSizeForTest();
diff --git a/chrome/browser/feedback/show_feedback_page.cc b/chrome/browser/feedback/show_feedback_page.cc
index 8468461..fc5bbd8 100644
--- a/chrome/browser/feedback/show_feedback_page.cc
+++ b/chrome/browser/feedback/show_feedback_page.cc
@@ -53,11 +53,13 @@
 constexpr char kDescriptionPlaceholderQueryParam[] =
     "description_placeholder_text";
 constexpr char kFromAssistantQueryParam[] = "from_assistant";
+constexpr char kSettingsSearchFeedbackQueryParam[] = "from_settings_search";
 constexpr char kCategoryTagParam[] = "category_tag";
 constexpr char kPageURLParam[] = "page_url";
 constexpr char kQueryParamSeparator[] = "&";
 constexpr char kQueryParamKeyValueSeparator[] = "=";
 constexpr char kFromAssistantQueryParamValue[] = "true";
+constexpr char kSettingsSearchFeedbackQueryParamValue[] = "true";
 
 // Concat query parameter with escaped value.
 std::string StrCatQueryParam(const std::string query_param,
@@ -72,7 +74,7 @@
                       const std::string description_placeholder_text,
                       const std::string category_tag,
                       const GURL page_url,
-                      bool from_assistant) {
+                      FeedbackSource source) {
   std::vector<std::string> query_params;
 
   if (!extra_diagnostics.empty()) {
@@ -99,11 +101,17 @@
     query_params.emplace_back(StrCatQueryParam(kPageURLParam, page_url.spec()));
   }
 
-  if (from_assistant) {
+  if (source == kFeedbackSourceAssistant) {
     query_params.emplace_back(StrCatQueryParam(kFromAssistantQueryParam,
                                                kFromAssistantQueryParamValue));
   }
 
+  if (source == kFeedbackSourceOsSettingsSearch) {
+    query_params.emplace_back(
+        StrCatQueryParam(kSettingsSearchFeedbackQueryParam,
+                         kSettingsSearchFeedbackQueryParamValue));
+  }
+
   // Use default URL if no extra parameters to be added.
   if (query_params.empty()) {
     return GURL(ash::kChromeUIOSFeedbackUrl);
@@ -138,6 +146,7 @@
     case kFeedbackSourceNetworkHealthPage:
     case kFeedbackSourceMdSettingsAboutPage:
     case kFeedbackSourceOldSettingsAboutPage:
+    case kFeedbackSourceOsSettingsSearch:
     case kFeedbackSourceQuickAnswers:
     case kFeedbackSourceQuickOffice:
     case kFeedbackSourceSettingsPerformancePage:
@@ -190,7 +199,7 @@
     ash::SystemAppLaunchParams params{};
     params.url = BuildFeedbackUrl(extra_diagnostics, description_template,
                                   description_placeholder_text, category_tag,
-                                  page_url, source == kFeedbackSourceAssistant);
+                                  page_url, source);
 
     ash::LaunchSystemWebAppAsync(profile, ash::SystemWebAppType::OS_FEEDBACK,
                                  std::move(params));
diff --git a/chrome/browser/feedback/show_feedback_page_browsertest.cc b/chrome/browser/feedback/show_feedback_page_browsertest.cc
index b8a2f43..09badde 100644
--- a/chrome/browser/feedback/show_feedback_page_browsertest.cc
+++ b/chrome/browser/feedback/show_feedback_page_browsertest.cc
@@ -103,7 +103,7 @@
 // - `page_url` GURL.
 // - `from_assistant` set true.
 IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest,
-                       OsFeedbackAdditionalContextAddedToUrl) {
+                       OsFeedbackAdditionalAssistantContextAddedToUrl) {
   ash::SystemWebAppManager::GetForTest(browser()->profile())
       ->InstallSystemAppsForTesting();
   std::string unused;
@@ -150,4 +150,60 @@
   EXPECT_EQ(expected_url, visible_url);
 }
 
+// Test that when parameters appended include:
+// - `extra_diagnostics` string.
+// - `description_template` string.
+// - `description_placeholder_text` string.
+// - `category_tag` string.
+// - `page_url` GURL.
+// - `from_settings_search` set true.
+IN_PROC_BROWSER_TEST_F(ShowFeedbackPageBrowserTest,
+                       OsFeedbackAdditionalSettingsSearchContextAddedToUrl) {
+  ash::SystemWebAppManager::GetForTest(browser()->profile())
+      ->InstallSystemAppsForTesting();
+  std::string unused;
+  const GURL page_url = chrome::GetTargetTabUrl(
+      browser()->session_id(), browser()->tab_strip_model()->active_index());
+  const std::string extra_diagnostics = "extra diagnostics param";
+  const std::string description_template = "Q1: Question one?";
+  const std::string description_placeholder_text =
+      "Thanks for giving feedback on the Camera app";
+  const std::string category_tag = "category tag param";
+  GURL expected_url(base::StrCat(
+      {ash::kChromeUIOSFeedbackUrl, "/?extra_diagnostics=",
+       base::EscapeQueryParamValue(extra_diagnostics, /*use_plus=*/false),
+       "&description_template=",
+       base::EscapeQueryParamValue(description_template, /*use_plus=*/false),
+       "&description_placeholder_text=",
+       base::EscapeQueryParamValue(description_placeholder_text,
+                                   /*use_plus=*/false),
+       "&category_tag=",
+       base::EscapeQueryParamValue(category_tag, /*use_plus=*/false),
+       "&page_url=",
+       base::EscapeQueryParamValue(page_url.spec(), /*use_plus=*/false),
+       "&from_settings_search=",
+       base::EscapeQueryParamValue("true", /*use_plus=*/false)}));
+
+  content::TestNavigationObserver navigation_observer(expected_url);
+  navigation_observer.StartWatchingNewWebContents();
+
+  browser()->profile()->GetPrefs()->SetBoolean(prefs::kUserFeedbackAllowed,
+                                               true);
+
+  chrome::ShowFeedbackPage(
+      browser(), chrome::kFeedbackSourceOsSettingsSearch,
+      /*description_template=*/description_template,
+      /*description_placeholder_text=*/description_placeholder_text,
+      /*category_tag=*/category_tag,
+      /*extra_diagnostics=*/extra_diagnostics);
+  navigation_observer.Wait();
+
+  const GURL visible_url = chrome::FindLastActive()
+                               ->tab_strip_model()
+                               ->GetActiveWebContents()
+                               ->GetVisibleURL();
+  EXPECT_TRUE(visible_url.has_query());
+  EXPECT_EQ(expected_url, visible_url);
+}
+
 }  // namespace ash
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 5e83667..cadf4fe 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1914,11 +1914,6 @@
     "expiry_milestone": 112
   },
   {
-    "name": "enable-conditional-tabstrip",
-    "owners": [ "memex-team@google.com" ],
-    "expiry_milestone": 90
-  },
-  {
     "name": "enable-cooperative-scheduling",
     "owners": [ "keishi" ],
     "expiry_milestone": 85
@@ -2288,7 +2283,7 @@
   {
     "name": "enable-experimental-accessibility-switch-access-text",
     "owners": [ "//ui/accessibility/OWNERS" ],
-    "expiry_milestone": 95
+    "expiry_milestone": 130
   },
   {
     "name": "enable-experimental-cookie-features",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 2a0ae65..946ae97a 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -127,10 +127,6 @@
     "Enable use of Chrome Root Store over platform roots. "
     "On some platforms this may also enable Chrome Cert Verifier.";
 
-const char kConditionalTabStripAndroidName[] = "Conditional Tab Strip";
-const char kConditionalTabStripAndroidDescription[] =
-    "Allows users to access conditional tab strip.";
-
 const char kContentLanguagesInLanguagePickerName[] =
     "Content languages in language picker";
 const char kContentLanguagesInLanguagePickerDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 62cb075..7d1e15ed 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -396,9 +396,6 @@
 extern const char kClosedTabCacheName[];
 extern const char kClosedTabCacheDescription[];
 
-extern const char kConditionalTabStripAndroidName[];
-extern const char kConditionalTabStripAndroidDescription[];
-
 extern const char kClearCrossSiteCrossBrowsingContextGroupWindowNameName[];
 extern const char
     kClearCrossSiteCrossBrowsingContextGroupWindowNameDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 3f30ffd..cbe28d1 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -208,7 +208,6 @@
     &kChromeSharingHubLaunchAdjacent,
     &kChromeSurveyNextAndroid,
     &kCommandLineOnNonRooted,
-    &kConditionalTabStripAndroid,
     &kContextMenuEnableLensShoppingAllowlist,
     &kContextMenuGoogleLensChip,
     &kContextMenuSearchWithGoogleLens,
@@ -480,10 +479,6 @@
              "BaselineGM3SurfaceColors",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-BASE_FEATURE(kConditionalTabStripAndroid,
-             "ConditionalTabStripAndroid",
-             base::FEATURE_DISABLED_BY_DEFAULT);
-
 // Used in downstream code.
 BASE_FEATURE(kCastDeviceFilter,
              "CastDeviceFilter",
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 93c1427..bf8fb75 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -67,7 +67,6 @@
 BASE_DECLARE_FEATURE(kChromeSharingHubLaunchAdjacent);
 BASE_DECLARE_FEATURE(kChromeSurveyNextAndroid);
 BASE_DECLARE_FEATURE(kCommandLineOnNonRooted);
-BASE_DECLARE_FEATURE(kConditionalTabStripAndroid);
 BASE_DECLARE_FEATURE(kContextMenuEnableLensShoppingAllowlist);
 BASE_DECLARE_FEATURE(kContextMenuGoogleLensChip);
 BASE_DECLARE_FEATURE(kContextMenuPopupForAllScreenSizes);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index d733855..9ad89f1 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -260,7 +260,6 @@
     public static final String COMMERCE_COUPONS = "CommerceCoupons";
     public static final String COMMERCE_MERCHANT_VIEWER = "CommerceMerchantViewer";
     public static final String COMMERCE_PRICE_TRACKING = "CommercePriceTracking";
-    public static final String CONDITIONAL_TAB_STRIP_ANDROID = "ConditionalTabStripAndroid";
     public static final String CONTACTS_PICKER_SELECT_ALL = "ContactsPickerSelectAll";
     public static final String CONTEXTUAL_PAGE_ACTIONS = "ContextualPageActions";
     public static final String CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING =
@@ -584,8 +583,6 @@
     public static final CachedFlag sCommandLineOnNonRooted =
             new CachedFlag(COMMAND_LINE_ON_NON_ROOTED, false);
     public static final CachedFlag sCommerceCoupons = new CachedFlag(COMMERCE_COUPONS, false);
-    public static final CachedFlag sConditionalTabStripAndroid =
-            new CachedFlag(CONDITIONAL_TAB_STRIP_ANDROID, false);
     public static final CachedFlag sCriticalPersistedTabData =
             new CachedFlag(CRITICAL_PERSISTED_TAB_DATA, false);
     public static final CachedFlag sDiscardOccludedBitmaps =
diff --git a/chrome/browser/headless/BUILD.gn b/chrome/browser/headless/BUILD.gn
index 84c308a..d1c63e7f 100644
--- a/chrome/browser/headless/BUILD.gn
+++ b/chrome/browser/headless/BUILD.gn
@@ -53,6 +53,8 @@
       sources += [
         "headless_mode_devtooled_browsertest.cc",
         "headless_mode_devtooled_browsertest.h",
+        "headless_mode_protocol_browsertest.cc",
+        "headless_mode_protocol_browsertest.h",
         "test/headless_browser_test_utils.cc",
         "test/headless_browser_test_utils.h",
       ]
@@ -91,5 +93,10 @@
     if (use_ozone && is_linux) {
       deps += [ "//ui/ozone" ]
     }
+
+    data = [
+      "test/data/",
+      "//third_party/blink/web_tests/http/tests/inspector-protocol/resources/inspector-protocol-test.js",
+    ]
   }
 }
diff --git a/chrome/browser/headless/headless_mode_devtooled_browsertest.cc b/chrome/browser/headless/headless_mode_devtooled_browsertest.cc
index 1f7cde2..12115f32 100644
--- a/chrome/browser/headless/headless_mode_devtooled_browsertest.cc
+++ b/chrome/browser/headless/headless_mode_devtooled_browsertest.cc
@@ -12,15 +12,14 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/web_contents.h"
+#include "url/gurl.h"
 
 namespace headless {
 
-HeadlessDevTooledBrowserTest::HeadlessDevTooledBrowserTest() = default;
-HeadlessDevTooledBrowserTest::~HeadlessDevTooledBrowserTest() = default;
+HeadlessModeDevTooledBrowserTest::HeadlessModeDevTooledBrowserTest() = default;
+HeadlessModeDevTooledBrowserTest::~HeadlessModeDevTooledBrowserTest() = default;
 
-void HeadlessDevTooledBrowserTest::RunTest() {
-  ASSERT_TRUE(embedded_test_server()->Start());
-
+void HeadlessModeDevTooledBrowserTest::RunTest() {
   browser_devtools_client_.AttachToBrowser();
 
   content::BrowserContext* browser_context = browser()->profile();
@@ -34,7 +33,8 @@
 
   devtools_client_.AttachToWebContents(web_contents_.get());
 
-  GURL url = GetURL();
+  // TODO(crbug.com/1408835): Figure about a better way to cope with racing.
+  GURL url("about:blank");
   content::NavigationController::LoadURLParams params(url);
   web_contents_->GetController().LoadURLWithParams(params);
 
@@ -52,16 +52,20 @@
   base::RunLoop().RunUntilIdle();
 }
 
-void HeadlessDevTooledBrowserTest::RenderViewReady() {
-  RunDevTooledTest();
+void HeadlessModeDevTooledBrowserTest::
+    DocumentOnLoadCompletedInPrimaryMainFrame() {
+  if (!test_started_) {
+    test_started_ = true;
+    RunDevTooledTest();
+  }
 }
 
-void HeadlessDevTooledBrowserTest::WebContentsDestroyed() {
+void HeadlessModeDevTooledBrowserTest::WebContentsDestroyed() {
   FinishAsyncTest();
   FAIL() << "Web contents destroyed unexpectedly.";
 }
 
-void HeadlessDevTooledBrowserTest::RunAsyncTest() {
+void HeadlessModeDevTooledBrowserTest::RunAsyncTest() {
   DCHECK(!run_loop_);
 
   run_loop_ = std::make_unique<base::RunLoop>(
@@ -70,24 +74,22 @@
   run_loop_ = nullptr;
 }
 
-void HeadlessDevTooledBrowserTest::FinishAsyncTest() {
+void HeadlessModeDevTooledBrowserTest::FinishAsyncTest() {
   DCHECK(run_loop_);
 
   run_loop_->Quit();
 }
 
-GURL HeadlessDevTooledBrowserTest::GetURL() {
-  return GURL("about:blank");
-}
-
-class HeadlessDevToolsClientNavigationTest
-    : public HeadlessDevTooledBrowserTest {
+class HeadlessModeDevToolsClientNavigationTest
+    : public HeadlessModeDevTooledBrowserTest {
  public:
   void RunDevTooledTest() override {
+    ASSERT_TRUE(embedded_test_server()->Start());
+
     devtools_client_.AddEventHandler(
         "Page.loadEventFired",
         base::BindRepeating(
-            &HeadlessDevToolsClientNavigationTest::OnLoadEventFired,
+            &HeadlessModeDevToolsClientNavigationTest::OnLoadEventFired,
             base::Unretained(this)));
     SendCommandSync(devtools_client_, "Page.enable");
 
@@ -103,6 +105,6 @@
   }
 };
 
-HEADLESS_DEVTOOLED_TEST_F(HeadlessDevToolsClientNavigationTest);
+HEADLESS_MODE_DEVTOOLED_TEST_F(HeadlessModeDevToolsClientNavigationTest);
 
 }  // namespace headless
diff --git a/chrome/browser/headless/headless_mode_devtooled_browsertest.h b/chrome/browser/headless/headless_mode_devtooled_browsertest.h
index 194cfd9..ae8201c 100644
--- a/chrome/browser/headless/headless_mode_devtooled_browsertest.h
+++ b/chrome/browser/headless/headless_mode_devtooled_browsertest.h
@@ -12,7 +12,6 @@
 #include "components/devtools/simple_devtools_protocol_client/simple_devtools_protocol_client.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "url/gurl.h"
 
 namespace content {
 class WebContents;
@@ -23,23 +22,20 @@
 // Base class for tests that require access to a DevToolsClient. Subclasses
 // should override the RunDevTooledTest() method, which is called asynchronously
 // when the DevToolsClient is ready.
-class HeadlessDevTooledBrowserTest : public HeadlessModeBrowserTest,
-                                     public content::WebContentsObserver {
+class HeadlessModeDevTooledBrowserTest : public HeadlessModeBrowserTest,
+                                         public content::WebContentsObserver {
  public:
-  HeadlessDevTooledBrowserTest();
-  ~HeadlessDevTooledBrowserTest() override;
+  HeadlessModeDevTooledBrowserTest();
+  ~HeadlessModeDevTooledBrowserTest() override;
 
  protected:
   using SimpleDevToolsProtocolClient =
       simple_devtools_protocol_client::SimpleDevToolsProtocolClient;
 
   // content::WebContentsObserver implementation:
-  void RenderViewReady() override;
+  void DocumentOnLoadCompletedInPrimaryMainFrame() override;
   void WebContentsDestroyed() override;
 
-  // Implemented by tests to navigate to a page other than 'about:blank'.
-  virtual GURL GetURL();
-
   // Implemented by tests and used to send requests to DevTools. Subclasses
   // need to ensure that FinishAsyncTest() is called at some point.
   virtual void RunDevTooledTest() = 0;
@@ -60,31 +56,32 @@
 
  private:
   std::unique_ptr<base::RunLoop> run_loop_;
+  bool test_started_ = false;
 };
 
-#define HEADLESS_DEVTOOLED_TEST_F(TEST_FIXTURE_NAME)        \
+#define HEADLESS_MODE_DEVTOOLED_TEST_F(TEST_FIXTURE_NAME)   \
   IN_PROC_BROWSER_TEST_F(TEST_FIXTURE_NAME, RunAsyncTest) { \
     RunTest();                                              \
   }                                                         \
-  class HeadlessDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
+  class HeadlessModeDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
 
-#define HEADLESS_DEVTOOLED_TEST_P(TEST_FIXTURE_NAME)        \
+#define HEADLESS_MODE_DEVTOOLED_TEST_P(TEST_FIXTURE_NAME)   \
   IN_PROC_BROWSER_TEST_P(TEST_FIXTURE_NAME, RunAsyncTest) { \
     RunTest();                                              \
   }                                                         \
-  class HeadlessDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
+  class HeadlessModeDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
 
-#define DISABLED_HEADLESS_DEVTOOLED_TEST_F(TEST_FIXTURE_NAME)        \
+#define DISABLED_HEADLESS_MODE_DEVTOOLED_TEST_F(TEST_FIXTURE_NAME)   \
   IN_PROC_BROWSER_TEST_F(TEST_FIXTURE_NAME, DISABLED_RunAsyncTest) { \
     RunTest();                                                       \
   }                                                                  \
-  class HeadlessDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
+  class HeadlessModeDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
 
-#define DISABLED_HEADLESS_DEVTOOLED_TEST_P(TEST_FIXTURE_NAME)        \
+#define DISABLED_HEADLESS_MODE_DEVTOOLED_TEST_P(TEST_FIXTURE_NAME)   \
   IN_PROC_BROWSER_TEST_P(TEST_FIXTURE_NAME, DISABLED_RunAsyncTest) { \
     RunTest();                                                       \
   }                                                                  \
-  class HeadlessDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
+  class HeadlessModeDevTooledBrowserTestNeedsSemicolon##TEST_FIXTURE_NAME {}
 
 }  // namespace headless
 
diff --git a/chrome/browser/headless/headless_mode_protocol_browsertest.cc b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
new file mode 100644
index 0000000..2867173
--- /dev/null
+++ b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
@@ -0,0 +1,202 @@
+// 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 "chrome/browser/headless/headless_mode_protocol_browsertest.h"
+
+#include "base/base_paths.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/json/json_writer.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/path_service.h"
+#include "chrome/browser/headless/test/headless_browser_test_utils.h"
+#include "content/public/common/content_switches.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "services/network/public/cpp/network_switches.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+
+using testing::NotNull;
+
+namespace headless {
+
+namespace switches {
+static const char kResetResults[] = "reset-results";
+static const char kDumpConsoleMessages[] = "dump-console-messages";
+static const char kDumpDevToolsProtocol[] = "dump-devtools-protocol";
+static const char kDumpTestResult[] = "dump-test-result";
+}  // namespace switches
+
+namespace {
+static const base::FilePath kTestsScriptRoot(
+    FILE_PATH_LITERAL("chrome/browser/headless/test/data/protocol"));
+}  // namespace
+
+HeadlessModeProtocolBrowserTest::HeadlessModeProtocolBrowserTest() = default;
+HeadlessModeProtocolBrowserTest::~HeadlessModeProtocolBrowserTest() = default;
+
+void HeadlessModeProtocolBrowserTest::SetUpCommandLine(
+    base::CommandLine* command_line) {
+  command_line->AppendSwitchASCII(::network::switches::kHostResolverRules,
+                                  "MAP *.test 127.0.0.1");
+  HeadlessModeDevTooledBrowserTest::SetUpCommandLine(command_line);
+}
+
+base::Value::Dict HeadlessModeProtocolBrowserTest::GetPageUrlExtraParams() {
+  return base::Value::Dict();
+}
+
+void HeadlessModeProtocolBrowserTest::RunDevTooledTest() {
+  embedded_test_server()->ServeFilesFromSourceDirectory(
+      "third_party/blink/web_tests/http/tests/inspector-protocol");
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  scoped_refptr<content::DevToolsAgentHost> agent_host =
+      content::DevToolsAgentHost::GetOrCreateFor(web_contents_.get());
+
+  // Set up Page domain.
+  devtools_client_.AddEventHandler(
+      "Page.loadEventFired",
+      base::BindRepeating(&HeadlessModeProtocolBrowserTest::OnLoadEventFired,
+                          base::Unretained(this)));
+  devtools_client_.SendCommand("Page.enable");
+
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDumpConsoleMessages)) {
+    // Set up Runtime domain to intercept console messages.
+    devtools_client_.AddEventHandler(
+        "Runtime.consoleAPICalled",
+        base::BindRepeating(
+            &HeadlessModeProtocolBrowserTest::OnConsoleAPICalled,
+            base::Unretained(this)));
+    devtools_client_.SendCommand("Runtime.enable");
+  }
+
+  // Expose DevTools protocol to the target.
+  browser_devtools_client_.SendCommand("Target.exposeDevToolsProtocol",
+                                       Param("targetId", agent_host->GetId()));
+
+  // Navigate to test harness page
+  GURL page_url = embedded_test_server()->GetURL(
+      "harness.test", "/protocol/inspector-protocol-test.html");
+  devtools_client_.SendCommand("Page.navigate", Param("url", page_url.spec()));
+}
+
+void HeadlessModeProtocolBrowserTest::OnLoadEventFired(
+    const base::Value::Dict& params) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::FilePath src_dir;
+  CHECK(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
+  base::FilePath test_path =
+      src_dir.Append(kTestsScriptRoot).AppendASCII(script_name_);
+  std::string script;
+  if (!base::ReadFileToString(test_path, &script)) {
+    ADD_FAILURE() << "Unable to read test in " << test_path;
+    FinishAsyncTest();
+    return;
+  }
+  GURL test_url = embedded_test_server()->GetURL("harness.test",
+                                                 "/protocol/" + script_name_);
+  GURL target_url =
+      embedded_test_server()->GetURL("127.0.0.1", "/protocol/" + script_name_);
+
+  base::Value::Dict test_params;
+  test_params.Set("test", test_url.spec());
+  test_params.Set("target", target_url.spec());
+  // TODO(crbug.com/1408836): Replaces this with VLOG'ed protocol output from
+  // simple devtools protocol.
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDumpDevToolsProtocol)) {
+    test_params.Set("dumpDevToolsProtocol", true);
+  }
+  test_params.Merge(GetPageUrlExtraParams());
+
+  std::string json_test_params;
+  base::JSONWriter::Write(test_params, &json_test_params);
+  std::string evaluate_script = "runTest(" + json_test_params + ")";
+
+  base::Value::Dict evaluate_params;
+  evaluate_params.Set("expression", evaluate_script);
+  evaluate_params.Set("awaitPromise", true);
+  evaluate_params.Set("returnByValue", true);
+  devtools_client_.SendCommand(
+      "Runtime.evaluate", std::move(evaluate_params),
+      base::BindOnce(&HeadlessModeProtocolBrowserTest::OnEvaluateResult,
+                     base::Unretained(this)));
+}
+
+void HeadlessModeProtocolBrowserTest::OnEvaluateResult(
+    base::Value::Dict params) {
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kDumpTestResult)) {
+    LOG(INFO) << "Test result: " << params.DebugString();
+  }
+
+  std::string* value = params.FindStringByDottedPath("result.result.value");
+  EXPECT_THAT(value, NotNull());
+
+  ProcessTestResult(*value);
+
+  FinishAsyncTest();
+}
+
+// TODO(1408839): Move similar code in //headless/test to a shared location
+// in //components/devtools/test.
+void HeadlessModeProtocolBrowserTest::ProcessTestResult(
+    const std::string& test_result) {
+  base::ScopedAllowBlockingForTesting allow_blocking;
+
+  base::FilePath src_dir;
+  ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_dir));
+  base::FilePath expectation_path =
+      src_dir.Append(kTestsScriptRoot)
+          .AppendASCII(script_name_.substr(0, script_name_.length() - 3) +
+                       "-expected.txt");
+
+  if (base::CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kResetResults)) {
+    LOG(INFO) << "Updating expectations in " << expectation_path;
+    int result = base::WriteFile(expectation_path, test_result.data(),
+                                 static_cast<int>(test_result.size()));
+    CHECK(test_result.size() == static_cast<size_t>(result));
+  }
+
+  std::string expectation;
+  if (!base::ReadFileToString(expectation_path, &expectation)) {
+    ADD_FAILURE() << "Unable to read expectations in " << expectation_path
+                  << ", run test with --" << switches::kResetResults
+                  << " to create expectations.";
+    FinishAsyncTest();
+    return;
+  }
+
+  EXPECT_EQ(expectation, test_result);
+}
+
+void HeadlessModeProtocolBrowserTest::OnConsoleAPICalled(
+    const base::Value::Dict& params) {
+  const base::Value::List* args = params.FindListByDottedPath("params.args");
+  if (!args || args->empty()) {
+    return;
+  }
+
+  const base::Value* value = args->front().GetDict().Find("value");
+  switch (value->type()) {
+    case base::Value::Type::NONE:
+    case base::Value::Type::BOOLEAN:
+    case base::Value::Type::INTEGER:
+    case base::Value::Type::DOUBLE:
+    case base::Value::Type::STRING:
+      LOG(INFO) << value->DebugString();
+      return;
+    default:
+      LOG(INFO) << "Unhandled value type: " << value->type();
+      return;
+  }
+}
+
+HEADLESS_MODE_PROTOCOL_TEST(DomFocus, "input/dom-focus.js")
+
+}  // namespace headless
diff --git a/chrome/browser/headless/headless_mode_protocol_browsertest.h b/chrome/browser/headless/headless_mode_protocol_browsertest.h
new file mode 100644
index 0000000..c7f425f6
--- /dev/null
+++ b/chrome/browser/headless/headless_mode_protocol_browsertest.h
@@ -0,0 +1,53 @@
+// 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 CHROME_BROWSER_HEADLESS_HEADLESS_MODE_PROTOCOL_BROWSERTEST_H_
+#define CHROME_BROWSER_HEADLESS_HEADLESS_MODE_PROTOCOL_BROWSERTEST_H_
+
+#include <string>
+
+#include "base/command_line.h"
+#include "base/values.h"
+#include "chrome/browser/headless/headless_mode_devtooled_browsertest.h"
+
+namespace headless {
+
+class HeadlessModeProtocolBrowserTest
+    : public HeadlessModeDevTooledBrowserTest {
+ public:
+  HeadlessModeProtocolBrowserTest();
+  ~HeadlessModeProtocolBrowserTest() override;
+
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override;
+
+  // Implement this for tests that need to pass extra parameters to
+  // JavaScript code.
+  virtual base::Value::Dict GetPageUrlExtraParams();
+
+ private:
+  // HeadlessModeDevTooledBrowserTest overrides.
+  void RunDevTooledTest() override;
+
+  void OnLoadEventFired(const base::Value::Dict& params);
+  void OnEvaluateResult(base::Value::Dict params);
+  void OnConsoleAPICalled(const base::Value::Dict& params);
+
+  void ProcessTestResult(const std::string& test_result);
+
+ protected:
+  std::string test_folder_;
+  std::string script_name_;
+};
+
+#define HEADLESS_MODE_PROTOCOL_TEST(TEST_NAME, SCRIPT_NAME)            \
+  IN_PROC_BROWSER_TEST_F(HeadlessModeProtocolBrowserTest, TEST_NAME) { \
+    test_folder_ = "/protocol/";                                       \
+    script_name_ = SCRIPT_NAME;                                        \
+    RunTest();                                                         \
+  }
+
+}  // namespace headless
+
+#endif  // CHROME_BROWSER_HEADLESS_HEADLESS_MODE_PROTOCOL_BROWSERTEST_H_
diff --git a/chrome/browser/headless/test/data/protocol/input/dom-focus-expected.txt b/chrome/browser/headless/test/data/protocol/input/dom-focus-expected.txt
new file mode 100644
index 0000000..573d435
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/input/dom-focus-expected.txt
@@ -0,0 +1,3 @@
+Tests DOM.focus method.
+BODY
+second
\ No newline at end of file
diff --git a/chrome/browser/headless/test/data/protocol/input/dom-focus.js b/chrome/browser/headless/test/data/protocol/input/dom-focus.js
new file mode 100644
index 0000000..d4c9249
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/input/dom-focus.js
@@ -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.
+
+(async function(testRunner) {
+  const html = `<input></input>
+    <input id='second'></input>
+  `;
+  const {page, session, dp} =
+      await testRunner.startHTML(html, 'Tests DOM.focus method.');
+
+  testRunner.log(await session.evaluate(getActiveElement));
+  const document = (await dp.DOM.getDocument()).result.root;
+  const node = (await dp.DOM.querySelector({
+                 nodeId: document.nodeId,
+                 selector: '#second'
+               })).result;
+  await dp.DOM.focus({nodeId: node.nodeId});
+  testRunner.log(await session.evaluate(getActiveElement));
+  testRunner.completeTest();
+
+  function getActiveElement() {
+    const element = document.activeElement;
+    return element ? (element.id || element.tagName) : '(none)';
+  }
+})
diff --git a/chrome/browser/headless/test/data/protocol/inspector-protocol-page.html b/chrome/browser/headless/test/data/protocol/inspector-protocol-page.html
new file mode 100644
index 0000000..90531a4b
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/inspector-protocol-page.html
@@ -0,0 +1,2 @@
+<html>
+</html>
diff --git a/chrome/browser/headless/test/data/protocol/inspector-protocol-test.html b/chrome/browser/headless/test/data/protocol/inspector-protocol-test.html
new file mode 100644
index 0000000..b116637
--- /dev/null
+++ b/chrome/browser/headless/test/data/protocol/inspector-protocol-test.html
@@ -0,0 +1,59 @@
+<!--
+Copyright 2018 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+<html>
+<head>
+<script>
+let fulfillDone = () => {};
+const output = [];
+const testRunner = {};
+testRunner.dumpAsText = () => {};
+testRunner.waitUntilDone = () => {};
+testRunner.setPopupBlockingEnabled = () => {};
+testRunner.notifyDone = () => {
+  return fulfillDone(output.join('\n'));
+};
+DevToolsHost = {};
+DevToolsHost.sendMessageToEmbedder = (message) => {
+  const object = JSON.parse(message);
+  sendProtocolMessage(object.params[0]);
+}
+
+DevToolsHost.dummyPageURL = `http://127.0.0.1:${window.location.port}/protocol/inspector-protocol-page.html`;
+
+</script>
+<script src="/resources/inspector-protocol-test.js"></script>
+<script>
+DevToolsAPI._log = text => output.push(text);
+
+window.cdp.onmessage = json => {
+  DevToolsAPI.dispatchMessage(json);
+}
+
+function sendProtocolMessage(json) {
+  window.cdp.send(json);
+}
+
+async function runTest(params) {
+  const testScriptURL = params.test;
+  const testBaseURL = testScriptURL.substring(0, testScriptURL.lastIndexOf('/') + 1);
+
+  const targetPageURL = params.target || params.test;
+  const targetBaseURL = targetPageURL.substring(0, targetPageURL.lastIndexOf('/') + 1);
+
+  const testScript = await DevToolsAPI._fetch(testScriptURL);
+  const testFunction = eval(`${testScript}\n//# sourceURL=${testScriptURL}`);
+  const testRunner = new TestRunner(testBaseURL, targetBaseURL,
+      DevToolsAPI._log, DevToolsAPI._completeTest, DevToolsAPI._fetch, params);
+  if (params.dumpDevToolsProtocol)
+    testRunner.startDumpingProtocolMessages();
+  testFunction(testRunner);
+
+  return new Promise(fulfill => { fulfillDone = fulfill; });
+}
+
+</script>
+</head>
+</html>
diff --git a/chrome/browser/hid/hid_policy_allowed_devices.cc b/chrome/browser/hid/hid_policy_allowed_devices.cc
index 90a66fd..cd44679 100644
--- a/chrome/browser/hid/hid_policy_allowed_devices.cc
+++ b/chrome/browser/hid/hid_policy_allowed_devices.cc
@@ -14,6 +14,7 @@
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "services/device/public/mojom/hid.mojom.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
 namespace {
@@ -125,11 +126,11 @@
   // The pref value has already been validated by the policy handler, so it is
   // safe to assume that |pref_value| follows the policy template.
   for (const auto& item : pref_value) {
-    const base::Value* urls_value = item.FindKey(kPrefUrlsKey);
+    const base::Value::List* urls_value = item.GetDict().FindList(kPrefUrlsKey);
     DCHECK(urls_value);
 
     std::vector<url::Origin> urls;
-    for (const auto& url_value : urls_value->GetList()) {
+    for (const auto& url_value : *urls_value) {
       GURL url(url_value.GetString());
       if (url.is_valid())
         urls.push_back(url::Origin::Create(url));
@@ -138,21 +139,23 @@
     if (urls.empty())
       continue;
 
-    const auto* devices_value = item.FindKey(kPrefDevicesKey);
+    const base::Value::List* devices_value =
+        item.GetDict().FindList(kPrefDevicesKey);
     DCHECK(devices_value);
-    for (const auto& device_value : devices_value->GetList()) {
-      const auto* vendor_id_value = device_value.FindKey(kPrefVendorIdKey);
+    for (const auto& device_value : *devices_value) {
+      const absl::optional<int> vendor_id_value =
+          device_value.GetDict().FindInt(kPrefVendorIdKey);
       DCHECK(vendor_id_value);
 
-      const auto* product_id_value = device_value.FindKey(kPrefProductIdKey);
+      const absl::optional<int> product_id_value =
+          device_value.GetDict().FindInt(kPrefProductIdKey);
       // "product_id" is optional. If it is not specified, the policy matches
       // any device with the given vendor ID.
       if (product_id_value) {
-        device_policy_[{vendor_id_value->GetInt(), product_id_value->GetInt()}]
-            .insert(urls.begin(), urls.end());
+        device_policy_[{*vendor_id_value, *product_id_value}].insert(
+            urls.begin(), urls.end());
       } else {
-        vendor_policy_[vendor_id_value->GetInt()].insert(urls.begin(),
-                                                         urls.end());
+        vendor_policy_[*vendor_id_value].insert(urls.begin(), urls.end());
       }
     }
   }
@@ -187,20 +190,19 @@
         item.GetDict().FindList(kPrefUsagesKey);
     DCHECK(usages_value);
     for (const auto& usage_and_page_value : *usages_value) {
-      const auto* usage_page_value =
-          usage_and_page_value.FindKey(kPrefUsagePageKey);
+      const absl::optional<int> usage_page_value =
+          usage_and_page_value.GetDict().FindInt(kPrefUsagePageKey);
       DCHECK(usage_page_value);
 
-      const base::Value* usage_value =
-          usage_and_page_value.GetDict().Find(kPrefUsageKey);
+      const absl::optional<int> usage_value =
+          usage_and_page_value.GetDict().FindInt(kPrefUsageKey);
       // "usage" is optional. If "usage" is not specified, the policy matches
       // any device containing a top-level collection with the given usage page.
       if (usage_value) {
-        usage_policy_[{usage_page_value->GetInt(), usage_value->GetInt()}]
-            .insert(urls.begin(), urls.end());
+        usage_policy_[{*usage_page_value, *usage_value}].insert(urls.begin(),
+                                                                urls.end());
       } else {
-        usage_page_policy_[usage_page_value->GetInt()].insert(urls.begin(),
-                                                              urls.end());
+        usage_page_policy_[*usage_page_value].insert(urls.begin(), urls.end());
       }
     }
   }
diff --git a/chrome/browser/lacros/for_which_extension_type.cc b/chrome/browser/lacros/for_which_extension_type.cc
index 4854482..6227f9cab 100644
--- a/chrome/browser/lacros/for_which_extension_type.cc
+++ b/chrome/browser/lacros/for_which_extension_type.cc
@@ -24,11 +24,48 @@
 bool ForWhichExtensionType::Matches(
     const extensions::Extension* extension) const {
   if (for_chrome_apps_) {
+    // For older ash version without app service block list support, follow
+    // the old code path. The extension app running in both ash and lacros will
+    // not be published in app service from either ash or lacros.
+    if (!extensions::IsAppServiceBlocklistCrosapiSupported()) {
+      return lacros_extensions_util::IsExtensionApp(extension) &&
+             !extensions::ExtensionAppRunsInOS(extension->id());
+    }
+
+    // An extension app should be published to app service by lacros if it
+    // meets all of the following conditions:
+    // 1. It does not run in ash only.
+    // 2. If it runs in both ash and lacros, it is not blocked for app service
+    // in lacros.
     return lacros_extensions_util::IsExtensionApp(extension) &&
-           !extensions::ExtensionAppRunsInOS(extension->id());
+           !extensions::ExtensionAppRunsInOSOnly(extension->id()) &&
+           !(extensions::ExtensionAppRunsInBothOSAndStandaloneBrowser(
+                 extension->id()) &&
+             extensions::
+                 ExtensionAppBlockListedForAppServiceInStandaloneBrowser(
+                     extension->id()));
   }
 
   if (extension->is_extension()) {
+    // An extension should be published to app service by lacros if it meets
+    // all of the following conditions:
+    // 1. It does not run in ash only.
+    // 2. If it runs in both ash and lacros, it is not blocked for app service
+    // in lacros.
+    // 3. It is either a QuickOffice extension or an extension registered with
+    // file browser handlers.
+
+    if (extensions::ExtensionRunsInOSOnly(extension->id())) {
+      return false;
+    }
+
+    if (extensions::ExtensionRunsInBothOSAndStandaloneBrowser(
+            extension->id()) &&
+        extensions::ExtensionBlockListedForAppServiceInStandaloneBrowser(
+            extension->id())) {
+      return false;
+    }
+
     // QuickOffice extensions do not use file browser handler manifest key
     // to register their handlers for MS Office files; instead, they use
     // file_handler manifest key(like the way chrome apps do). We should
@@ -37,11 +74,6 @@
     if (extension_misc::IsQuickOfficeExtension(extension->id()))
       return true;
 
-    // If an extension runs in ash, regardless of whether it may also run in
-    // Lacros, do not publish it.
-    if (extensions::ExtensionRunsInOS(extension->id()))
-      return false;
-
     // For the regular extensions, we should only publish them if they have file
     // handlers registered using file browser handlers.
     FileBrowserHandler::List* handler_list =
diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc
index 4496601fae..5332a14 100644
--- a/chrome/browser/media/router/media_router_feature.cc
+++ b/chrome/browser/media/router/media_router_feature.cc
@@ -135,8 +135,6 @@
                                PrefRegistry::PUBLIC);
   registry->RegisterBooleanPref(
       media_router::prefs::kMediaRouterMediaRemotingEnabled, true);
-  registry->RegisterListPref(
-      media_router::prefs::kMediaRouterTabMirroringSources);
   registry->RegisterBooleanPref(
       media_router::prefs::kMediaRouterShowCastSessionsStartedByOtherDevices,
       true);
diff --git a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
index 274d97c..5991c87 100644
--- a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
+++ b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
@@ -63,18 +63,6 @@
   return expected.url == arg.url && expected.id == arg.id;
 }
 
-#if !BUILDFLAG(IS_ANDROID)
-// Set the user preference for |origin| to prefer tab mirroring.
-void EnableTabMirroringForOrigin(PrefService* prefs,
-                                 const std::string& origin) {
-  ScopedListPrefUpdate update(
-      prefs, media_router::prefs::kMediaRouterTabMirroringSources);
-  base::Value::List& list = update.Get();
-  if (!base::Contains(list, base::Value(origin)))
-    list.Append(origin);
-}
-#endif
-
 }  // namespace
 
 namespace media_router {
@@ -775,92 +763,14 @@
 
   MockCreatePresentationConnectionCallbacks mock_create_connection_callbacks;
   const std::string kPresentationId("auto-join");
-  ASSERT_TRUE(IsAutoJoinPresentationId(kPresentationId));
-
-  EnableTabMirroringForOrigin(profile()->GetPrefs(), origin);
 
   auto& mock_local_manager = GetMockLocalPresentationManager();
   EXPECT_CALL(mock_local_manager, IsLocalPresentation(kPresentationId))
       .WillRepeatedly(Return(false));
 
-  // Auto-join requests should be rejected.
-  EXPECT_CALL(mock_create_connection_callbacks, OnCreateConnectionError(_));
-  EXPECT_CALL(*router_, JoinRouteInternal(_, kPresentationId, _, _, _, _, _))
-      .Times(0);
-  delegate_impl_->ReconnectPresentation(
-      *presentation_request_, kPresentationId,
-      base::BindOnce(
-          &MockCreatePresentationConnectionCallbacks::OnCreateConnectionSuccess,
-          base::Unretained(&mock_create_connection_callbacks)),
-      base::BindOnce(
-          &MockCreatePresentationConnectionCallbacks::OnCreateConnectionError,
-          base::Unretained(&mock_create_connection_callbacks)));
-
-  // Remove the user preference for |origin|.
-  {
-    ScopedListPrefUpdate update(profile()->GetPrefs(),
-                                prefs::kMediaRouterTabMirroringSources);
-    update->EraseValue(base::Value(origin));
-  }
-
-  // Auto-join requests should now go through.
-  EXPECT_CALL(*router_, JoinRouteInternal(_, kPresentationId, _, _, _, _, _))
-      .Times(1);
-  delegate_impl_->ReconnectPresentation(
-      *presentation_request_, kPresentationId,
-      base::BindOnce(
-          &MockCreatePresentationConnectionCallbacks::OnCreateConnectionSuccess,
-          base::Unretained(&mock_create_connection_callbacks)),
-      base::BindOnce(
-          &MockCreatePresentationConnectionCallbacks::OnCreateConnectionError,
-          base::Unretained(&mock_create_connection_callbacks)));
-}
-
-TEST_F(PresentationServiceDelegateImplIncognitoTest, AutoJoinRequest) {
-  std::string origin(frame_origin_.Serialize());
-  content::WebContentsTester::For(GetWebContents())
-      ->NavigateAndCommit(frame_url_);
-
-  MockCreatePresentationConnectionCallbacks mock_create_connection_callbacks;
-  const std::string kPresentationId("auto-join");
+  // A request to reconnect to a presentation with the special presentation ID
+  // should succeed.
   ASSERT_TRUE(IsAutoJoinPresentationId(kPresentationId));
-
-  EnableTabMirroringForOrigin(
-      profile()->GetPrimaryOTRProfile(/*create_if_needed=*/true)->GetPrefs(),
-      origin);
-
-  auto& mock_local_manager = GetMockLocalPresentationManager();
-  EXPECT_CALL(mock_local_manager, IsLocalPresentation(kPresentationId))
-      .WillRepeatedly(Return(false));
-
-  // Setting the pref in OffTheRecord shouldn't set it for the regular
-  // profile.
-  const base::Value::List& non_off_the_record_origins =
-      profile()->GetPrefs()->GetList(prefs::kMediaRouterTabMirroringSources);
-  EXPECT_FALSE(base::Contains(non_off_the_record_origins, base::Value(origin)));
-
-  // Auto-join requests should be rejected.
-  EXPECT_CALL(mock_create_connection_callbacks, OnCreateConnectionError(_));
-  EXPECT_CALL(*router_, JoinRouteInternal(_, kPresentationId, _, _, _, _, _))
-      .Times(0);
-  delegate_impl_->ReconnectPresentation(
-      *presentation_request_, kPresentationId,
-      base::BindOnce(
-          &MockCreatePresentationConnectionCallbacks::OnCreateConnectionSuccess,
-          base::Unretained(&mock_create_connection_callbacks)),
-      base::BindOnce(
-          &MockCreatePresentationConnectionCallbacks::OnCreateConnectionError,
-          base::Unretained(&mock_create_connection_callbacks)));
-
-  // Remove the user preference for |origin| in OffTheRecord.
-  {
-    ScopedListPrefUpdate update(
-        profile()->GetPrimaryOTRProfile(/*create_if_needed=*/true)->GetPrefs(),
-        prefs::kMediaRouterTabMirroringSources);
-    update->EraseValue(base::Value(origin));
-  }
-
-  // Auto-join requests should now go through.
   EXPECT_CALL(*router_, JoinRouteInternal(_, kPresentationId, _, _, _, _, _))
       .Times(1);
   delegate_impl_->ReconnectPresentation(
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
index b6f82de..190894d 100644
--- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
+++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl_unittest.cc
@@ -107,10 +107,11 @@
                         base::OnceCallback<void()> callback,
                         base::OnceCallback<void()> error_callback) override {
     ++start_advertising_call_count_;
-    if (should_succeed_on_start_)
+    if (should_succeed_on_start_) {
       std::move(callback).Run();
-    else
+    } else {
       std::move(error_callback).Run();
+    }
   }
 
   void StopAdvertising(base::OnceCallback<void()> callback) override {
@@ -569,8 +570,9 @@
   }
 
   void TearDown() override {
-    if (service_)
+    if (service_) {
       service_->Shutdown();
+    }
 
     if (profile_) {
       DownloadCoreServiceFactory::GetForBrowserContext(profile_)
@@ -793,7 +795,7 @@
                       sharing::mojom::PairedKeyEncryptionFrame::New(
                           is_incoming ? kIncomingConnectionSignedData
                                       : kOutgoingConnectionSignedData,
-                          kPrivateCertificateHashAuthToken));
+                          kPrivateCertificateHashAuthToken, absl::nullopt));
               sharing::mojom::FramePtr mojo_frame =
                   sharing::mojom::Frame::NewV1(std::move(mojo_v1frame));
               std::move(callback).Run(std::move(mojo_frame));
@@ -837,8 +839,9 @@
               }
 
               absl::optional<std::string> device_name;
-              if (!return_empty_device_name)
+              if (!return_empty_device_name) {
                 device_name = kDeviceName;
+              }
 
               sharing::mojom::AdvertisementPtr advertisement =
                   sharing::mojom::Advertisement::New(
@@ -1040,8 +1043,9 @@
                                                TransferMetadata metadata) {
         EXPECT_EQ(target.id, share_target.id);
         EXPECT_EQ(status, metadata.status());
-        if (new_share_target)
+        if (new_share_target) {
           *new_share_target = share_target;
+        }
 
         // Though this is indirect, verify that the highest level
         // success/failure metric was logged. We expect transfer updates to
@@ -1149,8 +1153,9 @@
   std::unique_ptr<sharing::Advertisement> GetCurrentAdvertisement() {
     auto endpoint_info =
         fake_nearby_connections_manager_->advertising_endpoint_info();
-    if (!endpoint_info)
+    if (!endpoint_info) {
       return nullptr;
+    }
 
     return sharing::AdvertisementDecoder::FromEndpointInfo(base::make_span(
         *fake_nearby_connections_manager_->advertising_endpoint_info()));
@@ -1202,8 +1207,9 @@
 
     for (int64_t id : kValidIntroductionFramePayloadIds) {
       // Update file payload at the end.
-      if (id == kFilePayloadId)
+      if (id == kFilePayloadId) {
         continue;
+      }
 
       if (id != kWifiCredentialsPayloadId) {
         fake_nearby_connections_manager_->SetIncomingPayload(
@@ -1345,8 +1351,9 @@
         kFilePayloadId, GetFilePayloadPtr(kFilePayloadId));
 
     for (int64_t id : kValidIntroductionFramePayloadIds) {
-      if (id == kFilePayloadId)
+      if (id == kFilePayloadId) {
         continue;
+      }
 
       if (id != kWifiCredentialsPayloadId) {
         fake_nearby_connections_manager_->SetIncomingPayload(
@@ -1484,8 +1491,9 @@
   }
 
   void FireProcessShutdownIfRunning() {
-    if (IsProcessShutdownTimerRunning())
+    if (IsProcessShutdownTimerRunning()) {
       service_->process_shutdown_pending_timer_.FireNow();
+    }
   }
 
   bool IsBoundToProcess() { return service_->process_reference_ != nullptr; }
@@ -3392,8 +3400,9 @@
 
   for (int64_t id : kValidIntroductionFramePayloadIds) {
     // Update file payload at the end.
-    if (id == kFilePayloadId)
+    if (id == kFilePayloadId) {
       continue;
+    }
 
     // Deliberately not calling SetIncomingPayload() for text payloads to check
     // for failure condition.
diff --git a/chrome/browser/nearby_sharing/paired_key_verification_runner.cc b/chrome/browser/nearby_sharing/paired_key_verification_runner.cc
index 8073b44..254acde 100644
--- a/chrome/browser/nearby_sharing/paired_key_verification_runner.cc
+++ b/chrome/browser/nearby_sharing/paired_key_verification_runner.cc
@@ -208,8 +208,9 @@
   // TODO(https://crbug.com/1114765): Update once the bug is resolved.
   std::vector<nearbyshare::proto::PublicCertificate> certificates;
 
-  if (certificates.empty())
+  if (certificates.empty()) {
     return;
+  }
 
   sharing::nearby::Frame frame;
   frame.set_version(sharing::nearby::Frame::V1);
@@ -301,7 +302,24 @@
     NS_LOG(VERBOSE) << __func__
                     << ": Unable to verify remote paired key encryption frame. "
                        "Signature verification failed.";
-    return PairedKeyVerificationResult::kFail;
+
+    if (!frame->get_paired_key_encryption()->optional_signed_data) {
+      NS_LOG(VERBOSE) << __func__ << ": No fallback signature to verify.";
+      return PairedKeyVerificationResult::kFail;
+    }
+
+    NS_LOG(VERBOSE)
+        << __func__
+        << ": Attempting to verify fallback signature for relaxed visibility.";
+    if (!certificate_->VerifySignature(
+            PadPrefix(remote_prefix_, raw_token_),
+            *frame->get_paired_key_encryption()->optional_signed_data)) {
+      NS_LOG(VERBOSE)
+          << __func__
+          << ": Unable to verify remote paired key encryption frame. "
+             "Fallback signature verification failed.";
+      return PairedKeyVerificationResult::kFail;
+    }
   }
 
   if (!share_target_.is_known) {
@@ -322,11 +340,13 @@
     const std::vector<PairedKeyVerificationResult>& results) {
   bool all_success = true;
   for (const auto& result : results) {
-    if (result == PairedKeyVerificationResult::kFail)
+    if (result == PairedKeyVerificationResult::kFail) {
       return result;
+    }
 
-    if (result != PairedKeyVerificationResult::kSuccess)
+    if (result != PairedKeyVerificationResult::kSuccess) {
       all_success = false;
+    }
   }
 
   return all_success ? PairedKeyVerificationResult::kSuccess
diff --git a/chrome/browser/nearby_sharing/paired_key_verification_runner_unittest.cc b/chrome/browser/nearby_sharing/paired_key_verification_runner_unittest.cc
index 83977d3..5e6634c 100644
--- a/chrome/browser/nearby_sharing/paired_key_verification_runner_unittest.cc
+++ b/chrome/browser/nearby_sharing/paired_key_verification_runner_unittest.cc
@@ -39,6 +39,13 @@
     0x02, 0x21, 0x00, 0xd4, 0xe1, 0x1d, 0x14, 0xcb, 0x58, 0xf7, 0x02, 0xd5,
     0xab, 0x48, 0xe2, 0x2f, 0xcb, 0xc0, 0x53, 0x41, 0x06, 0x50, 0x65, 0x95,
     0x19, 0xa9, 0x22, 0x92, 0x00, 0x42, 0x01, 0x26, 0x25, 0xcb, 0x8c};
+const std::vector<uint8_t> kIncomingConnectionInvalidSignedData = {
+    0x72, 0xe5, 0x40, 0xa6, 0xdd, 0x1d, 0xfd, 0x44, 0xf2, 0x55, 0xd5, 0x15,
+    0x61, 0xe1, 0xe6, 0x15, 0x93, 0xa5, 0xf9, 0x94, 0x16, 0xcd, 0x8b, 0x0a,
+    0xb3, 0xca, 0xe6, 0x10, 0x6d, 0x22, 0x3e, 0x1e, 0x3f, 0x34, 0x23, 0x4f,
+    0xc2, 0x07, 0xae, 0xcc, 0xb0, 0xb2, 0x5e, 0x26, 0xca, 0x01, 0xd8, 0xe2,
+    0x3e, 0xc4, 0x54, 0x0b, 0xfd, 0xc4, 0xf1, 0xa7, 0xf5, 0xa8, 0x63, 0x10,
+    0x46, 0x48, 0xdc, 0x98, 0x0b, 0x8f, 0xc3, 0xee, 0xb4, 0x99, 0xb6};
 
 const base::TimeDelta kTimeout = base::Seconds(1);
 
@@ -93,6 +100,12 @@
     kEmpty,
     // Return a valid frame.
     kValid,
+    // Return a valid frame where |signed_data| is invalid, but
+    // |optional_signed_data| is valid.
+    kOptionalSignedDataValid,
+    // Return an invalid frame where both |signed_data| and
+    // |optional_signed_data| are invalid.
+    kOptionalSignedDataInvalid,
   };
 
   PairedKeyVerificationRunnerTest()
@@ -146,7 +159,21 @@
                 mojo_v1frame = sharing::mojom::V1Frame::NewPairedKeyEncryption(
                     sharing::mojom::PairedKeyEncryptionFrame::New(
                         kIncomingConnectionSignedData,
-                        kPrivateCertificateHashAuthToken));
+                        kPrivateCertificateHashAuthToken, absl::nullopt));
+              } else if (frame_type ==
+                         ReturnFrameType::kOptionalSignedDataValid) {
+                mojo_v1frame = sharing::mojom::V1Frame::NewPairedKeyEncryption(
+                    sharing::mojom::PairedKeyEncryptionFrame::New(
+                        kIncomingConnectionInvalidSignedData,
+                        kPrivateCertificateHashAuthToken,
+                        kIncomingConnectionSignedData));
+              } else if (frame_type ==
+                         ReturnFrameType::kOptionalSignedDataInvalid) {
+                mojo_v1frame = sharing::mojom::V1Frame::NewPairedKeyEncryption(
+                    sharing::mojom::PairedKeyEncryptionFrame::New(
+                        kIncomingConnectionInvalidSignedData,
+                        kPrivateCertificateHashAuthToken,
+                        kIncomingConnectionInvalidSignedData));
               } else {
                 mojo_v1frame = sharing::mojom::V1Frame::NewPairedKeyEncryption(
                     sharing::mojom::PairedKeyEncryptionFrame::New());
@@ -256,6 +283,13 @@
 } kParameters[] = {
     {true, true, PairedKeyVerificationRunnerTest::ReturnFrameType::kValid,
      PairedKeyVerificationRunner::PairedKeyVerificationResult::kSuccess},
+    {true, true,
+     PairedKeyVerificationRunnerTest::ReturnFrameType::kOptionalSignedDataValid,
+     PairedKeyVerificationRunner::PairedKeyVerificationResult::kSuccess},
+    {true, true,
+     PairedKeyVerificationRunnerTest::ReturnFrameType::
+         kOptionalSignedDataInvalid,
+     PairedKeyVerificationRunner::PairedKeyVerificationResult::kFail},
     {true, true, PairedKeyVerificationRunnerTest::ReturnFrameType::kEmpty,
      PairedKeyVerificationRunner::PairedKeyVerificationResult::kFail},
     {true, false, PairedKeyVerificationRunnerTest::ReturnFrameType::kValid,
@@ -292,8 +326,9 @@
 
   ExpectPairedKeyEncryptionFrameSent();
   if (params.encryption_frame_type ==
-      PairedKeyVerificationRunnerTest::ReturnFrameType::kValid)
+      PairedKeyVerificationRunnerTest::ReturnFrameType::kValid) {
     ExpectCertificateInfoSent();
+  }
 
   // Check for result frame sent.
   if (!params.is_valid_certificate) {
@@ -303,7 +338,10 @@
   }
 
   if (params.encryption_frame_type ==
-      PairedKeyVerificationRunnerTest::ReturnFrameType::kEmpty) {
+          PairedKeyVerificationRunnerTest::ReturnFrameType::kEmpty ||
+      params.encryption_frame_type ==
+          PairedKeyVerificationRunnerTest::ReturnFrameType::
+              kOptionalSignedDataInvalid) {
     ExpectPairedKeyResultFrameSent(sharing::nearby::PairedKeyResultFrame::FAIL);
     return;
   }
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index a7630e80..3ebed1f 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -150,30 +150,6 @@
             "Chrome.CommerceSubscriptions.ChromeManagedTimestamp";
 
     /**
-     * Saves a counter of how many continuous feature sessions in which a user has dismissed
-     * conditional tab strip.
-     */
-    public static final String CONDITIONAL_TAB_STRIP_CONTINUOUS_DISMISS_COUNTER =
-            "Chrome.ConditionalTabStrip.ContinuousDismissCounter";
-
-    /**
-     * Saves the feature status of conditional tab strip.
-     */
-    public static final String CONDITIONAL_TAB_STRIP_FEATURE_STATUS =
-            "Chrome.ConditionalTabStrip.FeatureStatus";
-
-    /**
-     * Saves the timestamp of the last time that conditional tab strip shows.
-     */
-    public static final String CONDITIONAL_TAB_STRIP_LAST_SHOWN_TIMESTAMP =
-            "Chrome.ConditionalTabStrip.LastShownTimeStamp";
-
-    /**
-     * Saves whether a user has chosen to opt-out the conditional tab strip feature.
-     */
-    public static final String CONDITIONAL_TAB_STRIP_OPT_OUT = "Chrome.ConditionalTabStrip.OptOut";
-
-    /**
      * Marks that the content suggestions surface has been shown.
      * Default value is false.
      */
@@ -1037,10 +1013,6 @@
                 CLOUD_MANAGEMENT_CLIENT_ID,
                 CLOUD_MANAGEMENT_DM_TOKEN,
                 COMMERCE_SUBSCRIPTIONS_CHROME_MANAGED_TIMESTAMP,
-                CONDITIONAL_TAB_STRIP_CONTINUOUS_DISMISS_COUNTER,
-                CONDITIONAL_TAB_STRIP_FEATURE_STATUS,
-                CONDITIONAL_TAB_STRIP_LAST_SHOWN_TIMESTAMP,
-                CONDITIONAL_TAB_STRIP_OPT_OUT,
                 CONTEXT_MENU_OPEN_IMAGE_IN_EPHEMERAL_TAB_CLICKED,
                 CONTEXT_MENU_OPEN_IN_EPHEMERAL_TAB_CLICKED,
                 CONTEXT_MENU_SEARCH_WITH_GOOGLE_LENS_CLICKED,
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index bb8cc82d..f0a8ce90 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -816,6 +816,7 @@
 // Deprecated 01/2023
 const char kSendDownloadToCloudPref[] =
     "enterprise_connectors.send_download_to_cloud";
+
 #if BUILDFLAG(IS_MAC)
 const char kDeviceTrustDisableKeyCreationPref[] =
     "enterprise_connectors.device_trust.disable_key_creation";
@@ -825,6 +826,12 @@
 const char kFileSystemSyncAccessHandleAsyncInterfaceEnabled[] =
     "policy.file_system_sync_access_handle_async_interface_enabled";
 
+// Deprecated 01/2023.
+#if !BUILDFLAG(IS_ANDROID)
+const char kMediaRouterTabMirroringSources[] =
+    "media_router.tab_mirroring_sources";
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 // Register local state used only for migration (clearing or moving to a new
 // key).
 void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) {
@@ -894,8 +901,9 @@
   // Deprecated 11/2022.
   registry->RegisterDictionaryPref(kLocalConsentsDictionary);
 
-  // Deprecated 01/2023
+  // Deprecated 01/2023.
   registry->RegisterListPref(kSendDownloadToCloudPref);
+
 #if BUILDFLAG(IS_MAC)
   registry->RegisterBooleanPref(kDeviceTrustDisableKeyCreationPref, false);
 #endif  // BUILDFLAG(IS_MAC)
@@ -1105,6 +1113,11 @@
   // Deprecated 01/2023.
   registry->RegisterBooleanPref(
       kFileSystemSyncAccessHandleAsyncInterfaceEnabled, false);
+
+  // Deprecated 01/2023.
+#if !BUILDFLAG(IS_ANDROID)
+  registry->RegisterListPref(kMediaRouterTabMirroringSources);
+#endif  // !BUILDFLAG(IS_ANDROID)
 }
 
 }  // namespace
@@ -2160,6 +2173,11 @@
   // Added 01/2023.
   profile_prefs->ClearPref(kFileSystemSyncAccessHandleAsyncInterfaceEnabled);
 
+  // Added 01/2023.
+#if !BUILDFLAG(IS_ANDROID)
+  profile_prefs->ClearPref(kMediaRouterTabMirroringSources);
+#endif  // !BUILDFLAG(IS_ANDROID)
+
   // Please don't delete the following line. It is used by PRESUBMIT.py.
   // END_MIGRATE_OBSOLETE_PROFILE_PREFS
 
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn
index 9e501f46..cafe4607 100644
--- a/chrome/browser/resources/BUILD.gn
+++ b/chrome/browser/resources/BUILD.gn
@@ -132,26 +132,17 @@
   }
 }
 
-if (enable_js_type_check) {
+if (is_chromeos_ash && enable_js_type_check) {
   group("closure_compile") {
-    deps = []
-    if (is_chromeos_ash) {
-      deps += [
-        "chromeos:closure_compile",
-        "chromeos/contact_center_insights:closure_compile",
-        "gaia_auth_host:closure_compile",
-        "nearby_internals:closure_compile",
-        "nearby_share:closure_compile",
-        "nearby_share/shared:closure_compile_module",
-        "settings:closure_compile",
-      ]
-    }
-    if (is_android) {
-      deps += [
-        "explore_sites_internals:closure_compile",
-        "video_tutorials:closure_compile",
-      ]
-    }
+    deps = [
+      "chromeos:closure_compile",
+      "chromeos/contact_center_insights:closure_compile",
+      "gaia_auth_host:closure_compile",
+      "nearby_internals:closure_compile",
+      "nearby_share:closure_compile",
+      "nearby_share/shared:closure_compile_module",
+      "settings:closure_compile",
+    ]
   }
 }
 
diff --git a/chrome/browser/resources/bookmarks/bookmarks.ts b/chrome/browser/resources/bookmarks/bookmarks.ts
index d810bf4f..d41249c 100644
--- a/chrome/browser/resources/bookmarks/bookmarks.ts
+++ b/chrome/browser/resources/bookmarks/bookmarks.ts
@@ -13,7 +13,7 @@
 export {BookmarksCommandManagerElement} from './command_manager.js';
 export {Command, DropPosition, IncognitoAvailability, LOCAL_STORAGE_FOLDER_STATE_KEY, LOCAL_STORAGE_TREE_WIDTH_KEY, MenuSource, ROOT_NODE_ID} from './constants.js';
 export {DialogFocusManager} from './dialog_focus_manager.js';
-export {DndManager, DragInfo} from './dnd_manager.js';
+export {DndManager, DragInfo, overrideFolderOpenerTimeoutDelay} from './dnd_manager.js';
 export {BookmarksEditDialogElement} from './edit_dialog.js';
 export {BookmarksFolderNodeElement} from './folder_node.js';
 export {BookmarksItemElement} from './item.js';
diff --git a/chrome/browser/resources/bookmarks/dnd_manager.ts b/chrome/browser/resources/bookmarks/dnd_manager.ts
index 9bc6faed..929b6b1 100644
--- a/chrome/browser/resources/bookmarks/dnd_manager.ts
+++ b/chrome/browser/resources/bookmarks/dnd_manager.ts
@@ -138,7 +138,11 @@
   }
 }
 
-const EXPAND_FOLDER_DELAY: number = 400;
+// Ms to wait during a dragover to open closed folder.
+let folderOpenerTimeoutDelay = 400;
+export function overrideFolderOpenerTimeoutDelay(ms: number) {
+  folderOpenerTimeoutDelay = ms;
+}
 
 /**
  * Manages auto expanding of sidebar folders on hover while dragging.
@@ -178,7 +182,7 @@
     if (overElement && overElement === this.lastElement_ &&
         dropPosition === DropPosition.ON) {
       if (x !== this.lastX_ || y !== this.lastY_) {
-        this.debouncer_.restartTimeout(EXPAND_FOLDER_DELAY);
+        this.debouncer_.restartTimeout(folderOpenerTimeoutDelay);
       }
     } else {
       // Otherwise, cancel the expander.
diff --git a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js
index 6006e71..e5b67d35 100644
--- a/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js
+++ b/chrome/browser/resources/chromeos/accessibility/switch_access/switch_access.js
@@ -12,6 +12,9 @@
 import {SAConstants} from './switch_access_constants.js';
 
 const AutomationNode = chrome.automation.AutomationNode;
+const EventType = chrome.automation.EventType;
+const FindParams = chrome.automation.FindParams;
+const RoleType = chrome.automation.RoleType;
 
 /**
  * The top-level class for the Switch Access accessibility feature. Handles
@@ -23,35 +26,41 @@
     SwitchAccess.instance = new SwitchAccess();
 
     const desktop = await AsyncUtil.getDesktop();
-    const focus = await AsyncUtil.getFocus();
+    const currentFocus = await AsyncUtil.getFocus();
 
+    SwitchAccess.waitForFocus_(desktop, currentFocus);
+  }
+
+  /**
+   * @param {!AutomationNode} desktop
+   * @param {AutomationNode} currentFocus
+   * @private
+   */
+  static waitForFocus_(desktop, currentFocus) {
     // Focus is available. Finish init without waiting for further events.
     // Disallow web view nodes, which indicate a root web area is still
     // loading and pending focus.
-    if (focus && focus.role !== chrome.automation.RoleType.WEB_VIEW) {
+    if (currentFocus && currentFocus.role !== RoleType.WEB_VIEW) {
       SwitchAccess.finishInit_(desktop);
       return;
     }
 
-    // Wait for the focus to be sent. If |focus| was undefined, this is
+    // Wait for the focus to be sent. If |currentFocus| was undefined, this is
     // guaranteed. Otherwise, also set a timed callback to ensure we do
     // eventually init.
     let callbackId = 0;
     const listener = maybeEvent => {
-      if (maybeEvent &&
-          maybeEvent.target.role === chrome.automation.RoleType.WEB_VIEW) {
+      if (maybeEvent && maybeEvent.target.role === RoleType.WEB_VIEW) {
         return;
       }
 
-      desktop.removeEventListener(
-          chrome.automation.EventType.FOCUS, listener, false);
+      desktop.removeEventListener(EventType.FOCUS, listener, false);
       clearTimeout(callbackId);
 
       SwitchAccess.finishInit_(desktop);
     };
 
-    desktop.addEventListener(
-        chrome.automation.EventType.FOCUS, listener, false);
+    desktop.addEventListener(EventType.FOCUS, listener, false);
     callbackId = setTimeout(listener, 5000);
   }
 
@@ -95,7 +104,7 @@
    * Helper function to robustly find a node fitting a given FindParams, even if
    * that node has not yet been created.
    * Used to find the menu and back button.
-   * @param {!chrome.automation.FindParams} findParams
+   * @param {!FindParams} findParams
    * @param {!function(!AutomationNode): void} foundCallback
    */
   static findNodeMatching(findParams, foundCallback) {
@@ -109,8 +118,7 @@
     // If it's not currently in the tree, listen for changes to the desktop
     // tree.
     const eventHandler = new EventHandler(
-        desktop, chrome.automation.EventType.CHILDREN_CHANGED,
-        null /** callback */);
+        desktop, EventType.CHILDREN_CHANGED, null /** callback */);
 
     const onEvent = event => {
       if (event.target.matches(findParams)) {
diff --git a/chrome/browser/resources/explore_sites_internals/BUILD.gn b/chrome/browser/resources/explore_sites_internals/BUILD.gn
deleted file mode 100644
index 05f8e12..0000000
--- a/chrome/browser/resources/explore_sites_internals/BUILD.gn
+++ /dev/null
@@ -1,23 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-assert(is_android)
-
-js_type_check("closure_compile") {
-  closure_flags = default_closure_args + mojom_js_args + [
-                    "js_module_root=" + rebase_path(".", root_build_dir),
-                    "js_module_root=" + rebase_path(
-                            "$root_gen_dir/mojom-webui/chrome/browser/ui/webui/explore_sites_internals",
-                            root_build_dir),
-                  ]
-  deps = [ ":explore_sites_internals" ]
-}
-
-js_library("explore_sites_internals") {
-  deps = [
-    "//chrome/browser/ui/webui/explore_sites_internals:mojo_bindings_webui_js",
-  ]
-}
diff --git a/chrome/browser/resources/explore_sites_internals/OWNERS b/chrome/browser/resources/explore_sites_internals/OWNERS
deleted file mode 100644
index de7517a..0000000
--- a/chrome/browser/resources/explore_sites_internals/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://chrome/browser/android/explore_sites/OWNERS
diff --git a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.css b/chrome/browser/resources/explore_sites_internals/explore_sites_internals.css
deleted file mode 100644
index 2cfbe3c..0000000
--- a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.css
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Copyright 2018 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-body {
-  margin: 1em;
-}
-
-.details {
-  width: 100%;
-}
-
-.details td {
-  min-width: 100px;
-}
-
-.details tr:nth-child(odd) {
-  background: rgb(239, 243, 255);
-}
-
-.controls {
-  display: flex;
-  justify-content: space-between;
-}
-
-#country-code-input {
-  display: inline-block;
-  flex-grow: 1;
-}
-
-.failed.throbber {
-  background: url(chrome://resources/images/error.svg);
-  background-size: contain;
-}
-
-.throbber {
-  margin-bottom: auto;
-  margin-top: auto;
-}
diff --git a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.html b/chrome/browser/resources/explore_sites_internals/explore_sites_internals.html
deleted file mode 100644
index 7bede74..0000000
--- a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-Copyright 2018 The Chromium Authors
-Use of this source code is governed by a BSD-style license that can be
-found in the LICENSE file.
--->
-
-<!doctype html>
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  <title>Explore Sites Internals</title>
-  <link rel="stylesheet" href="chrome://resources/css/chrome_shared.css">
-  <link rel="stylesheet" href="chrome://resources/css/throbber.css">
-  <link rel="stylesheet" href="explore_sites_internals.css">
-
-  <script type="module" src="explore_sites_internals.js"></script>
-</head>
-
-<body>
-  <div id="properties">
-    <h3>Properties</h3>
-    <div>
-      <table class="details">
-        <tr>
-          <td>Server Endpoint</td>
-          <td id="server-endpoint"></td>
-        </tr>
-        <tr>
-          <td>Country Code</td>
-          <td id="country-code"></td>
-        </tr>
-        <tr>
-          <td>Chrome flags setup correctly</td>
-          <td id="chrome-flags-setup"></td>
-        </tr>
-      </table>
-    </div>
-  </div>
-
-  <div>
-    <h3>Cached Catalog</h3>
-    <div class="controls">
-      <button id="clear-cached-catalog">Clear suggestions</button>
-      <div id="clear-catalog-throbber" class="throbber" hidden></div>
-    </div>
-    <h3>Override Country Code</h3>
-    <div class="controls">
-      <button id="override-country-code">Override country:</button>
-      <input class="expand" id="country-code-input" type="text">
-      <div id="country-override-throbber" class="throbber" hidden></div>
-    </div>
-    <p>
-      Country override is reset when Chrome shuts down. Press "Force fetch"
-      to download the catalog for the new country.
-    </p>
-    <h3>Network Requests</h3>
-    <div class="controls">
-      <button id="force-network-request">Force fetch</button>
-      <div id="network-request-throbber" class="throbber" hidden></div>
-  </div>
-</body>
-</html>
diff --git a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js b/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js
deleted file mode 100644
index 1170fd4..0000000
--- a/chrome/browser/resources/explore_sites_internals/explore_sites_internals.js
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {PageHandler} from './explore_sites_internals.mojom-webui.js';
-
-// Reference to the backend.
-let pageHandler = null;
-
-function delay(ms) {
-  return new Promise((resolve, reject) => setTimeout(resolve, ms));
-}
-
-/** Setting this class changes a throbber to show an error symbol. */
-const FAILED_CSS_CLASS = 'failed';
-
-/**
- * Shows a throbber with ID |id|.
- * @param {string} id The HTML id of the throbber element to reveal.
- * @param {!Promise} promiseToWaitFor The throbber won't be hidden before this
- *     promise resolves.
- * @return {!Promise} Resolves with the result of promiseToWaitFor after the
- *     minimum delay has completed.
- */
-function showThrobber(id, promiseToWaitFor) {
-  const delayMs = 400;
-  const element = document.body.querySelector(`#${id}`);
-  element.classList.remove(FAILED_CSS_CLASS);
-
-  element.removeAttribute('hidden');
-  return Promise.all([delay(delayMs), promiseToWaitFor]).then(results => {
-    element.hidden = true;
-    return results[1];
-  });
-}
-
-/**
- * Get the current Explore Sites service parameters and fill the DOM with
- * the values.
- */
-function updatePageWithProperties() {
-  pageHandler.getProperties().then(function(response) {
-    for (const [field, value] of Object.entries(response.properties)) {
-      document.body.querySelector(`#${field}`).textContent = value;
-    }
-  });
-}
-
-/**
- * Removes any existing catalogs and their version_token markers from the
- * catalog.
- */
-function clearCachedCatalog() {
-  const id = 'clear-catalog-throbber';
-  showThrobber(id, pageHandler.clearCachedExploreSitesCatalog())
-      .then(success => {
-        document.body.querySelector(`#${id}`).classList.toggle(
-            FAILED_CSS_CLASS, !success);
-      });
-}
-
-/**
- * Sets the country code on ExploreSitesService in order to override the Finch
- * and geolocation based parameter.
- */
-function overrideCountryCode() {
-  const id = 'country-override-throbber';
-  const newCountryCode =
-      document.body.querySelector('#country-code-input').value;
-  showThrobber(id, pageHandler.overrideCountryCode(newCountryCode))
-      .then(success => {
-        document.body.querySelector(`#${id}`).classList.toggle(
-            FAILED_CSS_CLASS, !success);
-        updatePageWithProperties();
-      });
-}
-
-/**
- * Causes the Explore Sites service to request a catalog from the network as a
- * "foreground" request.  Does not override any of the local data, so the
- * downloaded network may be unchanged.
- */
-function forceNetworkRequest() {
-  const id = 'network-request-throbber';
-  showThrobber(id, pageHandler.forceNetworkRequest()).then(e => {
-    document.body.querySelector(`#${id}`).classList.toggle(
-        FAILED_CSS_CLASS, !e.success);
-  });
-}
-
-document.addEventListener('DOMContentLoaded', function() {
-  // Setup backend mojo.
-  pageHandler = PageHandler.getRemote();
-  updatePageWithProperties();
-
-  // Set up event listeners.
-  document.body.querySelector('#clear-cached-catalog').onclick =
-      clearCachedCatalog;
-  document.body.querySelector('#override-country-code').onclick =
-      overrideCountryCode;
-  document.body.querySelector('#force-network-request').onclick =
-      forceNetworkRequest;
-});
diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn
index b05bf96..dd398aa 100644
--- a/chrome/browser/resources/settings/chromeos/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/BUILD.gn
@@ -84,13 +84,12 @@
     ":generate_html_wrapper_files",
     ":generate_mojom_webui",
     ":preprocess",
-    ":preprocess_generated_web_component_files",
     "//ash/webui/common/resources:generate_definitions",
   ]
   definitions = ts_definition_files
   root_dir = tsc_input_dir
-  in_files = src_ts_files + html_wrapper_files + css_wrapper_files +
-             generated_web_component_files + mojom_webui_files
+  in_files =
+      src_ts_files + html_wrapper_files + css_wrapper_files + mojom_webui_files
   out_dir = tsc_output_dir
 }
 
@@ -101,19 +100,7 @@
   out_folder = tsc_input_dir
 }
 
-preprocess_if_expr("preprocess_generated_web_component_files") {
-  defines = chrome_grit_defines
-  deps = [
-    # preprocess should happen before these code gen.
-    # This remaining target should natually disappear after we migrated fully
-    # to typescript.
-    ":generate_web_components",
-  ]
-  in_folder = get_path_info("../", "gen_dir")
-  in_files = generated_web_component_files
-  out_folder = tsc_input_dir
-}
-
+# preprocess should happen before these code gen.
 html_to_wrapper("generate_html_wrapper_files") {
   deps = [ ":preprocess" ]
   in_files = html_files
@@ -121,6 +108,7 @@
   out_folder = tsc_input_dir
 }
 
+# preprocess should happen before these code gen.
 css_to_wrapper("generate_css_wrapper_files") {
   deps = [ ":preprocess" ]
   in_files = css_files
@@ -278,15 +266,6 @@
   }
 }
 
-group("generate_web_components") {
-  public_deps = [
-    # Sub-folder targets
-    "nearby_share_page:web_components",
-    "os_a11y_page:web_components",
-    "os_privacy_page:web_components",
-  ]
-}
-
 # TODO(crbug/1315757) Gradually remove closure compilation for subfolders/pages
 # that are migrated to TypeScript
 group("closure_compile_module") {
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.html b/chrome/browser/resources/settings/chromeos/device_page/audio.html
index e2de3f15..0e5cffe6 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/audio.html
+++ b/chrome/browser/resources/settings/chromeos/device_page/audio.html
@@ -63,6 +63,20 @@
   :host(:not([is-output-muted_])) #audioOutputMuteButton:hover {
     --cr-icon-button-fill-color: var(--cros-color-primary);
   }
+
+  :host([is-input-muted_]) #audioInputGainVolumeSlider {
+    --cr-slider-active-color: var(--cros-slider-color-inactive);
+    --cr-slider-container-color: var(--cros-slider-track-color-inactive);
+    --cr-slider-knob-color-rgb: var(--cros-color-primary-rgb);
+  }
+
+  :host([is-input-muted_]) #audioInputGainMuteButton {
+    --cr-icon-button-fill-color: var(--cros-color-secondary);
+  }
+
+  :host(:not([is-input-muted_])) #audioInputGainMuteButton {
+    --cr-icon-button-fill-color: var(--cros-color-prominent);
+  }
 </style>
 
 <!-- Output section -->
@@ -136,7 +150,8 @@
           <div>
             <!--TODO(b/260277007): Replace icon once mic-on and mic-off icons
                 available. -->
-            <cr-icon-button id="audioInputGainMuteButton" iron-icon="cr:mic"
+            <cr-icon-button id="audioInputGainMuteButton"
+                iron-icon="[[getInputIcon_(isInputMuted_)]]"
                 on-click="onInputMuteClicked">
             </cr-icon-button>
             <cr-slider id ="audioInputGainVolumeSlider" min="0" max="100"
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.ts b/chrome/browser/resources/settings/chromeos/device_page/audio.ts
index 50a4b95..4826f943 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/audio.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/audio.ts
@@ -60,6 +60,11 @@
         reflectToAttribute: true,
       },
 
+      isInputMuted_: {
+        type: Boolean,
+        reflectToAttribute: true,
+      },
+
       isNoiseCancellationEnabled_: {
         type: Boolean,
         observer:
@@ -228,6 +233,11 @@
       return;
     }
   }
+
+  /** Handles updating the mic icon depending on the input mute state. */
+  protected getInputIcon_(): string {
+    return this.isInputMuted_ ? 'settings:mic-off' : 'cr:mic';
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
index bc297983..59183b5 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -18,23 +18,14 @@
   is_polymer3 = true
   deps = [
     ":multidevice_browser_proxy",
-    ":multidevice_combined_setup_item",
     ":multidevice_constants",
     ":multidevice_feature_behavior",
-    ":multidevice_feature_item",
-    ":multidevice_feature_toggle",
     ":multidevice_metrics_logger",
     ":multidevice_notification_access_setup_dialog",
     ":multidevice_page",
     ":multidevice_permissions_setup_dialog",
-    ":multidevice_radio_button",
     ":multidevice_screen_lock_subpage",
     ":multidevice_subpage",
-    ":multidevice_task_continuation_disabled_link",
-    ":multidevice_task_continuation_item",
-    ":multidevice_tether_item",
-    ":multidevice_wifi_sync_disabled_link",
-    ":multidevice_wifi_sync_item",
   ]
 }
 
@@ -57,28 +48,6 @@
   ]
 }
 
-js_library("multidevice_feature_item") {
-  deps = [
-    ":multidevice_constants",
-    ":multidevice_feature_behavior",
-    ":multidevice_feature_toggle",
-    ":multidevice_metrics_logger",
-    "..:os_route",
-    "..:route_origin_behavior",
-    "..:router",
-    "//ash/webui/common/resources:assert",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("multidevice_feature_toggle") {
-  deps = [
-    ":multidevice_constants",
-    ":multidevice_feature_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
 js_library("multidevice_page") {
   deps = [
     ":multidevice_browser_proxy",
@@ -116,21 +85,10 @@
   ]
 }
 
-js_library("multidevice_radio_button") {
-  deps = [ "//third_party/polymer/v3_0/components-chromium/paper-behaviors:paper-ripple-behavior" ]
-  externs_list = [
-    "//ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_externs.js",
-    "//ui/webui/resources/cr_elements/policy/cr_policy_indicator_externs.js",
-  ]
-}
-
 js_library("multidevice_subpage") {
   deps = [
     ":multidevice_browser_proxy",
-    ":multidevice_combined_setup_item",
     ":multidevice_constants",
-    ":multidevice_task_continuation_item",
-    ":multidevice_wifi_sync_item",
     "..:deep_linking_behavior",
     "..:os_route",
     "..:os_settings_routes",
@@ -141,80 +99,6 @@
   ]
 }
 
-js_library("multidevice_combined_setup_item") {
-  deps = [
-    ":multidevice_constants",
-    ":multidevice_feature_behavior",
-    ":multidevice_feature_item",
-    "//ash/webui/common/resources:web_ui_listener_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [ "../settings_controls_types.js" ]
-}
-
-js_library("multidevice_tether_item") {
-  deps = [
-    ":multidevice_feature_behavior",
-    "..:os_route",
-    "..:os_settings_routes",
-    "//ash/webui/common/resources/network:mojo_interface_provider",
-    "//ash/webui/common/resources/network:network_listener_behavior",
-    "//ash/webui/common/resources/network:onc_mojo",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("multidevice_task_continuation_item") {
-  deps = [
-    ":multidevice_constants",
-    ":multidevice_feature_behavior",
-    ":multidevice_feature_item",
-    ":multidevice_task_continuation_disabled_link",
-    "//ash/webui/common/resources:web_ui_listener_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [ "../settings_controls_types.js" ]
-}
-
-js_library("multidevice_wifi_sync_item") {
-  deps = [
-    ":multidevice_feature_behavior",
-    ":multidevice_feature_item",
-    ":multidevice_wifi_sync_disabled_link",
-    "..:os_route",
-    "..:route_origin_behavior",
-    "..:router",
-    "../os_people_page:os_sync_browser_proxy",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources:load_time_data.m",
-    "//ash/webui/common/resources:web_ui_listener_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-  externs_list = [ "../settings_controls_types.js" ]
-}
-
-js_library("multidevice_task_continuation_disabled_link") {
-  deps = [
-    "..:os_route",
-    "..:router",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources:load_time_data.m",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
-js_library("multidevice_wifi_sync_disabled_link") {
-  deps = [
-    ":multidevice_feature_behavior",
-    "..:os_route",
-    "..:route_origin_behavior",
-    "..:router",
-    "//ash/webui/common/resources:i18n_behavior",
-    "//ash/webui/common/resources:load_time_data.m",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
 js_library("multidevice_screen_lock_subpage") {
   deps = [
     "../os_people_page:lock_screen_password_prompt_dialog",
@@ -229,18 +113,6 @@
   externs_list = [ "$externs_path/chrome_extensions.js" ]
 }
 
-js_library("multidevice_smartlock_item") {
-  deps = [
-    ":multidevice_browser_proxy",
-    ":multidevice_constants",
-    ":multidevice_feature_behavior",
-    ":multidevice_feature_item",
-    "..:metrics_recorder",
-    "//ash/webui/common/resources:web_ui_listener_behavior",
-    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-  ]
-}
-
 js_library("multidevice_metrics_logger") {
   deps = [ "//ash/webui/common/resources:assert" ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.ts
similarity index 81%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.ts
index 769ee1a1..a6d5341 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.ts
@@ -11,28 +11,25 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import './multidevice_feature_item.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Constructor} from '../common/types';
+
 import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_browser_proxy.js';
 import {getTemplate} from './multidevice_combined_setup_item.html.js';
 import {PhoneHubPermissionsSetupFeatureCombination} from './multidevice_constants.js';
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- * @implements {I18nBehaviorInterface}
- */
 const SettingsMultideviceCombinedSetupItemElementBase =
-    mixinBehaviors([MultiDeviceFeatureBehavior, I18nBehavior], PolymerElement);
+    mixinBehaviors([MultiDeviceFeatureBehavior], I18nMixin(PolymerElement)) as
+    Constructor<PolymerElement&I18nMixinInterface&
+                MultiDeviceFeatureBehaviorInterface>;
 
-/** @polymer */
 class SettingsMultideviceCombinedSetupItemElement extends
     SettingsMultideviceCombinedSetupItemElementBase {
   static get is() {
-    return 'settings-multidevice-combined-setup-item';
+    return 'settings-multidevice-combined-setup-item' as const;
   }
 
   static get template() {
@@ -59,14 +56,12 @@
         value: false,
       },
 
-      /** @private */
       setupName_: {
         type: String,
         computed: 'getSetupName_(cameraRoll, notifications, appStreaming)',
         reflectToAttribute: true,
       },
 
-      /** @private */
       setupSummary_: {
         type: String,
         computed: 'getSetupSummary_(cameraRoll, notifications, appStreaming)',
@@ -75,19 +70,21 @@
     };
   }
 
-  /** @override */
+  cameraRoll: boolean;
+  notifications: boolean;
+  appStreaming: boolean;
+
+  private browserProxy_: MultiDeviceBrowserProxy;
+  private setupName_: string;
+  private setupSummary_: string;
+
   constructor() {
     super();
 
-    /** @private {!MultiDeviceBrowserProxy} */
     this.browserProxy_ = MultiDeviceBrowserProxyImpl.getInstance();
   }
 
-  /**
-   * @return {string}
-   * @private
-   */
-  getSetupName_() {
+  private getSetupName_(): string {
     if (this.cameraRoll && this.notifications && this.appStreaming) {
       return this.i18n(
           'multidevicePhoneHubCameraRollNotificationsAndAppsItemTitle');
@@ -105,11 +102,7 @@
     return '';
   }
 
-  /**
-   * @return {string}
-   * @private
-   */
-  getSetupSummary_() {
+  private getSetupSummary_(): string {
     if (this.cameraRoll && this.notifications && this.appStreaming) {
       return this.i18n(
           'multidevicePhoneHubCameraRollNotificationsAndAppsItemSummary');
@@ -127,8 +120,7 @@
     return '';
   }
 
-  /** @private */
-  handlePhoneHubSetupClick_() {
+  private handlePhoneHubSetupClick_(): void {
     const permissionSetupRequiredEvent = new CustomEvent(
         'permission-setup-requested', {bubbles: true, composed: true});
     this.dispatchEvent(permissionSetupRequiredEvent);
@@ -152,15 +144,21 @@
     this.browserProxy_.logPhoneHubPermissionSetUpButtonClicked(setupMode);
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  getButtonDisabledState_() {
+  private getButtonDisabledState_(): boolean {
     return !this.isSuiteOn() || !this.isPhoneHubOn();
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceCombinedSetupItemElement.is]:
+        SettingsMultideviceCombinedSetupItemElement;
+  }
+  interface HTMLElementEventMap {
+    'permission-setup-requested': CustomEvent;
+  }
+}
+
 customElements.define(
     SettingsMultideviceCombinedSetupItemElement.is,
     SettingsMultideviceCombinedSetupItemElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.ts
similarity index 71%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.ts
index b96f51c..2863a354 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_item.ts
@@ -18,33 +18,30 @@
 import '../../settings_shared.css.js';
 import './multidevice_feature_toggle.js';
 
-import {assert} from 'chrome://resources/ash/common/assert.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {castExists} from '../assert_extras.js';
+import {Constructor} from '../common/types';
 import {routes} from '../os_route.js';
-import {RouteOriginBehavior, RouteOriginBehaviorInterface} from '../route_origin_behavior.js';
+import {RouteOriginMixin, RouteOriginMixinInterface} from '../route_origin_mixin.js';
 import {Route, Router} from '../router.js';
 
 import {MultiDeviceFeature} from './multidevice_constants.js';
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
 import {getTemplate} from './multidevice_feature_item.html.js';
-import {SettingsMultideviceFeatureToggleElement} from './multidevice_feature_toggle.js';
 import {recordSmartLockToggleMetric, SmartLockToggleLocation} from './multidevice_metrics_logger.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- * @implements {RouteOriginBehaviorInterface}
- */
-const SettingsMultideviceFeatureItemElementBase = mixinBehaviors(
-    [MultiDeviceFeatureBehavior, RouteOriginBehavior], PolymerElement);
+const SettingsMultideviceFeatureItemElementBase =
+    mixinBehaviors(
+        [MultiDeviceFeatureBehavior], RouteOriginMixin(PolymerElement)) as
+    Constructor<PolymerElement&RouteOriginMixinInterface&
+                MultiDeviceFeatureBehaviorInterface>;
 
-/** @polymer */
-class SettingsMultideviceFeatureItemElement extends
+export class SettingsMultideviceFeatureItemElement extends
     SettingsMultideviceFeatureItemElementBase {
   static get is() {
-    return 'settings-multidevice-feature-item';
+    return 'settings-multidevice-feature-item' as const;
   }
 
   static get template() {
@@ -53,14 +50,12 @@
 
   static get properties() {
     return {
-      /** @type {!MultiDeviceFeature} */
       feature: Number,
 
       /**
        * If it is truthy, the item should be actionable and clicking on it
        * should navigate to the provided route. Otherwise, the item does not
        * have a subpage to navigate to.
-       * @type {!Route|undefined}
        */
       subpageRoute: Object,
 
@@ -81,7 +76,6 @@
       /**
        * URLSearchParams for subpage route. No param is provided if it is
        * undefined.
-       * @type {URLSearchParams|undefined}
        */
       subpageRouteUrlSearchParams: Object,
 
@@ -100,13 +94,22 @@
     };
   }
 
+  feature: MultiDeviceFeature;
+  icon: string;
+  iconTooltip: string;
+  isSubFeature: boolean;
+  isFeatureIconHidden: boolean;
+  subpageRoute: Route|undefined;
+  subpageRouteUrlSearchParams: URLSearchParams|undefined;
+  private route_: Route;
+
   constructor() {
     super();
 
     this.route_ = routes.MULTIDEVICE_FEATURES;
   }
 
-  ready() {
+  override ready(): void {
     super.ready();
 
     this.addEventListener(
@@ -115,46 +118,32 @@
     this.addFocusConfig(this.subpageRoute, '#subpageButton');
   }
 
-  /** @override */
-  focus() {
-    const slot =
-        this.shadowRoot.querySelector('slot[name="feature-controller"]');
+  override focus(): void {
+    const slot = castExists(this.shadowRoot!.querySelector<HTMLSlotElement>(
+        'slot[name="feature-controller"]'));
     const elems = slot.assignedElements({flatten: true});
     assert(elems.length > 0);
     // Elems contains any elements that override the feature controller. If none
     // exist, contains the default toggle elem.
-    elems[0].focus();
+    (elems[0] as HTMLElement).focus();
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  isRowClickable_() {
+  private isRowClickable_(): boolean {
     return this.hasSubpageClickHandler_() ||
         this.isFeatureStateEditable(this.feature);
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  hasSubpageClickHandler_() {
+  private hasSubpageClickHandler_(): boolean {
     return !!this.subpageRoute && this.isFeatureAllowedByPolicy(this.feature);
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  shouldShowSeparator_() {
+  private shouldShowSeparator_(): boolean {
     return this.hasSubpageClickHandler_() || !!this.iconTooltip;
   }
 
-  /** @private */
-  handleItemClick_(event) {
+  private handleItemClick_(event: Event): void {
     // We do not navigate away if the click was on a link.
-    if (event.composedPath()[0].tagName === 'A') {
+    if ((event.composedPath()[0] as Element).tagName === 'A') {
       event.stopPropagation();
       return;
     }
@@ -163,10 +152,8 @@
       if (this.isFeatureStateEditable(this.feature)) {
         // Toggle the editable feature if the feature is editable and does not
         // link to a subpage.
-        const toggleButton =
-            /** @type {SettingsMultideviceFeatureToggleElement} */
-            (this.shadowRoot.querySelector(
-                'settings-multidevice-feature-toggle'));
+        const toggleButton = castExists(this.shadowRoot!.querySelector(
+            'settings-multidevice-feature-toggle'));
         toggleButton.toggleFeature();
       }
       return;
@@ -175,9 +162,10 @@
     // Remove the search term when navigating to avoid potentially having any
     // visible search term reappear at a later time. See
     // https://crbug.com/989119.
+    assert(this.subpageRoute);
     Router.getInstance().navigateTo(
-        /** @type {!Route} */ (this.subpageRoute),
-        this.subpageRouteUrlSearchParams, true /* opt_removeSearch */);
+        this.subpageRoute, this.subpageRouteUrlSearchParams,
+        true /* opt_removeSearch */);
   }
 
 
@@ -185,20 +173,17 @@
    * The class name used for given multidevice feature item text container
    * Checks if icon is present next to text to determine if class 'middle'
    * applies
-   * @param {boolean} isFeatureIconHidden
-   * @return {string}
-   * @private
    */
-  getItemTextContainerClassName_(isFeatureIconHidden) {
+  private getItemTextContainerClassName_(isFeatureIconHidden: boolean): string {
     return isFeatureIconHidden ? 'start' : 'middle';
   }
 
   /**
    * Intercept (but do not stop propagation of) the feature-toggle-clicked event
    * for the purpose of logging metrics.
-   * @private
    */
-  onFeatureToggleClicked_(event) {
+  private onFeatureToggleClicked_(
+      event: CustomEvent<{feature: MultiDeviceFeature, enabled: boolean}>) {
     const feature = event.detail.feature;
     const enabled = event.detail.enabled;
 
@@ -213,6 +198,13 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceFeatureItemElement.is]:
+        SettingsMultideviceFeatureItemElement;
+  }
+}
+
 customElements.define(
     SettingsMultideviceFeatureItemElement.is,
     SettingsMultideviceFeatureItemElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.ts
similarity index 80%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.ts
index eaf1e6e..2e541c2 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_toggle.ts
@@ -13,25 +13,29 @@
 
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 
+import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Constructor} from '../common/types.js';
+
 import {MultiDeviceFeature, MultiDeviceFeatureState} from './multidevice_constants.js';
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
 import {getTemplate} from './multidevice_feature_toggle.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- */
-const SettingsMultideviceFeatureToggleElementBase =
-    mixinBehaviors([MultiDeviceFeatureBehavior], PolymerElement);
+export interface SettingsMultideviceFeatureToggleElement {
+  $: {
+    toggle: CrToggleElement,
+  };
+}
 
-/** @polymer */
+const SettingsMultideviceFeatureToggleElementBase =
+    mixinBehaviors([MultiDeviceFeatureBehavior], PolymerElement) as
+    Constructor<PolymerElement&MultiDeviceFeatureBehaviorInterface>;
+
 export class SettingsMultideviceFeatureToggleElement extends
     SettingsMultideviceFeatureToggleElementBase {
   static get is() {
-    return 'settings-multidevice-feature-toggle';
+    return 'settings-multidevice-feature-toggle' as const;
   }
 
   static get template() {
@@ -40,12 +44,8 @@
 
   static get properties() {
     return {
-      /** @type {!MultiDeviceFeature} */
       feature: Number,
-
       toggleAriaLabel: String,
-
-      /** @private {boolean} */
       checked_: Boolean,
     };
   }
@@ -54,15 +54,17 @@
     return ['resetChecked_(feature, pageContentData)'];
   }
 
-  /** @override */
-  ready() {
+  feature: MultiDeviceFeature;
+  toggleAriaLabel: string;
+  private checked_: boolean;
+
+  override ready(): void {
     super.ready();
 
     this.addEventListener('click', this.onDisabledInnerToggleClick_);
   }
 
-  /** @override */
-  focus() {
+  override focus(): void {
     this.$.toggle.focus();
   }
 
@@ -71,7 +73,7 @@
    * without other links. It attempts to toggle the feature's status if the user
    * is allowed.
    */
-  toggleFeature() {
+  toggleFeature(): void {
     this.resetChecked_();
 
     // Pass the negation of |this.checked_|: this indicates that if the toggle
@@ -90,9 +92,8 @@
    * MultiDevice mojo service, we need the cr-toggle to appear not to change
    * when pressed. This method resets it before a change is visible to the
    * user.
-   * @private
    */
-  resetChecked_() {
+  private resetChecked_(): void {
     // If Phone Hub notification access is prohibited, the toggle is always off.
     if (this.feature === MultiDeviceFeature.PHONE_HUB_NOTIFICATIONS &&
         this.isPhoneHubNotificationAccessProhibited()) {
@@ -120,21 +121,30 @@
    * while it is disabled, the click event targets the parent element directly
    * instead of propagating through the cr-toggle. This handler prevents such a
    * click from unintentionally bubbling up the tree.
-   * @private
    */
-  onDisabledInnerToggleClick_(event) {
+  private onDisabledInnerToggleClick_(event: Event) {
     event.stopPropagation();
   }
 
   /**
    * Returns the A11y label for the toggle.
-   * @private
    */
-  getToggleA11yLabel_() {
+  private getToggleA11yLabel_(): string {
     return this.toggleAriaLabel || this.getFeatureName(this.feature);
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceFeatureToggleElement.is]:
+        SettingsMultideviceFeatureToggleElement;
+  }
+  interface HTMLElementEventMap {
+    'feature-toggle-clicked':
+        CustomEvent<{feature: MultiDeviceFeature, enabled: boolean}>;
+  }
+}
+
 customElements.define(
     SettingsMultideviceFeatureToggleElement.is,
     SettingsMultideviceFeatureToggleElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.ts
similarity index 71%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.ts
index 7b2ad28..80d9e752 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_radio_button.ts
@@ -6,38 +6,22 @@
 import 'chrome://resources/cr_elements/policy/cr_policy_indicator.js';
 import '../../settings_shared.css.js';
 
-import {CrRadioButtonMixin} from 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button_mixin.js';
+import {CrRadioButtonMixin, CrRadioButtonMixinInterface} from 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button_mixin.js';
 import {PaperRippleBehavior} from 'chrome://resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js';
+import {PaperRippleElement} from 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Constructor} from '../common/types.js';
+
 import {getTemplate} from './multidevice_radio_button.html.js';
 
-class PaperRippleBehaviorInterface {
-  constructor() {
-    /**
-     * @type {?Element}
-     * @protected
-     */
-    this._rippleContainer;
-  }
-
-  /** @return {!HTMLElement} */
-  getRipple() {}
-}
-
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {CrRadioButtonMixinInterface}
- * @implements {PaperRippleBehaviorInterface}
- */
 const MultideviceRadioButtonElementBase =
-    mixinBehaviors([PaperRippleBehavior], CrRadioButtonMixin(PolymerElement));
+    mixinBehaviors([PaperRippleBehavior], CrRadioButtonMixin(PolymerElement)) as
+    Constructor<PolymerElement&CrRadioButtonMixinInterface&PaperRippleBehavior>;
 
-/** @polymer */
 class MultideviceRadioButtonElement extends MultideviceRadioButtonElementBase {
   static get is() {
-    return 'multidevice-radio-button';
+    return 'multidevice-radio-button' as const;
   }
 
   static get template() {
@@ -68,21 +52,20 @@
     };
   }
 
-  ready() {
+  override ready(): void {
     super.ready();
     this.setAttribute('role', 'radio');
   }
 
   // Overridden from CrRadioButtonMixin
-  /** @override */
-  getPaperRipple() {
+  override getPaperRipple(): PaperRippleElement {
     return this.getRipple();
   }
 
   // Overridden from PaperRippleBehavior
   /* eslint-disable-next-line @typescript-eslint/naming-convention */
-  _createRipple() {
-    this._rippleContainer = this.shadowRoot.querySelector('.disc-wrapper');
+  override _createRipple(): PaperRippleElement {
+    this._rippleContainer = this.shadowRoot!.querySelector('.disc-wrapper');
     const ripple = super._createRipple();
     ripple.id = 'ink';
     ripple.setAttribute('recenters', '');
@@ -90,21 +73,25 @@
     return ripple;
   }
 
-  getLabel_(label) {
+  private getLabel_(label: string): string {
     return label;
   }
 
   /**
    * Prevents on-click handles on the control from being activated when the
    * indicator is clicked.
-   * @param {!Event} e The click event.
-   * @private
    */
-  onIndicatorTap_(e) {
+  private onIndicatorTap_(e: Event): void {
     e.preventDefault();
     e.stopPropagation();
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [MultideviceRadioButtonElement.is]: MultideviceRadioButtonElement;
+  }
+}
+
 customElements.define(
     MultideviceRadioButtonElement.is, MultideviceRadioButtonElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.ts
similarity index 66%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.ts
index 9ae5529..5cc3d86 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.ts
@@ -12,9 +12,10 @@
 
 import './multidevice_feature_item.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
+import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {Constructor} from '../common/types';
 import {recordSettingChange} from '../metrics_recorder.js';
 import {routes} from '../os_route.js';
 import {OsSettingsRoutes} from '../os_settings_routes.js';
@@ -22,22 +23,25 @@
 import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_browser_proxy.js';
 import {MultiDeviceFeature, MultiDevicePageContentData, MultiDeviceSettingsMode} from './multidevice_constants.js';
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
+import {SettingsMultideviceFeatureItemElement} from './multidevice_feature_item.js';
 import {getTemplate} from './multidevice_smartlock_item.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- * @implements {WebUIListenerBehaviorInterface}
- */
-const SettingsMultideviceSmartlockItemElementBase = mixinBehaviors(
-    [MultiDeviceFeatureBehavior, WebUIListenerBehavior], PolymerElement);
+interface SettingsMultideviceSmartlockItemElement {
+  $: {
+    smartLockItem: SettingsMultideviceFeatureItemElement,
+  };
+}
 
-/** @polymer */
+const SettingsMultideviceSmartlockItemElementBase =
+    mixinBehaviors(
+        [MultiDeviceFeatureBehavior], WebUiListenerMixin(PolymerElement)) as
+    Constructor<PolymerElement&WebUiListenerMixinInterface&
+                MultiDeviceFeatureBehaviorInterface>;
+
 class SettingsMultideviceSmartlockItemElement extends
     SettingsMultideviceSmartlockItemElementBase {
   static get is() {
-    return 'settings-multidevice-smartlock-item';
+    return 'settings-multidevice-smartlock-item' as const;
   }
 
   static get template() {
@@ -47,8 +51,7 @@
   static get properties() {
     return {
       /**
-       * Alias for allowing Polymer bindings to routes.
-       * @type {?OsSettingsRoutes}
+       * Alias for allowing Polymer HTML bindings to routes.
        */
       routes: {
         type: Object,
@@ -57,7 +60,6 @@
 
       /**
        * Authentication token provided by lock-screen-password-prompt-dialog.
-       * @type {!chrome.quickUnlockPrivate.TokenInfo|undefined}
        */
       authToken: {
         type: Object,
@@ -65,27 +67,24 @@
     };
   }
 
+  authToken: chrome.quickUnlockPrivate.TokenInfo|undefined;
+  routes: OsSettingsRoutes|null;
+  private browserProxy_: MultiDeviceBrowserProxy;
+
   constructor() {
     super();
 
-    /** @private {!MultiDeviceBrowserProxy} */
     this.browserProxy_ = MultiDeviceBrowserProxyImpl.getInstance();
   }
 
-  /** @override */
-  ready() {
+  override ready(): void {
     super.ready();
 
     this.addEventListener('feature-toggle-clicked', (event) => {
-      this.onFeatureToggleClicked_(
-          /**
-           * @type {!CustomEvent<!{feature: !MultiDeviceFeature, enabled:
-           *  boolean}>}
-           */
-          (event));
+      this.onFeatureToggleClicked_(event);
     });
 
-    this.addWebUIListener(
+    this.addWebUiListener(
         'settings.updateMultidevicePageContentData',
         this.onPageContentDataChanged_.bind(this));
 
@@ -93,24 +92,15 @@
         this.onPageContentDataChanged_.bind(this));
   }
 
-  /** @override */
-  focus() {
+  override focus(): void {
     this.$.smartLockItem.focus();
   }
 
-  /**
-   * @param {!MultiDevicePageContentData} newData
-   * @private
-   */
-  onPageContentDataChanged_(newData) {
+  private onPageContentDataChanged_(newData: MultiDevicePageContentData): void {
     this.pageContentData = newData;
   }
 
-  /**
-   * @return {boolean}
-   * @private
-   */
-  shouldShowFeature_() {
+  private shouldShowFeature_(): boolean {
     // We only show the feature when it is editable, because a disabled toggle
     // is confusing for the user without greater context.
     return this.isFeatureSupported(MultiDeviceFeature.SMART_LOCK) &&
@@ -124,23 +114,26 @@
    * provided by the parent element.
    * TODO(crbug.com/1229430) refactor to avoid duplicating code from the
    * multidevice page
-   *
-   * @param {!CustomEvent<!{
-   *     feature: !MultiDeviceFeature,
-   *     enabled: boolean
-   * }>} event
-   * @private
    */
-  onFeatureToggleClicked_(event) {
+  private onFeatureToggleClicked_(
+      event: CustomEvent<{feature: MultiDeviceFeature, enabled: boolean}>):
+      void {
     const feature = event.detail.feature;
     const enabled = event.detail.enabled;
 
     this.browserProxy_.setFeatureEnabledState(
-        feature, enabled, this.authToken.token);
+        feature, enabled, this.authToken!.token);
     recordSettingChange();
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceSmartlockItemElement.is]:
+        SettingsMultideviceSmartlockItemElement;
+  }
+}
+
 customElements.define(
     SettingsMultideviceSmartlockItemElement.is,
     SettingsMultideviceSmartlockItemElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.ts
similarity index 70%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.ts
index 62f30d83..3e85720 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.ts
@@ -15,39 +15,31 @@
 
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.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 {routes} from '../os_route.js';
-import {Router} from '../router.js';
+import {castExists} from '../assert_extras.js';
 
 import {getTemplate} from './multidevice_task_continuation_disabled_link.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {I18nBehaviorInterface}
- */
 const SettingsMultideviceTaskContinuationDisabledLinkElementBase =
-    mixinBehaviors([I18nBehavior], PolymerElement);
+    I18nMixin(PolymerElement);
 
 /** @polymer */
 class SettingsMultideviceTaskContinuationDisabledLinkElement extends
     SettingsMultideviceTaskContinuationDisabledLinkElementBase {
   static get is() {
-    return 'settings-multidevice-task-continuation-disabled-link';
+    return 'settings-multidevice-task-continuation-disabled-link' as const;
   }
 
   static get template() {
     return getTemplate();
   }
 
-  /** @override */
-  connectedCallback() {
+  override connectedCallback(): void {
     super.connectedCallback();
 
-    const chromeSyncLink = this.shadowRoot.querySelector('#chromeSyncLink');
+    const chromeSyncLink = this.shadowRoot!.querySelector('#chromeSyncLink');
     if (chromeSyncLink) {
       chromeSyncLink.addEventListener(
           'click', this.onChromeSyncLinkClick_.bind(this));
@@ -55,11 +47,10 @@
   }
 
   /**
-   * @return {string} Localized summary of Task Continuation when Chrome Sync is
+   * @return  Localized summary of Task Continuation when Chrome Sync is
    *     turned off, formatted with correct aria-labels and click events.
-   * @private
    */
-  getAriaLabelledContent_() {
+  private getAriaLabelledContent_(): string {
     const tempEl = document.createElement('div');
     tempEl.innerHTML = this.i18nAdvanced(
         'multidevicePhoneHubTaskContinuationDisabledSummary', {attrs: ['id']});
@@ -70,14 +61,15 @@
         const spanNode = document.createElement('span');
         spanNode.textContent = node.textContent;
         spanNode.id = `id${index}`;
-        spanNode.setAttribute('aria-hidden', true);
+        spanNode.setAttribute('aria-hidden', 'true');
         node.replaceWith(spanNode);
-        return;
       }
     });
 
-    const chromeSyncLink = tempEl.querySelector('#chromeSyncLink');
-    const learnMoreLink = tempEl.querySelector('#learnMoreLink');
+    const chromeSyncLink =
+        castExists(tempEl.querySelector<HTMLAnchorElement>('#chromeSyncLink'));
+    const learnMoreLink =
+        castExists(tempEl.querySelector<HTMLAnchorElement>('#learnMoreLink'));
 
     chromeSyncLink.setAttribute(
         'aria-label',
@@ -89,11 +81,7 @@
     return tempEl.innerHTML;
   }
 
-  /**
-   * @param {!Event} event
-   * @private
-   */
-  onChromeSyncLinkClick_(event) {
+  private onChromeSyncLinkClick_(event: Event): void {
     event.preventDefault();
     window.open('chrome://settings/syncSetup/advanced');
 
@@ -104,6 +92,16 @@
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceTaskContinuationDisabledLinkElement.is]:
+        SettingsMultideviceTaskContinuationDisabledLinkElement;
+  }
+  interface HTMLElementEventMap {
+    'opened-browser-advanced-sync-settings': CustomEvent;
+  }
+}
+
 customElements.define(
     SettingsMultideviceTaskContinuationDisabledLinkElement.is,
     SettingsMultideviceTaskContinuationDisabledLinkElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.ts
similarity index 64%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.ts
index 73b959eb..899e4fa 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.ts
@@ -22,32 +22,32 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 import '../../settings_shared.css.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
+import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
+import {SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs} from '../../people_page/sync_browser_proxy.js';
+import {Constructor} from '../common/types.js';
 
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
+import {SettingsMultideviceFeatureItemElement} from './multidevice_feature_item.js';
 import {getTemplate} from './multidevice_task_continuation_item.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- * @implements {WebUIListenerBehaviorInterface}
- */
-const SettingsMultideviceTaskContinuationItemElementBase = mixinBehaviors(
-    [
-      MultiDeviceFeatureBehavior,
-      WebUIListenerBehavior,
-    ],
-    PolymerElement);
+interface SettingsMultideviceTaskContinuationItemElement {
+  $: {
+    phoneHubTaskContinuationItem: SettingsMultideviceFeatureItemElement,
+  };
+}
 
-/** @polymer */
+const SettingsMultideviceTaskContinuationItemElementBase =
+    mixinBehaviors(
+        [MultiDeviceFeatureBehavior], WebUiListenerMixin(PolymerElement)) as
+    Constructor<PolymerElement&WebUiListenerMixinInterface&
+                MultiDeviceFeatureBehaviorInterface>;
+
 class SettingsMultideviceTaskContinuationItemElement extends
     SettingsMultideviceTaskContinuationItemElementBase {
   static get is() {
-    return 'settings-multidevice-task-continuation-item';
+    return 'settings-multidevice-task-continuation-item' as const;
   }
 
   static get template() {
@@ -56,7 +56,6 @@
 
   static get properties() {
     return {
-      /** @private */
       isChromeTabsSyncEnabled_: {
         type: Boolean,
         value: false,
@@ -64,19 +63,19 @@
     };
   }
 
-  /** @override */
+  private isChromeTabsSyncEnabled_: boolean;
+  private syncBrowserProxy_: SyncBrowserProxy;
+
   constructor() {
     super();
 
-    /** @private {!SyncBrowserProxy} */
     this.syncBrowserProxy_ = SyncBrowserProxyImpl.getInstance();
   }
 
-  /** @override */
-  connectedCallback() {
+  override connectedCallback(): void {
     super.connectedCallback();
 
-    this.addWebUIListener(
+    this.addWebUiListener(
         'sync-prefs-changed', this.handleSyncPrefsChanged_.bind(this));
 
     // Cause handleSyncPrefsChanged_() to be called when the element is first
@@ -84,10 +83,9 @@
     this.syncBrowserProxy_.sendSyncPrefsChanged();
   }
 
-  /** @override */
-  focus() {
+  override focus(): void {
     if (!this.isChromeTabsSyncEnabled_) {
-      this.shadowRoot.querySelector('cr-toggle').focus();
+      this.shadowRoot!.querySelector('cr-toggle')!.focus();
     } else {
       this.$.phoneHubTaskContinuationItem.focus();
     }
@@ -95,14 +93,19 @@
 
   /**
    * Handler for when the sync preferences are updated.
-   * @param {!SyncPrefs} syncPrefs
-   * @private
    */
-  handleSyncPrefsChanged_(syncPrefs) {
+  private handleSyncPrefsChanged_(syncPrefs: SyncPrefs): void {
     this.isChromeTabsSyncEnabled_ = !!syncPrefs && syncPrefs.tabsSynced;
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceTaskContinuationItemElement.is]:
+        SettingsMultideviceTaskContinuationItemElement;
+  }
+}
+
 customElements.define(
     SettingsMultideviceTaskContinuationItemElement.is,
     SettingsMultideviceTaskContinuationItemElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.ts
similarity index 77%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.ts
index b837f13..adcd53f 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_tether_item.ts
@@ -24,30 +24,28 @@
 import {DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {castExists} from '../assert_extras.js';
+import {Constructor} from '../common/types';
 import {routes} from '../os_route.js';
 import {OsSettingsRoutes} from '../os_settings_routes.js';
 
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
 import {getTemplate} from './multidevice_tether_item.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {NetworkListenerBehaviorInterface}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- */
-const SettingsMultideviceTetherItemElementBase = mixinBehaviors(
-    [
-      NetworkListenerBehavior,
-      MultiDeviceFeatureBehavior,
-    ],
-    PolymerElement);
+const SettingsMultideviceTetherItemElementBase =
+    mixinBehaviors(
+        [
+          NetworkListenerBehavior,
+          MultiDeviceFeatureBehavior,
+        ],
+        PolymerElement) as
+    Constructor<PolymerElement&NetworkListenerBehaviorInterface&
+                MultiDeviceFeatureBehaviorInterface>;
 
-/** @polymer */
 class SettingsMultideviceTetherItemElement extends
     SettingsMultideviceTetherItemElementBase {
   static get is() {
-    return 'settings-multidevice-tether-item';
+    return 'settings-multidevice-tether-item' as const;
   }
 
   static get template() {
@@ -58,7 +56,6 @@
     return {
       /**
        * The device state for tethering.
-       * @private {?OncMojo.DeviceStateProperties|undefined}
        */
       deviceState_: Object,
 
@@ -66,13 +63,11 @@
        * The network state for a potential tethering host phone. Note that there
        * is at most one because only one MultiDevice host phone is allowed on an
        * account at a given time.
-       * @private {?OncMojo.NetworkStateProperties|undefined}
        */
       activeNetworkState_: Object,
 
       /**
        * Alias for allowing Polymer bindings to routes.
-       * @type {?OsSettingsRoutes}
        */
       routes: {
         type: Object,
@@ -81,7 +76,6 @@
 
       /**
        * Whether to show technology badge on mobile network icon.
-       * @private
        */
       showTechnologyBadge_: {
         type: Boolean,
@@ -93,26 +87,29 @@
     };
   }
 
-  /** @override */
+  routes: OsSettingsRoutes|null;
+  private activeNetworkState_: OncMojo.NetworkStateProperties|undefined;
+  private deviceState_: OncMojo.DeviceStateProperties|undefined;
+  private networkConfig_: CrosNetworkConfigRemote;
+  private showTechnologyBadge_: boolean;
+
   constructor() {
     super();
 
-    /** @private {!CrosNetworkConfigRemote} */
     this.networkConfig_ =
         MojoInterfaceProviderImpl.getInstance().getMojoServiceRemote();
   }
 
-  /** @override */
-  connectedCallback() {
+  override connectedCallback(): void {
     super.connectedCallback();
 
     this.updateTetherDeviceState_();
     this.updateTetherNetworkState_();
   }
 
-  /** @override */
-  focus() {
-    this.shadowRoot.querySelector('settings-multidevice-feature-item').focus();
+  override focus(): void {
+    this.shadowRoot!.querySelector(
+                        'settings-multidevice-feature-item')!.focus();
   }
 
   /**
@@ -121,12 +118,9 @@
    * onNetworkStateListChanged, triggering updateTetherNetworkState_ and
    * rendering this callback redundant. As a result, we return early if the
    * active network is not changed.
-   * @param {!Array<NetworkStateProperties>}
-   *     networks
-   * @private
    */
-  onActiveNetworksChanged(networks) {
-    const guid = this.activeNetworkState_.guid;
+  override onActiveNetworksChanged(networks: NetworkStateProperties[]): void {
+    const guid = this.activeNetworkState_!.guid;
     if (!networks.find(network => network.guid === guid)) {
       return;
     }
@@ -138,12 +132,12 @@
   }
 
   /** CrosNetworkConfigObserver impl */
-  onNetworkStateListChanged() {
+  override onNetworkStateListChanged(): void {
     this.updateTetherNetworkState_();
   }
 
   /** CrosNetworkConfigObserver impl */
-  onDeviceStateListChanged() {
+  override onDeviceStateListChanged(): void {
     this.updateTetherDeviceState_();
   }
 
@@ -153,9 +147,8 @@
    * there is none). Note that crosNetworkConfig.getDeviceStateList retrieves at
    * most one device per NetworkType so there will be at most one Tether device
    * state.
-   * @private
    */
-  updateTetherDeviceState_() {
+  private updateTetherDeviceState_(): void {
     this.networkConfig_.getDeviceStateList().then(response => {
       const kTether = NetworkType.kTether;
       const deviceStates = response.result;
@@ -168,7 +161,7 @@
         scanning: false,
         simAbsent: false,
         type: kTether,
-      };
+      } as OncMojo.DeviceStateProperties;
     });
   }
 
@@ -178,9 +171,8 @@
    * only one host is allowed on an account at a given time. Then it sets
    * this.activeNetworkState_ to that network if there is one or a dummy object
    * with an empty string for a GUID otherwise.
-   * @private
    */
-  updateTetherNetworkState_() {
+  private updateTetherNetworkState_(): void {
     const kTether = NetworkType.kTether;
     const filter = {
       filter: FilterType.kVisible,
@@ -198,22 +190,25 @@
    * Returns an array containing the active network state if there is one
    * (note that if there is not GUID will be falsy).  Returns an empty array
    * otherwise.
-   * @return {!Array<NetworkStateProperties>}
-   * @private
    */
-  getNetworkStateList_() {
-    return this.activeNetworkState_.guid ? [this.activeNetworkState_] : [];
+  private getNetworkStateList_(): NetworkStateProperties[] {
+    return this.activeNetworkState_!.guid ?
+        [castExists(this.activeNetworkState_)] :
+        [];
   }
 
-  /**
-   * @return {!URLSearchParams}
-   * @private
-   */
-  getTetherNetworkUrlSearchParams_() {
+  private getTetherNetworkUrlSearchParams_(): URLSearchParams {
     return new URLSearchParams('type=Tether');
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceTetherItemElement.is]:
+        SettingsMultideviceTetherItemElement;
+  }
+}
+
 customElements.define(
     SettingsMultideviceTetherItemElement.is,
     SettingsMultideviceTetherItemElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.ts
similarity index 68%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.ts
index d98285d..31a4b94 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.ts
@@ -14,37 +14,33 @@
 
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
+import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {castExists} from '../assert_extras.js';
+import {Constructor} from '../common/types.js';
 import {routes} from '../os_route.js';
 import {Router} from '../router.js';
 
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
 import {getTemplate} from './multidevice_wifi_sync_disabled_link.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- * @implements {I18nBehaviorInterface}
- */
 const SettingsMultideviceWifiSyncDisabledLinkElementBase =
-    mixinBehaviors([MultiDeviceFeatureBehavior, I18nBehavior], PolymerElement);
+    mixinBehaviors([MultiDeviceFeatureBehavior], I18nMixin(PolymerElement)) as
+    Constructor<PolymerElement&I18nMixinInterface&
+                MultiDeviceFeatureBehaviorInterface>;
 
-/** @polymer */
 class SettingsMultideviceWifiSyncDisabledLinkElement extends
     SettingsMultideviceWifiSyncDisabledLinkElementBase {
   static get is() {
-    return 'settings-multidevice-wifi-sync-disabled-link';
+    return 'settings-multidevice-wifi-sync-disabled-link' as const;
   }
 
   static get template() {
     return getTemplate();
   }
 
-  getAriaLabelledContent_() {
+  private getAriaLabelledContent_(): string {
     const tempEl = document.createElement('div');
     tempEl.innerHTML = this.i18nAdvanced(
         'multideviceEnableWifiSyncV1ItemSummary', {attrs: ['id']});
@@ -55,14 +51,15 @@
         const spanNode = document.createElement('span');
         spanNode.textContent = node.textContent;
         spanNode.id = `id${index}`;
-        spanNode.setAttribute('aria-hidden', true);
+        spanNode.setAttribute('aria-hidden', 'true');
         node.replaceWith(spanNode);
-        return;
       }
     });
 
-    const chromeSyncLink = tempEl.querySelector('#chromeSyncLink');
-    const learnMoreLink = tempEl.querySelector('#learnMoreLink');
+    const chromeSyncLink =
+        castExists(tempEl.querySelector<HTMLAnchorElement>('#chromeSyncLink'));
+    const learnMoreLink =
+        castExists(tempEl.querySelector<HTMLAnchorElement>('#learnMoreLink'));
 
     chromeSyncLink.setAttribute(
         'aria-label', this.i18n('multideviceWifiSyncChromeSyncLabel'));
@@ -73,27 +70,29 @@
     return tempEl.innerHTML;
   }
 
-  /** @override */
-  connectedCallback() {
+  override connectedCallback(): void {
     super.connectedCallback();
 
-    const chromeSyncLink = this.shadowRoot.querySelector('#chromeSyncLink');
+    const chromeSyncLink = this.shadowRoot!.querySelector('#chromeSyncLink');
     if (chromeSyncLink) {
       chromeSyncLink.addEventListener(
           'click', this.onChromeSyncLinkClick_.bind(this));
     }
   }
 
-  /**
-   * @param {!Event} event
-   * @private
-   */
-  onChromeSyncLinkClick_(event) {
+  private onChromeSyncLinkClick_(event: Event): void {
     event.preventDefault();
     Router.getInstance().navigateTo(routes.OS_SYNC);
   }
 }
 
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceWifiSyncDisabledLinkElement.is]:
+        SettingsMultideviceWifiSyncDisabledLinkElement;
+  }
+}
+
 customElements.define(
     SettingsMultideviceWifiSyncDisabledLinkElement.is,
     SettingsMultideviceWifiSyncDisabledLinkElement);
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.ts
similarity index 61%
rename from chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
rename to chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.ts
index 34e6662..211cdbdc 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.ts
@@ -20,30 +20,25 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 import '../../settings_shared.css.js';
 
-import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
+import {WebUiListenerMixin, WebUiListenerMixinInterface} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
+import {Constructor} from '../common/types';
 import {OsSyncBrowserProxy, OsSyncBrowserProxyImpl, OsSyncPrefs} from '../os_people_page/os_sync_browser_proxy.js';
 
 import {MultiDeviceFeatureBehavior, MultiDeviceFeatureBehaviorInterface} from './multidevice_feature_behavior.js';
 import {getTemplate} from './multidevice_wifi_sync_item.html.js';
 
-/**
- * @constructor
- * @extends {PolymerElement}
- * @implements {MultiDeviceFeatureBehaviorInterface}
- * @implements {WebUIListenerBehaviorInterface}
- */
-const SettingsMultideviceWifiSyncItemElementBase = mixinBehaviors(
-    [MultiDeviceFeatureBehavior, WebUIListenerBehavior], PolymerElement);
+const SettingsMultideviceWifiSyncItemElementBase =
+    mixinBehaviors(
+        [MultiDeviceFeatureBehavior], WebUiListenerMixin(PolymerElement)) as
+    Constructor<PolymerElement&WebUiListenerMixinInterface&
+                MultiDeviceFeatureBehaviorInterface>;
 
-/** @polymer */
 class SettingsMultideviceWifiSyncItemElement extends
     SettingsMultideviceWifiSyncItemElementBase {
   static get is() {
-    return 'settings-multidevice-wifi-sync-item';
+    return 'settings-multidevice-wifi-sync-item' as const;
   }
 
   static get template() {
@@ -52,56 +47,45 @@
 
   static get properties() {
     return {
-      /** @private */
       isWifiSyncV1Enabled_: Boolean,
     };
   }
 
-  /** @override */
+  private isWifiSyncV1Enabled_: boolean;
+  private osSyncBrowserProxy_: OsSyncBrowserProxy;
+
   constructor() {
     super();
 
-    /** @private {?OsSyncBrowserProxy} */
-    this.osSyncBrowserProxy_ = null;
-
-    /** @private {?SyncBrowserProxy} */
-    this.syncBrowserProxy_ = null;
-
     this.osSyncBrowserProxy_ = OsSyncBrowserProxyImpl.getInstance();
   }
 
-  /** @override */
-  connectedCallback() {
+  override connectedCallback(): void {
     super.connectedCallback();
 
-    this.addWebUIListener(
+    this.addWebUiListener(
         'os-sync-prefs-changed', this.handleOsSyncPrefsChanged_.bind(this));
     this.osSyncBrowserProxy_.sendOsSyncPrefsChanged();
   }
 
   /**
-   * Handler for when the sync preferences are updated.
-   * @param {!SyncPrefs} syncPrefs
-   * @private
-   */
-  handleSyncPrefsChanged_(syncPrefs) {
-    this.isWifiSyncV1Enabled_ =
-        !!syncPrefs && syncPrefs.wifiConfigurationsSynced;
-  }
-
-  /**
    * Handler for when os sync preferences are updated.
-   * @param {!OsSyncPrefs} osSyncPrefs
-   * @private
    */
-  handleOsSyncPrefsChanged_(osSyncPrefs) {
+  private handleOsSyncPrefsChanged_(osSyncPrefs: OsSyncPrefs): void {
     this.isWifiSyncV1Enabled_ =
         !!osSyncPrefs && osSyncPrefs.osWifiConfigurationsSynced;
   }
 
-  /** @override */
-  focus() {
-    this.shadowRoot.querySelector('settings-multidevice-feature-item').focus();
+  override focus(): void {
+    this.shadowRoot!.querySelector(
+                        'settings-multidevice-feature-item')!.focus();
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    [SettingsMultideviceWifiSyncItemElement.is]:
+        SettingsMultideviceWifiSyncItemElement;
   }
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
index ea7f07f1..9f3b3bc4 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
 import("../os_settings.gni")
 
 js_type_check("closure_compile") {
@@ -151,15 +150,3 @@
 
 js_library("types") {
 }
-
-html_to_js("web_components") {
-  js_files = [
-    "nearby_share_confirm_page.js",
-    "nearby_share_contact_visibility_dialog.js",
-    "nearby_share_data_usage_dialog.js",
-    "nearby_share_device_name_dialog.js",
-    "nearby_share_high_visibility_page.js",
-    "nearby_share_receive_dialog.js",
-    "nearby_share_subpage.js",
-  ]
-}
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
index 61bd74d..6d4736b5 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
@@ -16,7 +16,9 @@
 
 import {ShareTarget, TransferStatus} from '/mojo/nearby_share.mojom-webui.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './nearby_share_confirm_page.html.js';
 
 /**
  * The progress bar asset URL for light mode.
@@ -45,7 +47,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js
index da785c7..89e86e9 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js
@@ -14,11 +14,13 @@
 import '../../shared/nearby_visibility_page.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyContactVisibilityElement} from '../../shared/nearby_contact_visibility.js';
 import {NearbySettings} from '../../shared/nearby_share_settings_behavior.js';
 
+import {getTemplate} from './nearby_share_contact_visibility_dialog.html.js';
+
 /** @polymer */
 class NearbyShareContactVisibilityDialogElement extends PolymerElement {
   static get is() {
@@ -26,7 +28,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
index ccc8f3c..a85a9dcf 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
@@ -14,11 +14,11 @@
 import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js';
 
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {DataUsage} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js';
 
+import {getTemplate} from './nearby_share_data_usage_dialog.html.js';
 import {dataUsageStringToEnum, NearbyShareDataUsage} from './types.js';
 
 /**
@@ -37,7 +37,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
index 25b675c2..67b0b2b 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
@@ -14,11 +14,13 @@
 
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {DeviceNameValidationResult} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js';
 import {NearbySettings} from '../../shared/nearby_share_settings_behavior.js';
 
+import {getTemplate} from './nearby_share_device_name_dialog.html.js';
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -35,7 +37,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
index 6a7c2a1ca6..5fdee28 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
@@ -16,7 +16,9 @@
 
 import {RegisterReceiveSurfaceResult} from '/mojo/nearby_share.mojom-webui.js';
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './nearby_share_high_visibility_page.html.js';
 
 /**
  * Represents the current error state, if one exists.
@@ -57,7 +59,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.js
index 3c2a3219..69dee78 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_receive_dialog.js
@@ -32,10 +32,11 @@
 import {ReceiveManagerInterface, ReceiveObserverInterface, ReceiveObserverReceiver, RegisterReceiveSurfaceResult, ShareTarget, TransferMetadata, TransferStatus} from '/mojo/nearby_share.mojom-webui.js';
 import {assert} from 'chrome://resources/ash/common/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbySettings} from '../../shared/nearby_share_settings_behavior.js';
 
+import {getTemplate} from './nearby_share_receive_dialog.html.js';
 import {getReceiveManager, observeReceiveManager} from './nearby_share_receive_manager.js';
 
 /** @enum {string} */
@@ -54,7 +55,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
index afbcd48..719498b 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
@@ -23,7 +23,7 @@
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
 import {FastInitiationNotificationState, Visibility} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js';
-import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {flush, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
 import {getContactManager} from '../../shared/nearby_contact_manager.js';
@@ -36,6 +36,7 @@
 
 import {NearbyAccountManagerBrowserProxyImpl} from './nearby_account_manager_browser_proxy.js';
 import {observeReceiveManager} from './nearby_share_receive_manager.js';
+import {getTemplate} from './nearby_share_subpage.html.js';
 import {dataUsageStringToEnum, NearbyShareDataUsage} from './types.js';
 
 /**
@@ -64,7 +65,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
index 4a34d18..d2e292d 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -4,7 +4,6 @@
 
 import("//chrome/browser/resources/settings/chromeos/os_settings.gni")
 import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
 import("../os_settings.gni")
 
 js_type_check("closure_compile_module") {
@@ -36,7 +35,3 @@
   deps = [ "//ash/webui/common/resources:cr.m" ]
   externs_list = [ "$externs_path/chrome_send.js" ]
 }
-
-html_to_js("web_components") {
-  js_files = [ "manage_a11y_page.js" ]
-}
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index 9cb17db..8e11da1 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -18,18 +18,19 @@
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 
 import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
-import {Route, Router} from '../router.js';
 import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
 import {DevicePageBrowserProxyImpl} from '../device_page/device_page_browser_proxy.js';
 import {routes} from '../os_route.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
 import {RouteOriginBehavior, RouteOriginBehaviorImpl, RouteOriginBehaviorInterface} from '../route_origin_behavior.js';
+import {Route, Router} from '../router.js';
 
+import {getTemplate} from './manage_a11y_page.html.js';
 import {ManageA11yPageBrowserProxy, ManageA11yPageBrowserProxyImpl} from './manage_a11y_page_browser_proxy.js';
 
 /** @const {number} */
@@ -74,7 +75,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
index e607fd6d..468846b5 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
 import("../os_settings.gni")
 
 js_type_check("closure_compile_module") {
@@ -95,7 +94,6 @@
     "..:os_route",
     "..:route_observer_behavior",
     "..:router",
-    "../multidevice_page:multidevice_smartlock_item",
     "//ash/webui/common/resources:assert",
     "//ash/webui/common/resources:focus_without_ink_js",
     "//ash/webui/common/resources:i18n_behavior",
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
index cc42e5c3..14ea09ed 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/BUILD.gn
@@ -3,7 +3,6 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
-import("//tools/polymer/html_to_js.gni")
 import("../os_settings.gni")
 
 js_type_check("closure_compile_module") {
@@ -100,13 +99,3 @@
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
 }
-
-html_to_js("web_components") {
-  js_files = [
-    "metrics_consent_toggle_button.js",
-    "os_privacy_page.js",
-    "peripheral_data_access_protection_dialog.js",
-    "privacy_hub_page.js",
-    "smart_privacy_page.js",
-  ]
-}
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/metrics_consent_toggle_button.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/metrics_consent_toggle_button.js
index 2ac0f43d..0ea2b6d 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/metrics_consent_toggle_button.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/metrics_consent_toggle_button.js
@@ -10,9 +10,10 @@
 
 import '../../controls/settings_toggle_button.js';
 
-import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MetricsConsentBrowserProxy, MetricsConsentBrowserProxyImpl} from './metrics_consent_browser_proxy.js';
+import {getTemplate} from './metrics_consent_toggle_button.html.js';
 
 /** @polymer */
 class SettingsMetricsConsentToggleButtonElement extends PolymerElement {
@@ -21,7 +22,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js
index 600bdd0..78608ce 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/os_privacy_page.js
@@ -23,16 +23,17 @@
 import './metrics_consent_toggle_button.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {afterNextRender, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
-import {Route, Router} from '../router.js';
 import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
 import {LockStateBehavior, LockStateBehaviorInterface} from '../os_people_page/lock_state_behavior.js';
 import {routes} from '../os_route.js';
 import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
+import {Route, Router} from '../router.js';
 
+import {getTemplate} from './os_privacy_page.html.js';
 import {PeripheralDataAccessBrowserProxy, PeripheralDataAccessBrowserProxyImpl} from './peripheral_data_access_browser_proxy.js';
 import {PrivacyHubNavigationOrigin} from './privacy_hub_page.js';
 
@@ -60,7 +61,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js
index 04ed687..c9c9aa5e 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js
@@ -12,10 +12,12 @@
 import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
 import '../../settings_shared.css.js';
 
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js';
 
+import {getTemplate} from './peripheral_data_access_protection_dialog.html.js';
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -32,7 +34,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
index 38cbdb6..bb1432f 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
@@ -13,20 +13,21 @@
 import '../../controls/settings_toggle_button.js';
 import './metrics_consent_toggle_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/ash/common/assert.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
-import {Route} from '../router.js';
 import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
+import {Route} from '../router.js';
 
 import {MediaDevicesProxy} from './media_devices_proxy.js';
 import {PrivacyHubBrowserProxy, PrivacyHubBrowserProxyImpl} from './privacy_hub_browser_proxy.js';
+import {getTemplate} from './privacy_hub_page.html.js';
 
 /**
  * These values are persisted to logs and should not be renumbered or re-used.
@@ -63,7 +64,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   constructor() {
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js
index 10f97ca4..4ef888d 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/smart_privacy_page.js
@@ -17,14 +17,16 @@
 import '../../settings_vars.css.js';
 
 import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
-import {Route} from '../router.js';
 import {DeepLinkingBehavior, DeepLinkingBehaviorInterface} from '../deep_linking_behavior.js';
 import {routes} from '../os_route.js';
 import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js';
 import {RouteObserverBehavior, RouteObserverBehaviorInterface} from '../route_observer_behavior.js';
+import {Route} from '../router.js';
+
+import {getTemplate} from './smart_privacy_page.html.js';
 
 /**
  * The values that the quick lock slider can have, in ms.
@@ -64,7 +66,7 @@
   }
 
   static get template() {
-    return html`{__html_template__}`;
+    return getTemplate();
   }
 
   static get properties() {
diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni
index 2282c42..1c458ca 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings.gni
+++ b/chrome/browser/resources/settings/chromeos/os_settings.gni
@@ -85,26 +85,34 @@
   "chromeos/kerberos_page/kerberos_add_account_dialog.ts",
   "chromeos/kerberos_page/kerberos_page.ts",
   "chromeos/keyboard_shortcut_banner/keyboard_shortcut_banner.ts",
-  "chromeos/multidevice_page/multidevice_combined_setup_item.js",
-  "chromeos/multidevice_page/multidevice_feature_item.js",
-  "chromeos/multidevice_page/multidevice_feature_toggle.js",
+  "chromeos/multidevice_page/multidevice_combined_setup_item.ts",
+  "chromeos/multidevice_page/multidevice_feature_item.ts",
+  "chromeos/multidevice_page/multidevice_feature_toggle.ts",
   "chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js",
   "chromeos/multidevice_page/multidevice_page.js",
   "chromeos/multidevice_page/multidevice_permissions_setup_dialog.js",
-  "chromeos/multidevice_page/multidevice_radio_button.js",
+  "chromeos/multidevice_page/multidevice_radio_button.ts",
   "chromeos/multidevice_page/multidevice_screen_lock_subpage.js",
-  "chromeos/multidevice_page/multidevice_smartlock_item.js",
+  "chromeos/multidevice_page/multidevice_smartlock_item.ts",
   "chromeos/multidevice_page/multidevice_subpage.js",
-  "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js",
-  "chromeos/multidevice_page/multidevice_task_continuation_item.js",
-  "chromeos/multidevice_page/multidevice_tether_item.js",
-  "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js",
-  "chromeos/multidevice_page/multidevice_wifi_sync_item.js",
+  "chromeos/multidevice_page/multidevice_task_continuation_disabled_link.ts",
+  "chromeos/multidevice_page/multidevice_task_continuation_item.ts",
+  "chromeos/multidevice_page/multidevice_tether_item.ts",
+  "chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.ts",
+  "chromeos/multidevice_page/multidevice_wifi_sync_item.ts",
+  "chromeos/nearby_share_page/nearby_share_confirm_page.js",
+  "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js",
+  "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js",
+  "chromeos/nearby_share_page/nearby_share_device_name_dialog.js",
+  "chromeos/nearby_share_page/nearby_share_high_visibility_page.js",
+  "chromeos/nearby_share_page/nearby_share_receive_dialog.js",
+  "chromeos/nearby_share_page/nearby_share_subpage.js",
   "chromeos/os_a11y_page/audio_and_captions_page.ts",
   "chromeos/os_a11y_page/change_dictation_locale_dialog.ts",
   "chromeos/os_a11y_page/cursor_and_touchpad_page.ts",
   "chromeos/os_a11y_page/display_and_magnification_page.ts",
   "chromeos/os_a11y_page/keyboard_and_text_input_page.ts",
+  "chromeos/os_a11y_page/manage_a11y_page.js",
   "chromeos/os_a11y_page/os_a11y_page.ts",
   "chromeos/os_a11y_page/select_to_speak_subpage.ts",
   "chromeos/os_a11y_page/switch_access_action_assignment_dialog.ts",
@@ -202,6 +210,11 @@
   "chromeos/os_printing_page/cups_saved_printers.ts",
   "chromeos/os_printing_page/cups_settings_add_printer_dialog.ts",
   "chromeos/os_printing_page/os_printing_page.ts",
+  "chromeos/os_privacy_page/metrics_consent_toggle_button.js",
+  "chromeos/os_privacy_page/os_privacy_page.js",
+  "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js",
+  "chromeos/os_privacy_page/privacy_hub_page.js",
+  "chromeos/os_privacy_page/smart_privacy_page.js",
   "chromeos/os_reset_page/os_powerwash_dialog.ts",
   "chromeos/os_reset_page/os_powerwash_dialog_esim_item.ts",
   "chromeos/os_reset_page/os_reset_page.ts",
@@ -410,23 +423,6 @@
   "relaunch_mixin.ts",
 ]
 
-# Files that are generated by html_to_js() or other build rule.
-generated_web_component_files = [
-  "chromeos/nearby_share_page/nearby_share_confirm_page.js",
-  "chromeos/nearby_share_page/nearby_share_contact_visibility_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_data_usage_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_device_name_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_high_visibility_page.js",
-  "chromeos/nearby_share_page/nearby_share_receive_dialog.js",
-  "chromeos/nearby_share_page/nearby_share_subpage.js",
-  "chromeos/os_a11y_page/manage_a11y_page.js",
-  "chromeos/os_privacy_page/metrics_consent_toggle_button.js",
-  "chromeos/os_privacy_page/os_privacy_page.js",
-  "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.js",
-  "chromeos/os_privacy_page/privacy_hub_page.js",
-  "chromeos/os_privacy_page/smart_privacy_page.js",
-]
-
 mojom_webui_files = [
   "mojom-webui/audio/cros_audio_config.mojom-webui.js",
   "mojom-webui/os_apps_page/app_notification_handler.mojom-webui.ts",
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks.html
index a8c4101..add5fb8 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks.html
@@ -1,5 +1,6 @@
 <!doctype html>
-<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<html dir="$i18n{textdirection}" lang="$i18n{language}"
+    $i18n{chromeRefresh2023Attribute}>
 <head>
   <meta charset="utf-8">
   <title>$i18n{bookmarksTabTitle}</title>
diff --git a/chrome/browser/resources/side_panel/customize_chrome/shortcuts.html b/chrome/browser/resources/side_panel/customize_chrome/shortcuts.html
index f6ea7f9..e17786e 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/shortcuts.html
+++ b/chrome/browser/resources/side_panel/customize_chrome/shortcuts.html
@@ -54,7 +54,7 @@
   <iron-collapse opened="[[show_]]">
     <hr>
     <cr-radio-group id="shortcutsRadioSelection" disabled="[[!show_]]"
-      selected="[[shortcutsRadioSelection_(customLinksEnabled_)]]"
+      selected="[[shortcutsRadioSelection_]]"
       on-selected-changed="onShortcutsRadioSelectionChanged_">
       <cr-radio-button id="customLinksButton" name="customLinksOption">
       </cr-radio-button>
diff --git a/chrome/browser/resources/side_panel/customize_chrome/shortcuts.ts b/chrome/browser/resources/side_panel/customize_chrome/shortcuts.ts
index 910f93a..eacbd14e 100644
--- a/chrome/browser/resources/side_panel/customize_chrome/shortcuts.ts
+++ b/chrome/browser/resources/side_panel/customize_chrome/shortcuts.ts
@@ -11,9 +11,10 @@
 import {CrRadioButtonElement} from 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js';
 import {CrRadioGroupElement} from 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js';
 import {CrToggleElement} from 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
+import {assert} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {CustomizeChromePageHandlerInterface} from './customize_chrome.mojom-webui.js';
+import {CustomizeChromePageCallbackRouter, CustomizeChromePageHandlerInterface} from './customize_chrome.mojom-webui.js';
 import {CustomizeChromeApiProxy} from './customize_chrome_api_proxy.js';
 import {getTemplate} from './shortcuts.html.js';
 
@@ -26,8 +27,6 @@
   };
 }
 
-export interface ShortcutsElement {}
-
 export class ShortcutsElement extends PolymerElement {
   static get is() {
     return 'customize-chrome-shortcuts';
@@ -40,29 +39,44 @@
   static get properties() {
     return {
       customLinksEnabled_: Boolean,
+      shortcutsRadioSelection_: {
+        type: String,
+        computed: 'computeShortcutsRadioSelection_(customLinksEnabled_)',
+      },
       show_: Boolean,
     };
   }
 
   private customLinksEnabled_: boolean;
+  private shortcutsRadioSelection_: string|undefined = undefined;
   private show_: boolean;
+
+  private setMostVisitedSettingsListenerId_: number|null = null;
+
+  private callbackRouter_: CustomizeChromePageCallbackRouter;
   private pageHandler_: CustomizeChromePageHandlerInterface;
 
   constructor() {
     super();
-    const {handler} = CustomizeChromeApiProxy.getInstance();
-    this.pageHandler_ = handler;
-    // TODO(crbug.com/1384278) Auto update most visited settings if they change
-    // while the side panel is open.
-    this.pageHandler_.getMostVisitedSettings().then(
-        ({customLinksEnabled, shortcutsVisible}) => {
-          this.customLinksEnabled_ = customLinksEnabled;
-          this.show_ = shortcutsVisible;
-        });
+    this.pageHandler_ = CustomizeChromeApiProxy.getInstance().handler;
+    this.callbackRouter_ = CustomizeChromeApiProxy.getInstance().callbackRouter;
   }
 
   override connectedCallback() {
     super.connectedCallback();
+    this.setMostVisitedSettingsListenerId_ =
+        this.callbackRouter_.setMostVisitedSettings.addListener(
+            (customLinksEnabled: boolean, shortcutsVisible: boolean) => {
+              this.customLinksEnabled_ = customLinksEnabled;
+              this.show_ = shortcutsVisible;
+            });
+    this.pageHandler_.updateMostVisitedSettings();
+  }
+
+  override disconnectedCallback() {
+    super.disconnectedCallback();
+    assert(this.setMostVisitedSettingsListenerId_);
+    this.callbackRouter_.removeListener(this.setMostVisitedSettingsListenerId_);
   }
 
   private setMostVisitedSettings_() {
@@ -75,7 +89,7 @@
     this.setMostVisitedSettings_();
   }
 
-  private shortcutsRadioSelection_(): string {
+  private computeShortcutsRadioSelection_(): string {
     return this.customLinksEnabled_ ? 'customLinksOption' : 'mostVisitedOption';
   }
 
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list.html b/chrome/browser/resources/side_panel/reading_list/reading_list.html
index 06130b3f..82a80277 100644
--- a/chrome/browser/resources/side_panel/reading_list/reading_list.html
+++ b/chrome/browser/resources/side_panel/reading_list/reading_list.html
@@ -1,5 +1,6 @@
 <!doctype html>
-<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<html dir="$i18n{textdirection}" lang="$i18n{language}"
+    $i18n{chromeRefresh2023Attribute}>
 <head>
   <meta charset="utf-8">
   <title>$i18n{title}</title>
diff --git a/chrome/browser/resources/side_panel/user_notes/BUILD.gn b/chrome/browser/resources/side_panel/user_notes/BUILD.gn
index 99c3f477..fbf1e2a 100644
--- a/chrome/browser/resources/side_panel/user_notes/BUILD.gn
+++ b/chrome/browser/resources/side_panel/user_notes/BUILD.gn
@@ -14,6 +14,7 @@
   web_component_files = [
     "app.ts",
     "user_note.ts",
+    "user_note_menu.ts",
   ]
 
   non_web_component_files = [ "user_notes_api_proxy.ts" ]
diff --git a/chrome/browser/resources/side_panel/user_notes/user_note.html b/chrome/browser/resources/side_panel/user_notes/user_note.html
index 797615d..2812300 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_note.html
+++ b/chrome/browser/resources/side_panel/user_notes/user_note.html
@@ -41,10 +41,6 @@
     position: relative;
   }
 
-  #menuButton {
-    --cr-icon-button-fill-color: var(--cr-secondary-text-color);
-  }
-
   #noteContent {
     color: var(--cr-primary-text-color);
     padding: var(--note-content-vertical-padding)
@@ -110,9 +106,8 @@
 <template is="dom-if" if="[[!editing_]]" restamp>
   <div id="inactiveHeader" hidden="[[editing_]]">
     <div id="headerText">[[note.lastModificationTimeText]]</div>
-    <cr-icon-button id="menuButton" class="no-overlap" iron-icon="cr:more-vert"
-        on-click="onMenuButtonClick_" >
-    </cr-icon-button>
+    <user-note-menu note="[[note]]" on-edit-clicked="onEditClicked_">
+    </user-note-menu>
   </div>
 </template>
 <div id="placeholderText" hidden="[[!showPlaceholder_]]">$i18n{addANote}</div>
diff --git a/chrome/browser/resources/side_panel/user_notes/user_note.ts b/chrome/browser/resources/side_panel/user_notes/user_note.ts
index 6d621bd..f85fc11e 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_note.ts
+++ b/chrome/browser/resources/side_panel/user_notes/user_note.ts
@@ -7,8 +7,8 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
 import 'chrome://resources/cr_elements/icons.html.js';
+import './user_note_menu.js';
 
-import {assert} from 'chrome://resources/js/assert_ts.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './user_note.html.js';
@@ -32,6 +32,10 @@
 
   static get properties() {
     return {
+      /**
+       * The `note` is undefined if the UserNoteElement is the persistent entry
+       * note and not a preexisting note.
+       */
       note: {
         type: Object,
         observer: 'onNoteChanged_',
@@ -103,7 +107,13 @@
   }
 
   private onCancelClick_() {
-    this.clearInput_();
+    if (this.note === undefined) {
+      this.clearInput_();
+    } else {
+      this.$.noteContent.textContent = this.note.text;
+      this.onNoteContentInput_();
+      this.editing_ = false;
+    }
   }
 
   private async onAddClick_() {
@@ -111,14 +121,17 @@
       await this.userNotesApi_.newNoteFinished(this.$.noteContent.textContent!);
       this.clearInput_();
     } else {
-      // TODO(crbug.com/1394044): implement editing of an existing note.
+      await this.userNotesApi_.updateNote(
+          this.note.guid, this.$.noteContent.textContent!);
+      this.editing_ = false;
     }
   }
 
-  private onMenuButtonClick_() {
-    // TODO(crbug.com/1394044): add menu with edit and delete options.
-    assert(this.note);
-    this.userNotesApi_.deleteNote(this.note.guid);
+  private onEditClicked_() {
+    this.editing_ = true;
+    setTimeout(() => {
+      this.$.noteContent.focus();
+    }, 0);
   }
 }
 
diff --git a/chrome/browser/resources/side_panel/user_notes/user_note_menu.html b/chrome/browser/resources/side_panel/user_notes/user_note_menu.html
new file mode 100644
index 0000000..26ee7c2
--- /dev/null
+++ b/chrome/browser/resources/side_panel/user_notes/user_note_menu.html
@@ -0,0 +1,20 @@
+<style include="cr-icons">
+  #menuButton {
+    --cr-icon-button-fill-color: var(--cr-secondary-text-color);
+  }
+</style>
+
+<cr-icon-button id="menuButton" class="no-overlap" iron-icon="cr:more-vert"
+    on-click="onMenuButtonClick_" >
+</cr-icon-button>
+
+<cr-lazy-render id="contextMenu">
+  <cr-action-menu id="menu">
+      <button class="dropdown-item" on-click="onEditClick_">
+        $i18n{edit}
+      </button>
+      <button class="dropdown-item" on-click="onDeleteClick_">
+        $i18n{delete}
+      </button>
+  </cr-action-menu>
+</cr-lazy-render>
\ No newline at end of file
diff --git a/chrome/browser/resources/side_panel/user_notes/user_note_menu.ts b/chrome/browser/resources/side_panel/user_notes/user_note_menu.ts
new file mode 100644
index 0000000..3fbb8a2
--- /dev/null
+++ b/chrome/browser/resources/side_panel/user_notes/user_note_menu.ts
@@ -0,0 +1,68 @@
+// 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 'chrome://resources/cr_elements/icons.html.js';
+import '//resources/cr_elements/cr_action_menu/cr_action_menu.js';
+import '//resources/cr_elements/cr_icon_button/cr_icon_button.js';
+import '//resources/cr_elements/icons.html.js';
+
+import {CrActionMenuElement} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {getTemplate} from './user_note_menu.html.js';
+import {Note} from './user_notes.mojom-webui.js';
+import {UserNotesApiProxy, UserNotesApiProxyImpl} from './user_notes_api_proxy.js';
+
+export interface UserNoteMenuElement {
+  $: {
+    menu: CrActionMenuElement,
+  };
+}
+
+export class UserNoteMenuElement extends PolymerElement {
+  static get is() {
+    return 'user-note-menu';
+  }
+
+  static get template() {
+    return getTemplate();
+  }
+
+  static get properties() {
+    return {
+      note: Object,
+    };
+  }
+
+  note: Note;
+  private userNotesApi_: UserNotesApiProxy =
+      UserNotesApiProxyImpl.getInstance();
+
+  private onMenuButtonClick_(event: MouseEvent) {
+    event.preventDefault();
+    event.stopPropagation();
+    this.$.menu.showAt(event.target as HTMLElement);
+  }
+
+  private onEditClick_() {
+    this.dispatchEvent(new CustomEvent('edit-clicked', {
+      bubbles: true,
+      composed: true,
+    }));
+    this.$.menu.close();
+  }
+
+  private onDeleteClick_() {
+    this.userNotesApi_.deleteNote(this.note.guid);
+    this.$.menu.close();
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'user-note-menu': UserNoteMenuElement;
+  }
+}
+
+customElements.define(UserNoteMenuElement.is, UserNoteMenuElement);
diff --git a/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts b/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts
index a6ed40dc..6fd812d2 100644
--- a/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts
+++ b/chrome/browser/resources/side_panel/user_notes/user_notes_api_proxy.ts
@@ -10,6 +10,7 @@
   showUi(): void;
   getNotesForCurrentTab(): Promise<{notes: Note[]}>;
   newNoteFinished(text: string): Promise<{success: boolean}>;
+  updateNote(guid: string, text: string): Promise<{success: boolean}>;
   deleteNote(guid: string): Promise<{success: boolean}>;
   getCallbackRouter(): UserNotesPageCallbackRouter;
 }
@@ -39,6 +40,10 @@
     return this.handler.newNoteFinished(text);
   }
 
+  updateNote(guid: string, text: string) {
+    return this.handler.updateNote(guid, text);
+  }
+
   deleteNote(guid: string) {
     return this.handler.deleteNote(guid);
   }
diff --git a/chrome/browser/resources/video_tutorials/BUILD.gn b/chrome/browser/resources/video_tutorials/BUILD.gn
index b7b56ac4..5a59b55d 100644
--- a/chrome/browser/resources/video_tutorials/BUILD.gn
+++ b/chrome/browser/resources/video_tutorials/BUILD.gn
@@ -2,11 +2,10 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/typescript/ts_library.gni")
 
-js_type_check("closure_compile") {
-  deps = [ ":video_player" ]
-}
-
-js_library("video_player") {
+ts_library("build_ts") {
+  root_dir = "."
+  out_dir = "$target_gen_dir/tsc"
+  in_files = [ "video_player.ts" ]
 }
diff --git a/chrome/browser/resources/video_tutorials/video_player.js b/chrome/browser/resources/video_tutorials/video_player.ts
similarity index 64%
rename from chrome/browser/resources/video_tutorials/video_player.js
rename to chrome/browser/resources/video_tutorials/video_player.ts
index 9da327f..6bf90bb 100644
--- a/chrome/browser/resources/video_tutorials/video_player.js
+++ b/chrome/browser/resources/video_tutorials/video_player.ts
@@ -5,19 +5,22 @@
 function onDocumentLoaded() {
   // Find out the video, image, and caption urls from the url params.
   const urlParams = new URLSearchParams(window.location.search);
-  video.src = urlParams.get('video_url');
-  video.poster = urlParams.get('poster_url');
-  track.src = urlParams.get('caption_url');
-  video.play();
+  video!.src = urlParams.get('video_url') || '';
+  video!.poster = urlParams.get('poster_url') || '';
+  track!.src = urlParams.get('caption_url') || '';
+  video!.play();
 }
 
 function onVideoEnded() {
   // Resize the poster.
-  video.classList.add('video-ended');
-  video.controls = false;
+  video!.classList.add('video-ended');
+  video!.controls = false;
 }
 
 const video = document.querySelector('video');
 const track = document.querySelector('track');
+if (!video || !track) {
+  throw new Error('Failed to find video or track');
+}
 video.addEventListener('ended', onVideoEnded);
 document.addEventListener('DOMContentLoaded', onDocumentLoaded);
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
index 8e3bb2c..bbe88ce 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service.cc
@@ -380,7 +380,7 @@
         std::move(traffic_annotation), std::move(callback));
   } else if (!data.path.empty()) {
     upload_request = MultipartUploadRequest::CreateFileRequest(
-        url_loader_factory_, std::move(url), metadata, data.path,
+        url_loader_factory_, std::move(url), metadata, data.path, data.size,
         std::move(traffic_annotation), std::move(callback));
   } else if (data.page.IsValid()) {
     upload_request = MultipartUploadRequest::CreatePageRequest(
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
index 24dd531..7056d8a 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/cloud_binary_upload_service_unittest.cc
@@ -116,6 +116,7 @@
       const GURL& base_url,
       const std::string& metadata,
       const base::FilePath& path,
+      uint64_t file_size,
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       MultipartUploadRequest::Callback callback) override {
     return std::make_unique<FakeMultipartUploadRequest>(
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.cc b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.cc
index c0c6f78..9a1bda2e 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.cc
@@ -88,12 +88,14 @@
     const GURL& base_url,
     const std::string& metadata,
     const base::FilePath& path,
+    uint64_t file_size,
     const net::NetworkTrafficAnnotationTag& traffic_annotation,
     Callback callback)
     : base_url_(base_url),
       metadata_(metadata),
       data_source_(FILE),
       path_(path),
+      data_size_(file_size),
       boundary_(net::GenerateMimeMultipartBoundary()),
       callback_(std::move(callback)),
       current_backoff_(base::Seconds(kInitialBackoffSeconds)),
@@ -114,6 +116,7 @@
       metadata_(metadata),
       data_source_(PAGE),
       page_region_(std::move(page_region)),
+      data_size_(page_region_.GetSize()),
       boundary_(net::GenerateMimeMultipartBoundary()),
       callback_(std::move(callback)),
       current_backoff_(base::Seconds(kInitialBackoffSeconds)),
@@ -155,18 +158,36 @@
                        "\r\n\r\n", data, "\r\n--", boundary_, "--\r\n"});
 }
 
+void MultipartUploadRequest::SetRequestHeaders(
+    network::ResourceRequest* request) {
+  request->headers.SetHeader("X-Goog-Upload-Protocol", "multipart");
+  uint64_t data_size = 0;
+  switch (data_source_) {
+    case STRING:
+      data_size = data_.size();
+      break;
+    case FILE:
+    case PAGE:
+      data_size = data_size_;
+      break;
+    default:
+      NOTREACHED();
+  }
+  request->headers.SetHeader("X-Goog-Upload-Header-Content-Length",
+                             base::NumberToString(data_size));
+
+  if (access_token_.empty()) {
+    request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+  } else {
+    SetAccessTokenAndClearCookieInResourceRequest(request, access_token_);
+  }
+}
+
 void MultipartUploadRequest::SendRequest() {
   auto resource_request = std::make_unique<network::ResourceRequest>();
   resource_request->url = base_url_;
   resource_request->method = "POST";
-  resource_request->headers.SetHeader("X-Goog-Upload-Protocol", "multipart");
-
-  if (access_token_.empty()) {
-    resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit;
-  } else {
-    SetAccessTokenAndClearCookieInResourceRequest(resource_request.get(),
-                                                  access_token_);
-  }
+  SetRequestHeaders(resource_request.get());
 
   switch (data_source_) {
     case STRING:
@@ -330,16 +351,17 @@
     const GURL& base_url,
     const std::string& metadata,
     const base::FilePath& path,
+    uint64_t file_size,
     const net::NetworkTrafficAnnotationTag& traffic_annotation,
     MultipartUploadRequest::Callback callback) {
   if (!factory_) {
     return std::make_unique<MultipartUploadRequest>(
-        url_loader_factory, base_url, metadata, path, traffic_annotation,
-        std::move(callback));
+        url_loader_factory, base_url, metadata, path, file_size,
+        traffic_annotation, std::move(callback));
   }
 
   return factory_->CreateFileRequest(url_loader_factory, base_url, metadata,
-                                     path, traffic_annotation,
+                                     path, file_size, traffic_annotation,
                                      std::move(callback));
 }
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.h b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.h
index 9e6035e..6520ee35 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.h
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader.h
@@ -55,6 +55,7 @@
       const GURL& base_url,
       const std::string& metadata,
       const base::FilePath& path,
+      uint64_t file_size,
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       Callback callback);
 
@@ -98,6 +99,7 @@
       const GURL& base_url,
       const std::string& metadata,
       const base::FilePath& file,
+      uint64_t file_size,
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       MultipartUploadRequest::Callback callback);
 
@@ -115,6 +117,8 @@
 
   void set_access_token(const std::string& access_token);
 
+  void SetRequestHeaders(network::ResourceRequest* request);
+
  private:
   FRIEND_TEST_ALL_PREFIXES(MultipartUploadRequestTest, GeneratesCorrectBody);
   FRIEND_TEST_ALL_PREFIXES(MultipartUploadRequestTest, RetriesCorrectly);
@@ -176,6 +180,9 @@
   // Memory to upload. Only populated for PAGE requests.
   base::ReadOnlySharedMemoryRegion page_region_;
 
+  // Size of the file or page region.
+  uint64_t data_size_ = 0;
+
   // Data pipe getter used to stream a file or a page. Only populated for the
   // corresponding requests.
   std::unique_ptr<MultipartDataPipeGetter> data_pipe_getter_;
@@ -212,6 +219,7 @@
       const GURL& base_url,
       const std::string& metadata,
       const base::FilePath& path,
+      uint64_t file_size,
       const net::NetworkTrafficAnnotationTag& traffic_annotation,
       MultipartUploadRequest::Callback callback) = 0;
   virtual std::unique_ptr<MultipartUploadRequest> CreatePageRequest(
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader_unittest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader_unittest.cc
index b538ead..d14d0d3 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader_unittest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/multipart_uploader_unittest.cc
@@ -77,6 +77,7 @@
                                GURL(),
                                "metadata",
                                path,
+                               123,
                                TRAFFIC_ANNOTATION_FOR_TESTS,
                                std::move(callback)) {}
 
@@ -319,4 +320,65 @@
   EXPECT_EQ(expected_body, data_pipe_request->GetBodyFromFileOrPageRequest());
 }
 
+TEST_F(MultipartUploadRequestTest, GeneratesCorrectHeaders_StringRequest) {
+  network::ResourceRequest resource_request;
+  std::string header_value;
+
+  std::unique_ptr<MultipartUploadRequest> request =
+      MultipartUploadRequest::CreateStringRequest(
+          nullptr, GURL(), "metadata", "data", TRAFFIC_ANNOTATION_FOR_TESTS,
+          base::DoNothing());
+  request->SetRequestHeaders(&resource_request);
+  ASSERT_TRUE(resource_request.headers.HasHeader("X-Goog-Upload-Protocol"));
+  ASSERT_TRUE(resource_request.headers.GetHeader("X-Goog-Upload-Protocol",
+                                                 &header_value));
+  ASSERT_EQ(header_value, "multipart");
+  ASSERT_TRUE(resource_request.headers.HasHeader(
+      "X-Goog-Upload-Header-Content-Length"));
+  ASSERT_TRUE(resource_request.headers.GetHeader(
+      "X-Goog-Upload-Header-Content-Length", &header_value));
+  ASSERT_EQ(header_value, "4");
+}
+
+TEST_F(MultipartUploadRequestTest, GeneratesCorrectHeaders_FileRequest) {
+  network::ResourceRequest resource_request;
+  std::string header_value;
+
+  std::unique_ptr<MultipartUploadRequest> request =
+      MultipartUploadRequest::CreateFileRequest(
+          nullptr, GURL(), "metadata",
+          CreateFile("my_file_name.foo", "file_data"), 9,
+          TRAFFIC_ANNOTATION_FOR_TESTS, base::DoNothing());
+  request->SetRequestHeaders(&resource_request);
+  ASSERT_TRUE(resource_request.headers.HasHeader("X-Goog-Upload-Protocol"));
+  ASSERT_TRUE(resource_request.headers.GetHeader("X-Goog-Upload-Protocol",
+                                                 &header_value));
+  ASSERT_EQ(header_value, "multipart");
+  ASSERT_TRUE(resource_request.headers.HasHeader(
+      "X-Goog-Upload-Header-Content-Length"));
+  ASSERT_TRUE(resource_request.headers.GetHeader(
+      "X-Goog-Upload-Header-Content-Length", &header_value));
+  ASSERT_EQ(header_value, "9");
+}
+
+TEST_F(MultipartUploadRequestTest, GeneratesCorrectHeaders_PageRequest) {
+  network::ResourceRequest resource_request;
+  std::string header_value;
+
+  std::unique_ptr<MultipartUploadRequest> request =
+      MultipartUploadRequest::CreatePageRequest(
+          nullptr, GURL(), "metadata", CreatePage("print_data"),
+          TRAFFIC_ANNOTATION_FOR_TESTS, base::DoNothing());
+  request->SetRequestHeaders(&resource_request);
+  ASSERT_TRUE(resource_request.headers.HasHeader("X-Goog-Upload-Protocol"));
+  ASSERT_TRUE(resource_request.headers.GetHeader("X-Goog-Upload-Protocol",
+                                                 &header_value));
+  ASSERT_EQ(header_value, "multipart");
+  ASSERT_TRUE(resource_request.headers.HasHeader(
+      "X-Goog-Upload-Header-Content-Length"));
+  ASSERT_TRUE(resource_request.headers.GetHeader(
+      "X-Goog-Upload-Header-Content-Length", &header_value));
+  ASSERT_EQ(header_value, "10");
+}
+
 }  // namespace safe_browsing
diff --git a/chrome/browser/sync/test/integration/single_client_history_sync_test.cc b/chrome/browser/sync/test/integration/single_client_history_sync_test.cc
index 5d47fe79..64c84b7 100644
--- a/chrome/browser/sync/test/integration/single_client_history_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_history_sync_test.cc
@@ -542,6 +542,24 @@
             ReferrerURLIs(url1.spec())))));
 }
 
+IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest,
+                       UploadsMarkVisitAsKnownToSync) {
+  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
+
+  // Navigate to some URL, and make sure it shows up on the server.
+  GURL url1 =
+      embedded_test_server()->GetURL("www.host1.com", "/sync/simple.html");
+  NavigateToURL(url1, ui::PAGE_TRANSITION_AUTO_BOOKMARK);
+  ASSERT_TRUE(WaitForServerHistory(UnorderedElementsAre(
+      AllOf(StandardFieldsArePopulated(), UrlIs(url1.spec())))));
+
+  // Now also verify that the local visit is marked as known to sync.
+  history::VisitVector visits =
+      typed_urls_helper::GetVisitsForURLFromClient(/*index=*/0, url1);
+  ASSERT_EQ(visits.size(), 1U);
+  EXPECT_TRUE(visits[0].is_known_to_sync);
+}
+
 IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest, UploadsServerRedirect) {
   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
 
@@ -677,6 +695,30 @@
 }
 
 IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest,
+                       DownloadsAndMarksRemoteVisitAsKnownToSync) {
+  ASSERT_TRUE(SetupClients()) << "SetupClients() failed.";
+
+  // This simple test only has a single remote visit.
+  const GURL url_remote("https://www.url-remote.com");
+  GetFakeServer()->InjectEntity(CreateFakeServerEntity(CreateSpecifics(
+      base::Time::Now() - base::Minutes(5), "other_cache_guid", url_remote)));
+
+  // Turn on Sync - this should download the single remote visit.
+  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
+
+  // The "remote" URLs should have one visit marked as known to Sync.
+  history::URLRow row_remote;
+  EXPECT_TRUE(typed_urls_helper::GetUrlFromClient(/*index=*/0, url_remote,
+                                                  &row_remote));
+  EXPECT_EQ(row_remote.visit_count(), 1);
+
+  history::VisitVector visits =
+      typed_urls_helper::GetVisitsFromClient(/*index=*/0, row_remote.id());
+  ASSERT_EQ(visits.size(), 1U);
+  EXPECT_TRUE(visits[0].is_known_to_sync);
+}
+
+IN_PROC_BROWSER_TEST_F(SingleClientHistorySyncTest,
                        DownloadsServerRedirectChain) {
   const GURL url1("https://www.url1.com");
   const GURL url2("https://www.url2.com");
diff --git a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java
index b3c701bf..907c5a6 100644
--- a/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java
+++ b/chrome/browser/tabpersistence/android/java/src/org/chromium/chrome/browser/tabpersistence/TabStateFileManager.java
@@ -7,6 +7,7 @@
 import android.os.SystemClock;
 import android.util.Pair;
 
+import androidx.annotation.IntDef;
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.Log;
@@ -29,7 +30,10 @@
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.nio.ByteBuffer;
+import java.nio.channels.ClosedByInterruptException;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileChannel.MapMode;
 
@@ -50,6 +54,20 @@
     private static String sChannelNameOverrideForTest;
 
     /**
+     * Enum representing the exception that occurred during {@link restoreTabState}.
+     */
+    @IntDef({RestoreTabStateException.FILE_NOT_FOUND_EXCEPTION,
+            RestoreTabStateException.CLOSED_BY_INTERRUPT_EXCEPTION,
+            RestoreTabStateException.IO_EXCEPTION, RestoreTabStateException.NUM_ENTRIES})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface RestoreTabStateException {
+        int FILE_NOT_FOUND_EXCEPTION = 0;
+        int CLOSED_BY_INTERRUPT_EXCEPTION = 1;
+        int IO_EXCEPTION = 2;
+        int NUM_ENTRIES = 3;
+    }
+
+    /**
      * Restore a TabState file for a particular Tab.  Checks if the Tab exists as a regular tab
      * before searching for an encrypted version.
      * @param stateFolder Folder containing the TabState files.
@@ -94,14 +112,25 @@
             tabState = readState(stream, isEncrypted);
         } catch (FileNotFoundException exception) {
             Log.e(TAG, "Failed to restore tab state for tab: " + tabFile);
+            recordRestoreTabStateException(RestoreTabStateException.FILE_NOT_FOUND_EXCEPTION);
+        } catch (ClosedByInterruptException exception) {
+            Log.e(TAG, "Failed to restore tab state.", exception);
+            recordRestoreTabStateException(RestoreTabStateException.CLOSED_BY_INTERRUPT_EXCEPTION);
         } catch (IOException exception) {
             Log.e(TAG, "Failed to restore tab state.", exception);
+            recordRestoreTabStateException(RestoreTabStateException.IO_EXCEPTION);
         } finally {
             StreamUtil.closeQuietly(stream);
         }
         return tabState;
     }
 
+    private static void recordRestoreTabStateException(
+            @RestoreTabStateException int restoreTabStateException) {
+        RecordHistogram.recordEnumeratedHistogram("Tabs.RestoreTabStateException",
+                restoreTabStateException, RestoreTabStateException.NUM_ENTRIES);
+    }
+
     /**
      * Restores a particular TabState file from storage.
      * @param input Location of the TabState file.
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 8ff1e36..eea8489 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -857,10 +857,6 @@
       "page_info/chrome_page_info_client.cc",
       "page_info/chrome_page_info_client.h",
       "screen_capture_notification_ui_stub.cc",
-      "webui/explore_sites_internals/explore_sites_internals_page_handler.cc",
-      "webui/explore_sites_internals/explore_sites_internals_page_handler.h",
-      "webui/explore_sites_internals/explore_sites_internals_ui.cc",
-      "webui/explore_sites_internals/explore_sites_internals_ui.h",
       "webui/internals/lens/lens_internals_ui_message_handler.cc",
       "webui/internals/lens/lens_internals_ui_message_handler.h",
       "webui/internals/notifications/notifications_internals_ui_message_handler.cc",
@@ -900,7 +896,6 @@
       "//chrome/browser/ui:adaptive_toolbar_enums_java",
       "//chrome/browser/ui/android/autofill/internal:jni_headers",
       "//chrome/browser/ui/android/toolbar:jni_headers",
-      "//chrome/browser/ui/webui/explore_sites_internals:mojo_bindings",
       "//chrome/browser/ui/webui/feed_internals:mojo_bindings",
       "//components/browser_ui/accessibility/android",
       "//components/browser_ui/client_certificate/android",
@@ -1236,6 +1231,10 @@
       "performance_controls/high_efficiency_bubble_observer.h",
       "performance_controls/high_efficiency_iph_controller.cc",
       "performance_controls/high_efficiency_iph_controller.h",
+      "performance_controls/performance_controls_hats_service.cc",
+      "performance_controls/performance_controls_hats_service.h",
+      "performance_controls/performance_controls_hats_service_factory.cc",
+      "performance_controls/performance_controls_hats_service_factory.h",
       "performance_controls/performance_controls_metrics.cc",
       "performance_controls/performance_controls_metrics.h",
       "performance_controls/tab_discard_tab_helper.cc",
diff --git a/chrome/browser/ui/ash/network/network_state_notifier.cc b/chrome/browser/ui/ash/network/network_state_notifier.cc
index 11e5b5f..cbcea3f 100644
--- a/chrome/browser/ui/ash/network/network_state_notifier.cc
+++ b/chrome/browser/ui/ash/network/network_state_notifier.cc
@@ -58,8 +58,8 @@
 
 std::string GetStringFromDictionary(const absl::optional<base::Value>& dict,
                                     const std::string& key) {
-  const base::Value* v = dict ? dict->FindKey(key) : nullptr;
-  return v ? v->GetString() : std::string();
+  const std::string* v = dict ? dict->GetDict().FindString(key) : nullptr;
+  return v ? *v : std::string();
 }
 
 // Error messages based on |error_name|, not network_state->GetError().
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.cc b/chrome/browser/ui/ash/projector/projector_client_impl.cc
index d40d808..533ba653 100644
--- a/chrome/browser/ui/ash/projector/projector_client_impl.cc
+++ b/chrome/browser/ui/ash/projector/projector_client_impl.cc
@@ -12,10 +12,12 @@
 #include "ash/public/cpp/projector/projector_new_screencast_precondition.h"
 #include "ash/webui/projector_app/projector_app_client.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
+#include "base/check.h"
 #include "base/containers/fixed_flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_helpers.h"
+#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
 #include "chrome/browser/ash/system_web_apps/types/system_web_app_type.h"
@@ -71,6 +73,42 @@
   return locale;
 }
 
+ash::OnDeviceToServerSpeechRecognitionFallbackReason GetFallbackReason(
+    ash::OnDeviceRecognitionAvailability availability) {
+  if (ash::features::ShouldForceEnableServerSideSpeechRecognitionForDev()) {
+    return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+        kEnforcedByFlag;
+  }
+
+  DCHECK_NE(availability, ash::OnDeviceRecognitionAvailability::kAvailable);
+  switch (availability) {
+    case ash::OnDeviceRecognitionAvailability::kSodaNotAvailable:
+      return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+          kSodaNotAvailable;
+    case ash::OnDeviceRecognitionAvailability::kUserLanguageNotAvailable:
+      return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+          kUserLanguageNotAvailableForSoda;
+    case ash::OnDeviceRecognitionAvailability::kSodaNotInstalled:
+      return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+          kSodaNotInstalled;
+    case ash::OnDeviceRecognitionAvailability::kSodaInstalling:
+      return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+          kSodaInstalling;
+    case ash::OnDeviceRecognitionAvailability::
+        kSodaInstallationErrorUnspecified:
+      return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+          kSodaInstallationErrorUnspecified;
+    case ash::OnDeviceRecognitionAvailability::
+        kSodaInstallationErrorNeedsReboot:
+      return ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+          kSodaInstallationErrorNeedsReboot;
+    case ash::OnDeviceRecognitionAvailability::kAvailable:
+      break;
+  }
+  NOTREACHED();
+  return ash::OnDeviceToServerSpeechRecognitionFallbackReason::kMaxValue;
+}
+
 }  // namespace
 
 // static
@@ -148,6 +186,10 @@
           /*enable_formatting=*/true, locale,
           /*is_server_based=*/!availability.use_on_device,
           media::mojom::RecognizerClientType::kProjector));
+  if (!availability.use_on_device) {
+    RecordOnDeviceToServerSpeechRecognitionFallbackReason(
+        GetFallbackReason(availability.on_device_availability));
+  }
 }
 
 void ProjectorClientImpl::StopSpeechRecognition() {
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl_unittest.cc b/chrome/browser/ui/ash/projector/projector_client_impl_unittest.cc
index 28de8c0..51fbc15 100644
--- a/chrome/browser/ui/ash/projector/projector_client_impl_unittest.cc
+++ b/chrome/browser/ui/ash/projector/projector_client_impl_unittest.cc
@@ -7,12 +7,14 @@
 #include <memory>
 
 #include "ash/constants/ash_features.h"
+#include "ash/projector/projector_metrics.h"
 #include "ash/public/cpp/locale_update_controller.h"
 #include "ash/public/cpp/projector/projector_client.h"
 #include "ash/public/cpp/projector/projector_controller.h"
 #include "ash/public/cpp/test/mock_projector_controller.h"
 #include "ash/webui/projector_app/public/cpp/projector_app_constants.h"
 #include "ash/webui/projector_app/test/mock_app_client.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/branding_buildflags.h"
 #include "chrome/browser/profiles/profile.h"
@@ -29,6 +31,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
 namespace ash {
@@ -39,6 +42,10 @@
 const char kSecondSpeechResult[] = "the brown fox jumped over the lazy dog";
 
 const char kEnglishUS[] = "en-US";
+
+constexpr char kS3FallbackReasonMetricName[] =
+    "Ash.Projector.OnDeviceToServerSpeechRecognitionFallbackReason";
+
 inline void SetLocale(const std::string& locale) {
   g_browser_process->SetApplicationLocale(locale);
 }
@@ -167,6 +174,29 @@
   }
 
  protected:
+  // Start speech recognition and verify on device to server based speech
+  // recognition fallback reason. If `expected_reason` is null, there will be no
+  // metric recorded because there is no fallback to server based recognition.
+  void MaybeReportToServerBasedFallbackReasonMetricAndVerify(
+      absl::optional<ash::OnDeviceToServerSpeechRecognitionFallbackReason>
+          expected_reason,
+      int expected_count) {
+    ProjectorClientImpl* client =
+        static_cast<ProjectorClientImpl*>(projector_client_.get());
+    client->StartSpeechRecognition();
+    if (expected_reason.has_value()) {
+      histogram_tester_.ExpectBucketCount(kS3FallbackReasonMetricName,
+                                          /*sample=*/expected_reason.value(),
+                                          /*expected_count=*/expected_count);
+    } else {
+      EXPECT_TRUE(client->GetSpeechRecognitionAvailability().use_on_device);
+    }
+
+    client->OnSpeechRecognitionStopped();
+  }
+
+  base::HistogramTester histogram_tester_;
+
   content::BrowserTaskEnvironment task_environment_;
   Profile* testing_profile_ = nullptr;
 
@@ -287,6 +317,64 @@
   }
 }
 
+TEST_P(ProjectorClientImplUnitTest, FallbackReasonMetric) {
+  const bool force_enable_server_based =
+      features::ShouldForceEnableServerSideSpeechRecognitionForDev();
+  const bool server_based_available =
+      features::IsInternalServerSideSpeechRecognitionEnabled();
+
+  size_t expect_total_count = 0;
+
+  SetLocale(kFrench);
+  if (server_based_available) {
+    if (force_enable_server_based) {
+      MaybeReportToServerBasedFallbackReasonMetricAndVerify(
+          ash::OnDeviceToServerSpeechRecognitionFallbackReason::kEnforcedByFlag,
+          1);
+      expect_total_count++;
+    } else {
+      // French is not available for SODA:
+      MaybeReportToServerBasedFallbackReasonMetricAndVerify(
+          ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+              kUserLanguageNotAvailableForSoda,
+          1);
+
+      // Set available language for SODA:
+      SetLocale(kEnglishUS);
+
+      // Verify metric reports for SODA error:
+      speech::SodaInstaller::GetInstance()->UninstallSodaForTesting();
+
+      speech::SodaInstaller::GetInstance()->NotifySodaErrorForTesting(
+          speech::LanguageCode::kEnUs,
+          speech::SodaInstaller::ErrorCode::kUnspecifiedError);
+      MaybeReportToServerBasedFallbackReasonMetricAndVerify(
+          ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+              kSodaInstallationErrorUnspecified,
+          1);
+      speech::SodaInstaller::GetInstance()->NotifySodaErrorForTesting(
+          speech::LanguageCode::kEnUs,
+          speech::SodaInstaller::ErrorCode::kNeedsReboot);
+      MaybeReportToServerBasedFallbackReasonMetricAndVerify(
+          ash::OnDeviceToServerSpeechRecognitionFallbackReason::
+              kSodaInstallationErrorNeedsReboot,
+          1);
+      expect_total_count += 3;
+    }
+  } else {
+    if (!force_enable_server_based) {
+      // Set available language for SODA:
+      SetLocale(kEnglishUS);
+
+      // No metric reports if SODA is available:
+      MaybeReportToServerBasedFallbackReasonMetricAndVerify(absl::nullopt, 0);
+    }
+  }
+
+  histogram_tester_.ExpectTotalCount(kS3FallbackReasonMetricName,
+                                     /*count=*/expect_total_count);
+}
+
 #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
index 58e4205d..1bddbc5 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_unittest.cc
@@ -64,6 +64,7 @@
 #include "chrome/browser/apps/app_service/app_service_test.h"
 #include "chrome/browser/apps/app_service/policy_util.h"
 #include "chrome/browser/ash/app_list/app_list_syncable_service_factory.h"
+#include "chrome/browser/ash/app_list/app_service/app_service_app_icon_loader.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_icon.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ash/app_list/arc/arc_app_test.h"
@@ -283,6 +284,59 @@
   std::set<std::string> supported_apps_;
 };
 
+// Fake AppServiceAppIconLoader to wait for icons loaded.
+class FakeAppServiceAppIconLoader : public AppServiceAppIconLoader {
+ public:
+  FakeAppServiceAppIconLoader(Profile* profile,
+                              int resource_size_in_dip,
+                              AppIconLoaderDelegate* delegate)
+      : AppServiceAppIconLoader(profile, resource_size_in_dip, delegate) {}
+
+  void WaitForIconLoadded(
+      const std::vector<std::string>& expected_icon_loaded_app_ids) {
+    bool icon_loaded = true;
+    for (const auto& app_id : expected_icon_loaded_app_ids) {
+      if (!base::Contains(icon_loaded_app_ids_, app_id)) {
+        icon_loaded = false;
+        break;
+      }
+    }
+
+    if (icon_loaded) {
+      return;
+    }
+
+    expected_icon_loaded_app_ids_ = expected_icon_loaded_app_ids;
+    base::RunLoop run_loop;
+    icon_loaded_callback_ = run_loop.QuitClosure();
+    run_loop.Run();
+  }
+
+ private:
+  // Callback invoked when the icon is loaded.
+  void OnLoadIcon(const std::string& app_id,
+                  apps::IconValuePtr icon_value) override {
+    AppServiceAppIconLoader::OnLoadIcon(app_id, std::move(icon_value));
+    icon_loaded_app_ids_.insert(app_id);
+
+    bool icon_loaded = true;
+    for (const auto& id : expected_icon_loaded_app_ids_) {
+      if (!base::Contains(icon_loaded_app_ids_, id)) {
+        icon_loaded = false;
+        break;
+      }
+    }
+
+    if (icon_loaded && !icon_loaded_callback_.is_null()) {
+      std::move(icon_loaded_callback_).Run();
+    }
+  }
+
+  base::OnceClosure icon_loaded_callback_;
+  std::set<std::string> icon_loaded_app_ids_;
+  std::vector<std::string> expected_icon_loaded_app_ids_;
+};
+
 // Test implementation of ShelfControllerHelper.
 class TestShelfControllerHelper : public ShelfControllerHelper {
  public:
@@ -1200,13 +1254,6 @@
                                                       : absl::optional<GURL>());
   }
 
-  void WaitForOnAppUpdated(const std::map<std::string, int>& app_ids) {
-    on_app_updated_app_ids_ = app_ids;
-    base::RunLoop run_loop;
-    on_app_updated_callback_ = run_loop.QuitClosure();
-    run_loop.Run();
-  }
-
   void RemoveWebApp(const char* web_app_id) {
     web_app::test::UninstallWebApp(profile(), web_app_id);
     web_app::AppReadinessWaiter(profile(), web_app_id,
@@ -1214,22 +1261,6 @@
         .Await();
   }
 
-  // apps::AppRegistryCache::Observer overrides:
-  void OnAppUpdate(const apps::AppUpdate& update) override {
-    if (!on_app_updated_callback_.is_null() &&
-        apps_util::IsInstalled(update.Readiness())) {
-      if (base::Contains(on_app_updated_app_ids_, update.AppId())) {
-        on_app_updated_app_ids_[update.AppId()]--;
-        if (on_app_updated_app_ids_[update.AppId()] == 0)
-          on_app_updated_app_ids_.erase(update.AppId());
-      }
-      if (on_app_updated_app_ids_.empty()) {
-        base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
-            FROM_HERE, std::move(on_app_updated_callback_));
-      }
-    }
-  }
-
   void OnAppRegistryCacheWillBeDestroyed(
       apps::AppRegistryCache* cache) override {
     Observe(nullptr);
@@ -1277,8 +1308,6 @@
   }
 
   apps::AppServiceTest app_service_test_;
-  base::OnceClosure on_app_updated_callback_;
-  std::map<std::string, int> on_app_updated_app_ids_;
 };
 
 class ChromeShelfControllerWithArcTest : public ChromeShelfControllerTestBase {
@@ -2005,6 +2034,14 @@
   StartAppSyncService(copy_sync_list);
   RecreateShelfController()->Init();
 
+  // Set FakeAppServiceAppIconLoader to wait for icons loaded.
+  auto fake_app_service_icon_loader =
+      std::make_unique<FakeAppServiceAppIconLoader>(
+          profile(), extension_misc::EXTENSION_ICON_MEDIUM,
+          shelf_controller_.get());
+  FakeAppServiceAppIconLoader* icon_loader = fake_app_service_icon_loader.get();
+  SetAppIconLoader(std::move(fake_app_service_icon_loader));
+
   // Pins must be automatically updated.
   SendListOfArcApps();
   EXPECT_TRUE(shelf_controller_->IsAppPinned(extension1_->id()));
@@ -2026,9 +2063,9 @@
             GetPinnedAppStatus());
 
   // ARC apps, Fake App 1 and Fake App 0, are updated due to icon updates. So
-  // wait for ARC apps icon updated in AppService before reset sync service.
-  WaitForOnAppUpdated(
-      std::map<std::string, int>{{arc_app_id1, 2}, {arc_app_id2, 2}});
+  // wait for ARC apps icon updated by AppService before reset sync service.
+  icon_loader->WaitForIconLoadded(
+      std::vector<std::string>{arc_app_id1, arc_app_id2});
   copy_sync_list = app_list_syncable_service_->GetAllSyncDataForTesting();
 
   ResetShelfController();
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index 01af2b1..08ac5f0a 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1458,12 +1458,11 @@
   return true;
 }
 
-bool Browser::IsPrerender2Supported(content::WebContents& web_contents) {
+content::PreloadingEligibility Browser::IsPrerender2Supported(
+    content::WebContents& web_contents) {
   Profile* profile =
       Profile::FromBrowserContext(web_contents.GetBrowserContext());
-  return prefetch::IsSomePreloadingEnabled(*profile->GetPrefs(),
-                                           &web_contents) ==
-         content::PreloadingEligibility::kEligible;
+  return prefetch::IsSomePreloadingEnabled(*profile->GetPrefs(), &web_contents);
 }
 
 std::unique_ptr<content::WebContents> Browser::ActivatePortalWebContents(
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h
index 7623254..08879ac2 100644
--- a/chrome/browser/ui/browser.h
+++ b/chrome/browser/ui/browser.h
@@ -698,7 +698,8 @@
       content::WebContents* web_contents) override;
   void ExitPictureInPicture() override;
   bool IsBackForwardCacheSupported() override;
-  bool IsPrerender2Supported(content::WebContents& web_contents) override;
+  content::PreloadingEligibility IsPrerender2Supported(
+      content::WebContents& web_contents) override;
   std::unique_ptr<content::WebContents> ActivatePortalWebContents(
       content::WebContents* predecessor_contents,
       std::unique_ptr<content::WebContents> portal_contents) override;
diff --git a/chrome/browser/ui/hats/hats_helper.cc b/chrome/browser/ui/hats/hats_helper.cc
index 7287cb9..88b3255 100644
--- a/chrome/browser/ui/hats/hats_helper.cc
+++ b/chrome/browser/ui/hats/hats_helper.cc
@@ -11,6 +11,7 @@
 #include "chrome/browser/ui/hats/hats_service_factory.h"
 #include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
 #include "chrome/browser/ui/hats/trust_safety_sentiment_service_factory.h"
+#include "chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/safe_browsing/core/common/features.h"
@@ -33,6 +34,11 @@
     sentiment_service->OpenedNewTabPage();
   }
 
+  if (auto* performance_service =
+          PerformanceControlsHatsServiceFactory::GetForProfile(profile())) {
+    performance_service->OpenedNewTabPage();
+  }
+
   // If the demo HaTS feature is enabled display a test survey on every NTP
   // load unless the "auto_prompt" parameter is explicitly set to false. The
   // demo feature also disables client-side HaTS rate limiting, thus setting
diff --git a/chrome/browser/ui/hats/hats_service.cc b/chrome/browser/ui/hats/hats_service.cc
index 651c75b1..bb3800c 100644
--- a/chrome/browser/ui/hats/hats_service.cc
+++ b/chrome/browser/ui/hats/hats_service.cc
@@ -29,6 +29,7 @@
 #include "chrome/common/pref_names.h"
 #include "components/history_clusters/core/features.h"
 #include "components/metrics_services_manager/metrics_services_manager.h"
+#include "components/performance_manager/public/features.h"
 #include "components/permissions/constants.h"
 #include "components/permissions/features.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -49,6 +50,14 @@
 constexpr char kHatsSurveyTriggerNtpModules[] = "ntp-modules";
 constexpr char kHatsSurveyTriggerNtpPhotosModuleOptOut[] =
     "ntp-photos-module-opt-out";
+constexpr char kHatsSurveyTriggerPerformanceControlsPerformance[] =
+    "performance-general";
+constexpr char kHatsSurveyTriggerPerformanceControlsBatteryPerformance[] =
+    "performance-battery";
+constexpr char kHatsSurveyTriggerPerformanceControlsHighEfficiencyOptOut[] =
+    "performance-high-efficiency-opt-out";
+constexpr char kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut[] =
+    "performance-battery-saver-opt-out";
 constexpr char kHatsSurveyTriggerPermissionsPostPrompt[] =
     "permissions-post-prompt";
 constexpr char kHatsSurveyTriggerPrivacyGuide[] = "privacy-guide";
@@ -318,6 +327,23 @@
           permissions::kPermissionsPostPromptSurveyRequestTypeKey,
           permissions::kPermissionsPostPromptSurveyReleaseChannelKey});
 
+  // Performance Controls surveys.
+  survey_configs.emplace_back(
+      &performance_manager::features::kPerformanceControlsPerformanceSurvey,
+      kHatsSurveyTriggerPerformanceControlsPerformance);
+  survey_configs.emplace_back(
+      &performance_manager::features::
+          kPerformanceControlsBatteryPerformanceSurvey,
+      kHatsSurveyTriggerPerformanceControlsBatteryPerformance);
+  survey_configs.emplace_back(
+      &performance_manager::features::
+          kPerformanceControlsHighEfficiencyOptOutSurvey,
+      kHatsSurveyTriggerPerformanceControlsHighEfficiencyOptOut);
+  survey_configs.emplace_back(
+      &performance_manager::features::
+          kPerformanceControlsBatterySaverOptOutSurvey,
+      kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut);
+
   return survey_configs;
 }
 
diff --git a/chrome/browser/ui/hats/hats_service.h b/chrome/browser/ui/hats/hats_service.h
index ec7a17c..1ce172c 100644
--- a/chrome/browser/ui/hats/hats_service.h
+++ b/chrome/browser/ui/hats/hats_service.h
@@ -45,6 +45,10 @@
 extern const char kHatsSurveyTriggerJourneysOmniboxEntrypoint[];
 extern const char kHatsSurveyTriggerNtpModules[];
 extern const char kHatsSurveyTriggerNtpPhotosModuleOptOut[];
+extern const char kHatsSurveyTriggerPerformanceControlsPerformance[];
+extern const char kHatsSurveyTriggerPerformanceControlsBatteryPerformance[];
+extern const char kHatsSurveyTriggerPerformanceControlsHighEfficiencyOptOut[];
+extern const char kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut[];
 extern const char kHatsSurveyTriggerPermissionsPostPrompt[];
 extern const char kHatsSurveyTriggerPrivacyGuide[];
 extern const char kHatsSurveyTriggerPrivacySandbox[];
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
index c215a93..8320ac6 100644
--- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
+++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
@@ -88,7 +88,7 @@
     public static final int UMA_TAB_GROUP_MANUAL_CREATION_UNDO = 32;
     public static final int UMA_TWA_PRIVACY_DISCLOSURE_V2 = 33;
     public static final int UMA_HOMEPAGE_PROMO_CHANGED_UNDO = 34;
-    public static final int UMA_CONDITIONAL_TAB_STRIP_DISMISS_UNDO = 35;
+    // Obsolete; don't use: UMA_CONDITIONAL_TAB_STRIP_DISMISS_UNDO = 35;
     public static final int UMA_PAINT_PREVIEW_UPGRADE_NOTIFICATION = 36;
     public static final int UMA_READING_LIST_BOOKMARK_ADDED = 37;
     public static final int UMA_PRIVACY_SANDBOX_PAGE_OPEN = 38;
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc
new file mode 100644
index 0000000..71e0c90
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service.cc
@@ -0,0 +1,93 @@
+// 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 "chrome/browser/ui/performance_controls/performance_controls_hats_service.h"
+
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/performance_manager/public/user_tuning/user_performance_tuning_manager.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/hats/hats_service.h"
+#include "chrome/browser/ui/hats/hats_service_factory.h"
+#include "components/performance_manager/public/features.h"
+#include "components/performance_manager/public/user_tuning/prefs.h"
+#include "components/prefs/pref_service.h"
+
+PerformanceControlsHatsService::PerformanceControlsHatsService(Profile* profile)
+    : profile_(profile) {}
+
+void PerformanceControlsHatsService::OpenedNewTabPage() {
+  HatsService* hats_service = HatsServiceFactory::GetForProfile(profile_, true);
+
+  // If none of the features are enabled, return early.
+  if (!hats_service) {
+    return;
+  }
+
+  const bool show_performance_survey = base::FeatureList::IsEnabled(
+      performance_manager::features::kPerformanceControlsPerformanceSurvey);
+  const bool show_battery_survey = base::FeatureList::IsEnabled(
+      performance_manager::features::
+          kPerformanceControlsBatteryPerformanceSurvey);
+  const bool show_high_efficiency_opt_out_survey = base::FeatureList::IsEnabled(
+      performance_manager::features::
+          kPerformanceControlsHighEfficiencyOptOutSurvey);
+  const bool show_battery_saver_opt_out_survey = base::FeatureList::IsEnabled(
+      performance_manager::features::
+          kPerformanceControlsBatterySaverOptOutSurvey);
+
+  PrefService* prefs = g_browser_process->local_state();
+  const int battery_saver_mode = prefs->GetInteger(
+      performance_manager::user_tuning::prefs::kBatterySaverModeState);
+  const bool high_efficiency_mode = prefs->GetBoolean(
+      performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled);
+
+  // A general performance survey for all users.
+  if (show_performance_survey) {
+    hats_service->LaunchSurvey(
+        kHatsSurveyTriggerPerformanceControlsPerformance, base::DoNothing(),
+        base::DoNothing(), {{"high_efficiency_mode", high_efficiency_mode}},
+        {{"battery_saver_mode", base::NumberToString(battery_saver_mode)}});
+  }
+
+  // A battery performance survey for users with a battery-powered device.
+  if (show_battery_survey && performance_manager::user_tuning::
+                                 UserPerformanceTuningManager::GetInstance()
+                                     ->DeviceHasBattery()) {
+    hats_service->LaunchSurvey(
+        kHatsSurveyTriggerPerformanceControlsBatteryPerformance,
+        base::DoNothing(), base::DoNothing(),
+        {{"high_efficiency_mode", high_efficiency_mode}},
+        {{"battery_saver_mode", base::NumberToString(battery_saver_mode)}});
+  }
+
+  // A survey for users who have turned off high efficiency mode.
+  if (show_high_efficiency_opt_out_survey && !high_efficiency_mode &&
+      base::FeatureList::IsEnabled(
+          performance_manager::features::kHighEfficiencyModeAvailable)) {
+    auto* pref = prefs->FindPreference(
+        performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled);
+    if (!pref->IsManaged() && !pref->IsDefaultValue()) {
+      hats_service->LaunchSurvey(
+          kHatsSurveyTriggerPerformanceControlsHighEfficiencyOptOut);
+    }
+  }
+
+  // A survey for users who have turned off battery saver.
+  if (show_battery_saver_opt_out_survey &&
+      base::FeatureList::IsEnabled(
+          performance_manager::features::kBatterySaverModeAvailable) &&
+      battery_saver_mode ==
+          static_cast<int>(performance_manager::user_tuning::prefs::
+                               BatterySaverModeState::kDisabled)) {
+    auto* pref = prefs->FindPreference(
+        performance_manager::user_tuning::prefs::kBatterySaverModeState);
+    if (!pref->IsManaged()) {
+      hats_service->LaunchSurvey(
+          kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut);
+    }
+  }
+}
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service.h b/chrome/browser/ui/performance_controls/performance_controls_hats_service.h
new file mode 100644
index 0000000..f4c44ce
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service.h
@@ -0,0 +1,24 @@
+// 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 CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_PERFORMANCE_CONTROLS_HATS_SERVICE_H_
+#define CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_PERFORMANCE_CONTROLS_HATS_SERVICE_H_
+
+#include "chrome/browser/profiles/profile.h"
+#include "components/keyed_service/core/keyed_service.h"
+
+class PerformanceControlsHatsService : public KeyedService {
+ public:
+  explicit PerformanceControlsHatsService(Profile* profile);
+  ~PerformanceControlsHatsService() override = default;
+
+  // Called when the user opens an NTP. This allows the service to check if one
+  // of the performance controls surveys should be shown.
+  void OpenedNewTabPage();
+
+ private:
+  raw_ptr<Profile> profile_;
+};
+
+#endif  // CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_PERFORMANCE_CONTROLS_HATS_SERVICE_H_
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc
new file mode 100644
index 0000000..ddd1a28
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.cc
@@ -0,0 +1,63 @@
+// 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 "chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.h"
+
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/ui/hats/hats_service.h"
+#include "chrome/browser/ui/hats/hats_service_factory.h"
+#include "chrome/browser/ui/performance_controls/performance_controls_hats_service.h"
+#include "components/performance_manager/public/features.h"
+#include "content/public/browser/browser_context.h"
+
+PerformanceControlsHatsServiceFactory::PerformanceControlsHatsServiceFactory()
+    : ProfileKeyedServiceFactory("PerformanceControlsHatsService") {
+  DependsOn(HatsServiceFactory::GetInstance());
+  DependsOn(HostContentSettingsMapFactory::GetInstance());
+}
+
+PerformanceControlsHatsServiceFactory*
+PerformanceControlsHatsServiceFactory::GetInstance() {
+  return base::Singleton<PerformanceControlsHatsServiceFactory>::get();
+}
+
+PerformanceControlsHatsService*
+PerformanceControlsHatsServiceFactory::GetForProfile(Profile* profile) {
+  return static_cast<PerformanceControlsHatsService*>(
+      GetInstance()->GetServiceForBrowserContext(profile, /*create=*/true));
+}
+
+KeyedService* PerformanceControlsHatsServiceFactory::BuildServiceInstanceFor(
+    content::BrowserContext* context) const {
+  if (context->IsOffTheRecord() ||
+      (!base::FeatureList::IsEnabled(
+           performance_manager::features::
+               kPerformanceControlsPerformanceSurvey) &&
+       !base::FeatureList::IsEnabled(
+           performance_manager::features::
+               kPerformanceControlsBatteryPerformanceSurvey) &&
+       !base::FeatureList::IsEnabled(
+           performance_manager::features::
+               kPerformanceControlsHighEfficiencyOptOutSurvey) &&
+       !base::FeatureList::IsEnabled(
+           performance_manager::features::
+               kPerformanceControlsBatterySaverOptOutSurvey))) {
+    return nullptr;
+  }
+  Profile* profile = Profile::FromBrowserContext(context);
+
+  // If there is no HaTS service, or the HaTS service reports the user is not
+  // eligible to be surveyed by HaTS, do not create the service. This state is
+  // unlikely to change over the life of the profile (e.g. before closing
+  // Chrome) and simply not creating the service avoids unnecessary work
+  // tracking user interactions.
+  auto* hats_service =
+      HatsServiceFactory::GetForProfile(profile, /*create_if_necessary=*/true);
+  if (!hats_service ||
+      !hats_service->CanShowAnySurvey(/*user_prompted=*/false)) {
+    return nullptr;
+  }
+
+  return new PerformanceControlsHatsService(profile);
+}
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.h b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.h
new file mode 100644
index 0000000..a42d9a31
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_factory.h
@@ -0,0 +1,31 @@
+// 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 CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_PERFORMANCE_CONTROLS_HATS_SERVICE_FACTORY_H_
+#define CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_PERFORMANCE_CONTROLS_HATS_SERVICE_FACTORY_H_
+
+#include "base/memory/singleton.h"
+#include "chrome/browser/profiles/profile_keyed_service_factory.h"
+#include "chrome/browser/ui/hats/trust_safety_sentiment_service.h"
+#include "chrome/browser/ui/performance_controls/performance_controls_hats_service.h"
+
+class PerformanceControlsHatsServiceFactory
+    : public ProfileKeyedServiceFactory {
+ public:
+  static PerformanceControlsHatsServiceFactory* GetInstance();
+  static PerformanceControlsHatsService* GetForProfile(Profile* profile);
+
+ private:
+  friend struct base::DefaultSingletonTraits<
+      PerformanceControlsHatsServiceFactory>;
+
+  PerformanceControlsHatsServiceFactory();
+  ~PerformanceControlsHatsServiceFactory() override = default;
+
+  // BrowserContextKeyedServiceFactory:
+  KeyedService* BuildServiceInstanceFor(
+      content::BrowserContext* context) const override;
+};
+
+#endif  // CHROME_BROWSER_UI_PERFORMANCE_CONTROLS_PERFORMANCE_CONTROLS_HATS_SERVICE_FACTORY_H_
diff --git a/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc b/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc
new file mode 100644
index 0000000..7df3c07
--- /dev/null
+++ b/chrome/browser/ui/performance_controls/performance_controls_hats_service_unittest.cc
@@ -0,0 +1,195 @@
+// 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 "chrome/browser/ui/performance_controls/performance_controls_hats_service.h"
+#include <memory>
+
+#include "base/memory/raw_ptr.h"
+#include "base/test/power_monitor_test_utils.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/performance_manager/test_support/test_user_performance_tuning_manager_environment.h"
+#include "chrome/browser/ui/hats/hats_service_factory.h"
+#include "chrome/browser/ui/hats/mock_hats_service.h"
+#include "chrome/test/base/testing_browser_process.h"
+#include "chrome/test/base/testing_profile.h"
+#include "chrome/test/base/testing_profile_manager.h"
+#include "components/performance_manager/public/features.h"
+#include "components/performance_manager/public/user_tuning/prefs.h"
+#include "components/prefs/testing_pref_service.h"
+#include "content/public/test/browser_task_environment.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+
+class PerformanceControlsHatsServiceTest : public testing::Test {
+ public:
+  PerformanceControlsHatsServiceTest() = default;
+
+  void SetUp() override {
+    testing::Test::SetUp();
+
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(profile_manager_->SetUp());
+    TestingProfile* profile =
+        profile_manager_->CreateTestingProfile("Test", true);
+
+    mock_hats_service_ = static_cast<MockHatsService*>(
+        HatsServiceFactory::GetInstance()->SetTestingFactoryAndUse(
+            profile, base::BindRepeating(&BuildMockHatsService)));
+    EXPECT_CALL(*mock_hats_service(), CanShowAnySurvey(_))
+        .WillRepeatedly(testing::Return(true));
+
+    feature_list_.InitWithFeaturesAndParameters(GetFeatures(), {});
+    performance_manager::user_tuning::prefs::RegisterLocalStatePrefs(
+        local_state_.registry());
+    environment_.SetUp(&local_state_);
+
+    performance_controls_hats_service_ =
+        std::make_unique<PerformanceControlsHatsService>(profile);
+  }
+
+  void TearDown() override {
+    environment_.TearDown();
+    profile_manager_.reset();
+    testing::Test::TearDown();
+  }
+
+  void SetBatterySaverMode(
+      const performance_manager::user_tuning::prefs::BatterySaverModeState
+          battery_saver_mode) {
+    g_browser_process->local_state()->SetInteger(
+        performance_manager::user_tuning::prefs::kBatterySaverModeState,
+        static_cast<int>(battery_saver_mode));
+  }
+
+  void SetHighEfficiencyEnabled(const bool high_efficiency_enabled) {
+    g_browser_process->local_state()->SetBoolean(
+        performance_manager::user_tuning::prefs::kHighEfficiencyModeEnabled,
+        high_efficiency_enabled);
+  }
+
+  PerformanceControlsHatsService* performance_controls_hats_service() {
+    return performance_controls_hats_service_.get();
+  }
+  MockHatsService* mock_hats_service() { return mock_hats_service_; }
+
+ protected:
+  performance_manager::user_tuning::TestUserPerformanceTuningManagerEnvironment
+      environment_;
+
+  virtual const std::vector<base::test::FeatureRefAndParams> GetFeatures() {
+    return {
+        {performance_manager::features::kPerformanceControlsPerformanceSurvey,
+         {}},
+    };
+  }
+
+ private:
+  content::BrowserTaskEnvironment task_environment_;
+  base::test::ScopedFeatureList feature_list_;
+  TestingPrefServiceSimple local_state_;
+  std::unique_ptr<TestingProfileManager> profile_manager_;
+  std::unique_ptr<PerformanceControlsHatsService>
+      performance_controls_hats_service_;
+  raw_ptr<MockHatsService> mock_hats_service_;
+};
+
+class PerformanceControlsHatsServiceHasBatteryTest
+    : public PerformanceControlsHatsServiceTest {
+ public:
+  void SetUp() override {
+    PerformanceControlsHatsServiceTest::SetUp();
+
+    // Set the battery status so DeviceHasBattery() returns true.
+    environment_.battery_level_provider()->SetBatteryState(
+        base::test::TestBatteryLevelProvider::CreateBatteryState());
+    environment_.sampling_source()->SimulateEvent();
+  }
+
+ protected:
+  const std::vector<base::test::FeatureRefAndParams> GetFeatures() override {
+    return {
+        {performance_manager::features::
+             kPerformanceControlsBatteryPerformanceSurvey,
+         {}},
+        {performance_manager::features::kBatterySaverModeAvailable, {}},
+    };
+  }
+};
+
+class PerformanceControlsHatsServiceMemoryOptOutTest
+    : public PerformanceControlsHatsServiceTest {
+ protected:
+  const std::vector<base::test::FeatureRefAndParams> GetFeatures() override {
+    return {
+        {performance_manager::features::
+             kPerformanceControlsHighEfficiencyOptOutSurvey,
+         {}},
+        {performance_manager::features::kHighEfficiencyModeAvailable, {}},
+    };
+  }
+};
+
+class PerformanceControlsHatsServiceBatteryOptOutTest
+    : public PerformanceControlsHatsServiceTest {
+ protected:
+  const std::vector<base::test::FeatureRefAndParams> GetFeatures() override {
+    return {
+        {performance_manager::features::
+             kPerformanceControlsBatterySaverOptOutSurvey,
+         {}},
+        {performance_manager::features::kBatterySaverModeAvailable, {}},
+    };
+  }
+};
+
+TEST_F(PerformanceControlsHatsServiceTest, LaunchesPerformanceSurvey) {
+  SetHighEfficiencyEnabled(false);
+  SetBatterySaverMode(performance_manager::user_tuning::prefs::
+                          BatterySaverModeState::kEnabledBelowThreshold);
+
+  SurveyBitsData expected_bits = {{"high_efficiency_mode", false}};
+  SurveyStringData expected_strings = {
+      {"battery_saver_mode",
+       base::NumberToString(static_cast<int>(
+           performance_manager::user_tuning::prefs::BatterySaverModeState::
+               kEnabledBelowThreshold))}};
+  EXPECT_CALL(*mock_hats_service(),
+              LaunchSurvey(kHatsSurveyTriggerPerformanceControlsPerformance, _,
+                           _, expected_bits, expected_strings));
+  performance_controls_hats_service()->OpenedNewTabPage();
+}
+
+TEST_F(PerformanceControlsHatsServiceHasBatteryTest,
+       LaunchesBatteryPerformanceSurvey) {
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerPerformanceControlsBatteryPerformance, _,
+                   _, _, _));
+  performance_controls_hats_service()->OpenedNewTabPage();
+}
+
+TEST_F(PerformanceControlsHatsServiceMemoryOptOutTest,
+       LaunchesMemoryOptOutSurvey) {
+  SetHighEfficiencyEnabled(false);
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerPerformanceControlsHighEfficiencyOptOut, _,
+                   _, _, _));
+  performance_controls_hats_service()->OpenedNewTabPage();
+}
+
+TEST_F(PerformanceControlsHatsServiceBatteryOptOutTest,
+       LaunchesBatteryOptOutSurvey) {
+  SetBatterySaverMode(performance_manager::user_tuning::prefs::
+                          BatterySaverModeState::kDisabled);
+  EXPECT_CALL(
+      *mock_hats_service(),
+      LaunchSurvey(kHatsSurveyTriggerPerformanceControlsBatterySaverOptOut, _,
+                   _, _, _));
+  performance_controls_hats_service()->OpenedNewTabPage();
+}
diff --git a/chrome/browser/ui/tab_helpers.cc b/chrome/browser/ui/tab_helpers.cc
index 6840b3f..e5ac635 100644
--- a/chrome/browser/ui/tab_helpers.cc
+++ b/chrome/browser/ui/tab_helpers.cc
@@ -551,7 +551,18 @@
     BUILDFLAG(IS_CHROMEOS)
   if (base::FeatureList::IsEnabled(
           features::kHappinessTrackingSurveysForDesktopDemo) ||
-      base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurvey)) {
+      base::FeatureList::IsEnabled(features::kTrustSafetySentimentSurvey) ||
+      base::FeatureList::IsEnabled(performance_manager::features::
+                                       kPerformanceControlsPerformanceSurvey) ||
+      base::FeatureList::IsEnabled(
+          performance_manager::features::
+              kPerformanceControlsBatteryPerformanceSurvey) ||
+      base::FeatureList::IsEnabled(
+          performance_manager::features::
+              kPerformanceControlsHighEfficiencyOptOutSurvey) ||
+      base::FeatureList::IsEnabled(
+          performance_manager::features::
+              kPerformanceControlsBatterySaverOptOutSurvey)) {
     HatsHelper::CreateForWebContents(web_contents);
   }
   SharedHighlightingPromo::CreateForWebContents(web_contents);
diff --git a/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc b/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
index e9e863c..e0912a03 100644
--- a/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
+++ b/chrome/browser/ui/views/user_education/help_bubble_factory_webui_interactive_uitest.cc
@@ -68,6 +68,10 @@
             .SetDescription("ShowHelpBubble"));
   }
 
+  auto CloseHelpBubble() {
+    return Do(base::BindLambdaForTesting([this]() { help_bubble_->Close(); }));
+  }
+
  protected:
   std::unique_ptr<user_education::HelpBubble> help_bubble_;
 
@@ -93,6 +97,9 @@
 
 IN_PROC_BROWSER_TEST_F(HelpBubbleFactoryWebUIInteractiveUiTest,
                        ShowFloatingHelpBubble) {
+  DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kReadLaterElementId);
+  const DeepQuery kPathToAddCurrentTabElement{"reading-list-app",
+                                              "#currentPageActionButton"};
   RunTestSequence(
       // Click on the toolbar button to show the side panel.
       PressButton(kSidePanelButtonElementId), WaitForShow(kSidePanelElementId),
@@ -101,6 +108,13 @@
                          static_cast<int>(SidePanelEntry::Id::kReadingList)),
       ShowHelpBubble(kAddCurrentTabToReadingListElementId),
 
+      // Verify that the anchor element is marked.
+      InstrumentNonTabWebView(kReadLaterElementId,
+                              kReadLaterSidePanelWebViewElementId),
+      CheckJsResultAt(kReadLaterElementId, kPathToAddCurrentTabElement,
+                      "el => el.classList.contains('help-anchor-highlight')",
+                      true),
+
       // Expect the help bubble to display with the correct parameters.
       CheckView(user_education::HelpBubbleView::kHelpBubbleElementIdForTesting,
                 base::BindOnce([](user_education::HelpBubbleView* bubble) {
@@ -122,7 +136,13 @@
                               ->GetBoundsInScreen();
                       return bubble_rect.Intersects(side_panel_rect);
                     },
-                    browser()->window()->GetElementContext())));
+                    browser()->window()->GetElementContext())),
+
+      // Verify that the anchor element is no longer marked.
+      CloseHelpBubble(),
+      CheckJsResultAt(kReadLaterElementId, kPathToAddCurrentTabElement,
+                      "el => el.classList.contains('help-anchor-highlight')",
+                      false));
 }
 
 IN_PROC_BROWSER_TEST_F(HelpBubbleFactoryWebUIInteractiveUiTest,
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index fd83abf..0d41270 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -126,7 +126,6 @@
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h"
 #include "chrome/browser/ui/webui/feed_internals/feed_internals_ui.h"
 #include "chrome/browser/ui/webui/offline/offline_internals_ui.h"
 #include "chrome/browser/ui/webui/webapks/webapks_ui.h"
@@ -1024,9 +1023,6 @@
     return &NewWebUI<WebUIJsErrorUI>;
 #endif
 #if BUILDFLAG(IS_ANDROID)
-  if (url.host_piece() == chrome::kChromeUIExploreSitesInternalsHost &&
-      !profile->IsOffTheRecord())
-    return &NewWebUI<explore_sites::ExploreSitesInternalsUI>;
   if (url.host_piece() == chrome::kChromeUIOfflineInternalsHost)
     return &NewWebUI<OfflineInternalsUI>;
   if (url.host_piece() == chrome::kChromeUISnippetsInternalsHost &&
diff --git a/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn b/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn
deleted file mode 100644
index e4fb93b..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/BUILD.gn
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojom("mojo_bindings") {
-  sources = [ "explore_sites_internals.mojom" ]
-  webui_module_path = "/"
-}
diff --git a/chrome/browser/ui/webui/explore_sites_internals/OWNERS b/chrome/browser/ui/webui/explore_sites_internals/OWNERS
deleted file mode 100644
index 97834375..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-file://chrome/browser/android/explore_sites/OWNERS
-
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom
deleted file mode 100644
index 9b975668..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module explore_sites_internals.mojom;
-
-// Browser interface for the page. Consists of calls for data and hooks for
-// interactivity.
-interface PageHandler {
-  // Get a key/value mapping of properties.
-  GetProperties() => (map<string, string> properties);
-
-  // Clear the cached suggestions.
-  ClearCachedExploreSitesCatalog() => (bool success);
-
-  // Force the fetcher to ping the server for a new catalog.
-  ForceNetworkRequest() => (bool success);
-
-  // Force the fetcher to use a different country code than that provided by
-  // Finch.
-  OverrideCountryCode(string country_code) => (bool success);
-};
diff --git a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc
deleted file mode 100644
index 1cd3356..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/containers/flat_map.h"
-#include "chrome/browser/android/explore_sites/explore_sites_feature.h"
-#include "chrome/browser/android/explore_sites/url_util.h"
-#include "chrome/browser/flags/android/chrome_feature_list.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom.h"
-#include "components/language/core/browser/pref_names.h"
-#include "components/prefs/pref_service.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-
-namespace explore_sites {
-using chrome::android::explore_sites::ExploreSitesVariation;
-using chrome::android::explore_sites::GetExploreSitesVariation;
-
-namespace {
-
-std::string GetChromeFlagsSetupString() {
-  switch (GetExploreSitesVariation()) {
-    case ExploreSitesVariation::ENABLED:
-      return "Enabled";
-    case ExploreSitesVariation::DISABLED:
-      return "Disabled";
-  }
-}
-}  // namespace
-
-ExploreSitesInternalsPageHandler::ExploreSitesInternalsPageHandler(
-    mojo::PendingReceiver<explore_sites_internals::mojom::PageHandler> receiver,
-    ExploreSitesService* explore_sites_service,
-    Profile* profile)
-    : receiver_(this, std::move(receiver)),
-      explore_sites_service_(explore_sites_service),
-      profile_(profile) {}
-
-ExploreSitesInternalsPageHandler::~ExploreSitesInternalsPageHandler() {}
-
-void ExploreSitesInternalsPageHandler::GetProperties(
-    GetPropertiesCallback callback) {
-  base::flat_map<std::string, std::string> properties;
-  properties["chrome-flags-setup"] = GetChromeFlagsSetupString();
-  properties["server-endpoint"] = GetCatalogURL().spec();
-  properties["country-code"] = explore_sites_service_->GetCountryCode();
-  std::move(callback).Run(properties);
-}
-
-void ExploreSitesInternalsPageHandler::ClearCachedExploreSitesCatalog(
-    ClearCachedExploreSitesCatalogCallback callback) {
-  if (ExploreSitesVariation::DISABLED == GetExploreSitesVariation()) {
-    std::move(callback).Run(false);
-    return;
-  }
-
-  explore_sites_service_->ClearCachedCatalogsForDebugging();
-  std::move(callback).Run(true);
-}
-
-void ExploreSitesInternalsPageHandler::ForceNetworkRequest(
-    ForceNetworkRequestCallback callback) {
-  explore_sites_service_->UpdateCatalogFromNetwork(
-      true /* is_immediate_fetch */,
-      profile_->GetPrefs()->GetString(language::prefs::kAcceptLanguages),
-      std::move(callback));
-}
-
-void ExploreSitesInternalsPageHandler::OverrideCountryCode(
-    const std::string& country_code,
-    OverrideCountryCodeCallback callback) {
-  if (ExploreSitesVariation::DISABLED == GetExploreSitesVariation()) {
-    std::move(callback).Run(false);
-    return;
-  }
-
-  explore_sites_service_->OverrideCountryCodeForDebugging(country_code);
-  std::move(callback).Run(true);
-}
-
-}  // namespace explore_sites
diff --git a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.h b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.h
deleted file mode 100644
index c473c40..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.h
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_EXPLORE_SITES_INTERNALS_EXPLORE_SITES_INTERNALS_PAGE_HANDLER_H_
-#define CHROME_BROWSER_UI_WEBUI_EXPLORE_SITES_INTERNALS_EXPLORE_SITES_INTERNALS_PAGE_HANDLER_H_
-
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/android/explore_sites/explore_sites_service.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver.h"
-
-class Profile;
-
-namespace explore_sites {
-
-// Concrete implementation of explore_sites_internals::mojom::PageHandler.
-class ExploreSitesInternalsPageHandler
-    : public explore_sites_internals::mojom::PageHandler {
- public:
-  ExploreSitesInternalsPageHandler(
-      mojo::PendingReceiver<explore_sites_internals::mojom::PageHandler>
-          receiver,
-      ExploreSitesService* explore_sites_service,
-      Profile* profile);
-
-  ExploreSitesInternalsPageHandler(const ExploreSitesInternalsPageHandler&) =
-      delete;
-  ExploreSitesInternalsPageHandler& operator=(
-      const ExploreSitesInternalsPageHandler&) = delete;
-
-  ~ExploreSitesInternalsPageHandler() override;
-
- private:
-  // explore_sites_internals::mojom::ExploreSitesInternalsPageHandler
-  void GetProperties(GetPropertiesCallback) override;
-  void ClearCachedExploreSitesCatalog(
-      ClearCachedExploreSitesCatalogCallback) override;
-  void OverrideCountryCode(const std::string& country_code,
-                           OverrideCountryCodeCallback) override;
-  void ForceNetworkRequest(ForceNetworkRequestCallback) override;
-
-  mojo::Receiver<explore_sites_internals::mojom::PageHandler> receiver_;
-  raw_ptr<ExploreSitesService> explore_sites_service_;
-  raw_ptr<Profile> profile_;
-};
-
-}  // namespace explore_sites
-
-#endif  // CHROME_BROWSER_UI_WEBUI_EXPLORE_SITES_INTERNALS_EXPLORE_SITES_INTERNALS_PAGE_HANDLER_H_
diff --git a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.cc b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.cc
deleted file mode 100644
index 467b723..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h"
-
-#include "base/functional/bind.h"
-#include "build/build_config.h"
-#include "chrome/browser/android/explore_sites/explore_sites_service_factory.h"
-#include "chrome/browser/flags/android/chrome_feature_list.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.h"
-#include "chrome/common/url_constants.h"
-#include "chrome/grit/browser_resources.h"
-#include "content/public/browser/web_ui_data_source.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-
-namespace explore_sites {
-
-ExploreSitesInternalsUI::ExploreSitesInternalsUI(content::WebUI* web_ui)
-    : ui::MojoWebUIController(web_ui) {
-  Profile* profile = Profile::FromWebUI(web_ui);
-  content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
-      profile, chrome::kChromeUIExploreSitesInternalsHost);
-
-  source->AddResourcePath("explore_sites_internals.css",
-                          IDR_EXPLORE_SITES_INTERNALS_CSS);
-  source->AddResourcePath("explore_sites_internals.js",
-                          IDR_EXPLORE_SITES_INTERNALS_JS);
-  source->AddResourcePath("explore_sites_internals.mojom-webui.js",
-                          IDR_EXPLORE_SITES_INTERNALS_MOJO_JS);
-  source->SetDefaultResource(IDR_EXPLORE_SITES_INTERNALS_HTML);
-
-  explore_sites_service_ =
-      ExploreSitesServiceFactory::GetForBrowserContext(profile);
-}
-
-WEB_UI_CONTROLLER_TYPE_IMPL(ExploreSitesInternalsUI)
-
-ExploreSitesInternalsUI::~ExploreSitesInternalsUI() {}
-
-void ExploreSitesInternalsUI::BindInterface(
-    mojo::PendingReceiver<explore_sites_internals::mojom::PageHandler>
-        receiver) {
-  page_handler_ = std::make_unique<ExploreSitesInternalsPageHandler>(
-      std::move(receiver), explore_sites_service_,
-      Profile::FromWebUI(web_ui()));
-}
-
-}  // namespace explore_sites
diff --git a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h b/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h
deleted file mode 100644
index 0ad6c6c..0000000
--- a/chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_ui.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_WEBUI_EXPLORE_SITES_INTERNALS_EXPLORE_SITES_INTERNALS_UI_H_
-#define CHROME_BROWSER_UI_WEBUI_EXPLORE_SITES_INTERNALS_EXPLORE_SITES_INTERNALS_UI_H_
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals.mojom-forward.h"
-#include "chrome/browser/ui/webui/explore_sites_internals/explore_sites_internals_page_handler.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "ui/webui/mojo_web_ui_controller.h"
-
-namespace explore_sites {
-
-// UI controller for chrome://explore-sites-internals, hooks up a concrete
-// implementation of explore_sites_internals::mojom::PageHandler to requests for
-// that page handler that will come from the frontend.
-class ExploreSitesInternalsUI : public ui::MojoWebUIController {
- public:
-  explicit ExploreSitesInternalsUI(content::WebUI* web_ui);
-
-  ExploreSitesInternalsUI(const ExploreSitesInternalsUI&) = delete;
-  ExploreSitesInternalsUI& operator=(const ExploreSitesInternalsUI&) = delete;
-
-  ~ExploreSitesInternalsUI() override;
-
-  // Instantiates the implementor of the mojom::PageHandler mojo
-  // interface passing the pending receiver that will be internally bound.
-  void BindInterface(
-      mojo::PendingReceiver<explore_sites_internals::mojom::PageHandler>
-          receiver);
-
- private:
-  std::unique_ptr<ExploreSitesInternalsPageHandler> page_handler_;
-  raw_ptr<ExploreSitesService> explore_sites_service_;
-
-  WEB_UI_CONTROLLER_TYPE_DECL();
-};
-
-}  // namespace explore_sites
-
-#endif  // CHROME_BROWSER_UI_WEBUI_EXPLORE_SITES_INTERNALS_EXPLORE_SITES_INTERNALS_UI_H_
diff --git a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
index 2b7445d..6f76428 100644
--- a/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/bookmarks/bookmarks_side_panel_ui.cc
@@ -36,6 +36,7 @@
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "ui/accessibility/accessibility_features.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/base/webui/web_ui_util.h"
 #include "ui/views/style/platform_style.h"
 
@@ -125,6 +126,10 @@
       base::NumberToString(bookmark_model ? bookmark_model->mobile_node()->id()
                                           : -1));
 
+  source->AddString(
+      "chromeRefresh2023Attribute",
+      features::IsChromeRefresh2023() ? "chrome-refresh-2023" : "");
+
   content::URLDataSource::Add(
       profile, std::make_unique<FaviconSource>(
                    profile, chrome::FaviconUrlFormat::kFavicon2));
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome.mojom b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome.mojom
index aee65c38..0ecb94b 100644
--- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome.mojom
+++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome.mojom
@@ -107,9 +107,8 @@
   // Sets the visibility of NTP tiles and whether custom links are enabled.
   SetMostVisitedSettings(bool custom_links_enabled, bool shortcuts_visible);
 
-  // Returns the visibility of NTP tiles and whether custom links are enabled.
-  GetMostVisitedSettings() => (bool custom_links_enabled,
-                               bool shortcuts_visible);
+  // Triggers a call to |CustomizeChromePage.SetPageMostVisitedSettings|.
+  UpdateMostVisitedSettings();
 
   // Returns the chrome colors used in the customize chrome side panel.
   GetChromeColors() => (array<ChromeColor> colors);
@@ -166,6 +165,8 @@
    // enabled status, visibility and managed state.
    SetModulesSettings(array<ModuleSettings> modules_settings, bool managed,
        bool visible);
+  // Sets the visibility of NTP tiles and whether custom links are enabled.
+  SetMostVisitedSettings(bool custom_links_enabled, bool visible);
    // Sets the current theme.
    SetTheme(Theme theme);
 };
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc
index d99918f..2daa8c96 100644
--- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc
+++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc
@@ -73,6 +73,16 @@
         base::BindRepeating(&CustomizeChromePageHandler::UpdateModulesSettings,
                             base::Unretained(this)));
   }
+  pref_change_registrar_.Add(
+      ntp_prefs::kNtpUseMostVisitedTiles,
+      base::BindRepeating(
+          &CustomizeChromePageHandler::UpdateMostVisitedSettings,
+          base::Unretained(this)));
+  pref_change_registrar_.Add(
+      ntp_prefs::kNtpShortcutsVisible,
+      base::BindRepeating(
+          &CustomizeChromePageHandler::UpdateMostVisitedSettings,
+          base::Unretained(this)));
 
   ntp_custom_background_service_observation_.Observe(
       ntp_custom_background_service_.get());
@@ -278,21 +288,20 @@
 void CustomizeChromePageHandler::SetMostVisitedSettings(
     bool custom_links_enabled,
     bool visible) {
-  if (IsShortcutsVisible() != visible) {
-    profile_->GetPrefs()->SetBoolean(ntp_prefs::kNtpShortcutsVisible, visible);
-    LogEvent(NTP_CUSTOMIZE_SHORTCUT_TOGGLE_VISIBILITY);
-  }
-
   if (IsCustomLinksEnabled() != custom_links_enabled) {
     profile_->GetPrefs()->SetBoolean(ntp_prefs::kNtpUseMostVisitedTiles,
                                      !custom_links_enabled);
     LogEvent(NTP_CUSTOMIZE_SHORTCUT_TOGGLE_TYPE);
   }
+
+  if (IsShortcutsVisible() != visible) {
+    profile_->GetPrefs()->SetBoolean(ntp_prefs::kNtpShortcutsVisible, visible);
+    LogEvent(NTP_CUSTOMIZE_SHORTCUT_TOGGLE_VISIBILITY);
+  }
 }
 
-void CustomizeChromePageHandler::GetMostVisitedSettings(
-    GetMostVisitedSettingsCallback callback) {
-  std::move(callback).Run(IsCustomLinksEnabled(), IsShortcutsVisible());
+void CustomizeChromePageHandler::UpdateMostVisitedSettings() {
+  page_->SetMostVisitedSettings(IsCustomLinksEnabled(), IsShortcutsVisible());
 }
 
 void CustomizeChromePageHandler::SetModulesVisible(bool visible) {
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h
index a06bc84..559b779 100644
--- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h
+++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.h
@@ -72,7 +72,7 @@
   void OpenChromeWebStore() override;
   void OpenThirdPartyThemePage(const std::string& theme_id) override;
   void SetMostVisitedSettings(bool custom_links_enabled, bool visible) override;
-  void GetMostVisitedSettings(GetMostVisitedSettingsCallback callback) override;
+  void UpdateMostVisitedSettings() override;
   void SetModulesVisible(bool visible) override;
   void SetModuleDisabled(const std::string& module_id, bool disabled) override;
   void UpdateModulesSettings() override;
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
index 8dc2f7c8..1cec47ec 100644
--- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
@@ -152,6 +152,8 @@
       void(std::vector<side_panel::mojom::ModuleSettingsPtr> modules_settings,
            bool managed,
            bool visible));
+  MOCK_METHOD2(SetMostVisitedSettings,
+               void(bool custom_links_enabled, bool visible));
   MOCK_METHOD1(SetTheme, void(side_panel::mojom::ThemePtr));
 
   mojo::Receiver<side_panel::mojom::CustomizeChromePage> receiver_{this};
@@ -312,13 +314,29 @@
 };
 
 TEST_F(CustomizeChromePageHandlerTest, SetMostVisitedSettings) {
+  bool custom_links_enabled;
+  bool visible;
+  EXPECT_CALL(mock_page_, SetMostVisitedSettings)
+      .Times(4)
+      .WillRepeatedly(
+          testing::Invoke([&custom_links_enabled, &visible](
+                              bool custom_links_enabled_arg, bool visible_arg) {
+            custom_links_enabled = custom_links_enabled_arg;
+            visible = visible_arg;
+          }));
+
   profile().GetPrefs()->SetBoolean(ntp_prefs::kNtpUseMostVisitedTiles, false);
   profile().GetPrefs()->SetBoolean(ntp_prefs::kNtpShortcutsVisible, false);
 
   histogram_tester().ExpectTotalCount("NewTabPage.CustomizeShortcutAction", 0);
+  EXPECT_FALSE(
+      profile().GetPrefs()->GetBoolean(ntp_prefs::kNtpUseMostVisitedTiles));
+  EXPECT_FALSE(
+      profile().GetPrefs()->GetBoolean(ntp_prefs::kNtpShortcutsVisible));
 
   handler().SetMostVisitedSettings(/*custom_links_enabled=*/false,
                                    /*visible=*/true);
+  mock_page_.FlushForTesting();
 
   EXPECT_TRUE(
       profile().GetPrefs()->GetBoolean(ntp_prefs::kNtpUseMostVisitedTiles));
@@ -327,28 +345,6 @@
   histogram_tester().ExpectTotalCount("NewTabPage.CustomizeShortcutAction", 2);
 }
 
-TEST_F(CustomizeChromePageHandlerTest, GetMostVisitedSettings) {
-  profile().GetPrefs()->SetBoolean(ntp_prefs::kNtpUseMostVisitedTiles, false);
-  profile().GetPrefs()->SetBoolean(ntp_prefs::kNtpShortcutsVisible, true);
-
-  base::MockCallback<CustomizeChromePageHandler::GetMostVisitedSettingsCallback>
-      callback;
-  bool custom_links_enabled = false;
-  bool shortcuts_visible = false;
-  EXPECT_CALL(callback, Run(testing::_, testing::_))
-      .Times(1)
-      .WillOnce(testing::Invoke(
-          [&custom_links_enabled, &shortcuts_visible](
-              bool custom_links_enabled_arg, bool shortcuts_visible_arg) {
-            custom_links_enabled = custom_links_enabled_arg;
-            shortcuts_visible = shortcuts_visible_arg;
-          }));
-  handler().GetMostVisitedSettings(callback.Get());
-
-  EXPECT_TRUE(custom_links_enabled);
-  EXPECT_TRUE(shortcuts_visible);
-}
-
 TEST_F(CustomizeChromePageHandlerTest, GetChromeColors) {
   std::vector<side_panel::mojom::ChromeColorPtr> colors;
   base::MockCallback<CustomizeChromePageHandler::GetChromeColorsCallback>
diff --git a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
index 83c8558..a2ec56d 100644
--- a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
@@ -31,6 +31,7 @@
 #include "content/public/browser/web_ui.h"
 #include "content/public/browser/web_ui_data_source.h"
 #include "ui/accessibility/accessibility_features.h"
+#include "ui/base/ui_base_features.h"
 #include "ui/base/webui/web_ui_util.h"
 #include "ui/views/style/platform_style.h"
 
@@ -68,6 +69,10 @@
       "hasUnseenReadingListEntries",
       reading_list_model->loaded() ? reading_list_model->unseen_size() : false);
 
+  source->AddString(
+      "chromeRefresh2023Attribute",
+      features::IsChromeRefresh2023() ? "chrome-refresh-2023" : "");
+
   content::URLDataSource::Add(
       profile, std::make_unique<FaviconSource>(
                    profile, chrome::FaviconUrlFormat::kFavicon2));
diff --git a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
index 0d53ade..97f3795 100644
--- a/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
+++ b/chrome/browser/ui/webui/side_panel/user_notes/user_notes_side_panel_ui.cc
@@ -27,10 +27,14 @@
       {"add", IDS_ADD},
       {"addANote", IDS_ADD_NEW_USER_NOTE_PLACEHOLDER_TEXT},
       {"cancel", IDS_CANCEL},
+      {"delete", IDS_DELETE},
+      {"edit", IDS_EDIT},
       {"title", IDS_USER_NOTE_TITLE},
       {"tooltipClose", IDS_CLOSE},
   };
-  source->AddLocalizedStrings(kLocalizedStrings);
+  for (const auto& str : kLocalizedStrings) {
+    webui::AddLocalizedString(source, str.name, str.id);
+  }
 
   webui::SetupWebUIDataSource(source,
                               base::make_span(kSidePanelUserNotesResources,
diff --git a/chrome/browser/ui/webui/theme_source.cc b/chrome/browser/ui/webui/theme_source.cc
index fc639173..4c04327b 100644
--- a/chrome/browser/ui/webui/theme_source.cc
+++ b/chrome/browser/ui/webui/theme_source.cc
@@ -181,9 +181,13 @@
 }
 
 std::string ThemeSource::GetMimeType(const GURL& url) {
-  std::string parsed_path;
-  webui::ParsePathAndScale(url, &parsed_path, nullptr);
-  return IsNewTabCssPath(parsed_path) ? "text/css" : "image/png";
+  const base::StringPiece file_path = url.path_piece();
+
+  if (base::EndsWith(file_path, ".css", base::CompareCase::INSENSITIVE_ASCII)) {
+    return "text/css";
+  }
+
+  return "image/png";
 }
 
 bool ThemeSource::AllowCaching() {
diff --git a/chrome/browser/ui/webui/theme_source_unittest.cc b/chrome/browser/ui/webui/theme_source_unittest.cc
index 00a4bc21..2c70c1c 100644
--- a/chrome/browser/ui/webui/theme_source_unittest.cc
+++ b/chrome/browser/ui/webui/theme_source_unittest.cc
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include <stddef.h>
+#include <vector>
 
 #include "base/functional/bind.h"
 #include "base/memory/ref_counted_memory.h"
@@ -74,14 +75,26 @@
 };
 
 TEST_F(WebUISourcesTest, ThemeSourceMimeTypes) {
-  EXPECT_EQ(
-      theme_source()->GetMimeType(GURL("chrome://theme/css/new_tab_theme.css")),
-      "text/css");
-  EXPECT_EQ(theme_source()->GetMimeType(
-                GURL("chrome://theme/css/new_tab_theme.css?foo")),
-            "text/css");
-  EXPECT_EQ(theme_source()->GetMimeType(GURL("chrome://theme/WRONGURL")),
-            "image/png");
+  std::vector<std::string> css_urls{
+      "chrome://theme/css/new_tab_theme.css",
+      "chrome://theme/css/new_tab_theme.css?foo",
+      "chrome://theme/colors.css?sets.css",
+      "chrome://theme/colors.css?sets.css=ui",
+  };
+
+  for (auto url : css_urls) {
+    EXPECT_EQ(theme_source()->GetMimeType(GURL(url)), "text/css");
+  }
+
+  std::vector<std::string> png_urls{
+      "chrome://theme/current-channel-logo",
+      "chrome://theme/other.png",
+      "chrome://theme/WRONGURL",
+  };
+
+  for (auto url : png_urls) {
+    EXPECT_EQ(theme_source()->GetMimeType(GURL(url)), "image/png");
+  }
 }
 
 TEST_F(WebUISourcesTest, ThemeSourceImages) {
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index d7dffea..74b4b758 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -387,6 +387,7 @@
     "//components/webapps/common:mojo_bindings",
     "//components/webapps/services/web_app_origin_association:lib",
     "//components/webapps/services/web_app_origin_association:service",
+    "//content/browser/background_fetch:background_fetch_proto",
     "//content/public/browser",
     "//mojo/core/embedder",
     "//mojo/core/embedder:features",
diff --git a/chrome/browser/web_applications/DEPS b/chrome/browser/web_applications/DEPS
index 89357b54..242c13f 100644
--- a/chrome/browser/web_applications/DEPS
+++ b/chrome/browser/web_applications/DEPS
@@ -4,6 +4,7 @@
   "+components/services/storage/indexed_db/locks",
   "+components/web_package",
   "+components/webapps/services/web_app_origin_association",
+  "+content/browser/background_fetch",
   "+mojo/core/embedder",
   "+mojo/public/cpp/bindings",
   "+services/network/public/cpp",
diff --git a/chrome/browser/web_applications/proto/BUILD.gn b/chrome/browser/web_applications/proto/BUILD.gn
index 3fbfadd..88c14676 100644
--- a/chrome/browser/web_applications/proto/BUILD.gn
+++ b/chrome/browser/web_applications/proto/BUILD.gn
@@ -16,6 +16,7 @@
   ]
   link_deps = [
     "//chrome/browser/ash/system_web_apps/types:proto",
+    "//content/browser/background_fetch:background_fetch_proto",
     "//components/sync/protocol",
   ]
 }
diff --git a/chrome/browser/web_applications/proto/web_app_tab_strip.proto b/chrome/browser/web_applications/proto/web_app_tab_strip.proto
index 0d5c5f4e..55d20bf 100644
--- a/chrome/browser/web_applications/proto/web_app_tab_strip.proto
+++ b/chrome/browser/web_applications/proto/web_app_tab_strip.proto
@@ -4,10 +4,16 @@
 
 syntax = "proto2";
 
+import "content/browser/background_fetch/background_fetch.proto";
+
 option optimize_for = LITE_RUNTIME;
 
 package web_app.proto;
 
+message HomeTabParams {
+  repeated content.proto.ImageResource icons = 1;
+}
+
 message NewTabButtonParams {
   optional string url = 1;
 }
@@ -28,6 +34,6 @@
 
   oneof home_tab {
     Visibility home_tab_visibility = 3;
-    // TODO(crbug.com/897314): Add HomeTabParams containing icons.
+    HomeTabParams home_tab_params = 4;
   }
 }
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc
index 96f45ee..8eb901f 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.cc
+++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -310,6 +310,56 @@
   return results;
 }
 
+std::vector<blink::Manifest::ImageResource> CreateRandomHomeTabIcons(
+    RandomHelper& random) {
+  std::vector<blink::Manifest::ImageResource> icons;
+
+  for (int i = random.next_uint(4) + 1; i >= 0; --i) {
+    blink::Manifest::ImageResource icon;
+
+    int mime_type = random.next_uint(3);
+    switch (mime_type) {
+      case 0:
+        icon.src = GURL("https://example.com/image" + base::NumberToString(i) +
+                        ".png");
+        icon.type = base::UTF8ToUTF16(std::string("image/png"));
+        break;
+      case 1:
+        icon.src = GURL("https://example.com/image" + base::NumberToString(i) +
+                        ".svg");
+        icon.type = base::UTF8ToUTF16(std::string("image/svg+xml"));
+        break;
+      case 2:
+        icon.src = GURL("https://example.com/image" + base::NumberToString(i) +
+                        ".webp");
+        icon.type = base::UTF8ToUTF16(std::string("image/webp"));
+        break;
+    }
+
+    // Icon sizes can be non square
+    std::vector<gfx::Size> sizes;
+    for (int j = random.next_uint(3) + 1; j > 0; --j) {
+      sizes.emplace_back(j * random.next_uint(200), j * random.next_uint(200));
+    }
+    icon.sizes = std::move(sizes);
+
+    std::vector<blink::mojom::ManifestImageResource_Purpose> purposes = {
+        blink::mojom::ManifestImageResource_Purpose::ANY,
+        blink::mojom::ManifestImageResource_Purpose::MASKABLE,
+        blink::mojom::ManifestImageResource_Purpose::MONOCHROME};
+
+    std::vector<blink::mojom::ManifestImageResource_Purpose> purpose;
+
+    for (int j = random.next_uint(purposes.size()); j >= 0; --j) {
+      unsigned index = random.next_uint(purposes.size());
+      purpose.push_back(purposes[index]);
+      purposes.erase(purposes.begin() + index);
+    }
+    icon.purpose = std::move(purpose);
+    icons.push_back(std::move(icon));
+  }
+  return icons;
+}
 }  // namespace
 
 std::string GetExternalPrefMigrationTestName(
@@ -627,8 +677,18 @@
 
   if (random.next_bool()) {
     blink::Manifest::TabStrip tab_strip;
-    tab_strip.home_tab =
-        random.next_enum<blink::mojom::TabStripMemberVisibility>();
+
+    if (random.next_bool()) {
+      blink::Manifest::HomeTabParams home_tab_params;
+      if (random.next_bool()) {
+        home_tab_params.icons = CreateRandomHomeTabIcons(random);
+      }
+      tab_strip.home_tab = std::move(home_tab_params);
+    } else {
+      tab_strip.home_tab =
+          random.next_enum<blink::mojom::TabStripMemberVisibility>();
+    }
+
     if (random.next_bool()) {
       blink::Manifest::NewTabButtonParams new_tab_button_params;
       if (random.next_bool()) {
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc
index 5505f8a2..10da49f 100644
--- a/chrome/browser/web_applications/web_app.cc
+++ b/chrome/browser/web_applications/web_app.cc
@@ -155,6 +155,30 @@
   return base::Value(std::move(debug_dict));
 }
 
+base::Value ImageResourceDebugValue(
+    const blink::Manifest::ImageResource& icon) {
+  const char* const kPurposeStrings[] = {"Any", "Monochrome", "Maskable"};
+
+  base::Value root(base::Value::Type::DICT);
+  root.SetStringKey("src", icon.src.spec());
+  root.SetStringKey("type", icon.type);
+
+  base::Value sizes_json(base::Value::Type::LIST);
+  for (const auto& size : icon.sizes) {
+    std::string size_formatted = base::NumberToString(size.width()) + "x" +
+                                 base::NumberToString(size.height());
+    sizes_json.Append(base::Value(size_formatted));
+  }
+  root.SetKey("sizes", std::move(sizes_json));
+
+  base::Value purpose_json(base::Value::Type::LIST);
+  for (const auto& purpose : icon.purpose) {
+    purpose_json.Append(kPurposeStrings[static_cast<int>(purpose)]);
+  }
+  root.SetKey("purpose", std::move(purpose_json));
+  return root;
+}
+
 }  // namespace
 
 WebApp::WebApp(const AppId& app_id)
@@ -956,8 +980,18 @@
           "home_tab", base::StreamableToString(absl::get<TabStrip::Visibility>(
                           tab_strip_.value().home_tab)));
     } else {
-      tab_strip_json.Set("home_tab", base::Value::Dict());
-      // TODO(crbug.com/897314): Add debug info for home tab icons.
+      base::Value::Dict home_tab_json;
+      base::Value icons_json(base::Value::Type::LIST);
+      absl::optional<std::vector<blink::Manifest::ImageResource>> icons =
+          absl::get<blink::Manifest::HomeTabParams>(tab_strip_.value().home_tab)
+              .icons;
+
+      for (auto& icon : *icons) {
+        icons_json.Append(ImageResourceDebugValue(icon));
+      }
+
+      home_tab_json.Set("icons", std::move(icons_json));
+      tab_strip_json.Set("home_tab", std::move(home_tab_json));
     }
     root.Set("tab_strip", std::move(tab_strip_json));
   } else {
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc
index 9d816aa..48b78bb 100644
--- a/chrome/browser/web_applications/web_app_database.cc
+++ b/chrome/browser/web_applications/web_app_database.cc
@@ -738,6 +738,15 @@
     if (absl::holds_alternative<TabStrip::Visibility>(tab_strip.home_tab)) {
       mutable_tab_strip->set_home_tab_visibility(TabStripVisibilityToProto(
           absl::get<TabStrip::Visibility>(tab_strip.home_tab)));
+    } else {
+      auto* mutable_home_tab_params =
+          mutable_tab_strip->mutable_home_tab_params();
+      absl::optional<std::vector<blink::Manifest::ImageResource>> icons =
+          absl::get<blink::Manifest::HomeTabParams>(tab_strip.home_tab).icons;
+      for (const auto& image_resource : *icons) {
+        *(mutable_home_tab_params->add_icons()) =
+            AppImageResourceToProto(image_resource);
+      }
     }
 
     if (absl::holds_alternative<TabStrip::Visibility>(
@@ -1375,7 +1384,14 @@
       tab_strip.home_tab = ProtoToTabStripVisibility(
           local_data.tab_strip().home_tab_visibility());
     } else {
-      tab_strip.home_tab = blink::Manifest::HomeTabParams();
+      absl::optional<std::vector<blink::Manifest::ImageResource>> icons =
+          ParseAppImageResource(
+              "WebApp", local_data.tab_strip().home_tab_params().icons());
+      blink::Manifest::HomeTabParams home_tab_params;
+      if (!icons->empty()) {
+        home_tab_params.icons = std::move(*icons);
+      }
+      tab_strip.home_tab = std::move(home_tab_params);
     }
 
     if (local_data.tab_strip().has_new_tab_button_visibility()) {
diff --git a/chrome/browser/web_applications/web_app_database_unittest.cc b/chrome/browser/web_applications/web_app_database_unittest.cc
index 02a295f..21d406ad 100644
--- a/chrome/browser/web_applications/web_app_database_unittest.cc
+++ b/chrome/browser/web_applications/web_app_database_unittest.cc
@@ -458,6 +458,7 @@
   EXPECT_FALSE(app_copy->manifest_id().has_value());
   EXPECT_FALSE(app_copy->IsStorageIsolated());
   EXPECT_TRUE(app_copy->permissions_policy().empty());
+  EXPECT_FALSE(app_copy->tab_strip());
 }
 
 TEST_F(WebAppDatabaseTest, WebAppWithManyIcons) {
diff --git a/chrome/browser/web_applications/web_app_proto_utils.cc b/chrome/browser/web_applications/web_app_proto_utils.cc
index 6bb92a2..24a1feb 100644
--- a/chrome/browser/web_applications/web_app_proto_utils.cc
+++ b/chrome/browser/web_applications/web_app_proto_utils.cc
@@ -3,10 +3,13 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/web_applications/web_app_proto_utils.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/user_display_mode.h"
 #include "components/services/app_service/public/cpp/icon_info.h"
+#include "third_party/blink/public/common/manifest/manifest.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "ui/gfx/geometry/size.h"
 
 namespace web_app {
 
@@ -40,6 +43,19 @@
   }
 }
 
+content::proto::ImageResource_Purpose
+ManifestImageResourcePurposeToImageResoucePurposeProto(
+    blink::mojom::ManifestImageResource_Purpose purpose) {
+  switch (purpose) {
+    case blink::mojom::ManifestImageResource_Purpose::ANY:
+      return content::proto::ImageResource_Purpose_ANY;
+    case blink::mojom::ManifestImageResource_Purpose::MONOCHROME:
+      return content::proto::ImageResource_Purpose_MONOCHROME;
+    case blink::mojom::ManifestImageResource_Purpose::MASKABLE:
+      return content::proto::ImageResource_Purpose_MASKABLE;
+  }
+}
+
 }  // namespace
 
 absl::optional<std::vector<apps::IconInfo>> ParseAppIconInfos(
@@ -80,6 +96,67 @@
   return manifest_icons;
 }
 
+absl::optional<std::vector<blink::Manifest::ImageResource>>
+ParseAppImageResource(const char* container_name_for_logging,
+                      const RepeatedImageResourceProto& manifest_icons_proto) {
+  std::vector<blink::Manifest::ImageResource> manifest_icons;
+  for (const content::proto::ImageResource& image_resource_proto :
+       manifest_icons_proto) {
+    blink::Manifest::ImageResource image_resource;
+
+    if (!image_resource_proto.has_src()) {
+      DLOG(ERROR) << container_name_for_logging
+                  << " ImageResource has missing url";
+      return absl::nullopt;
+    }
+    image_resource.src = GURL(image_resource_proto.src());
+
+    if (!image_resource.src.is_valid()) {
+      DLOG(ERROR) << container_name_for_logging
+                  << " ImageResource has invalid url: "
+                  << image_resource.src.possibly_invalid_spec();
+      return absl::nullopt;
+    }
+
+    if (image_resource_proto.has_type()) {
+      image_resource.type = base::ASCIIToUTF16(image_resource_proto.type());
+    }
+
+    if (!image_resource_proto.sizes().empty()) {
+      std::vector<gfx::Size> sizes;
+      for (const auto& size_proto : image_resource_proto.sizes()) {
+        sizes.emplace_back(size_proto.width(), size_proto.height());
+      }
+      image_resource.sizes = std::move(sizes);
+    }
+
+    std::vector<blink::mojom::ManifestImageResource_Purpose> purpose;
+    if (!image_resource_proto.purpose().empty()) {
+      for (const auto& purpose_proto : image_resource_proto.purpose()) {
+        switch (purpose_proto) {
+          case content::proto::ImageResource_Purpose_ANY:
+            purpose.push_back(blink::mojom::ManifestImageResource_Purpose::ANY);
+            break;
+          case content::proto::ImageResource_Purpose_MASKABLE:
+            purpose.push_back(
+                blink::mojom::ManifestImageResource_Purpose::MASKABLE);
+            break;
+          case content::proto::ImageResource_Purpose_MONOCHROME:
+            purpose.push_back(
+                blink::mojom::ManifestImageResource_Purpose::MONOCHROME);
+            break;
+        }
+      }
+    } else {
+      purpose.push_back(blink::mojom::ManifestImageResource_Purpose::ANY);
+    }
+    image_resource.purpose = std::move(purpose);
+    manifest_icons.push_back(std::move(image_resource));
+  }
+
+  return manifest_icons;
+}
+
 sync_pb::WebAppSpecifics WebAppToSyncProto(const WebApp& app) {
   DCHECK(!app.start_url().is_empty());
   DCHECK(app.start_url().is_valid());
@@ -120,6 +197,31 @@
   return icon_info_proto;
 }
 
+content::proto::ImageResource AppImageResourceToProto(
+    const blink::Manifest::ImageResource& image_resource) {
+  content::proto::ImageResource image_resource_proto;
+  DCHECK(!image_resource.src.is_empty());
+
+  image_resource_proto.set_src(image_resource.src.spec());
+
+  if (!image_resource.type.empty()) {
+    image_resource_proto.set_type(base::UTF16ToASCII(image_resource.type));
+  }
+
+  for (const auto& size : image_resource.sizes) {
+    content::proto::ImageResource::Size size_proto;
+    size_proto.set_width(size.width());
+    size_proto.set_height(size.height());
+    *(image_resource_proto.add_sizes()) = size_proto;
+  }
+
+  for (const auto& purpose : image_resource.purpose) {
+    image_resource_proto.add_purpose(
+        ManifestImageResourcePurposeToImageResoucePurposeProto(purpose));
+  }
+  return image_resource_proto;
+}
+
 absl::optional<WebApp::SyncFallbackData> ParseSyncFallbackDataStruct(
     const sync_pb::WebAppSpecifics& sync_proto) {
   WebApp::SyncFallbackData parsed_sync_fallback_data;
diff --git a/chrome/browser/web_applications/web_app_proto_utils.h b/chrome/browser/web_applications/web_app_proto_utils.h
index 1a480b22..a07227e 100644
--- a/chrome/browser/web_applications/web_app_proto_utils.h
+++ b/chrome/browser/web_applications/web_app_proto_utils.h
@@ -10,6 +10,7 @@
 #include "chrome/browser/web_applications/proto/web_app.pb.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "components/sync/protocol/web_app_specifics.pb.h"
+#include "content/browser/background_fetch/background_fetch.pb.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace apps {
@@ -23,16 +24,27 @@
 using RepeatedIconInfosProto =
     const ::google::protobuf::RepeatedPtrField<::sync_pb::WebAppIconInfo>;
 
+using RepeatedImageResourceProto =
+    const ::google::protobuf::RepeatedPtrField<content::proto::ImageResource>;
+
 absl::optional<std::vector<apps::IconInfo>> ParseAppIconInfos(
     const char* container_name_for_logging,
     const RepeatedIconInfosProto& manifest_icons_proto);
 
+absl::optional<std::vector<blink::Manifest::ImageResource>>
+ParseAppImageResource(const char* container_name_for_logging,
+                      const RepeatedImageResourceProto& manifest_icons_proto);
+
 // Use the given |app| to populate a |WebAppSpecifics| sync proto.
 sync_pb::WebAppSpecifics WebAppToSyncProto(const WebApp& app);
 
 // Use the given |icon_info| to populate a |WebAppIconInfo| sync proto.
 sync_pb::WebAppIconInfo AppIconInfoToSyncProto(const apps::IconInfo& icon_info);
 
+// Use the given |image_resource| to populate a |ImageResource| proto.
+content::proto::ImageResource AppImageResourceToProto(
+    const blink::Manifest::ImageResource& image_resource);
+
 absl::optional<WebApp::SyncFallbackData> ParseSyncFallbackDataStruct(
     const sync_pb::WebAppSpecifics& sync_proto);
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 19d47e5..efb2ab3 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1674129590-7363294e2ca8fb870c62606168cf15a86423b38f.profdata
+chrome-linux-main-1674151179-444a6c32cc2d887751696630e61a95dc4eedcc59.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 12dbc3b..b9a95e2d 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1674129590-006b1f7fa1536a50451d151ae81693cd59d7358f.profdata
+chrome-mac-main-1674151179-5cbdba6fa6d72d0fd35b860ec668d8dac0c6a0e5.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index ab0ed9c..d68a0f37 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1674129590-c70582817d3f00a9f2b6abe5b942b3c42515b1ac.profdata
+chrome-win32-main-1674151179-8da70f8885145c4bc1c1cf3dcde3cc646de24058.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index ac90b78..70c31b1 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1674140257-73ec78d2053ad276f5fbab23265db42bfb59b58f.profdata
+chrome-win64-main-1674151179-ee446dd25764dd835abaff4c8b716fc5551b7fab.profdata
diff --git a/chrome/common/channel_info_chromeos.cc b/chrome/common/channel_info_chromeos.cc
index 6a208e5..77596998 100644
--- a/chrome/common/channel_info_chromeos.cc
+++ b/chrome/common/channel_info_chromeos.cc
@@ -9,27 +9,15 @@
 #include "chromeos/crosapi/cpp/crosapi_constants.h"
 #include "components/version_info/version_info.h"
 
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#include "chromeos/crosapi/cpp/channel_to_enum.h"
+#endif
+
 namespace chrome {
 namespace {
 
 version_info::Channel g_chromeos_channel = version_info::Channel::UNKNOWN;
 
-#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
-// Sets the |g_chromeos_channel|.
-void SetChannel(const std::string& channel) {
-  if (channel == crosapi::kReleaseChannelStable)
-    g_chromeos_channel = version_info::Channel::STABLE;
-  else if (channel == crosapi::kReleaseChannelBeta)
-    g_chromeos_channel = version_info::Channel::BETA;
-  else if (channel == crosapi::kReleaseChannelDev)
-    g_chromeos_channel = version_info::Channel::DEV;
-  else if (channel == crosapi::kReleaseChannelCanary)
-    g_chromeos_channel = version_info::Channel::CANARY;
-  else
-    g_chromeos_channel = version_info::Channel::UNKNOWN;
-}
-#endif
-
 }  // namespace
 
 std::string GetChannelName(WithExtendedStable with_extended_stable) {
@@ -60,7 +48,7 @@
   std::string channel;
   if (base::SysInfo::GetLsbReleaseValue(crosapi::kChromeOSReleaseTrack,
                                         &channel)) {
-    SetChannel(channel);
+    g_chromeos_channel = crosapi::ChannelToEnum(channel);
     is_channel_set = true;
   }
 #endif
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index ad77a53c..37939d89 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -237,7 +237,6 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_ANDROID)
-const char kChromeUIExploreSitesInternalsHost[] = "explore-sites-internals";
 const char kChromeUIJavaCrashURL[] = "chrome://java-crash/";
 const char kChromeUINativeBookmarksURL[] = "chrome-native://bookmarks/";
 const char kChromeUINativeExploreURL[] = "chrome-native://explore";
@@ -743,7 +742,6 @@
     kChromeUIWhatsNewHost,
 #endif
 #if BUILDFLAG(IS_ANDROID)
-    kChromeUIExploreSitesInternalsHost,
     kChromeUIOfflineInternalsHost,
     kChromeUISnippetsInternalsHost,
     kChromeUIWebApksHost,
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 6e372cde..df0804f62 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -226,7 +226,6 @@
 #endif  // BUILDFLAG(IS_WIN)
 
 #if BUILDFLAG(IS_ANDROID)
-extern const char kChromeUIExploreSitesInternalsHost[];
 extern const char kChromeUIJavaCrashURL[];
 extern const char kChromeUINativeBookmarksURL[];
 extern const char kChromeUINativeExploreURL[];
diff --git a/chrome/installer/setup/DEPS b/chrome/installer/setup/DEPS
index 5eed5289..cc26fd1 100644
--- a/chrome/installer/setup/DEPS
+++ b/chrome/installer/setup/DEPS
@@ -1,8 +1,9 @@
 include_rules = [
   "+chrome/browser/chrome_for_testing/buildflags.h",
-  "+chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h",
-  "+chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h",
   "+chrome/browser/enterprise/connectors/device_trust/key_management/core/network/win_key_network_delegate.h",
+  "+chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h",
+  "+chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h",
+  "+chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h",
   "+chrome/chrome_elf/blocklist_constants.h",
   "+chrome/chrome_elf/chrome_elf_constants.h",
   "+chrome/install_static",
@@ -18,8 +19,8 @@
   ".*_unittest\.cc": [
     "+chrome/browser/enterprise/connectors/device_trust/key_management/core/network/key_network_delegate.h",
     "+chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mock_key_network_delegate.h",
-    "+chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mock_key_persistence_delegate.h",
     "+chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate_factory.h",
+    "+chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mock_key_persistence_delegate.h",
     "+chrome/chrome_elf/nt_registry/nt_registry.h",
   ],
-}
+}
\ No newline at end of file
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index 1cf37fb..0082c69 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -52,6 +52,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/win_key_network_delegate.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h"
+#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/management_service/rotate_util.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
@@ -1201,13 +1202,25 @@
     // threaded task runner so creating one here.
     base::SingleThreadTaskExecutor executor;
 
-    *exit_code = enterprise_connectors::RotateDeviceTrustKey(
-                     enterprise_connectors::KeyRotationManager::Create(
-                         std::make_unique<
-                             enterprise_connectors::WinKeyNetworkDelegate>()),
-                     cmd_line, install_static::GetChromeChannel())
-                     ? installer::ROTATE_DTKEY_SUCCESS
-                     : installer::ROTATE_DTKEY_FAILED;
+    const auto result = enterprise_connectors::RotateDeviceTrustKey(
+        enterprise_connectors::KeyRotationManager::Create(
+            std::make_unique<enterprise_connectors::WinKeyNetworkDelegate>()),
+        cmd_line, install_static::GetChromeChannel());
+
+    switch (result) {
+      case enterprise_connectors::KeyRotationResult::kSucceeded:
+        *exit_code = installer::ROTATE_DTKEY_SUCCESS;
+        break;
+      case enterprise_connectors::KeyRotationResult::kInsufficientPermissions:
+        *exit_code = installer::ROTATE_DTKEY_FAILED_PERMISSIONS;
+        break;
+      case enterprise_connectors::KeyRotationResult::kFailedKeyConflict:
+        *exit_code = installer::ROTATE_DTKEY_FAILED_CONFLICT;
+        break;
+      case enterprise_connectors::KeyRotationResult::kFailed:
+        *exit_code = installer::ROTATE_DTKEY_FAILED;
+        break;
+    }
 #endif
   } else if (cmd_line.HasSwitch(installer::switches::kCreateShortcuts)) {
     std::string install_op_arg =
diff --git a/chrome/installer/util/util_constants.h b/chrome/installer/util/util_constants.h
index 98b6db3..496242aa 100644
--- a/chrome/installer/util/util_constants.h
+++ b/chrome/installer/util/util_constants.h
@@ -125,7 +125,11 @@
   DELETE_DMTOKEN_FAILED = 74,     // Failed to delete DMToken from the registry.
   DELETE_DMTOKEN_SUCCESS = 75,    // Successfully deleted DMToken from the
                                   // registry.
-  MAX_INSTALL_STATUS = 76,  // When adding a new result, bump this and update
+  ROTATE_DTKEY_FAILED_PERMISSIONS = 76,  // Failed to rotate the device trust
+                                         // key due to missing permissions.
+  ROTATE_DTKEY_FAILED_CONFLICT = 77,  // Failed to rotate the device trust key
+                                      // due to a conflict during upload.
+  MAX_INSTALL_STATUS = 78,  // When adding a new result, bump this and update
                             // the SetupInstallResult enum in enums.xml.
 };
 
diff --git a/chrome/services/sharing/nearby/decoder/nearby_decoder.cc b/chrome/services/sharing/nearby/decoder/nearby_decoder.cc
index e55c2372..9052c4b 100644
--- a/chrome/services/sharing/nearby/decoder/nearby_decoder.cc
+++ b/chrome/services/sharing/nearby/decoder/nearby_decoder.cc
@@ -145,11 +145,19 @@
 
 mojom::PairedKeyEncryptionFramePtr GetPairedKeyEncryptionFrame(
     const sharing::nearby::PairedKeyEncryptionFrame& proto_frame) {
+  absl::optional<std::vector<uint8_t>> optional_signed_data =
+      proto_frame.has_optional_signed_data()
+          ? absl::make_optional<std::vector<uint8_t>>(
+                proto_frame.optional_signed_data().begin(),
+                proto_frame.optional_signed_data().end())
+          : absl::nullopt;
+
   return mojom::PairedKeyEncryptionFrame::New(
       std::vector<uint8_t>(proto_frame.signed_data().begin(),
                            proto_frame.signed_data().end()),
       std::vector<uint8_t>(proto_frame.secret_id_hash().begin(),
-                           proto_frame.secret_id_hash().end()));
+                           proto_frame.secret_id_hash().end()),
+      optional_signed_data);
 }
 
 mojom::PairedKeyResultFrame::Status ConvertPairedKeyStatus(
diff --git a/chrome/services/sharing/public/proto/wire_format.proto b/chrome/services/sharing/public/proto/wire_format.proto
index 9963d9a5..748b8cf 100644
--- a/chrome/services/sharing/public/proto/wire_format.proto
+++ b/chrome/services/sharing/public/proto/wire_format.proto
@@ -170,6 +170,9 @@
 
   // The hash of a certificate id.
   optional bytes secret_id_hash = 2;
+
+  // An optional encrypted data in byte array format.
+  optional bytes optional_signed_data = 3;
 }
 
 // A paired key verification result packet sent between devices.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 503e296..184d33d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6949,6 +6949,7 @@
       "../browser/ui/passwords/manage_passwords_ui_controller_unittest.cc",
       "../browser/ui/passwords/password_manager_navigation_throttle_unittest.cc",
       "../browser/ui/passwords/well_known_change_password_navigation_throttle_unittest.cc",
+      "../browser/ui/performance_controls/performance_controls_hats_service_unittest.cc",
       "../browser/ui/qrcode_generator/qrcode_generator_bubble_controller_unittest.cc",
       "../browser/ui/recently_audible_helper_unittest.cc",
       "../browser/ui/search/ntp_user_data_logger_unittest.cc",
diff --git a/chrome/test/data/webui/bookmarks/dnd_manager_test.ts b/chrome/test/data/webui/bookmarks/dnd_manager_test.ts
index 371c5962..747d123 100644
--- a/chrome/test/data/webui/bookmarks/dnd_manager_test.ts
+++ b/chrome/test/data/webui/bookmarks/dnd_manager_test.ts
@@ -2,11 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {BookmarkElement, BookmarkManagerApiProxyImpl, BookmarksAppElement, BookmarksFolderNodeElement, BookmarksListElement, BrowserProxyImpl, DndManager, DragInfo, setDebouncerForTesting} from 'chrome://bookmarks/bookmarks.js';
+import {BookmarkElement, BookmarkManagerApiProxyImpl, BookmarksAppElement, BookmarksFolderNodeElement, BookmarksItemElement, BookmarksListElement, BrowserProxyImpl, DndManager, DragInfo, overrideFolderOpenerTimeoutDelay, setDebouncerForTesting} from 'chrome://bookmarks/bookmarks.js';
 import {assertNotReached} from 'chrome://resources/js/assert_ts.js';
 import {middleOfNode, topLeftOfNode} from 'chrome://resources/polymer/v3_0/iron-test-helpers/mock-interactions.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
 import {TestBookmarkManagerApiProxy} from './test_bookmark_manager_api_proxy.js';
 import {TestBookmarksBrowserProxy} from './test_browser_proxy.js';
@@ -30,14 +31,14 @@
   }
 
   function getFolderNode(id: string) {
-    return findFolderNode(rootFolderNode, id) as BookmarkElement;
+    return findFolderNode(rootFolderNode, id) as BookmarksFolderNodeElement;
   }
 
   function getListItem(id: string) {
     const items = list.root!.querySelectorAll('bookmarks-item');
     for (let i = 0; i < items.length; i++) {
       if (items[i]!.itemId === id) {
-        return items[i] as BookmarkElement;
+        return items[i] as BookmarksItemElement;
       }
     }
     assertNotReached();
@@ -324,7 +325,7 @@
 
     // All positions should be allowed even with the same bookmark id if the
     // drag element is from a different profile.
-    let dragTarget = getListItem('11');
+    let dragTarget: BookmarkElement = getListItem('11');
     move(dragTarget, topLeftOfNode(dragTarget));
     assertDragStyle(dragTarget, DragStyle.ABOVE);
 
@@ -348,7 +349,7 @@
   });
 
   test('drag from sidebar to list', async function() {
-    let dragElement = getFolderNode('112');
+    let dragElement: BookmarkElement = getFolderNode('112');
     let dragTarget = getListItem('13');
 
     // Drag a folder onto the list.
@@ -387,7 +388,7 @@
     // Search results should not be able to be dragged onto, but can be dragged
     // from.
     bookmarkManagerApi.onDragEnter.callListeners(createDragData(['2']));
-    let dragTarget = getListItem('13');
+    let dragTarget: BookmarkElement = getListItem('13');
     move(dragTarget);
     assertDragStyle(dragTarget, DragStyle.NONE);
 
@@ -440,68 +441,63 @@
     assertDragStyle(dragTarget, DragStyle.NONE);
   });
 
-  /* Test is disabled because auto-expander functionality
-     is currently broken (https://crbug.com/1406349)
-
   test('auto expander', async function() {
-    const timerProxy = new TestTimerProxy();
-    timerProxy.immediatelyResolveTimeouts = false;
-
-    const autoExpander = dndManager.autoExpander_;
-    autoExpander.debouncer_.timerProxy_ = timerProxy;
+    overrideFolderOpenerTimeoutDelay(0);
+    store.setReducersEnabled(true);
 
     store.data.folderOpenState.set('11', false);
+    store.data.folderOpenState.set('14', false);
+    store.data.folderOpenState.set('15', false);
     store.notifyObservers();
     flush();
 
-    const dragElement = getFolderNode('14');
-    let dragTarget = getFolderNode('15');
+    const dragElement = getFolderNode('15');
+    await simulateDragStart(dragElement);
 
-    simulateDragStart(dragElement);
-
-    // Dragging onto folders without children doesn't update the auto expander.
+    // Dragging onto folders without children doesn't open the folder.
+    let dragTarget = getFolderNode('14');
     move(dragTarget);
-    assertEquals(null, autoExpander.lastElement_);
+    await flushTasks();
+    assertFalse(dragTarget.isOpen);
 
-    // Dragging onto open folders doesn't update the auto expander.
+    // Dragging onto itself doesn't open the folder.
+    move(dragElement);
+    await flushTasks();
+    assertFalse(dragElement.isOpen);
+
+    // Dragging onto an open folder doesn't affect the folder.
     dragTarget = getFolderNode('1');
+    assertTrue(dragTarget.isOpen);
     move(dragTarget);
-    assertEquals(null, autoExpander.lastElement_);
+    await flushTasks();
+    assertTrue(dragTarget.isOpen);
 
-    // Dragging onto a closed folder with children updates the auto expander.
     dragTarget = getFolderNode('11');
-    move(dragTarget);
-    assertEquals(dragTarget, autoExpander.lastElement_);
 
-    // Dragging onto another item resets the auto expander.
-    dragTarget = getFolderNode('1');
+    // Dragging off of a closed folder doesn't open it.
     move(dragTarget);
-    assertEquals(null, autoExpander.lastElement_);
+    move(list);
+    await flushTasks();
+    assertFalse(dragTarget.isOpen);
 
-    // Dragging onto the list resets the auto expander.
-    dragTarget = getFolderNode('11');
+    // Dragging onto a folder with DragStyle.BELOW doesn't open it.
+    move(dragTarget, bottomRightOfNode(dragTarget));
+    assertDragStyle(dragTarget, DragStyle.BELOW);
+    await flushTasks();
+    assertFalse(dragTarget.isOpen);
+
+    // Dragging onto a folder with DragStyle.ABOVE doesn't open it.
+    move(dragTarget, topLeftOfNode(dragTarget));
+    assertDragStyle(dragTarget, DragStyle.ABOVE);
+    await flushTasks();
+    assertFalse(dragTarget.isOpen);
+
+    // Dragging onto a closed folder with children opens it.
     move(dragTarget);
-    assertEquals(dragTarget, autoExpander.lastElement_);
-
-    dragTarget = list;
-    move(dragTarget);
-    assertEquals(null, autoExpander.lastElement_);
-
-    // Moving the mouse resets the delay.
-    dragTarget = getFolderNode('11');
-    move(dragTarget);
-    assertEquals(dragTarget, autoExpander.lastElement_);
-    const oldTimer = autoExpander.debouncer_.timer_;
-
-    move(dragTarget);
-    assertNotEquals(oldTimer, autoExpander.debouncer_.timer_);
-
-    // Auto expands after expand delay.
-    timerProxy.runTimeoutFn(autoExpander.debouncer_.timer_);
-    assertDeepEquals(changeFolderOpen('11', true), store.lastAction);
-    assertEquals(null, autoExpander.lastElement_);
+    assertDragStyle(dragTarget, DragStyle.ON);
+    await flushTasks();
+    assertTrue(dragTarget.isOpen);
   });
-  */
 
   test('drag item selects/deselects items', async function() {
     store.setReducersEnabled(true);
@@ -511,7 +507,7 @@
 
     // Dragging an item not in the selection selects the dragged item and
     // deselects the previous selection.
-    let dragElement = getListItem('14');
+    let dragElement: BookmarkElement = getListItem('14');
     await simulateDragStart(dragElement);
     assertDeepEquals(['14'], normalizeIterable(store.data.selection.items));
     dispatchDragEvent('dragend', dragElement);
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
index be19dc8..c8addb9d 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
@@ -146,6 +146,26 @@
     }
   }
 
+  /**
+   * @param {boolean} fromSettingsSearch
+   * @private
+   */
+  function setFromSettingsSearchFlag(fromSettingsSearch) {
+    if (fromSettingsSearch) {
+      const queryParams = new URLSearchParams(window.location.search);
+      const fromSettingsSearch = 'true';
+      queryParams.set(
+          AdditionalContextQueryParam.FROM_SETTINGS_SEARCH, fromSettingsSearch);
+
+      window.history.replaceState(null, '', '?' + queryParams.toString());
+    } else {
+      window.history.replaceState(
+          null, '',
+          '?' +
+              '');
+    }
+  }
+
   // Test that the search page is shown by default.
   test('SearchPageIsShownByDefault', async () => {
     await initializePage();
@@ -477,6 +497,68 @@
     fakeInternalUserFeedbackContext.fromAssistant = true;
   });
 
+  // Test the sys info and metrics checkbox will not be checked if
+  // fromSettingsSearch flag has been passed.
+  test(
+      'SysinfoAndMetricsCheckboxIsUncheckedWhenFeedbackIsSentFromSettingsSearch',
+      async () => {
+        // Replacing the query string to set the fromSettingsSearch flag as
+        // true.
+        setFromSettingsSearchFlag(true);
+        await initializePage();
+        const feedbackContext = getFeedbackContext_();
+        assertTrue(feedbackContext.fromSettingsSearch);
+
+        let activePage = page.shadowRoot.querySelector('.iron-selected');
+        activePage.shadowRoot.querySelector('textarea').value = 'text';
+        activePage.shadowRoot.querySelector('#buttonContinue').click();
+        await flushTasks();
+
+        // Check the sys info and metrics checkbox component is unchecked when
+        // the feedback app has opened through settings search
+        activePage = page.shadowRoot.querySelector('.iron-selected');
+        assertEquals('shareDataPage', activePage.id);
+
+        const sysInfoAndMetricsCheckboxContainer =
+            activePage.shadowRoot.querySelector('#sysInfoContainer');
+        assertTrue(!!sysInfoAndMetricsCheckboxContainer);
+
+        const sysInfoAndMetricsCheckbox =
+            activePage.shadowRoot.querySelector('#sysInfoCheckbox');
+        assertTrue(!!sysInfoAndMetricsCheckbox);
+        assertFalse(sysInfoAndMetricsCheckbox.checked);
+      });
+
+  // Test the sys info and metrics checkbox will be checked if
+  // fromSettingsSearch flag not passed.
+  test(
+      'SysinfoAndMetricsCheckboxIsCheckedWhenFeedbackIsNotSentFromSettingsSearch',
+      async () => {
+        // Replacing the query string to set the fromSettingsSearch flag as
+        // false.
+        setFromSettingsSearchFlag(false);
+        await initializePage();
+        const feedbackContext = getFeedbackContext_();
+        assertFalse(feedbackContext.fromSettingsSearch);
+
+        let activePage = page.shadowRoot.querySelector('.iron-selected');
+        activePage.shadowRoot.querySelector('textarea').value = 'text';
+        activePage.shadowRoot.querySelector('#buttonContinue').click();
+        await flushTasks();
+
+        activePage = page.shadowRoot.querySelector('.iron-selected');
+        assertEquals('shareDataPage', activePage.id);
+
+        const sysInfoAndMetricsContainer =
+            activePage.shadowRoot.querySelector('#sysInfoContainer');
+        assertTrue(!!sysInfoAndMetricsContainer);
+
+        const sysInfoAndMetricsCheckbox =
+            activePage.shadowRoot.querySelector('#sysInfoCheckbox');
+        assertTrue(!!sysInfoAndMetricsCheckbox);
+        assertTrue(sysInfoAndMetricsCheckbox.checked);
+      });
+
   // Test the navigation from confirmation page to search page after the
   // send new report button is clicked.
   test('NavigateFromConfirmationPageToSearchPage', async () => {
@@ -571,8 +653,8 @@
     assertEquals(1, feedbackServiceProvider.getFeedbackContextCallCount());
   });
 
-  // Test that the extra diagnostics, category tag, page_url and fromAssistant
-  // flag get set when query parameter is non-empty.
+  // Test that the extra diagnostics, category tag, page_url, fromAssistant
+  // and fromSettingsSearch flag get set when query parameter is non-empty.
   test(
       'AdditionalContextParametersProvidedInUrl_FeedbackContext_Matches',
       async () => {
@@ -596,6 +678,10 @@
         const from_assistant = 'true';
         queryParams.set(
             AdditionalContextQueryParam.FROM_ASSISTANT, from_assistant);
+        const fromSettingsSearch = 'true';
+        queryParams.set(
+            AdditionalContextQueryParam.FROM_SETTINGS_SEARCH,
+            fromSettingsSearch);
         // Replace current querystring with the new one.
         window.history.replaceState(null, '', '?' + queryParams.toString());
         await initializePage();
@@ -616,6 +702,7 @@
         assertEquals(
             decodeURIComponent(category_tag), feedbackContext.categoryTag);
         assertTrue(feedbackContext.fromAssistant);
+        assertTrue(feedbackContext.fromSettingsSearch);
 
         // Set the pageUrl in fake feedback context back to its origin value
         // because it's overwritten by the page_url passed from the app.
@@ -644,6 +731,7 @@
         assertEquals('', descriptionElement.value);
         assertEquals('', feedbackContext.categoryTag);
         assertFalse(feedbackContext.fromAssistant);
+        assertFalse(feedbackContext.fromSettingsSearch);
       });
 
   /**
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts
index 408933da..14dc0cc15 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_app_controller_test.ts
@@ -48,66 +48,76 @@
     personalizationStore.setReducersEnabled(true);
   });
 
-  [true, false].forEach(isGooglePhotosIntegrationEnabled => {
-    test('initializes Google Photos data in store', async () => {
-      loadTimeData.overrideValues({isGooglePhotosIntegrationEnabled});
+  test('initializes Google Photos data in store', async () => {
+    loadTimeData.overrideValues({isGooglePhotosIntegrationEnabled: true});
 
-      await initializeGooglePhotosData(wallpaperProvider, personalizationStore);
+    await initializeGooglePhotosData(wallpaperProvider, personalizationStore);
 
-      const expectedEnabled = isGooglePhotosIntegrationEnabled ?
-          GooglePhotosEnablementState.kEnabled :
-          GooglePhotosEnablementState.kError;
+    const expectedEnabled = GooglePhotosEnablementState.kEnabled;
 
-      assertDeepEquals(
-          [
-            {
-              name: 'begin_load_google_photos_enabled',
+    assertDeepEquals(
+        [
+          {
+            name: 'begin_load_google_photos_enabled',
+          },
+          {
+            name: 'set_google_photos_enabled',
+            enabled: expectedEnabled,
+          },
+        ],
+        personalizationStore.actions);
+
+    assertDeepEquals(
+        [
+          // BEGIN_LOAD_GOOGLE_PHOTOS_ENABLED.
+          {
+            'wallpaper.loading.googlePhotos': {
+              enabled: true,
+              albums: false,
+              albumsShared: false,
+              photos: false,
+              photosByAlbumId: {},
             },
-            {
-              name: 'set_google_photos_enabled',
+            'wallpaper.googlePhotos': {
+              enabled: undefined,
+              albums: undefined,
+              albumsShared: undefined,
+              photos: undefined,
+              photosByAlbumId: {},
+              resumeTokens: {
+                albums: null,
+                albumsShared: null,
+                photos: null,
+                photosByAlbumId: {},
+              },
+            },
+          },
+          // SET_GOOGLE_PHOTOS_ENABLED.
+          {
+            'wallpaper.loading.googlePhotos': {
+              enabled: false,
+              albums: false,
+              albumsShared: false,
+              photos: false,
+              photosByAlbumId: {},
+            },
+            'wallpaper.googlePhotos': {
               enabled: expectedEnabled,
-            },
-          ],
-          personalizationStore.actions);
-
-      assertDeepEquals(
-          [
-            // BEGIN_LOAD_GOOGLE_PHOTOS_ENABLED.
-            {
-              'wallpaper.loading.googlePhotos': {
-                enabled: true,
-                albums: false,
-                photos: false,
+              albums: undefined,
+              albumsShared: undefined,
+              photos: undefined,
+              photosByAlbumId: {},
+              resumeTokens: {
+                albums: null,
+                albumsShared: null,
+                photos: null,
                 photosByAlbumId: {},
               },
-              'wallpaper.googlePhotos': {
-                enabled: undefined,
-                albums: undefined,
-                photos: undefined,
-                photosByAlbumId: {},
-                resumeTokens: {albums: null, photos: null, photosByAlbumId: {}},
-              },
             },
-            // SET_GOOGLE_PHOTOS_ENABLED.
-            {
-              'wallpaper.loading.googlePhotos': {
-                enabled: false,
-                albums: false,
-                photos: false,
-                photosByAlbumId: {},
-              },
-              'wallpaper.googlePhotos': {
-                enabled: expectedEnabled,
-                albums: undefined,
-                photos: undefined,
-                photosByAlbumId: {},
-                resumeTokens: {albums: null, photos: null, photosByAlbumId: {}},
-              },
-            },
-          ],
-          personalizationStore.states.map(filterAndFlattenState(
-              ['wallpaper.googlePhotos', 'wallpaper.loading.googlePhotos'])));
-    });
+          },
+        ],
+        personalizationStore.states.map(filterAndFlattenState(
+            ['wallpaper.googlePhotos', 'wallpaper.loading.googlePhotos'])));
   });
 
   test('sets Google Photos album in store', async () => {
@@ -164,6 +174,7 @@
             'wallpaper.loading.googlePhotos': {
               enabled: false,
               albums: false,
+              albumsShared: false,
               photos: false,
               photosByAlbumId: {
                 [album.id]: true,
@@ -177,9 +188,15 @@
                   preview: album.preview,
                 },
               ],
+              albumsShared: undefined,
               photos: undefined,
               photosByAlbumId: {},
-              resumeTokens: {albums: null, photos: null, photosByAlbumId: {}},
+              resumeTokens: {
+                albums: null,
+                albumsShared: null,
+                photos: null,
+                photosByAlbumId: {},
+              },
             },
           },
           // APPEND_GOOGLE_PHOTOS_ALBUM
@@ -187,6 +204,7 @@
             'wallpaper.loading.googlePhotos': {
               enabled: false,
               albums: false,
+              albumsShared: false,
               photos: false,
               photosByAlbumId: {
                 [album.id]: false,
@@ -200,12 +218,14 @@
                   preview: album.preview,
                 },
               ],
+              albumsShared: undefined,
               photos: undefined,
               photosByAlbumId: {
                 [album.id]: photos,
               },
               resumeTokens: {
                 albums: null,
+                albumsShared: null,
                 photos: null,
                 photosByAlbumId: {[album.id]: null},
               },
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
index 1be17d06..33c52f0 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -20,6 +20,7 @@
       'fetchGooglePhotosAlbums',
       'fetchGooglePhotosEnabled',
       'fetchGooglePhotosPhotos',
+      'fetchGooglePhotosSharedAlbums',
       'getDefaultImageThumbnail',
       'getLocalImages',
       'getLocalImageThumbnail',
@@ -110,6 +111,8 @@
   private images_: WallpaperImage[]|null;
   private googlePhotosAlbums_: GooglePhotosAlbum[]|undefined = [];
   private googlePhotosAlbumsResumeToken_: string|undefined;
+  private googlePhotosSharedAlbums_: GooglePhotosAlbum[]|undefined = [];
+  private googlePhotosSharedAlbumsResumeToken_: string|undefined;
   private googlePhotosEnabled_: GooglePhotosEnablementState =
       GooglePhotosEnablementState.kEnabled;
   private googlePhotosPhotos_: GooglePhotosPhoto[]|undefined = [];
@@ -178,6 +181,14 @@
     return Promise.resolve({response});
   }
 
+  fetchGooglePhotosSharedAlbums(resumeToken: string|null) {
+    this.methodCalled('fetchGooglePhotosSharedAlbums', resumeToken);
+    const response = new FetchGooglePhotosAlbumsResponse();
+    response.albums = this.googlePhotosSharedAlbums_;
+    response.resumeToken = this.googlePhotosSharedAlbumsResumeToken_;
+    return Promise.resolve({response});
+  }
+
   fetchGooglePhotosEnabled() {
     this.methodCalled('fetchGooglePhotosEnabled');
     const state = loadTimeData.getBoolean('isGooglePhotosIntegrationEnabled') ?
@@ -307,6 +318,17 @@
     this.googlePhotosAlbumsResumeToken_ = googlePhotosAlbumsResumeToken;
   }
 
+  setGooglePhotosSharedAlbums(googlePhotosSharedAlbums: GooglePhotosAlbum[]|
+                              undefined) {
+    this.googlePhotosSharedAlbums_ = googlePhotosSharedAlbums;
+  }
+
+  setGooglePhotosSharedAlbumsResumeToken(googlePhotosSharedAlbumsResumeToken:
+                                             string|undefined) {
+    this.googlePhotosSharedAlbumsResumeToken_ =
+        googlePhotosSharedAlbumsResumeToken;
+  }
+
   setGooglePhotosEnabled(googlePhotosEnabled: GooglePhotosEnablementState) {
     this.googlePhotosEnabled_ = googlePhotosEnabled;
   }
diff --git a/chrome/test/data/webui/cr_components/help_bubble_mixin_test.ts b/chrome/test/data/webui/cr_components/help_bubble_mixin_test.ts
index 44ab7c3..0d0a1a5ee 100644
--- a/chrome/test/data/webui/cr_components/help_bubble_mixin_test.ts
+++ b/chrome/test/data/webui/cr_components/help_bubble_mixin_test.ts
@@ -6,7 +6,7 @@
 import 'chrome://resources/cr_components/help_bubble/help_bubble.js';
 
 import {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js';
-import {HelpBubbleElement} from 'chrome://resources/cr_components/help_bubble/help_bubble.js';
+import {ANCHOR_HIGHLIGHT_CLASS, HelpBubbleElement} from 'chrome://resources/cr_components/help_bubble/help_bubble.js';
 import {HelpBubbleArrowPosition, HelpBubbleClientCallbackRouter, HelpBubbleClientRemote, HelpBubbleClosedReason, HelpBubbleHandlerInterface, HelpBubbleParams} from 'chrome://resources/cr_components/help_bubble/help_bubble.mojom-webui.js';
 import {HelpBubbleController} from 'chrome://resources/cr_components/help_bubble/help_bubble_controller.js';
 import {HelpBubbleMixin, HelpBubbleMixinInterface} from 'chrome://resources/cr_components/help_bubble/help_bubble_mixin.js';
@@ -259,14 +259,16 @@
     assertFalse(container.isHelpBubbleShowing());
   });
 
-  const defaultParams: HelpBubbleParams = new HelpBubbleParams();
-  defaultParams.nativeIdentifier = PARAGRAPH_NATIVE_ID;
-  defaultParams.closeButtonAltText = CLOSE_BUTTON_ALT_TEXT;
-  defaultParams.position = HelpBubbleArrowPosition.BOTTOM_CENTER;
-  defaultParams.bodyText = 'This is a help bubble.';
-  defaultParams.bodyIconName = 'lightbulb_outline';
-  defaultParams.bodyIconAltText = BODY_ICON_ALT_TEXT;
-  defaultParams.buttons = [];
+  const defaultParams: HelpBubbleParams = {
+    nativeIdentifier: PARAGRAPH_NATIVE_ID,
+    closeButtonAltText: CLOSE_BUTTON_ALT_TEXT,
+    position: HelpBubbleArrowPosition.BOTTOM_CENTER,
+    bodyText: 'This is a help bubble.',
+    bodyIconName: 'lightbulb_outline',
+    bodyIconAltText: BODY_ICON_ALT_TEXT,
+    buttons: [],
+    forceCloseButton: false,
+  };
 
   test('help bubble mixin shows bubble when called directly', () => {
     assertFalse(container.isHelpBubbleShowing());
@@ -418,6 +420,21 @@
       });
 
   test(
+      'help bubble adds class to element on external help bubble shown',
+      async () => {
+        testProxy.getCallbackRouterRemote().externalHelpBubbleUpdated(
+            TITLE_NATIVE_ID, true);
+        await waitAfterNextRender(container);
+        assertTrue(
+            container.$.title.classList.contains(ANCHOR_HIGHLIGHT_CLASS));
+        testProxy.getCallbackRouterRemote().externalHelpBubbleUpdated(
+            TITLE_NATIVE_ID, false);
+        await waitAfterNextRender(container);
+        assertFalse(
+            container.$.title.classList.contains(ANCHOR_HIGHLIGHT_CLASS));
+      });
+
+  test(
       'help bubble mixin doesn\'t hide help bubble when called with wrong id',
       async () => {
         testProxy.getCallbackRouterRemote().showHelpBubble(defaultParams);
@@ -430,13 +447,15 @@
   test(
       'help bubble ignores unregistered ID in ShowHelpBubble call',
       async () => {
-        const params: HelpBubbleParams = new HelpBubbleParams();
-        params.nativeIdentifier = 'This is an unregistered identifier';
-        params.closeButtonAltText = CLOSE_BUTTON_ALT_TEXT;
-        params.bodyIconAltText = BODY_ICON_ALT_TEXT;
-        params.position = HelpBubbleArrowPosition.BOTTOM_CENTER;
-        params.bodyText = 'This is a help bubble.';
-        params.buttons = [];
+        const params: HelpBubbleParams = {
+          nativeIdentifier: 'This is an unregistered identifier',
+          closeButtonAltText: CLOSE_BUTTON_ALT_TEXT,
+          bodyIconAltText: BODY_ICON_ALT_TEXT,
+          position: HelpBubbleArrowPosition.BOTTOM_CENTER,
+          bodyText: 'This is a help bubble.',
+          buttons: [],
+          forceCloseButton: false,
+        };
 
         testProxy.getCallbackRouterRemote().showHelpBubble(params);
         await waitAfterNextRender(container);
@@ -599,14 +618,16 @@
     assertTrue(isVisible(bubble));
   });
 
-  const paramsWithTitle: HelpBubbleParams = new HelpBubbleParams();
-  paramsWithTitle.nativeIdentifier = TITLE_NATIVE_ID;
-  paramsWithTitle.closeButtonAltText = CLOSE_BUTTON_ALT_TEXT;
-  paramsWithTitle.bodyIconAltText = BODY_ICON_ALT_TEXT;
-  paramsWithTitle.position = HelpBubbleArrowPosition.TOP_CENTER;
-  paramsWithTitle.bodyText = 'This is another help bubble.';
-  paramsWithTitle.titleText = 'This is a title';
-  paramsWithTitle.buttons = [];
+  const paramsWithTitle: HelpBubbleParams = {
+    nativeIdentifier: TITLE_NATIVE_ID,
+    closeButtonAltText: CLOSE_BUTTON_ALT_TEXT,
+    bodyIconAltText: BODY_ICON_ALT_TEXT,
+    position: HelpBubbleArrowPosition.TOP_CENTER,
+    bodyText: 'This is another help bubble.',
+    titleText: 'This is a title',
+    buttons: [],
+    forceCloseButton: false,
+  };
 
   test('help bubble mixin shows multiple bubbles', async () => {
     testProxy.getCallbackRouterRemote().showHelpBubble(defaultParams);
@@ -639,14 +660,16 @@
     assertEquals(paramsWithTitle.titleText, titleBubble.titleText);
   });
 
-  const paramsWithProgress: HelpBubbleParams = new HelpBubbleParams();
-  paramsWithProgress.nativeIdentifier = LIST_NATIVE_ID;
-  paramsWithProgress.closeButtonAltText = CLOSE_BUTTON_ALT_TEXT;
-  paramsWithProgress.bodyIconAltText = BODY_ICON_ALT_TEXT;
-  paramsWithProgress.position = HelpBubbleArrowPosition.TOP_CENTER;
-  paramsWithProgress.bodyText = 'This is another help bubble.';
-  paramsWithProgress.progress = {current: 1, total: 3};
-  paramsWithProgress.buttons = [];
+  const paramsWithProgress: HelpBubbleParams = {
+    nativeIdentifier: LIST_NATIVE_ID,
+    closeButtonAltText: CLOSE_BUTTON_ALT_TEXT,
+    bodyIconAltText: BODY_ICON_ALT_TEXT,
+    position: HelpBubbleArrowPosition.TOP_CENTER,
+    bodyText: 'This is another help bubble.',
+    progress: {current: 1, total: 3},
+    buttons: [],
+    forceCloseButton: false,
+  };
 
   test(
       'help bubble mixin shows bubbles with and without progress', async () => {
@@ -700,23 +723,25 @@
     assertFalse(container.isHelpBubbleShowing());
   });
 
-  const buttonParams: HelpBubbleParams = new HelpBubbleParams();
-  buttonParams.nativeIdentifier = PARAGRAPH_NATIVE_ID;
-  buttonParams.closeButtonAltText = CLOSE_BUTTON_ALT_TEXT;
-  buttonParams.bodyIconAltText = BODY_ICON_ALT_TEXT;
-  buttonParams.position = HelpBubbleArrowPosition.TOP_CENTER;
-  buttonParams.bodyText = 'This is another help bubble.';
-  buttonParams.titleText = 'This is a title';
-  buttonParams.buttons = [
-    {
-      text: 'button1',
-      isDefault: false,
-    },
-    {
-      text: 'button2',
-      isDefault: true,
-    },
-  ];
+  const buttonParams: HelpBubbleParams = {
+    nativeIdentifier: PARAGRAPH_NATIVE_ID,
+    closeButtonAltText: CLOSE_BUTTON_ALT_TEXT,
+    bodyIconAltText: BODY_ICON_ALT_TEXT,
+    position: HelpBubbleArrowPosition.TOP_CENTER,
+    bodyText: 'This is another help bubble.',
+    titleText: 'This is a title',
+    buttons: [
+      {
+        text: 'button1',
+        isDefault: false,
+      },
+      {
+        text: 'button2',
+        isDefault: true,
+      },
+    ],
+    forceCloseButton: false,
+  };
 
   test('help bubble mixin sends action button clicked event', async () => {
     container.showHelpBubble(p1Bubble, buttonParams);
@@ -737,14 +762,16 @@
     assertFalse(container.isHelpBubbleShowing());
   });
 
-  const timeoutParams: HelpBubbleParams = new HelpBubbleParams();
-  timeoutParams.nativeIdentifier = PARAGRAPH_NATIVE_ID;
-  timeoutParams.closeButtonAltText = CLOSE_BUTTON_ALT_TEXT;
-  timeoutParams.bodyIconAltText = BODY_ICON_ALT_TEXT;
-  timeoutParams.position = HelpBubbleArrowPosition.TOP_CENTER;
-  timeoutParams.bodyText = 'This is another help bubble.';
-  timeoutParams.titleText = 'This is a title';
-  timeoutParams.buttons = [];
+  const timeoutParams: HelpBubbleParams = {
+    nativeIdentifier: PARAGRAPH_NATIVE_ID,
+    closeButtonAltText: CLOSE_BUTTON_ALT_TEXT,
+    bodyIconAltText: BODY_ICON_ALT_TEXT,
+    position: HelpBubbleArrowPosition.TOP_CENTER,
+    bodyText: 'This is another help bubble.',
+    titleText: 'This is a title',
+    buttons: [],
+    forceCloseButton: false,
+  };
 
   // It is hard to guarantee the correct timing on various test systems,
   // so the 'before timeout' and 'after timeout' tests are split
diff --git a/chrome/test/data/webui/cr_components/history_clusters_test.ts b/chrome/test/data/webui/cr_components/history_clusters_test.ts
index 9735f3d..1aa020f 100644
--- a/chrome/test/data/webui/cr_components/history_clusters_test.ts
+++ b/chrome/test/data/webui/cr_components/history_clusters_test.ts
@@ -29,34 +29,47 @@
     createBrowserProxy();
   });
 
-  function getTestResult() {
-    const cluster1 = new Cluster();
-    const urlVisit1 = new URLVisit();
-    urlVisit1.normalizedUrl = {url: 'https://www.google.com'};
-    urlVisit1.urlForDisplay = 'https://www.google.com';
-    urlVisit1.pageTitle = '';
-    urlVisit1.titleMatchPositions = [];
-    urlVisit1.urlForDisplayMatchPositions = [];
-    urlVisit1.duplicates = [];
-    urlVisit1.relativeDate = '';
-    urlVisit1.annotations = [];
-    urlVisit1.hidden = false;
-    urlVisit1.debugInfo = {};
-    const rawVisitData = new RawVisitData();
-    rawVisitData.url = {url: ''};
-    rawVisitData.visitTime = {internalValue: BigInt(0)};
-    urlVisit1.rawVisitData = rawVisitData;
-    cluster1.visits = [urlVisit1];
-    cluster1.labelMatchPositions = [];
-    cluster1.relatedSearches = [];
-    const cluster2 = new Cluster();
-    cluster2.visits = [];
-    cluster2.labelMatchPositions = [];
-    cluster2.relatedSearches = [];
+  function getTestResult(): QueryResult {
+    const rawVisitData: RawVisitData = {
+      url: {url: ''},
+      visitTime: {internalValue: BigInt(0)},
+    };
 
-    const queryResult = new QueryResult();
-    queryResult.query = '';
-    queryResult.clusters = [cluster1, cluster2];
+    const urlVisit1: URLVisit = {
+      normalizedUrl: {url: 'https://www.google.com'},
+      urlForDisplay: 'https://www.google.com',
+      pageTitle: '',
+      titleMatchPositions: [],
+      urlForDisplayMatchPositions: [],
+      duplicates: [],
+      relativeDate: '',
+      annotations: [],
+      hidden: false,
+      debugInfo: {},
+      rawVisitData: rawVisitData,
+      isKnownToSync: false,
+    };
+
+    const cluster1: Cluster = {
+      id: BigInt(111),
+      visits: [urlVisit1],
+      labelMatchPositions: [],
+      relatedSearches: [],
+    };
+
+    const cluster2: Cluster = {
+      id: BigInt(222),
+      visits: [],
+      labelMatchPositions: [],
+      relatedSearches: [],
+    };
+
+    const queryResult: QueryResult = {
+      query: '',
+      clusters: [cluster1, cluster2],
+      canLoadMore: false,
+      isContinuation: false,
+    };
 
     return queryResult;
   }
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
index fdc0628..1fab4b66 100644
--- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -1200,11 +1200,13 @@
           audioPage.shadowRoot.querySelector('#audioInputGainMuteButton');
 
       assertFalse(audioPage.getIsInputMutedForTest());
+      assertEquals('cr:mic', inputMuteButton.ironIcon);
 
       inputMuteButton.click();
       await flushTasks();
 
       assertTrue(audioPage.getIsInputMutedForTest());
+      assertEquals('settings:mic-off', inputMuteButton.ironIcon);
     });
 
     test('simulate setting input gain slider', async function() {
diff --git a/chrome/test/data/webui/side_panel/customize_chrome/shortcuts_test.ts b/chrome/test/data/webui/side_panel/customize_chrome/shortcuts_test.ts
index 0a0feb3..6e750a38 100644
--- a/chrome/test/data/webui/side_panel/customize_chrome/shortcuts_test.ts
+++ b/chrome/test/data/webui/side_panel/customize_chrome/shortcuts_test.ts
@@ -5,7 +5,7 @@
 import 'chrome://webui-test/mojo_webui_test_support.js';
 import 'chrome://customize-chrome-side-panel.top-chrome/shortcuts.js';
 
-import {CustomizeChromePageCallbackRouter, CustomizeChromePageHandlerRemote} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome.mojom-webui.js';
+import {CustomizeChromePageCallbackRouter, CustomizeChromePageHandlerRemote, CustomizeChromePageRemote} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome.mojom-webui.js';
 import {CustomizeChromeApiProxy} from 'chrome://customize-chrome-side-panel.top-chrome/customize_chrome_api_proxy.js';
 import {ShortcutsElement} from 'chrome://customize-chrome-side-panel.top-chrome/shortcuts.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
@@ -16,6 +16,7 @@
 suite('ShortcutsTest', () => {
   let customizeShortcutsElement: ShortcutsElement;
   let handler: TestBrowserProxy<CustomizeChromePageHandlerRemote>;
+  let callbackRouterRemote: CustomizeChromePageRemote;
 
   setup(async () => {
     document.body.innerHTML = window.trustedTypes!.emptyHTML;
@@ -24,18 +25,19 @@
         (mock: CustomizeChromePageHandlerRemote) =>
             CustomizeChromeApiProxy.setInstance(
                 mock, new CustomizeChromePageCallbackRouter()));
+    callbackRouterRemote = CustomizeChromeApiProxy.getInstance()
+                               .callbackRouter.$.bindNewPipeAndPassRemote();
   });
 
   async function setInitialSettings(
       customLinksEnabled: boolean, shortcutsVisible: boolean): Promise<void> {
-    handler.setResultFor('getMostVisitedSettings', Promise.resolve({
-      customLinksEnabled,
-      shortcutsVisible,
-    }));
     customizeShortcutsElement =
         document.createElement('customize-chrome-shortcuts');
     document.body.appendChild(customizeShortcutsElement);
-    await handler.whenCalled('getMostVisitedSettings');
+    await handler.whenCalled('updateMostVisitedSettings');
+    callbackRouterRemote.setMostVisitedSettings(
+        customLinksEnabled, shortcutsVisible);
+    await callbackRouterRemote.$.flushForTesting();
   }
 
   function assertShown(shown: boolean) {
diff --git a/chrome/test/data/webui/side_panel/user_notes/app_test.ts b/chrome/test/data/webui/side_panel/user_notes/app_test.ts
index 0103376..f8b6315e9 100644
--- a/chrome/test/data/webui/side_panel/user_notes/app_test.ts
+++ b/chrome/test/data/webui/side_panel/user_notes/app_test.ts
@@ -80,4 +80,87 @@
     assertEquals(text, sampleNoteContent);
     assertEquals('', entryNote.$.noteContent.textContent);
   });
+
+  test('edit note and save changes', async () => {
+    const notesElements = queryNotes();
+    const note = notesElements[0]!;
+    const originalContent = note.$.noteContent.textContent;
+    assertEquals('false', note.$.noteContent.getAttribute('contenteditable'));
+    const contextMenuElement =
+        note.shadowRoot!.querySelector('user-note-menu')!;
+    const noteMenuButton = contextMenuElement.shadowRoot!.querySelector(
+                               '#menuButton') as HTMLButtonElement;
+    noteMenuButton.click();
+    const noteMenu = contextMenuElement.$.menu;
+    // Click edit button.
+    const editButton =
+        noteMenu.querySelectorAll('.dropdown-item')[0]! as HTMLButtonElement;
+    editButton.click();
+    assertEquals('true', note.$.noteContent.getAttribute('contenteditable'));
+    assertEquals(originalContent, note.$.noteContent.textContent);
+    // Update content.
+    const newContent = 'different content';
+    note.$.noteContent.textContent = newContent;
+    // Click add button.
+    note.$.noteContent.focus();
+    await flushTasks();
+    const noteAddButton =
+        note.shadowRoot!.querySelector('#addButton')! as HTMLButtonElement;
+    noteAddButton.click();
+    // Verify changes to content have been saved and the note is no longer in
+    // the editing state.
+    const [, text] = await testProxy.whenCalled('updateNote');
+    assertEquals(text, newContent);
+    assertEquals('false', note.$.noteContent.getAttribute('contenteditable'));
+    assertEquals(newContent, note.$.noteContent.textContent);
+  });
+
+  test('cancel while editing note', async () => {
+    const notesElements = queryNotes();
+    const note = notesElements[0]!;
+    const originalContent = note.$.noteContent.textContent;
+    assertEquals('false', note.$.noteContent.getAttribute('contenteditable'));
+    const contextMenuElement =
+        note.shadowRoot!.querySelector('user-note-menu')!;
+    const noteMenuButton = contextMenuElement.shadowRoot!.querySelector(
+                               '#menuButton') as HTMLButtonElement;
+    noteMenuButton.click();
+    const noteMenu = contextMenuElement.$.menu;
+    // Click edit button.
+    const editButton =
+        noteMenu.querySelectorAll('.dropdown-item')[0]! as HTMLButtonElement;
+    editButton.click();
+    assertEquals('true', note.$.noteContent.getAttribute('contenteditable'));
+    assertEquals(originalContent, note.$.noteContent.textContent);
+    // Update content.
+    note.$.noteContent.textContent = 'different content';
+    // Click cancel button.
+    note.$.noteContent.focus();
+    await flushTasks();
+    const notesCancelButton =
+        note.shadowRoot!.querySelector('#cancelButton')! as HTMLButtonElement;
+    notesCancelButton.click();
+    // Verify changes to content have been undone and the note is no longer in
+    // the editing state.
+    assertEquals('false', note.$.noteContent.getAttribute('contenteditable'));
+    assertEquals(originalContent, note.$.noteContent.textContent);
+  });
+
+  test('delete note', async () => {
+    const notesElements = queryNotes();
+    assertEquals(notesElements.length, 3);
+    const note = notesElements[0]!;
+    assertEquals('false', note.$.noteContent.getAttribute('contenteditable'));
+    const contextMenuElement =
+        note.shadowRoot!.querySelector('user-note-menu')!;
+    const noteMenuButton = contextMenuElement.shadowRoot!.querySelector(
+                               '#menuButton') as HTMLButtonElement;
+    noteMenuButton.click();
+    const noteMenu = contextMenuElement.$.menu;
+    // Click delete button.
+    const deleteButton =
+        noteMenu.querySelectorAll('.dropdown-item')[1]! as HTMLButtonElement;
+    deleteButton.click();
+    await testProxy.whenCalled('deleteNote');
+  });
 });
\ No newline at end of file
diff --git a/chrome/test/data/webui/side_panel/user_notes/test_user_notes_api_proxy.ts b/chrome/test/data/webui/side_panel/user_notes/test_user_notes_api_proxy.ts
index 393aaa9f..fc4f453 100644
--- a/chrome/test/data/webui/side_panel/user_notes/test_user_notes_api_proxy.ts
+++ b/chrome/test/data/webui/side_panel/user_notes/test_user_notes_api_proxy.ts
@@ -18,6 +18,7 @@
       'getNotesForCurrentTab',
       'newNoteFinished',
       'showUi',
+      'updateNote',
     ]);
 
     this.notes_ = [];
@@ -42,6 +43,11 @@
     this.methodCalled('showUi');
   }
 
+  updateNote(guid: string, text: string) {
+    this.methodCalled('updateNote', guid, text);
+    return Promise.resolve({success: true});
+  }
+
   getCallbackRouter() {
     return this.callbackRouter_;
   }
diff --git a/chromeos/ash/components/phonehub/notification.cc b/chromeos/ash/components/phonehub/notification.cc
index 86baf4a75..96c4f7d8 100644
--- a/chromeos/ash/components/phonehub/notification.cc
+++ b/chromeos/ash/components/phonehub/notification.cc
@@ -11,6 +11,7 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
 #include "third_party/skia/include/core/SkColor.h"
 
 namespace ash {
@@ -80,31 +81,32 @@
 Notification::AppMetadata Notification::AppMetadata::FromValue(
     const base::Value& value) {
   DCHECK(value.is_dict());
-  DCHECK(value.FindKey(kVisibleAppName));
-  DCHECK(value.FindKey(kVisibleAppName)->is_string());
-  DCHECK(value.FindKey(kPackageName));
-  DCHECK(value.FindKey(kPackageName)->is_string());
-  DCHECK(value.FindKey(kUserId));
-  DCHECK(value.FindKey(kUserId)->is_double());
-  DCHECK(value.FindKey(kIcon));
-  DCHECK(value.FindKey(kIcon)->is_string());
+  const base::Value::Dict& dict = value.GetDict();
+  DCHECK(dict.contains(kVisibleAppName));
+  DCHECK(dict.FindString(kVisibleAppName));
+  DCHECK(dict.contains(kPackageName));
+  DCHECK(dict.FindString(kPackageName));
+  DCHECK(dict.contains(kUserId));
+  DCHECK(dict.FindDouble(kUserId));
+  DCHECK(dict.contains(kIcon));
+  DCHECK(dict.FindString(kIcon));
 
-  if (value.FindKey(kIconIsMonochrome)) {
-    DCHECK(value.FindKey(kIconIsMonochrome)->is_bool());
+  if (dict.contains(kIconIsMonochrome)) {
+    DCHECK(dict.FindBool(kIconIsMonochrome));
   }
   bool icon_is_monochrome =
-      value.FindBoolPath(kIconIsMonochrome).value_or(false);
+      dict.FindBoolByDottedPath(kIconIsMonochrome).value_or(false);
 
   absl::optional<SkColor> icon_color = absl::nullopt;
-  if (value.FindKey(kIconColorR)) {
-    DCHECK(value.FindKey(kIconColorR)->is_int());
-    DCHECK(value.FindKey(kIconColorG));
-    DCHECK(value.FindKey(kIconColorG)->is_int());
-    DCHECK(value.FindKey(kIconColorB));
-    DCHECK(value.FindKey(kIconColorB)->is_int());
-    icon_color = SkColorSetRGB(*(value.FindIntPath(kIconColorR)),
-                               *(value.FindIntPath(kIconColorG)),
-                               *(value.FindIntPath(kIconColorB)));
+  if (dict.contains(kIconColorR)) {
+    DCHECK(dict.FindInt(kIconColorR));
+    DCHECK(dict.contains(kIconColorG));
+    DCHECK(dict.FindInt(kIconColorG));
+    DCHECK(dict.contains(kIconColorB));
+    DCHECK(dict.FindInt(kIconColorB));
+    icon_color = SkColorSetRGB(*(dict.FindIntByDottedPath(kIconColorR)),
+                               *(dict.FindIntByDottedPath(kIconColorG)),
+                               *(dict.FindIntByDottedPath(kIconColorB)));
   }
 
   const base::Value* visible_app_name_value = value.FindPath(kVisibleAppName);
diff --git a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc
index c136ec7..7c262115 100644
--- a/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc
+++ b/chromeos/ash/components/sync_wifi/wifi_configuration_bridge.cc
@@ -15,6 +15,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/time/clock.h"
 #include "base/time/time.h"
+#include "base/values.h"
 #include "chromeos/ash/components/network/network_configuration_handler.h"
 #include "chromeos/ash/components/network/network_event_log.h"
 #include "chromeos/ash/components/network/network_metadata_store.h"
@@ -470,10 +471,11 @@
     return;
   }
 
-  if (!set_properties->FindKey(shill::kAutoConnectProperty) &&
-      !set_properties->FindKey(shill::kPriorityProperty) &&
-      !set_properties->FindKey(shill::kProxyConfigProperty) &&
-      !set_properties->FindKey(shill::kMeteredProperty) &&
+  const base::Value::Dict& set_properties_dict = set_properties->GetDict();
+  if (!set_properties_dict.contains(shill::kAutoConnectProperty) &&
+      !set_properties_dict.contains(shill::kPriorityProperty) &&
+      !set_properties_dict.contains(shill::kProxyConfigProperty) &&
+      !set_properties_dict.contains(shill::kMeteredProperty) &&
       !set_properties->FindPath(
           base::StringPrintf("%s.%s", shill::kStaticIPConfigProperty,
                              shill::kNameServersProperty))) {
diff --git a/chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom b/chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom
index 507009f..35a9a22c 100644
--- a/chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom
+++ b/chromeos/ash/services/nearby/public/mojom/nearby_decoder_types.mojom
@@ -175,6 +175,10 @@
   // authenticity_key salt.
   // The size of bytes of secret id after hash should be 6.
   array<uint8> secret_id_hash;
+
+  // An optional encrypted data in byte array format.
+  // The size of byte array generated by signing should be 72.
+  array<uint8>? optional_signed_data;
 };
 
 // A paired key verification result packet sent between devices.
diff --git a/chromeos/ash/services/network_config/cros_network_config.cc b/chromeos/ash/services/network_config/cros_network_config.cc
index 2ea80413..26a5f03 100644
--- a/chromeos/ash/services/network_config/cros_network_config.cc
+++ b/chromeos/ash/services/network_config/cros_network_config.cc
@@ -3715,9 +3715,16 @@
         /*old_apn_state=*/absl::nullopt);
     return;
   }
+
+  if (!DoesDefaultApnExist(new_custom_apns)) {
+    NET_LOG(ERROR)
+        << "ModifyCustomApn: Cannot change the type to attach because there "
+        << "will be no APN with a default type remaining.";
+    return;
+  }
+
   NET_LOG(USER) << "ModifyCustomApn: Setting user APNs for: " << network_guid
                 << ": " << new_custom_apns.size();
-
   network_metadata_store->SetCustomApnList(network_guid,
                                            new_custom_apns.Clone());
   SetPropertiesInternal(
diff --git a/chromeos/ash/services/network_config/cros_network_config_unittest.cc b/chromeos/ash/services/network_config/cros_network_config_unittest.cc
index 7b3ac9c3..d12c028b 100644
--- a/chromeos/ash/services/network_config/cros_network_config_unittest.cc
+++ b/chromeos/ash/services/network_config/cros_network_config_unittest.cc
@@ -2131,6 +2131,156 @@
       /*ip_type_count=*/1, ApnTypes::kDefault, /*apn_types_count=*/1);
 }
 
+TEST_F(CrosNetworkConfigTest, ModifyCustomApnList) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(ash::features::kApnRevamp);
+
+  // Register an observer to capture values sent to Shill
+  TestNetworkConfigurationObserver network_config_observer(
+      network_configuration_handler());
+
+  const base::Value::List* custom_apns =
+      network_metadata_store()->GetCustomApnList(kCellularGuid);
+  ASSERT_FALSE(custom_apns);
+
+  // Create a custom default APN.
+  TestApnData test_apn1;
+  test_apn1.access_point_name = kCellularTestApn1;
+  test_apn1.name = kCellularTestApnName1;
+  test_apn1.username = kCellularTestApnUsername1;
+  test_apn1.password = kCellularTestApnPassword1;
+  test_apn1.attach = kCellularTestApnAttach1;
+  test_apn1.mojo_apn_types = {mojom::ApnType::kDefault};
+  test_apn1.onc_apn_types = {::onc::cellular_apn::kApnTypeDefault};
+  CreateCustomApn(kCellularGuid, test_apn1.AsMojoApn());
+  EXPECT_EQ(1u, network_config_observer.GetOnConfigurationModifiedCallCount());
+  {
+    std::vector<TestApnData*> expected_apns({&test_apn1});
+    EXPECT_TRUE(
+        UserApnsInNetworkMetadataStoreMatch(kCellularGuid, expected_apns));
+    EXPECT_TRUE(UserApnsInCellularConfigMatch(kCellularGuid, expected_apns,
+                                              network_config_observer));
+    EXPECT_TRUE(UserApnsInManagedPropertiesMatch(kCellularGuid, expected_apns));
+  }
+
+  // Try to modify the APN type to be attach which will not work because there
+  // would be no default APN left.
+  custom_apns = network_metadata_store()->GetCustomApnList(kCellularGuid);
+  ASSERT_TRUE(custom_apns);
+  ASSERT_EQ(1u, custom_apns->size());
+  const std::string first_apn_id =
+      *custom_apns->front().GetDict().FindString(::onc::cellular_apn::kId);
+
+  TestApnData test_apn2;
+  test_apn2.access_point_name = kCellularTestApn2;
+  test_apn2.name = kCellularTestApnName2;
+  test_apn2.username = kCellularTestApnUsername2;
+  test_apn2.password = kCellularTestApnPassword2;
+  test_apn2.attach = "attach";
+  test_apn2.mojo_apn_types = {mojom::ApnType::kAttach};
+  test_apn2.onc_apn_types = {::onc::cellular_apn::kApnTypeAttach};
+  test_apn2.id = first_apn_id;
+
+  ModifyCustomApn(kCellularGuid, test_apn2.AsMojoApn());
+  EXPECT_EQ(1u, network_config_observer.GetOnConfigurationModifiedCallCount());
+  {
+    std::vector<TestApnData*> expected_apns({&test_apn1});
+    EXPECT_TRUE(
+        UserApnsInNetworkMetadataStoreMatch(kCellularGuid, expected_apns));
+    EXPECT_TRUE(UserApnsInCellularConfigMatch(kCellularGuid, expected_apns,
+                                              network_config_observer));
+    EXPECT_TRUE(UserApnsInManagedPropertiesMatch(kCellularGuid, expected_apns));
+  }
+
+  // Create a custom attach APN.
+  TestApnData test_apn3;
+  test_apn3.access_point_name = kCellularTestApn3;
+  test_apn3.name = kCellularTestApnName3;
+  test_apn3.username = kCellularTestApnUsername3;
+  test_apn3.password = kCellularTestApnPassword3;
+  test_apn3.attach = kCellularTestApnAttach1;
+  test_apn3.mojo_apn_types = {mojom::ApnType::kAttach};
+  test_apn3.onc_apn_types = {::onc::cellular_apn::kApnTypeAttach};
+  CreateCustomApn(kCellularGuid, test_apn3.AsMojoApn());
+  EXPECT_EQ(2u, network_config_observer.GetOnConfigurationModifiedCallCount());
+  {
+    std::vector<TestApnData*> expected_apns({&test_apn3, &test_apn1});
+    EXPECT_TRUE(
+        UserApnsInNetworkMetadataStoreMatch(kCellularGuid, expected_apns));
+    EXPECT_TRUE(UserApnsInCellularConfigMatch(kCellularGuid, expected_apns,
+                                              network_config_observer));
+    EXPECT_TRUE(UserApnsInManagedPropertiesMatch(kCellularGuid, expected_apns));
+  }
+  AssertCreateCustomApnResultBucketCount(/*num_success=*/2, /*num_failure=*/0);
+  AssertCreateCustomApnPropertiesBucketCount(
+      mojom::ApnAuthenticationType::kAutomatic,
+      /*auth_type_count=*/2, mojom::ApnIpType::kAutomatic,
+      /*ip_type_count=*/2, ApnTypes::kAttach, /*apn_types_count=*/1);
+
+  // Try to modify default APN to be attach which will not work because there
+  // would be no default APN left.
+  ModifyCustomApn(kCellularGuid, test_apn2.AsMojoApn());
+  EXPECT_EQ(2u, network_config_observer.GetOnConfigurationModifiedCallCount());
+  {
+    std::vector<TestApnData*> expected_apns({&test_apn3, &test_apn1});
+    EXPECT_TRUE(
+        UserApnsInNetworkMetadataStoreMatch(kCellularGuid, expected_apns));
+    EXPECT_TRUE(UserApnsInCellularConfigMatch(kCellularGuid, expected_apns,
+                                              network_config_observer));
+    EXPECT_TRUE(UserApnsInManagedPropertiesMatch(kCellularGuid, expected_apns));
+  }
+
+  // Modify attach APN type to default which is OK.
+  custom_apns = network_metadata_store()->GetCustomApnList(kCellularGuid);
+  ASSERT_TRUE(custom_apns);
+  ASSERT_EQ(2u, custom_apns->size());
+  const std::string second_apn_id =
+      *custom_apns->front().GetDict().FindString(::onc::cellular_apn::kId);
+
+  TestApnData test_apn4;
+  test_apn4.access_point_name = "TEST.APN4";
+  test_apn4.name = "Test Apn 4";
+  test_apn4.username = kCellularTestApnUsername1;
+  test_apn4.password = kCellularTestApnPassword1;
+  test_apn4.attach = "";
+  test_apn4.mojo_apn_types = {mojom::ApnType::kDefault};
+  test_apn4.onc_apn_types = {::onc::cellular_apn::kApnTypeDefault};
+  test_apn4.id = second_apn_id;
+
+  ModifyCustomApn(kCellularGuid, test_apn4.AsMojoApn());
+  EXPECT_EQ(3u, network_config_observer.GetOnConfigurationModifiedCallCount());
+  {
+    std::vector<TestApnData*> expected_apns({&test_apn4, &test_apn1});
+    EXPECT_TRUE(
+        UserApnsInNetworkMetadataStoreMatch(kCellularGuid, expected_apns));
+    EXPECT_TRUE(UserApnsInCellularConfigMatch(kCellularGuid, expected_apns,
+                                              network_config_observer));
+    EXPECT_TRUE(UserApnsInManagedPropertiesMatch(kCellularGuid, expected_apns));
+  }
+
+  // Modify first default APN to be attach which is OK.
+  TestApnData test_apn5;
+  test_apn5.access_point_name = "TEST.APN5";
+  test_apn5.name = "Test Apn 5";
+  test_apn5.username = kCellularTestApnUsername1;
+  test_apn5.password = kCellularTestApnPassword1;
+  test_apn5.attach = "attach";
+  test_apn5.mojo_apn_types = {mojom::ApnType::kAttach};
+  test_apn5.onc_apn_types = {::onc::cellular_apn::kApnTypeAttach};
+  test_apn5.id = first_apn_id;
+
+  ModifyCustomApn(kCellularGuid, test_apn5.AsMojoApn());
+  EXPECT_EQ(4u, network_config_observer.GetOnConfigurationModifiedCallCount());
+  {
+    std::vector<TestApnData*> expected_apns({&test_apn4, &test_apn5});
+    EXPECT_TRUE(
+        UserApnsInNetworkMetadataStoreMatch(kCellularGuid, expected_apns));
+    EXPECT_TRUE(UserApnsInCellularConfigMatch(kCellularGuid, expected_apns,
+                                              network_config_observer));
+    EXPECT_TRUE(UserApnsInManagedPropertiesMatch(kCellularGuid, expected_apns));
+  }
+}
+
 TEST_F(CrosNetworkConfigTest, CreateCustomApn_EmptyList) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kApnRevamp);
diff --git a/chromeos/crosapi/DEPS b/chromeos/crosapi/DEPS
index 91d3192..da01e209 100644
--- a/chromeos/crosapi/DEPS
+++ b/chromeos/crosapi/DEPS
@@ -7,6 +7,7 @@
   "+components/digital_goods/mojom",
   "+components/policy/core/common",
   "+components/tab_groups",
+  "+components/version_info",
   "+third_party/boringssl/src/include/openssl",
 ]
 
diff --git a/chromeos/crosapi/cpp/BUILD.gn b/chromeos/crosapi/cpp/BUILD.gn
index 4e23236..2122463 100644
--- a/chromeos/crosapi/cpp/BUILD.gn
+++ b/chromeos/crosapi/cpp/BUILD.gn
@@ -12,6 +12,8 @@
 component("cpp") {
   output_name = "crosapi_public_cpp"
   sources = [
+    "channel_to_enum.cc",
+    "channel_to_enum.h",
     "gurl_os_handler_utils.cc",
     "gurl_os_handler_utils.h",
     "keystore_service_util.cc",
@@ -24,6 +26,7 @@
     ":crosapi_constants",
     "//base",
     "//chromeos/crosapi/mojom",
+    "//components/version_info",
     "//mojo/public/cpp/bindings",
   ]
 
diff --git a/chromeos/crosapi/cpp/channel_to_enum.cc b/chromeos/crosapi/cpp/channel_to_enum.cc
new file mode 100644
index 0000000..745d130
--- /dev/null
+++ b/chromeos/crosapi/cpp/channel_to_enum.cc
@@ -0,0 +1,23 @@
+// 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 "chromeos/crosapi/cpp/channel_to_enum.h"
+
+namespace crosapi {
+
+version_info::Channel ChannelToEnum(base::StringPiece channel) {
+  if (channel == kReleaseChannelStable) {
+    return version_info::Channel::STABLE;
+  } else if (channel == kReleaseChannelBeta) {
+    return version_info::Channel::BETA;
+  } else if (channel == kReleaseChannelDev) {
+    return version_info::Channel::DEV;
+  } else if (channel == kReleaseChannelCanary) {
+    return version_info::Channel::CANARY;
+  } else {
+    return version_info::Channel::UNKNOWN;
+  }
+}
+
+}  // namespace crosapi
diff --git a/chromeos/crosapi/cpp/channel_to_enum.h b/chromeos/crosapi/cpp/channel_to_enum.h
new file mode 100644
index 0000000..5116ede9
--- /dev/null
+++ b/chromeos/crosapi/cpp/channel_to_enum.h
@@ -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.
+
+#ifndef CHROMEOS_CROSAPI_CPP_CHANNEL_TO_ENUM_H_
+#define CHROMEOS_CROSAPI_CPP_CHANNEL_TO_ENUM_H_
+
+#include "base/component_export.h"
+#include "base/strings/string_piece.h"
+#include "chromeos/crosapi/cpp/crosapi_constants.h"
+#include "components/version_info/version_info.h"
+
+namespace crosapi {
+
+COMPONENT_EXPORT(CROSAPI)
+version_info::Channel ChannelToEnum(base::StringPiece channel);
+
+}  // namespace crosapi
+
+#endif  // CHROMEOS_CROSAPI_CPP_CHANNEL_TO_ENUM_H_
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index bf2f01e5..1e3e24f 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -1296,6 +1296,12 @@
   // VideoConferenceManager in ash.
   [MinVersion=56]
   bool vc_controls_ui_enabled@56;
+
+  // App service block list for extension apps and extensions to be blocked
+  // for app service in lacros.
+  [MinVersion=57]
+  StandaloneBrowserAppServiceBlockList?
+      standalone_browser_app_service_blocklist@57;
 };
 
 // BrowserPostLoginParams is the subset of parameters in BrowserInitParams
diff --git a/chromeos/crosapi/mojom/extension_keeplist.mojom b/chromeos/crosapi/mojom/extension_keeplist.mojom
index 8c52a85..9e919e8 100644
--- a/chromeos/crosapi/mojom/extension_keeplist.mojom
+++ b/chromeos/crosapi/mojom/extension_keeplist.mojom
@@ -22,3 +22,26 @@
   // The ids of the extensions running in both ash-chrome and lacros-chrome.
   array<string> extensions_run_in_os_and_standalonebrowser@3;
 };
+
+// App service block list that lists the extension apps and extensions to be
+// blocked for AppService in Lacros.
+//
+// When Lacros is set as user's primary or only browser, by default, the
+// extensions and extension apps will run in Lacros only. However, there is a
+// small exception list (see ExtensionKeepList above) which allows
+// some extension apps and extensions to run in both ash and lacros. These
+// apps and extensions can be only published in either ash or lacros, but not
+// both. They should be added to StandaloneBrowserAppServiceBlockList if they
+// should not by published in AppService in Lacros.
+// Next version: 1
+// Next id: 2
+[Stable]
+struct StandaloneBrowserAppServiceBlockList {
+  // The ids of the extension apps to be blocked for app service in lacros.
+  // Extension apps include chrome apps and hosted apps.
+  array<string> extension_apps@0;
+
+  // The ids of the regular extensions (not apps) to be blocked for app service
+  // in lacros.
+  array<string> extensions@1;
+};
diff --git a/chromeos/printing/printer_config_cache.cc b/chromeos/printing/printer_config_cache.cc
index 4ff6d3c..82b4497 100644
--- a/chromeos/printing/printer_config_cache.cc
+++ b/chromeos/printing/printer_config_cache.cc
@@ -156,9 +156,57 @@
     fetch_queue_.pop();
     auto request = FormRequest(context->key);
 
-    // TODO(crbug.com/888189): add traffic annotation.
+    // Create traffic annotation tag.
+    net::NetworkTrafficAnnotationTag traffic_annotation =
+        net::DefineNetworkTrafficAnnotation("printer_config_fetch", R"(
+          semantics {
+            sender: "Printer Configuration"
+            description:
+              "This component sends requests to the Chrome OS Printing "
+              "serving root during printer configuration. This can return "
+              "two pieces of information, depending on the request: "
+              "PostScript Printer Description (PPD) files for a specified "
+              "printer, and PPD file metadata to help locate the desired PPD "
+              "file."
+            trigger: "On printer setup in ChromeOS."
+            data: "Printer names (comprising of make and/or model)."
+            user_data: {
+              type: OTHER
+            }
+            destination: GOOGLE_OWNED_SERVICE
+            internal: {
+              contacts: {
+                email: "bmgordon@google.com"
+              }
+            }
+            last_reviewed: "2023-01-18"
+          }
+          policy {
+            cookies_allowed: NO
+            setting:
+              "Admins must disable access to both enterprise and "
+              "non-enterprise printers. Enterprise printers should be left "
+              "empty under 'Devices > Chrome > Printers'. Non-enterprise "
+              "printers can be disabled under 'Devices > Chrome > Settings > "
+              "Printer management' by setting to: 'Do not allow users to add "
+              "new printers'."
+            chrome_policy {
+              UserPrintersAllowed {
+                UserPrintersAllowed: false
+              }
+              PrintersBulkConfiguration: {
+                PrintersBulkConfiguration: ""
+              }
+            }
+            # TODO(b/210911671): chrome_device_policy not supported by auditor
+            # chrome_device_policy {
+            #   DevicePrinters: {
+            #     external_policy: ""
+            #   }
+            # }
+          })");
     fetcher_ = network::SimpleURLLoader::Create(std::move(request),
-                                                MISSING_TRAFFIC_ANNOTATION);
+                                                traffic_annotation);
 
     fetcher_->DownloadToString(
         loader_factory_dispenser_.Run(),
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index c37ff97..59670d9 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-111-5464.0-1672659638-benchmark-111.0.5514.0-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-111-5481.32-1673869449-benchmark-111.0.5544.0-r1-redacted.afdo.xz
diff --git a/chromeos/startup/browser_params_proxy.cc b/chromeos/startup/browser_params_proxy.cc
index dced4ee..18012af 100644
--- a/chromeos/startup/browser_params_proxy.cc
+++ b/chromeos/startup/browser_params_proxy.cc
@@ -290,4 +290,9 @@
   return BrowserInitParams::Get()->vc_controls_ui_enabled;
 }
 
+const crosapi::mojom::StandaloneBrowserAppServiceBlockListPtr&
+BrowserParamsProxy::StandaloneBrowserAppServiceBlockList() const {
+  return BrowserInitParams::Get()->standalone_browser_app_service_blocklist;
+}
+
 }  // namespace chromeos
diff --git a/chromeos/startup/browser_params_proxy.h b/chromeos/startup/browser_params_proxy.h
index dab94d22..0cd70eb 100644
--- a/chromeos/startup/browser_params_proxy.h
+++ b/chromeos/startup/browser_params_proxy.h
@@ -129,6 +129,9 @@
 
   bool VcControlsUiEnabled() const;
 
+  const crosapi::mojom::StandaloneBrowserAppServiceBlockListPtr&
+  StandaloneBrowserAppServiceBlockList() const;
+
  private:
   friend base::NoDestructor<BrowserParamsProxy>;
 
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
index 41108d4e..a149fc5d 100644
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/AccessibilitySettings.java
@@ -85,7 +85,7 @@
             mPageZoomDefaultZoomPref.setInitialValue(
                     PageZoomUtils.getDefaultZoomAsSeekValue(mDelegate.getBrowserContextHandle()));
             mPageZoomDefaultZoomPref.setOnPreferenceChangeListener(this);
-            mPageZoomAlwaysShowPref.setChecked(PageZoomUtils.shouldAlwaysShowZoomMenuItem());
+            mPageZoomAlwaysShowPref.setChecked(PageZoomUtils.shouldShowZoomMenuItem());
             mPageZoomAlwaysShowPref.setOnPreferenceChangeListener(this);
         } else {
             mPageZoomDefaultZoomPref.setVisible(false);
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java
index 0d79ef3..70ef653 100644
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java
@@ -52,12 +52,12 @@
     }
 
     /**
-     * Whether or not the AppMenu should show the 'Zoom' menu item.
+     * Returns true if the AppMenu item for Zoom should be displayed, false otherwise.
      * @return boolean
      */
     public static boolean shouldShowMenuItem() {
         if (sShouldShowMenuItemForTesting != null) return sShouldShowMenuItemForTesting;
-        return PageZoomMediator.shouldShowMenuItem();
+        return PageZoomUtils.shouldShowZoomMenuItem();
     }
 
     /**
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomMediator.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomMediator.java
index f2475972..ebd6662 100644
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomMediator.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomMediator.java
@@ -13,8 +13,6 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.ContextUtils;
-import org.chromium.base.MathUtils;
-import org.chromium.content_public.browser.ContentFeatureList;
 import org.chromium.content_public.browser.HostZoomMap;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.modelutil.PropertyModel;
@@ -43,46 +41,6 @@
     }
 
     /**
-     * Returns whether the AppMenu item for Zoom should be displayed. It will be displayed if
-     * any of the following conditions are met:
-     *
-     *    - User has enabled the "Show Page Zoom" setting in Chrome Accessibility Settings
-     *    - User has set a default zoom other than 100% in Chrome Accessibility Settings
-     *    - User has changed the Android OS Font Size setting
-     *
-     * @return boolean
-     */
-    protected static boolean shouldShowMenuItem() {
-        // Never show the menu item if the content feature is disabled.
-        if (!ContentFeatureList.isEnabled(ContentFeatureList.ACCESSIBILITY_PAGE_ZOOM)) {
-            return false;
-        }
-
-        // Always show the menu item if the user has set this in Accessibility Settings.
-        if (PageZoomUtils.shouldAlwaysShowZoomMenuItem()) {
-            PageZoomUma.logAppMenuEnabledStateHistogram(
-                    PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.USER_ENABLED);
-            return true;
-        }
-
-        // The default (float) |fontScale| is 1, the default page zoom is 1.
-        // If the user has a system font scale other than the default, always show the menu item.
-        boolean isUsingDefaultSystemFontScale = MathUtils.areFloatsEqual(SYSTEM_FONT_SCALE, 1f);
-        if (!isUsingDefaultSystemFontScale) {
-            PageZoomUma.logAppMenuEnabledStateHistogram(
-                    PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.OS_ENABLED);
-            return true;
-        }
-
-        // TODO(mschillaci): Decide whether to additionally enable app menu item depending on
-        // default page zoom. If yes, then replace with a delegate call, cannot depend directly on
-        // Profile.
-        PageZoomUma.logAppMenuEnabledStateHistogram(
-                PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.NOT_ENABLED);
-        return false;
-    }
-
-    /**
      * Set the web contents that should be controlled by this instance.
      * @param webContents   The WebContents this instance should control.
      */
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java
index 4f6738c..8616bea5 100644
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java
@@ -24,14 +24,16 @@
     @IntDef({AccessibilityPageZoomAppMenuEnabledState.NOT_ENABLED,
             AccessibilityPageZoomAppMenuEnabledState.USER_ENABLED,
             AccessibilityPageZoomAppMenuEnabledState.OS_ENABLED,
+            AccessibilityPageZoomAppMenuEnabledState.USER_DISABLED,
             AccessibilityPageZoomAppMenuEnabledState.MAX_VALUE})
     public @interface AccessibilityPageZoomAppMenuEnabledState {
         int NOT_ENABLED = 0;
         int USER_ENABLED = 1;
         int OS_ENABLED = 2;
+        int USER_DISABLED = 3;
 
         // Be sure to also update enums.xml when updating these values.
-        int MAX_VALUE = 3;
+        int MAX_VALUE = 4;
     }
 
     // Page Zoom histogram values
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUtils.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUtils.java
index 0e3e9e8b..284e8988 100644
--- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUtils.java
+++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUtils.java
@@ -5,6 +5,7 @@
 package org.chromium.components.browser_ui.accessibility;
 
 import static org.chromium.content_public.browser.HostZoomMap.AVAILABLE_ZOOM_FACTORS;
+import static org.chromium.content_public.browser.HostZoomMap.SYSTEM_FONT_SCALE;
 import static org.chromium.content_public.browser.HostZoomMap.TEXT_SIZE_MULTIPLIER_RATIO;
 
 import org.chromium.base.ContextUtils;
@@ -140,8 +141,19 @@
     // that they can be used in //components.
 
     /**
-     * Returns the current user choice for always showing the Zoom AppMenu item (set in
-     * Accessibility Settings). This setting is Chrome Android specific.
+     * Returns true if the user has set a choice for always showing the Zoom AppMenu
+     * item (set in Accessibility Settings). This setting is Chrome Android specific.
+     * @return boolean
+     */
+    public static boolean hasUserSetShouldAlwaysShowZoomMenuItemOption() {
+        return ContextUtils.getAppSharedPreferences().contains(
+                AccessibilityConstants.PAGE_ZOOM_ALWAYS_SHOW_MENU_ITEM);
+    }
+
+    /**
+     * Returns the current user setting for always showing the Zoom AppMenu
+     * item (set in Accessibility Settings). Default is false. This setting is Chrome Android
+     * specific.
      * @return boolean
      */
     public static boolean shouldAlwaysShowZoomMenuItem() {
@@ -150,6 +162,49 @@
     }
 
     /**
+     * Returns true if the Zoom AppMenu item should be shown, false otherwise.
+     *
+     * - If there is a current user choice set in Accessibility Settings, respect and return the
+     * user setting.
+     * - Otherwise, if there is an OS level font size set, return true.
+     * - Otherwise, return false.
+     *
+     * This setting is Chrome Android specific.
+     * @return boolean
+     */
+    public static boolean shouldShowZoomMenuItem() {
+        if (!shouldShowSettingsUI()) {
+            return false;
+        }
+
+        // Always respect the user's choice if the user has set this in Accessibility Settings.
+        if (hasUserSetShouldAlwaysShowZoomMenuItemOption()) {
+            if (shouldAlwaysShowZoomMenuItem()) {
+                PageZoomUma.logAppMenuEnabledStateHistogram(
+                        PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.USER_ENABLED);
+                return true;
+            } else {
+                PageZoomUma.logAppMenuEnabledStateHistogram(
+                        PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.USER_DISABLED);
+                return false;
+            }
+        }
+
+        // The default (float) |fontScale| is 1, the default page zoom is 1.
+        // If the user has a system font scale other than the default, always show the menu item.
+        boolean isUsingDefaultSystemFontScale = MathUtils.areFloatsEqual(SYSTEM_FONT_SCALE, 1f);
+        if (!isUsingDefaultSystemFontScale) {
+            PageZoomUma.logAppMenuEnabledStateHistogram(
+                    PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.OS_ENABLED);
+            return true;
+        }
+
+        PageZoomUma.logAppMenuEnabledStateHistogram(
+                PageZoomUma.AccessibilityPageZoomAppMenuEnabledState.NOT_ENABLED);
+        return false;
+    }
+
+    /**
      * Set a new user choice for always showing the Zoom AppMenu item. This setting is Chrome
      * Android specific.
      * @param newValue boolean
diff --git a/components/cast_streaming/browser/stream_consumer.cc b/components/cast_streaming/browser/stream_consumer.cc
index 41ccc562..6c46b285 100644
--- a/components/cast_streaming/browser/stream_consumer.cc
+++ b/components/cast_streaming/browser/stream_consumer.cc
@@ -172,8 +172,9 @@
       openscreen::cast::EncodedFrame::Dependency::kKeyFrame;
 
   base::TimeDelta playout_time =
-      base::Microseconds(std::chrono::duration_cast<std::chrono::microseconds>(
-                             encoded_frame.reference_time.time_since_epoch())
+      base::Microseconds(encoded_frame.rtp_timestamp
+                             .ToTimeSinceOrigin<std::chrono::microseconds>(
+                                 receiver_->rtp_timebase())
                              .count());
 
   // Some senders do not send an initial playout time of 0. To work around this,
diff --git a/components/enterprise/browser/device_trust/device_trust_key_manager.h b/components/enterprise/browser/device_trust/device_trust_key_manager.h
index e62db0f..4eb9e7d 100644
--- a/components/enterprise/browser/device_trust/device_trust_key_manager.h
+++ b/components/enterprise/browser/device_trust/device_trust_key_manager.h
@@ -21,6 +21,8 @@
  public:
   virtual ~DeviceTrustKeyManager() = default;
 
+  // TODO(b:265141726): Rename this enum to reduce confusion with the other
+  // KeyRotationResult enum used as installer type.
   enum class KeyRotationResult {
     SUCCESS = 0,
     FAILURE = 1,
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index 650602fd..ffe853e 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -1231,7 +1231,8 @@
     absl::optional<std::string> originator_cache_guid,
     absl::optional<VisitID> originator_visit_id,
     absl::optional<VisitID> originator_referring_visit,
-    absl::optional<VisitID> originator_opener_visit) {
+    absl::optional<VisitID> originator_opener_visit,
+    bool is_known_to_sync) {
   // See if this URL is already in the DB.
   URLRow url_info(url);
   URLID url_id = db_->GetRowForURL(url, &url_info);
@@ -1282,6 +1283,8 @@
     visit_info.originator_referring_visit = *originator_referring_visit;
   if (originator_opener_visit.has_value())
     visit_info.originator_opener_visit = *originator_opener_visit;
+  visit_info.is_known_to_sync = is_known_to_sync;
+
   visit_info.visit_id = db_->AddVisit(&visit_info, visit_source);
 
   if (visit_info.visit_time < first_recorded_time_)
@@ -1544,6 +1547,7 @@
   DCHECK_EQ(visit.url_id, 0);
   DCHECK(!visit.visit_time.is_null());
   DCHECK(!visit.originator_cache_guid.empty());
+  DCHECK(visit.is_known_to_sync);
 
   if (!db_) {
     return kInvalidVisitID;
@@ -1553,12 +1557,13 @@
     return kInvalidVisitID;
   }
 
-  auto [url_id, visit_id] = AddPageVisit(
-      url, visit.visit_time, visit.referring_visit, visit.transition, hidden,
-      VisitSource::SOURCE_SYNCED, IsTypedIncrement(visit.transition),
-      visit.opener_visit, title, visit.visit_duration,
-      visit.originator_cache_guid, visit.originator_visit_id,
-      visit.originator_referring_visit, visit.originator_opener_visit);
+  auto [url_id, visit_id] =
+      AddPageVisit(url, visit.visit_time, visit.referring_visit,
+                   visit.transition, hidden, VisitSource::SOURCE_SYNCED,
+                   IsTypedIncrement(visit.transition), visit.opener_visit,
+                   title, visit.visit_duration, visit.originator_cache_guid,
+                   visit.originator_visit_id, visit.originator_referring_visit,
+                   visit.originator_opener_visit, visit.is_known_to_sync);
 
   if (visit_id == kInvalidVisitID) {
     // Adding the page visit failed, do not continue.
@@ -1592,6 +1597,7 @@
   DCHECK_EQ(visit.url_id, 0);
   DCHECK(!visit.visit_time.is_null());
   DCHECK(!visit.originator_cache_guid.empty());
+  DCHECK(visit.is_known_to_sync);
 
   if (!db_) {
     return kInvalidVisitID;
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h
index bf4281e..0233f09 100644
--- a/components/history/core/browser/history_backend.h
+++ b/components/history/core/browser/history_backend.h
@@ -798,7 +798,8 @@
       absl::optional<std::string> originator_cache_guid = absl::nullopt,
       absl::optional<VisitID> originator_visit_id = absl::nullopt,
       absl::optional<VisitID> originator_referring_visit = absl::nullopt,
-      absl::optional<VisitID> originator_opener_visit = absl::nullopt);
+      absl::optional<VisitID> originator_opener_visit = absl::nullopt,
+      bool is_known_to_sync = false);
 
   // Returns a redirect-or-referral chain in `redirects` for the VisitID
   // `cur_visit`. `cur_visit` is assumed to be valid. Assumes that
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc
index fff4564..e6956868 100644
--- a/components/history/core/browser/history_backend_unittest.cc
+++ b/components/history/core/browser/history_backend_unittest.cc
@@ -4309,8 +4309,8 @@
       ui::PAGE_TRANSITION_CHAIN_END);
 
   // Note: Per AddSyncedVisit() preconditions (DCHECKs), the passed visit MUST
-  // have visit_time and originator_cache_guid, but MUST NOT have visit_id or
-  // url_id.
+  // have visit_time, originator_cache_guid, and is_known_to_sync, but MUST NOT
+  // have visit_id or url_id.
 
   // First, try to add some visits with unwanted URLs. These should *not* get
   // added to the DB.
@@ -4320,6 +4320,7 @@
   foreign_visit.visit_time = base::Time::Now();
   foreign_visit.transition = kLink;
   foreign_visit.originator_cache_guid = "originator";
+  foreign_visit.is_known_to_sync = true;
   EXPECT_EQ(kInvalidVisitID,
             backend_->AddSyncedVisit(GURL("chrome://settings"), u"Settings",
                                      /*hidden=*/false, foreign_visit,
@@ -4341,6 +4342,22 @@
       foreign_visit.transition, added_visit.transition));
   EXPECT_EQ(foreign_visit.originator_cache_guid,
             added_visit.originator_cache_guid);
+  EXPECT_TRUE(added_visit.is_known_to_sync);
+}
+
+TEST_F(HistoryBackendTest, AddSyncedVisitWritesIsKnownToSync) {
+  VisitRow foreign_visit;
+  foreign_visit.visit_time = base::Time::Now();
+  foreign_visit.originator_cache_guid = "originator";
+  foreign_visit.is_known_to_sync = true;
+
+  VisitID added_id = backend_->AddSyncedVisit(
+      GURL("https://some.url"), u"Title", /*hidden=*/false, foreign_visit,
+      absl::nullopt, absl::nullopt);
+  ASSERT_NE(added_id, kInvalidVisitID);
+  VisitRow added_visit;
+  ASSERT_TRUE(backend_->GetVisitByID(added_id, &added_visit));
+  EXPECT_TRUE(added_visit.is_known_to_sync);
 }
 
 TEST_F(HistoryBackendTest, DeleteAllForeignVisitsDoesNotDeleteLocalVisits) {
@@ -4367,6 +4384,7 @@
   foreign_visit1.visit_time = base::Time::Now();
   foreign_visit1.transition = kLink;
   foreign_visit1.originator_cache_guid = "originator";
+  foreign_visit1.is_known_to_sync = true;
   VisitID foreign_visit_id1 = backend_->AddSyncedVisit(
       GURL("https://remote1.url"), u"Title 1", /*hidden=*/false, foreign_visit1,
       absl::nullopt, absl::nullopt);
@@ -4388,6 +4406,7 @@
   foreign_visit2.visit_time = base::Time::Now();
   foreign_visit2.transition = kLink;
   foreign_visit2.originator_cache_guid = "originator";
+  foreign_visit2.is_known_to_sync = true;
   VisitID foreign_visit_id2 = backend_->AddSyncedVisit(
       GURL("https://remote2.url"), u"Title 2", /*hidden=*/true, foreign_visit2,
       absl::nullopt, absl::nullopt);
@@ -4438,6 +4457,7 @@
     foreign_visit.visit_time = base::Time::Now();
     foreign_visit.transition = kLink;
     foreign_visit.originator_cache_guid = "originator";
+    foreign_visit.is_known_to_sync = true;
     backend_->AddSyncedVisit(GURL("https://remote.url"), /*title=*/u"",
                              /*hidden=*/false, foreign_visit, absl::nullopt,
                              absl::nullopt);
@@ -4483,6 +4503,7 @@
     foreign_visit.visit_time = base::Time::Now();
     foreign_visit.transition = kLink;
     foreign_visit.originator_cache_guid = "originator";
+    foreign_visit.is_known_to_sync = true;
     backend_->AddSyncedVisit(GURL("https://remote.url"), /*title=*/u"",
                              /*hidden=*/false, foreign_visit, absl::nullopt,
                              absl::nullopt);
@@ -4510,6 +4531,7 @@
     foreign_visit.visit_time = base::Time::Now();
     foreign_visit.transition = kLink;
     foreign_visit.originator_cache_guid = "originator";
+    foreign_visit.is_known_to_sync = true;
     new_foreign_visit_ids.push_back(backend_->AddSyncedVisit(
         GURL("https://remote.url"), /*title=*/u"",
         /*hidden=*/false, foreign_visit, absl::nullopt, absl::nullopt));
diff --git a/components/history/core/browser/sync/history_sync_bridge.cc b/components/history/core/browser/sync/history_sync_bridge.cc
index f073132..ce25e882 100644
--- a/components/history/core/browser/sync/history_sync_bridge.cc
+++ b/components/history/core/browser/sync/history_sync_bridge.cc
@@ -169,6 +169,9 @@
   row.originator_visit_id =
       specifics.redirect_entries(redirect_index).originator_visit_id();
 
+  // Definitionally, any visit from Sync is known to sync.
+  row.is_known_to_sync = true;
+
   // Reconstruct the page transition - first get the core type.
   int page_transition = syncer::FromSyncPageTransition(
       specifics.page_transition().core_transition());
diff --git a/components/history/core/browser/sync/history_sync_bridge_unittest.cc b/components/history/core/browser/sync/history_sync_bridge_unittest.cc
index 2f75742..879e6dc 100644
--- a/components/history/core/browser/sync/history_sync_bridge_unittest.cc
+++ b/components/history/core/browser/sync/history_sync_bridge_unittest.cc
@@ -455,8 +455,10 @@
   EXPECT_EQ(backend()->GetURLs()[0].url(), local_url);
   EXPECT_EQ(backend()->GetURLs()[1].url(), remote_url);
   EXPECT_EQ(backend()->GetVisits()[0].url_id, backend()->GetURLs()[0].id());
+  EXPECT_FALSE(backend()->GetVisits()[0].is_known_to_sync);
   EXPECT_EQ(backend()->GetVisits()[1].url_id, backend()->GetURLs()[1].id());
   EXPECT_EQ(backend()->GetVisits()[1].originator_cache_guid, remote_cache_guid);
+  EXPECT_TRUE(backend()->GetVisits()[1].is_known_to_sync);
 }
 
 TEST_F(HistorySyncBridgeTest, MergesRemoteChanges) {
diff --git a/components/history_clusters/history_clusters_internals/resources/BUILD.gn b/components/history_clusters/history_clusters_internals/resources/BUILD.gn
index ae159c9..db43f2a 100644
--- a/components/history_clusters/history_clusters_internals/resources/BUILD.gn
+++ b/components/history_clusters/history_clusters_internals/resources/BUILD.gn
@@ -33,20 +33,19 @@
 }
 
 copy("copy_mojo") {
-  deps = [ "//components/history_clusters/history_clusters_internals/webui:mojo_bindings_js__generator" ]
-  mojom_folder = "$root_gen_dir/mojom-webui/components/history_clusters/history_clusters_internals/webui/"
-  sources = [ "$mojom_folder/history_clusters_internals.mojom-webui.js" ]
+  deps = [ "//components/history_clusters/history_clusters_internals/webui:mojo_bindings_ts__generator" ]
+  mojom_folder = "$root_gen_dir/components/history_clusters/history_clusters_internals/webui/"
+  sources = [ "$mojom_folder/history_clusters_internals.mojom-webui.ts" ]
   outputs = [ "$target_gen_dir/{{source_file_part}}" ]
 }
 
 ts_library("build_ts") {
   root_dir = "$target_gen_dir"
   out_dir = "$target_gen_dir/$tsc_folder"
-  tsconfig_base = "tsconfig_base.json"
   in_files = [
     "history_clusters_internals.ts",
     "history_clusters_internals_browser_proxy.ts",
-    "history_clusters_internals.mojom-webui.js",
+    "history_clusters_internals.mojom-webui.ts",
   ]
   deps = [ "//ui/webui/resources:library" ]
   extra_deps = [
diff --git a/components/history_clusters/history_clusters_internals/resources/tsconfig_base.json b/components/history_clusters/history_clusters_internals/resources/tsconfig_base.json
deleted file mode 100644
index cbf406ef..0000000
--- a/components/history_clusters/history_clusters_internals/resources/tsconfig_base.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "extends": "../../../../tools/typescript/tsconfig_base.json",
-  "compilerOptions": {
-    "allowJs": true
-  }
-}
\ No newline at end of file
diff --git a/components/history_clusters/history_clusters_internals/webui/BUILD.gn b/components/history_clusters/history_clusters_internals/webui/BUILD.gn
index f5e19d5..5f61e73b 100644
--- a/components/history_clusters/history_clusters_internals/webui/BUILD.gn
+++ b/components/history_clusters/history_clusters_internals/webui/BUILD.gn
@@ -28,5 +28,6 @@
 mojom("mojo_bindings") {
   sources = [ "history_clusters_internals.mojom" ]
   webui_module_path = "/"
+  use_typescript_sources = true
   public_deps = [ "//mojo/public/mojom/base" ]
 }
diff --git a/components/image_service/image_service.cc b/components/image_service/image_service.cc
index aca6452..10e148e 100644
--- a/components/image_service/image_service.cc
+++ b/components/image_service/image_service.cc
@@ -44,6 +44,11 @@
     std::vector<Request> requests;
     for (auto& cluster : clusters_) {
       for (auto& visit : cluster.visits) {
+        // Only fetch URL-keyed metadata for visits known to sync.
+        if (!visit.annotated_visit.visit_row.is_known_to_sync) {
+          continue;
+        }
+
         // Only tag search visits for now.
         const auto& search_terms =
             visit.annotated_visit.content_annotations.search_terms;
diff --git a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
index 3e47ae01..ec6677a1 100644
--- a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
+++ b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
@@ -43,12 +43,6 @@
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "url/gurl.h"
 
-#if !BUILDFLAG(IS_ANDROID)
-#include "components/media_router/common/pref_names.h"
-#include "components/prefs/pref_service.h"
-#include "components/user_prefs/user_prefs.h"
-#endif
-
 using blink::mojom::PresentationConnection;
 using blink::mojom::PresentationError;
 using blink::mojom::PresentationErrorType;
@@ -516,16 +510,6 @@
     return;
   }
 
-#if !BUILDFLAG(IS_ANDROID)
-  if (IsAutoJoinPresentationId(presentation_id) &&
-      ShouldCancelAutoJoinForOrigin(request.frame_origin)) {
-    std::move(error_cb).Run(
-        PresentationError(PresentationErrorType::PRESENTATION_REQUEST_CANCELLED,
-                          "Auto-join request cancelled by user preferences."));
-    return;
-  }
-#endif  // !BUILDFLAG(IS_ANDROID)
-
   auto* local_presentation_manager =
       LocalPresentationManagerFactory::GetOrCreateForWebContents(
           &GetWebContents());
@@ -723,16 +707,6 @@
              : MediaRoute::Id();
 }
 
-#if !BUILDFLAG(IS_ANDROID)
-bool PresentationServiceDelegateImpl::ShouldCancelAutoJoinForOrigin(
-    const url::Origin& origin) {
-  const base::Value::List& origins =
-      user_prefs::UserPrefs::Get(GetWebContents().GetBrowserContext())
-          ->GetList(prefs::kMediaRouterTabMirroringSources);
-  return base::Contains(origins, base::Value(origin.Serialize()));
-}
-#endif  // !BUILDFLAG(IS_ANDROID)
-
 void PresentationServiceDelegateImpl::EnsurePresentationConnection(
     const content::GlobalRenderFrameHostId& render_frame_host_id,
     const PresentationInfo& presentation_info,
diff --git a/components/media_router/browser/presentation/presentation_service_delegate_impl.h b/components/media_router/browser/presentation/presentation_service_delegate_impl.h
index 16e60d02..4d7dd6e3 100644
--- a/components/media_router/browser/presentation/presentation_service_delegate_impl.h
+++ b/components/media_router/browser/presentation/presentation_service_delegate_impl.h
@@ -33,10 +33,6 @@
 class WebContents;
 }  // namespace content
 
-namespace url {
-class Origin;
-}  // namespace url
-
 namespace media_router {
 
 class MediaRoute;
@@ -203,11 +199,6 @@
       const content::GlobalRenderFrameHostId& render_frame_host_id,
       const std::string& presentation_id) const;
 
-#if !BUILDFLAG(IS_ANDROID)
-  // Returns true if auto-join requests should be cancelled for |origin|.
-  bool ShouldCancelAutoJoinForOrigin(const url::Origin& origin);
-#endif
-
   // Ensures that |connection| contains a valid pair of
   // blink::mojom::PresentationConnection{PtrInfo,Request} objects which will be
   // used for all Presentation API communication in a newly-connected
diff --git a/components/media_router/common/pref_names.cc b/components/media_router/common/pref_names.cc
index 2e7d7e2..1d2b1bf 100644
--- a/components/media_router/common/pref_names.cc
+++ b/components/media_router/common/pref_names.cc
@@ -21,9 +21,6 @@
 // dialog. Defaults to true.
 const char kMediaRouterShowCastSessionsStartedByOtherDevices[] =
     "media_router.show_cast_sessions_started_by_other_devices.enabled";
-// A list of website origins on which the user has chosen to use tab mirroring.
-const char kMediaRouterTabMirroringSources[] =
-    "media_router.tab_mirroring_sources";
 
 }  // namespace prefs
 }  // namespace media_router
diff --git a/components/media_router/common/pref_names.h b/components/media_router/common/pref_names.h
index 1a82921..a64cc9bb 100644
--- a/components/media_router/common/pref_names.h
+++ b/components/media_router/common/pref_names.h
@@ -12,7 +12,6 @@
 extern const char kMediaRouterMediaRemotingEnabled[];
 extern const char kMediaRouterReceiverIdHashToken[];
 extern const char kMediaRouterShowCastSessionsStartedByOtherDevices[];
-extern const char kMediaRouterTabMirroringSources[];
 
 }  // namespace prefs
 }  // namespace media_router
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc
index 083cee3b..bb94bd6 100644
--- a/components/omnibox/browser/autocomplete_match.cc
+++ b/components/omnibox/browser/autocomplete_match.cc
@@ -1127,8 +1127,7 @@
     case AutocompleteMatchType::STARTER_PACK:
       return OmniboxEventProto::Suggestion::STARTER_PACK;
     case AutocompleteMatchType::VOICE_SUGGEST:
-      // VOICE_SUGGEST matches are only used in Java and are not logged,
-      // so we should never reach this case.
+      return OmniboxEventProto::Suggestion::SEARCH_SUGGEST;
     case AutocompleteMatchType::CONTACT_DEPRECATED:
     case AutocompleteMatchType::PHYSICAL_WEB_DEPRECATED:
     case AutocompleteMatchType::PHYSICAL_WEB_OVERFLOW_DEPRECATED:
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn
index 34622ef..926f0180 100644
--- a/components/optimization_guide/core/BUILD.gn
+++ b/components/optimization_guide/core/BUILD.gn
@@ -90,6 +90,7 @@
 mojom("interfaces") {
   sources = [ "optimization_guide_common.mojom" ]
   webui_module_path = "/"
+  use_typescript_sources = true
   public_deps = [ "//mojo/public/mojom/base" ]
 }
 
diff --git a/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn b/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
index 7592dc6..562c7c9 100644
--- a/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
+++ b/components/optimization_guide/optimization_guide_internals/resources/BUILD.gn
@@ -34,15 +34,14 @@
 
 copy("copy_mojo") {
   deps = [
-    "//components/optimization_guide/core:interfaces_js__generator",
-    "//components/optimization_guide/optimization_guide_internals/webui:mojo_bindings_js__generator",
+    "//components/optimization_guide/core:interfaces_ts__generator",
+    "//components/optimization_guide/optimization_guide_internals/webui:mojo_bindings_ts__generator",
   ]
-  mojom_folder = "$root_gen_dir/mojom-webui/components/optimization_guide/optimization_guide_internals/webui/"
-  core_mojom_folder =
-      "$root_gen_dir/mojom-webui/components/optimization_guide/core/"
+  mojom_folder = "$root_gen_dir/components/optimization_guide/optimization_guide_internals/webui/"
+  core_mojom_folder = "$root_gen_dir/components/optimization_guide/core/"
   sources = [
-    "$core_mojom_folder/optimization_guide_common.mojom-webui.js",
-    "$mojom_folder/optimization_guide_internals.mojom-webui.js",
+    "$core_mojom_folder/optimization_guide_common.mojom-webui.ts",
+    "$mojom_folder/optimization_guide_internals.mojom-webui.ts",
   ]
   outputs = [ "$target_gen_dir/{{source_file_part}}" ]
 }
@@ -50,12 +49,11 @@
 ts_library("build_ts") {
   root_dir = "$target_gen_dir"
   out_dir = "$target_gen_dir/$tsc_folder"
-  tsconfig_base = "tsconfig_base.json"
   in_files = [
     "optimization_guide_internals.ts",
     "optimization_guide_internals_browser_proxy.ts",
-    "optimization_guide_internals.mojom-webui.js",
-    "optimization_guide_common.mojom-webui.js",
+    "optimization_guide_internals.mojom-webui.ts",
+    "optimization_guide_common.mojom-webui.ts",
   ]
   deps = [
     "//ui/webui/resources:library",
diff --git a/components/optimization_guide/optimization_guide_internals/resources/tsconfig_base.json b/components/optimization_guide/optimization_guide_internals/resources/tsconfig_base.json
deleted file mode 100644
index cbf406ef..0000000
--- a/components/optimization_guide/optimization_guide_internals/resources/tsconfig_base.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "extends": "../../../../tools/typescript/tsconfig_base.json",
-  "compilerOptions": {
-    "allowJs": true
-  }
-}
\ No newline at end of file
diff --git a/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn b/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn
index 0b3398b..03da11d 100644
--- a/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn
+++ b/components/optimization_guide/optimization_guide_internals/webui/BUILD.gn
@@ -37,6 +37,7 @@
 mojom("mojo_bindings") {
   sources = [ "optimization_guide_internals.mojom" ]
   webui_module_path = "/"
+  use_typescript_sources = true
   public_deps = [
     "//components/optimization_guide/core:interfaces",
     "//mojo/public/mojom/base",
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
index efc2dd3..d9bdd43 100644
--- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
+++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -268,6 +268,7 @@
           WebFeature::kWakeLockAcquireScreenLockWithoutActivation,
           WebFeature::kGetDisplayMediaWithoutUserActivation,
           WebFeature::kDataUrlInSvgUse,
+          WebFeature::kExecutedNonTrivialJavaScriptURL,
       }));
   return *opt_in_features;
 }
diff --git a/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc b/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc
index e610651..d2cfde3 100644
--- a/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc
+++ b/components/paint_preview/renderer/paint_preview_recorder_utils_unittest.cc
@@ -125,7 +125,7 @@
   outer_canvas->restore();
 
   outer_canvas->saveLayer(rect_1, cc::PaintFlags());
-  outer_canvas->saveLayerAlpha(8);
+  outer_canvas->saveLayerAlphaf(0.2f);
   outer_canvas->restoreToCount(1);
   auto record = outer_recorder.finishRecordingAsPicture();
 
diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc
index c37b8f32..f0fcbb6 100644
--- a/components/performance_manager/features.cc
+++ b/components/performance_manager/features.cc
@@ -50,6 +50,22 @@
     70,
 };
 
+BASE_FEATURE(kPerformanceControlsPerformanceSurvey,
+             "PerformanceControlsPerformanceSurvey",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+BASE_FEATURE(kPerformanceControlsBatteryPerformanceSurvey,
+             "PerformanceControlsBatteryPerformanceSurvey",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+BASE_FEATURE(kPerformanceControlsHighEfficiencyOptOutSurvey,
+             "PerformanceControlsHighEfficiencyOptOutSurvey",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+BASE_FEATURE(kPerformanceControlsBatterySaverOptOutSurvey,
+             "PerformanceControlsBatterySaverOptOutSurvey",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // On ChromeOS, the adjustment generally seems to be around 3%, sometimes 2%. We
 // choose 3% because it gets us close enough, or overestimates (which is better
 // than underestimating in this instance).
diff --git a/components/performance_manager/public/features.h b/components/performance_manager/public/features.h
index a632b6a..907ba2f 100644
--- a/components/performance_manager/public/features.h
+++ b/components/performance_manager/public/features.h
@@ -54,6 +54,12 @@
 extern const base::FeatureParam<int>
     kHighEfficiencyModePromoMemoryPercentThreshold;
 
+// Flag to control a baseline HaTS survey for Chrome performance.
+BASE_DECLARE_FEATURE(kPerformanceControlsPerformanceSurvey);
+BASE_DECLARE_FEATURE(kPerformanceControlsBatteryPerformanceSurvey);
+BASE_DECLARE_FEATURE(kPerformanceControlsHighEfficiencyOptOutSurvey);
+BASE_DECLARE_FEATURE(kPerformanceControlsBatterySaverOptOutSurvey);
+
 // On certain platforms (ChromeOS), the battery level displayed to the user is
 // artificially lower than the actual battery level. Unfortunately, the battery
 // level that Battery Saver Mode looks at is the "actual" level, so users on
diff --git a/components/user_education/webui/floating_webui_help_bubble_factory.cc b/components/user_education/webui/floating_webui_help_bubble_factory.cc
index 71ed038..f133e73 100644
--- a/components/user_education/webui/floating_webui_help_bubble_factory.cc
+++ b/components/user_education/webui/floating_webui_help_bubble_factory.cc
@@ -72,7 +72,10 @@
   internal::HelpBubbleAnchorParams anchor;
   anchor.view = GetWebViewForElement(element);
   anchor.rect = element->GetScreenBounds();
-  return CreateBubbleImpl(element, anchor, std::move(params));
+  auto result = CreateBubbleImpl(element, anchor, std::move(params));
+  element->AsA<TrackedElementWebUI>()->handler()->OnFloatingHelpBubbleCreated(
+      element->identifier(), result.get());
+  return result;
 }
 
 bool FloatingWebUIHelpBubbleFactory::CanBuildBubbleForTrackedElement(
diff --git a/components/user_education/webui/help_bubble_handler.cc b/components/user_education/webui/help_bubble_handler.cc
index 885befff..99139307 100644
--- a/components/user_education/webui/help_bubble_handler.cc
+++ b/components/user_education/webui/help_bubble_handler.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <string>
 
+#include "base/callback_list.h"
 #include "base/check.h"
 #include "base/containers/contains.h"
 #include "base/functional/callback.h"
@@ -106,6 +107,7 @@
   std::unique_ptr<TrackedElementWebUI> element;
   std::unique_ptr<HelpBubbleParams> params;
   base::raw_ptr<HelpBubbleWebUI> help_bubble = nullptr;
+  base::CallbackListSubscription external_bubble_subscription;
 
   // This is set to true if we are closing the help bubble as the result of a
   // message from the WebUI, rather than a browser-side event. It is used as a
@@ -394,6 +396,31 @@
   return gfx::Rect();
 }
 
+void HelpBubbleHandlerBase::OnFloatingHelpBubbleCreated(
+    ui::ElementIdentifier anchor_id,
+    HelpBubble* help_bubble) {
+  GetClient()->ExternalHelpBubbleUpdated(anchor_id.GetName(), true);
+  const auto it = element_data_.find(anchor_id);
+  if (it == element_data_.end()) {
+    return;
+  }
+  DCHECK(!it->second.external_bubble_subscription);
+  it->second.external_bubble_subscription = help_bubble->AddOnCloseCallback(
+      base::BindOnce(&HelpBubbleHandlerBase::OnFloatingHelpBubbleClosed,
+                     weak_ptr_factory_.GetWeakPtr(), anchor_id));
+}
+
+void HelpBubbleHandlerBase::OnFloatingHelpBubbleClosed(
+    ui::ElementIdentifier anchor_id,
+    HelpBubble* help_bubble) {
+  const auto it = element_data_.find(anchor_id);
+  if (it == element_data_.end()) {
+    return;
+  }
+  it->second.external_bubble_subscription = base::CallbackListSubscription();
+  GetClient()->ExternalHelpBubbleUpdated(anchor_id.GetName(), false);
+}
+
 HelpBubbleHandlerBase::ElementData* HelpBubbleHandlerBase::GetDataByName(
     const std::string& identifier_name,
     ui::ElementIdentifier* found_identifier) {
diff --git a/components/user_education/webui/help_bubble_handler.h b/components/user_education/webui/help_bubble_handler.h
index 52ae389..adf05c84 100644
--- a/components/user_education/webui/help_bubble_handler.h
+++ b/components/user_education/webui/help_bubble_handler.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/callback_list.h"
+#include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string_piece.h"
@@ -29,6 +30,7 @@
 
 namespace user_education {
 
+class HelpBubble;
 class HelpBubbleWebUI;
 
 // Base class abstracting away IPC so that handler functionality can be tested
@@ -83,8 +85,10 @@
   virtual void ReportBadMessage(base::StringPiece error);
 
  private:
+  friend class FloatingWebUIHelpBubbleFactory;
   friend class HelpBubbleFactoryWebUI;
   friend class HelpBubbleWebUI;
+  FRIEND_TEST_ALL_PREFIXES(HelpBubbleHandlerTest, ExternalHelpBubbleUpdated);
 
   struct ElementData;
 
@@ -94,6 +98,10 @@
   void OnHelpBubbleClosing(ui::ElementIdentifier anchor_id);
   bool ToggleHelpBubbleFocusForAccessibility(ui::ElementIdentifier anchor_id);
   gfx::Rect GetHelpBubbleBoundsInScreen(ui::ElementIdentifier anchor_id) const;
+  void OnFloatingHelpBubbleCreated(ui::ElementIdentifier anchor_id,
+                                   HelpBubble* help_bubble);
+  void OnFloatingHelpBubbleClosed(ui::ElementIdentifier anchor_id,
+                                  HelpBubble* help_bubble);
 
   // mojom::HelpBubbleHandler:
   void HelpBubbleAnchorVisibilityChanged(const std::string& identifier_name,
diff --git a/components/user_education/webui/help_bubble_handler_unittest.cc b/components/user_education/webui/help_bubble_handler_unittest.cc
index 453a8c9d..4a98d59 100644
--- a/components/user_education/webui/help_bubble_handler_unittest.cc
+++ b/components/user_education/webui/help_bubble_handler_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "components/user_education/common/help_bubble_factory_registry.h"
 #include "components/user_education/common/help_bubble_params.h"
+#include "components/user_education/test/test_help_bubble.h"
 #include "components/user_education/webui/help_bubble_webui.h"
 #include "components/user_education/webui/tracked_element_webui.h"
 #include "components/vector_icons/vector_icons.h"
@@ -52,6 +53,10 @@
               HideHelpBubble,
               (const std::string& native_identifier),
               (override));
+  MOCK_METHOD(void,
+              ExternalHelpBubbleUpdated,
+              (const std::string& native_identifier, bool shown),
+              (override));
 };
 
 // Handler that mocks the remote connection to the web side of the component.
@@ -383,6 +388,42 @@
   EXPECT_TRUE(help_bubble->Close());
 }
 
+TEST_F(HelpBubbleHandlerTest, ExternalHelpBubbleUpdated) {
+  // Generate and retrieve a tracked element.
+  handler()->HelpBubbleAnchorVisibilityChanged(
+      kHelpBubbleHandlerTestElementIdentifier.GetName(), true, kElementBounds);
+  auto* const element =
+      ui::ElementTracker::GetElementTracker()->GetUniqueElement(
+          kHelpBubbleHandlerTestElementIdentifier, test_handler_->context());
+
+  // Create a dummy external help bubble.
+  HelpBubbleParams params;
+  params.body_text = u"Help bubble body.";
+  params.close_button_alt_text = u"Close button alt text.";
+  HelpBubbleButtonParams button_params;
+  button_params.is_default = true;
+  button_params.text = u"Button";
+  params.buttons.emplace_back(std::move(button_params));
+
+  std::unique_ptr<HelpBubble> help_bubble =
+      std::make_unique<test::TestHelpBubble>(element->context(),
+                                             std::move(params));
+
+  // Call the floating help bubble created method and ensure that the correct
+  // message is sent over to the client.
+  EXPECT_CALL(test_handler_->mock(),
+              ExternalHelpBubbleUpdated(element->identifier().GetName(), true));
+  test_handler_->OnFloatingHelpBubbleCreated(element->identifier(),
+                                             help_bubble.get());
+
+  // Close the bubble and verify that the correct message is sent, this that
+  // there is no longer a bubble.
+  EXPECT_CALL(
+      test_handler_->mock(),
+      ExternalHelpBubbleUpdated(element->identifier().GetName(), false));
+  EXPECT_TRUE(help_bubble->Close());
+}
+
 TEST_F(HelpBubbleHandlerTest, HelpBubbleClosedWhenVisibilityChanges) {
   handler()->HelpBubbleAnchorVisibilityChanged(
       kHelpBubbleHandlerTestElementIdentifier.GetName(), true, kElementBounds);
diff --git a/components/variations/cros/BUILD.gn b/components/variations/cros/BUILD.gn
index ba3479e..ab335e5 100644
--- a/components/variations/cros/BUILD.gn
+++ b/components/variations/cros/BUILD.gn
@@ -19,8 +19,12 @@
   ]
   deps = [
     "//base",
+    "//build:branding_buildflags",
+    "//chromeos/crosapi/cpp",
+    "//chromeos/crosapi/cpp:crosapi_constants",
     "//components/variations",
     "//components/variations/proto",
+    "//components/variations/service",
   ]
 
   # restrict to only other targets in this BUILD.gn file.
@@ -34,6 +38,7 @@
     ":evaluate_seed_lib",
     "//base",
     "//base/test:test_support",
+    "//build:branding_buildflags",
     "//components/test:test_support",
     "//components/variations",
     "//testing/gmock",
diff --git a/components/variations/cros/DEPS b/components/variations/cros/DEPS
new file mode 100644
index 0000000..e8e2e56
--- /dev/null
+++ b/components/variations/cros/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+chromeos/crosapi/cpp"
+]
diff --git a/components/variations/cros/README.md b/components/variations/cros/README.md
index dab1fb4c..2cfc020 100644
--- a/components/variations/cros/README.md
+++ b/components/variations/cros/README.md
@@ -3,7 +3,7 @@
 The executable `evaluate_seed` is a minimal program (budget: 1MiB of disk space
 for the executable itself) used early in ChromeOS boot to determine which group
 each early-boot experiment should be in, as well as any parameters for the
-binary. It lives here so that it is trivial to keep the code in sync between
+experiment. It lives here so that it is trivial to keep the code in sync between
 ChromeOS's platform layer and chrome.
 
 It will be executed primarily by `featured`, which lives in
diff --git a/components/variations/cros/evaluate_seed.cc b/components/variations/cros/evaluate_seed.cc
index 2d6af85..540a5a1 100644
--- a/components/variations/cros/evaluate_seed.cc
+++ b/components/variations/cros/evaluate_seed.cc
@@ -7,21 +7,51 @@
 #include "base/check.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/system/sys_info.h"
+#include "build/branding_buildflags.h"
+#include "chromeos/crosapi/cpp/channel_to_enum.h"
+#include "chromeos/crosapi/cpp/crosapi_constants.h"
+#include "components/variations/proto/study.pb.h"
+#include "components/variations/service/variations_field_trial_creator.h"
 
 namespace variations::evaluate_seed {
 
 namespace {
 constexpr char kSafeSeedSwitch[] = "use-safe-seed";
 constexpr char kEnterpriseEnrolledSwitch[] = "enterprise-enrolled";
+const char kFakeVariationsChannel[] = "fake-variations-channel";
 }  // namespace
 
-ClientFilterableState GetClientFilterableState(
+// Get the active channel, if applicable.
+Study::Channel GetChannel(const base::CommandLine* command_line) {
+  std::string channel;
+  if (command_line->HasSwitch(kFakeVariationsChannel)) {
+    channel = command_line->GetSwitchValueASCII(kFakeVariationsChannel);
+  }
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  else if (base::SysInfo::GetLsbReleaseValue(crosapi::kChromeOSReleaseTrack,
+                                             &channel)) {
+    // do nothing; we successfully got channel.
+  }
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+  else {
+    // We didn't get the channel.
+    return Study::UNKNOWN;
+  }
+
+  return ConvertProductChannelToStudyChannel(crosapi::ChannelToEnum(channel));
+}
+
+std::unique_ptr<ClientFilterableState> GetClientFilterableState(
     const base::CommandLine* command_line) {
   bool enterprise_enrolled = command_line->HasSwitch(kEnterpriseEnrolledSwitch);
 
   // TODO(b/263975722): Fill in the rest of ClientFilterableState.
-  return ClientFilterableState(base::BindOnce(
+  auto state = std::make_unique<ClientFilterableState>(base::BindOnce(
       [](bool enrolled) { return enrolled; }, enterprise_enrolled));
+
+  state->channel = GetChannel(command_line);
+  return state;
 }
 
 absl::optional<SafeSeed> GetSafeSeedData(const base::CommandLine* command_line,
@@ -45,7 +75,8 @@
     return EXIT_FAILURE;
   }
 
-  ClientFilterableState state = GetClientFilterableState(command_line);
+  std::unique_ptr<ClientFilterableState> state =
+      GetClientFilterableState(command_line);
 
   // TODO(b/263975722): Implement this binary.
   (void)state;
diff --git a/components/variations/cros/evaluate_seed.h b/components/variations/cros/evaluate_seed.h
index d3d93b1..d0d6422 100644
--- a/components/variations/cros/evaluate_seed.h
+++ b/components/variations/cros/evaluate_seed.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_H_
 #define COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_H_
 
+#include <memory>
 #include <string>
 
 #include <stdio.h>
@@ -16,7 +17,7 @@
 namespace variations::evaluate_seed {
 
 // Retrieve a ClientFilterableState struct based on the given |command_line|.
-ClientFilterableState GetClientFilterableState(
+std::unique_ptr<ClientFilterableState> GetClientFilterableState(
     const base::CommandLine* command_line);
 
 struct SafeSeed {
diff --git a/components/variations/cros/evaluate_seed_unittest.cc b/components/variations/cros/evaluate_seed_unittest.cc
index 2e22551..72af208 100644
--- a/components/variations/cros/evaluate_seed_unittest.cc
+++ b/components/variations/cros/evaluate_seed_unittest.cc
@@ -4,6 +4,9 @@
 
 #include "components/variations/cros/evaluate_seed.h"
 
+#include "base/strings/strcat.h"
+#include "base/test/scoped_chromeos_version_info.h"
+#include "build/branding_buildflags.h"
 #include "components/variations/client_filterable_state.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -11,16 +14,78 @@
 
 TEST(VariationsCrosEvaluateSeed, GetClientFilterable_Enrolled) {
   base::CommandLine command_line({"evaluate_seed", "--enterprise-enrolled"});
-  ClientFilterableState state = GetClientFilterableState(&command_line);
-  EXPECT_TRUE(state.IsEnterprise());
+  std::unique_ptr<ClientFilterableState> state =
+      GetClientFilterableState(&command_line);
+  EXPECT_TRUE(state->IsEnterprise());
 }
 
 TEST(VariationsCrosEvaluateSeed, GetClientFilterable_NotEnrolled) {
   base::CommandLine command_line({"evaluate_seed"});
-  ClientFilterableState state = GetClientFilterableState(&command_line);
-  EXPECT_FALSE(state.IsEnterprise());
+  std::unique_ptr<ClientFilterableState> state =
+      GetClientFilterableState(&command_line);
+  EXPECT_FALSE(state->IsEnterprise());
 }
 
+struct Param {
+  std::string test_name;
+  std::string channel_name;
+  Study::Channel channel;
+};
+
+class VariationsCrosEvaluateSeedGetChannel
+    : public ::testing::TestWithParam<Param> {
+ protected:
+  VariationsCrosEvaluateSeedGetChannel() = default;
+};
+
+TEST_P(VariationsCrosEvaluateSeedGetChannel,
+       GetClientFilterableState_Channel_Override) {
+  base::CommandLine command_line(
+      {"evaluate_seed", base::StrCat({"--fake-variations-channel=",
+                                      GetParam().channel_name, "-channel"})});
+  std::unique_ptr<ClientFilterableState> state =
+      GetClientFilterableState(&command_line);
+  EXPECT_EQ(GetParam().channel, state->channel);
+}
+
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+// Verify GetClientFilterableState gets the channel from lsb-release on branded
+// builds.
+TEST_P(VariationsCrosEvaluateSeedGetChannel,
+       GetClientFilterableState_Channel_Branded) {
+  std::string lsb_release = base::StrCat(
+      {"CHROMEOS_RELEASE_TRACK=", GetParam().channel_name, "-channel"});
+  const base::Time lsb_release_time(base::Time::FromDoubleT(12345.6));
+  base::test::ScopedChromeOSVersionInfo lsb_info(lsb_release, lsb_release_time);
+
+  base::CommandLine command_line({"evaluate_seed"});
+  std::unique_ptr<ClientFilterableState> state =
+      GetClientFilterableState(&command_line);
+  EXPECT_EQ(GetParam().channel, state->channel);
+}
+
+#else   // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+// Verify that we use unknown channel on non-branded builds.
+TEST(VariationsCrosEvaluateSeed, GetClientFilterableState_Channel_NotBranded) {
+  base::CommandLine command_line({"evaluate_seed"});
+  std::unique_ptr<ClientFilterableState> state =
+      GetClientFilterableState(&command_line);
+  EXPECT_EQ(Study::UNKNOWN, state->channel);
+}
+#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING)
+INSTANTIATE_TEST_SUITE_P(
+    VariationsCrosEvaluateSeedGetChannel,
+    VariationsCrosEvaluateSeedGetChannel,
+    ::testing::ValuesIn<Param>({{"Stable", "stable", Study::STABLE},
+                                {"Beta", "beta", Study::BETA},
+                                {"Dev", "dev", Study::DEV},
+                                {"Canary", "canary", Study::CANARY},
+                                {"Unknown", "testimage", Study::UNKNOWN}}),
+    [](const testing::TestParamInfo<
+        VariationsCrosEvaluateSeedGetChannel::ParamType>& info) {
+      return info.param.test_name;
+    });
+
 // Should ignore data if flag is off.
 TEST(VariationsCrosEvaluateSeed, GetSafeSeedData_Off) {
   std::string text("some text");
diff --git a/components/variations/service/variations_field_trial_creator.cc b/components/variations/service/variations_field_trial_creator.cc
index 358fd5b9..276d5c8 100644
--- a/components/variations/service/variations_field_trial_creator.cc
+++ b/components/variations/service/variations_field_trial_creator.cc
@@ -44,7 +44,6 @@
 #include "components/variations/variations_ids_provider.h"
 #include "components/variations/variations_seed_processor.h"
 #include "components/variations/variations_switches.h"
-#include "components/version_info/channel.h"
 #include "components/version_info/version_info.h"
 #include "ui/base/device_form_factor.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -66,25 +65,6 @@
   return reference_date;
 }
 
-// Just maps one set of enum values to another. Nothing to see here.
-Study::Channel ConvertProductChannelToStudyChannel(
-    version_info::Channel product_channel) {
-  switch (product_channel) {
-    case version_info::Channel::CANARY:
-      return Study::CANARY;
-    case version_info::Channel::DEV:
-      return Study::DEV;
-    case version_info::Channel::BETA:
-      return Study::BETA;
-    case version_info::Channel::STABLE:
-      return Study::STABLE;
-    case version_info::Channel::UNKNOWN:
-      return Study::UNKNOWN;
-  }
-  NOTREACHED();
-  return Study::UNKNOWN;
-}
-
 // Records the loaded seed's expiry status.
 void RecordSeedExpiry(bool is_safe_seed, VariationsSeedExpiry seed_expiry) {
   const std::string histogram_name =
@@ -198,6 +178,24 @@
              "ForceFieldTrialSetupCrashForTesting",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+Study::Channel ConvertProductChannelToStudyChannel(
+    version_info::Channel product_channel) {
+  switch (product_channel) {
+    case version_info::Channel::CANARY:
+      return Study::CANARY;
+    case version_info::Channel::DEV:
+      return Study::DEV;
+    case version_info::Channel::BETA:
+      return Study::BETA;
+    case version_info::Channel::STABLE:
+      return Study::STABLE;
+    case version_info::Channel::UNKNOWN:
+      return Study::UNKNOWN;
+  }
+  NOTREACHED();
+  return Study::UNKNOWN;
+}
+
 VariationsFieldTrialCreator::VariationsFieldTrialCreator(
     VariationsServiceClient* client,
     std::unique_ptr<VariationsSeedStore> seed_store,
diff --git a/components/variations/service/variations_field_trial_creator.h b/components/variations/service/variations_field_trial_creator.h
index 09290c5..9bcaeb2e6 100644
--- a/components/variations/service/variations_field_trial_creator.h
+++ b/components/variations/service/variations_field_trial_creator.h
@@ -23,6 +23,7 @@
 #include "components/variations/service/buildflags.h"
 #include "components/variations/service/ui_string_overrider.h"
 #include "components/variations/variations_seed_store.h"
+#include "components/version_info/channel.h"
 
 namespace metrics {
 class MetricsStateManager;
@@ -30,6 +31,10 @@
 
 namespace variations {
 
+// Just maps one set of enum values to another. Nothing to see here.
+Study::Channel ConvertProductChannelToStudyChannel(
+    version_info::Channel product_channel);
+
 // Denotes whether Chrome used a variations seed. Also captures (a) the kind of
 // seed and (b) the conditions under which the seed was used or failed to be
 // used. Exposed for testing.
diff --git a/components/viz/service/display/software_renderer.cc b/components/viz/service/display/software_renderer.cc
index 484d0f42..30ea0d4 100644
--- a/components/viz/service/display/software_renderer.cc
+++ b/components/viz/service/display/software_renderer.cc
@@ -464,10 +464,10 @@
 
   bool blend_background =
       quad->background_color != SkColors::kTransparent && !image->isOpaque();
-  bool needs_layer = blend_background && (current_paint_.getAlpha() != 0xFF);
+  bool needs_layer = blend_background && (current_paint_.getAlphaf() != 1.f);
   if (needs_layer) {
-    current_canvas_->saveLayerAlpha(&quad_rect, current_paint_.getAlpha());
-    current_paint_.setAlpha(0xFF);
+    current_canvas_->saveLayerAlphaf(&quad_rect, current_paint_.getAlphaf());
+    current_paint_.setAlphaf(1.f);
   }
   if (blend_background) {
     SkPaint background_paint;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index af859fd..b9d3244f 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1829,6 +1829,7 @@
     "renderer_host/render_view_host_delegate.h",
     "renderer_host/render_view_host_delegate_view.cc",
     "renderer_host/render_view_host_delegate_view.h",
+    "renderer_host/render_view_host_enums.h",
     "renderer_host/render_view_host_factory.cc",
     "renderer_host/render_view_host_factory.h",
     "renderer_host/render_view_host_impl.cc",
diff --git a/content/browser/background_fetch/background_fetch.proto b/content/browser/background_fetch/background_fetch.proto
index 7218586e..51583c5 100644
--- a/content/browser/background_fetch/background_fetch.proto
+++ b/content/browser/background_fetch/background_fetch.proto
@@ -45,6 +45,34 @@
   optional BackgroundFetchFailureReason failure_reason = 8;
 }
 
+// TODO(crbug.com/1381377): Move ImageResource to generic place.
+// Currently also being used within chrome/browser/web_applications
+// https://w3c.github.io/manifest/#dom-imageresource
+//
+// Next Tag: 5
+message ImageResource {
+  optional string src = 1;
+
+  // Next Tag: 3
+  message Size {
+    optional int32 width = 1;
+    optional int32 height = 2;
+  }
+
+  repeated Size sizes = 2;
+  optional bytes type = 3;
+
+  // https://w3c.github.io/manifest/#purpose-member
+  enum Purpose {
+    ANY = 1;
+    MONOCHROME = 2;
+    MASKABLE = 3;
+  }
+
+  // blink::mojom::ManifestImageResource_Purpose enum.
+  repeated Purpose purpose = 4;
+}
+
 // Developer provided options.
 // https://wicg.github.io/background-fetch/#background-fetch-manager
 //
@@ -54,32 +82,6 @@
   // and the most recent value is stored in BackgroundFetchUIOptions.
   optional string title = 1;
 
-  // https://w3c.github.io/manifest/#dom-imageresource
-  //
-  // Next Tag: 5
-  message ImageResource {
-    optional string src = 1;
-
-    // Next Tag: 3
-    message Size {
-      optional int32 width = 1;
-      optional int32 height = 2;
-    }
-
-    repeated Size sizes = 2;
-    optional bytes type = 3;
-
-    // https://w3c.github.io/manifest/#purpose-member
-    enum Purpose {
-      ANY = 1;
-      MONOCHROME = 2;
-      MASKABLE = 3;
-    }
-
-    // blink::mojom::ManifestImageResource_Purpose enum.
-    repeated Purpose purpose = 4;
-  }
-
   repeated ImageResource icons = 2;
 
   optional uint64 download_total = 3;
diff --git a/content/browser/background_fetch/storage/create_metadata_task.cc b/content/browser/background_fetch/storage/create_metadata_task.cc
index 37bac1b2..b9c2165 100644
--- a/content/browser/background_fetch/storage/create_metadata_task.cc
+++ b/content/browser/background_fetch/storage/create_metadata_task.cc
@@ -128,6 +128,18 @@
       this};  // Keep as last.
 };
 
+proto::ImageResource_Purpose
+ManifestImageResourcePurposeToImageResoucePurposeProto(
+    blink::mojom::ManifestImageResource_Purpose purpose) {
+  switch (purpose) {
+    case blink::mojom::ManifestImageResource_Purpose::ANY:
+      return proto::ImageResource_Purpose_ANY;
+    case blink::mojom::ManifestImageResource_Purpose::MONOCHROME:
+      return proto::ImageResource_Purpose_MONOCHROME;
+    case blink::mojom::ManifestImageResource_Purpose::MASKABLE:
+      return proto::ImageResource_Purpose_MASKABLE;
+  }
+}
 }  // namespace
 
 CreateMetadataTask::CreateMetadataTask(
@@ -266,20 +278,8 @@
     image_resource_proto->set_type(base::UTF16ToASCII(icon.type));
 
     for (const auto& purpose : icon.purpose) {
-      switch (purpose) {
-        case blink::mojom::ManifestImageResource_Purpose::ANY:
-          image_resource_proto->add_purpose(
-              proto::BackgroundFetchOptions_ImageResource_Purpose_ANY);
-          break;
-        case blink::mojom::ManifestImageResource_Purpose::MONOCHROME:
-          image_resource_proto->add_purpose(
-              proto::BackgroundFetchOptions_ImageResource_Purpose_MONOCHROME);
-          break;
-        case blink::mojom::ManifestImageResource_Purpose::MASKABLE:
-          image_resource_proto->add_purpose(
-              proto::BackgroundFetchOptions_ImageResource_Purpose_MASKABLE);
-          break;
-      }
+      image_resource_proto->add_purpose(
+          ManifestImageResourcePurposeToImageResoucePurposeProto(purpose));
     }
   }
 
diff --git a/content/browser/background_fetch/storage/get_initialization_data_task.cc b/content/browser/background_fetch/storage/get_initialization_data_task.cc
index 22444605..c497a8f 100644
--- a/content/browser/background_fetch/storage/get_initialization_data_task.cc
+++ b/content/browser/background_fetch/storage/get_initialization_data_task.cc
@@ -371,11 +371,11 @@
       ir.purpose.reserve(icon.purpose_size());
       for (auto purpose : icon.purpose()) {
         switch (purpose) {
-          case proto::BackgroundFetchOptions_ImageResource_Purpose_ANY:
+          case proto::ImageResource_Purpose_ANY:
             ir.purpose.push_back(
                 blink::mojom::ManifestImageResource_Purpose::ANY);
             break;
-          case proto::BackgroundFetchOptions_ImageResource_Purpose_MONOCHROME:
+          case proto::ImageResource_Purpose_MONOCHROME:
             ir.purpose.push_back(
                 blink::mojom::ManifestImageResource_Purpose::MONOCHROME);
             break;
diff --git a/content/browser/client_hints/client_hints.cc b/content/browser/client_hints/client_hints.cc
index ca34b71..81e41399 100644
--- a/content/browser/client_hints/client_hints.cc
+++ b/content/browser/client_hints/client_hints.cc
@@ -621,6 +621,7 @@
     const base::TimeTicks start_time = base::TimeTicks::Now();
     delegate->GetAllowedClientHintsFromSource(outermost_main_frame_origin,
                                               &hints);
+    const base::TimeTicks pref_read_time = base::TimeTicks::Now();
 
     // If this is a prerender tree, also capture prerender local setting. The
     // setting was given by navigation requests on the prerendering page, and
@@ -632,6 +633,7 @@
               *frame_tree_node))
         host->GetAllowedClientHintsOnPage(outermost_main_frame_origin, &hints);
     }
+    const base::TimeTicks prerender_host_time = base::TimeTicks::Now();
 
     // If this is not a top-level frame, then check if any of the ancestors
     // in the path that led to this request have Sec-CH-UA-Reduced set.
@@ -651,8 +653,17 @@
     }
 
     // Record the time spent getting the client hints.
-    base::TimeDelta duration = base::TimeTicks::Now() - start_time;
-    base::UmaHistogramTimes("ClientHints.FetchLatency", duration);
+    const base::TimeTicks end_time = base::TimeTicks::Now();
+    base::UmaHistogramMicrosecondsTimes("ClientHints.FetchLatency_PrefRead",
+                                        pref_read_time - start_time);
+    base::UmaHistogramMicrosecondsTimes(
+        "ClientHints.FetchLatency_PrerenderHost",
+        prerender_host_time - pref_read_time);
+    base::UmaHistogramMicrosecondsTimes(
+        "ClientHints.FetchLatency_OriginTrialCheck",
+        end_time - prerender_host_time);
+    base::UmaHistogramMicrosecondsTimes("ClientHints.FetchLatency_Total",
+                                        end_time - start_time);
   }
 
   blink::EnabledClientHints hints;
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
index 9156d3c..62ad996 100644
--- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -239,8 +239,9 @@
   }
 
   // WebContentsDelegate overrides.
-  bool IsPrerender2Supported(WebContents& web_contents) override {
-    return true;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override {
+    return PreloadingEligibility::kEligible;
   }
 
   WebContents* web_contents() const { return shell()->web_contents(); }
@@ -2615,8 +2616,9 @@
   }
 
   // WebContentsDelegate overrides.
-  bool IsPrerender2Supported(WebContents& web_contents) override {
-    return true;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override {
+    return PreloadingEligibility::kEligible;
   }
 
   WebContents* GetWebContents() const { return shell()->web_contents(); }
diff --git a/content/browser/find_request_manager_browsertest.cc b/content/browser/find_request_manager_browsertest.cc
index 880b46a..7e365ccb 100644
--- a/content/browser/find_request_manager_browsertest.cc
+++ b/content/browser/find_request_manager_browsertest.cc
@@ -1212,8 +1212,9 @@
 class FindTestWebContentsPrerenderingDelegate
     : public FindTestWebContentsDelegate {
  public:
-  bool IsPrerender2Supported(WebContents& web_contents) override {
-    return true;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override {
+    return PreloadingEligibility::kEligible;
   }
 };
 
diff --git a/content/browser/manifest/manifest_browsertest.cc b/content/browser/manifest/manifest_browsertest.cc
index 007eab4..760a82e 100644
--- a/content/browser/manifest/manifest_browsertest.cc
+++ b/content/browser/manifest/manifest_browsertest.cc
@@ -67,8 +67,9 @@
                               const std::u16string& message,
                               int32_t line_no,
                               const std::u16string& source_id) override;
-  bool IsPrerender2Supported(WebContents& web_contents) override {
-    return true;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override {
+    return PreloadingEligibility::kEligible;
   }
 
  private:
diff --git a/content/browser/preloading/prerender/prerender_host_registry.cc b/content/browser/preloading/prerender/prerender_host_registry.cc
index 79b50476..5d1bc56f9 100644
--- a/content/browser/preloading/prerender/prerender_host_registry.cc
+++ b/content/browser/preloading/prerender/prerender_host_registry.cc
@@ -127,11 +127,24 @@
         base::BindOnce(&PrerenderHostRegistry::NotifyTrigger,
                        base::Unretained(this), attributes.prerendering_url));
 
-    // Check whether preloading is enabled. If users disable this setting, it
-    // means users do not want to preload pages.
-    if (initiator_web_contents.IsPrerender2Disabled()) {
+    // Check whether preloading is enabled. If it is not enabled, report the
+    // reason.
+    if (auto reason = initiator_web_contents.IsPrerender2Disabled();
+        reason != PreloadingEligibility::kEligible) {
+      switch (reason) {
+        case PreloadingEligibility::kPreloadingDisabled:
+          // TODO(crbug.com/1382315): add
+          // PrerenderFinalStatus::kPreloadingDisabled
+          break;
+        case PreloadingEligibility::kBatterySaverEnabled:
+          // TODO(crbug.com/1382315): add
+          // PrerenderFinalStatus::kBatterySaverEnabled
+          break;
+        default:
+          NOTREACHED();
+      }
       if (attempt)
-        attempt->SetEligibility(PreloadingEligibility::kPreloadingDisabled);
+        attempt->SetEligibility(reason);
       return RenderFrameHost::kNoFrameTreeNodeId;
     }
 
diff --git a/content/browser/preloading/prerender/prerender_new_tab_handle.cc b/content/browser/preloading/prerender/prerender_new_tab_handle.cc
index be7487d..64e103d 100644
--- a/content/browser/preloading/prerender/prerender_new_tab_handle.cc
+++ b/content/browser/preloading/prerender/prerender_new_tab_handle.cc
@@ -18,10 +18,11 @@
   WebContentsDelegateImpl() = default;
   ~WebContentsDelegateImpl() override = default;
 
-  bool IsPrerender2Supported(WebContents& web_contents) override {
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override {
     // This should be checked in the initiator's WebContents.
     NOTREACHED();
-    return false;
+    return PreloadingEligibility::kPreloadingDisabled;
   }
 
   // TODO(crbug.com/1350676): Investigate if we have to override other
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc
index 079ae660..f8852d1 100644
--- a/content/browser/renderer_host/frame_tree.cc
+++ b/content/browser/renderer_host/frame_tree.cc
@@ -33,6 +33,7 @@
 #include "content/browser/renderer_host/render_view_host_delegate.h"
 #include "content/browser/renderer_host/render_view_host_factory.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/common/content_navigation_policy.h"
 #include "content/common/content_switches_internal.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/frame/frame_owner_element_type.h"
@@ -221,6 +222,24 @@
 #endif
 }
 
+void FrameTree::MakeSpeculativeRVHCurrent() {
+  CHECK(speculative_render_view_host_);
+
+  // The existing RenderViewHost needs to be unregistered first.
+  // Speculative RenderViewHosts are only used for same-SiteInstanceGroup
+  // navigations, so there should be a RenderViewHost of the same
+  // SiteInstanceGroup already in the tree.
+  RenderViewHostMapId speculative_id =
+      speculative_render_view_host_->rvh_map_id();
+  auto it = render_view_host_map_.find(speculative_id);
+  CHECK(it != render_view_host_map_.end());
+  UnregisterRenderViewHost(speculative_id, it->second);
+
+  speculative_render_view_host_->set_is_speculative(false);
+  RegisterRenderViewHost(speculative_id, speculative_render_view_host_.get());
+  speculative_render_view_host_.reset();
+}
+
 FrameTreeNode* FrameTree::FindByID(int frame_tree_node_id) {
   for (FrameTreeNode* node : Nodes()) {
     if (node->frame_tree_node_id() == frame_tree_node_id)
@@ -613,7 +632,8 @@
     SiteInstanceImpl* site_instance,
     int32_t main_frame_routing_id,
     bool renderer_initiated_creation,
-    scoped_refptr<BrowsingContextState> main_browsing_context_state) {
+    scoped_refptr<BrowsingContextState> main_browsing_context_state,
+    CreateRenderViewHostCase create_case) {
   if (main_browsing_context_state) {
     DCHECK(main_browsing_context_state->is_main_frame());
   }
@@ -622,7 +642,18 @@
           this, site_instance->group(),
           site_instance->GetStoragePartitionConfig(), render_view_delegate_,
           render_widget_delegate_, main_frame_routing_id,
-          renderer_initiated_creation, std::move(main_browsing_context_state)));
+          renderer_initiated_creation, std::move(main_browsing_context_state),
+          create_case));
+
+  if (ShouldCreateNewHostForAllFrames() &&
+      create_case == CreateRenderViewHostCase::kSpeculative) {
+    set_speculative_render_view_host(rvh->GetWeakPtr());
+  } else {
+    // Register non-speculative RenderViewHosts. If they are speculative, they
+    // will be registered when they become active.
+    RegisterRenderViewHost(rvh->rvh_map_id(), rvh);
+  }
+
   return base::WrapRefCounted(rvh);
 }
 
@@ -651,18 +682,22 @@
                                        RenderViewHostImpl* rvh) {
   TRACE_EVENT_INSTANT("navigation", "FrameTree::RegisterRenderViewHost",
                       ChromeTrackEvent::kRenderViewHost, *rvh);
+  CHECK(!rvh->is_speculative());
   CHECK(!base::Contains(render_view_host_map_, id));
   render_view_host_map_[id] = rvh;
+  rvh->set_is_registered_with_frame_tree(true);
 }
 
 void FrameTree::UnregisterRenderViewHost(RenderViewHostMapId id,
                                          RenderViewHostImpl* rvh) {
   TRACE_EVENT_INSTANT("navigation", "FrameTree::UnregisterRenderViewHost",
                       ChromeTrackEvent::kRenderViewHost, *rvh);
+  CHECK(!rvh->is_speculative());
   auto it = render_view_host_map_.find(id);
   CHECK(it != render_view_host_map_.end());
   CHECK_EQ(it->second, rvh);
   render_view_host_map_.erase(it);
+  rvh->set_is_registered_with_frame_tree(false);
 }
 
 void FrameTree::FrameUnloading(FrameTreeNode* frame) {
diff --git a/content/browser/renderer_host/frame_tree.h b/content/browser/renderer_host/frame_tree.h
index 8261ad2e..efb8e074 100644
--- a/content/browser/renderer_host/frame_tree.h
+++ b/content/browser/renderer_host/frame_tree.h
@@ -23,6 +23,7 @@
 #include "content/browser/renderer_host/navigator.h"
 #include "content/browser/renderer_host/navigator_delegate.h"
 #include "content/browser/renderer_host/render_frame_host_manager.h"
+#include "content/browser/renderer_host/render_view_host_enums.h"
 #include "content/common/content_export.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom.h"
@@ -272,15 +273,34 @@
 
   using RenderViewHostMapId = base::IdType32<class RenderViewHostMap>;
 
-  // SiteInstanceGroup IDs are used to look up RenderViewHosts, since there is
-  // one RenderViewHost per SiteInstanceGroup in a given FrameTree.
+  // A map to store RenderViewHosts, keyed by SiteInstanceGroup ID.
+  // This map does not cover all RenderViewHosts in a FrameTree. See
+  // `speculative_render_view_host_`.
   using RenderViewHostMap = std::unordered_map<RenderViewHostMapId,
                                                RenderViewHostImpl*,
                                                RenderViewHostMapId::Hasher>;
+  // TODO(yangsharon, crbug.com/1336305): Change this to ForEachRenderViewHost
+  // to include `speculative_render_view_host_`.
   const RenderViewHostMap& render_view_hosts() const {
     return render_view_host_map_;
   }
 
+  // Speculative RenderViewHost accessors.
+  RenderViewHostImpl* speculative_render_view_host() const {
+    return speculative_render_view_host_.get();
+  }
+  void set_speculative_render_view_host(
+      base::WeakPtr<RenderViewHostImpl> render_view_host) {
+    speculative_render_view_host_ = render_view_host;
+  }
+
+  // Moves `speculative_render_view_host_` to `render_view_host_map_`. This
+  // should be called every time a main-frame same-SiteInstanceGroup speculative
+  // RenderFrameHost gets swapped in and becomes the active RenderFrameHost.
+  // This overwrites the previous RenderViewHost for the SiteInstanceGroup in
+  // `render_view_host_map_`, if one exists.
+  void MakeSpeculativeRVHCurrent();
+
   // Returns the FrameTreeNode with the given |frame_tree_node_id| if it is part
   // of this FrameTree.
   FrameTreeNode* FindByID(int frame_tree_node_id);
@@ -391,15 +411,21 @@
   //
   // The RenderFrameHostImpls and the RenderFrameProxyHosts will share ownership
   // of this object.
+  // `create_case` indicates whether or not the RenderViewHost being created is
+  // speculative or not. It should only be registered with the FrameTree if it
+  // is not speculative.
   scoped_refptr<RenderViewHostImpl> CreateRenderViewHost(
       SiteInstanceImpl* site_instance,
       int32_t main_frame_routing_id,
       bool renderer_initiated_creation,
-      scoped_refptr<BrowsingContextState> main_browsing_context_state);
+      scoped_refptr<BrowsingContextState> main_browsing_context_state,
+      CreateRenderViewHostCase create_case);
 
   // Returns the existing RenderViewHost for a new RenderFrameHost.
   // There should always be such a RenderViewHost, because the main frame
   // RenderFrameHost for each SiteInstance should be created before subframes.
+  // Note that this will never return `speculative_render_view_host_`. If that
+  // is needed, call `speculative_render_view_host()` instead.
   scoped_refptr<RenderViewHostImpl> GetRenderViewHost(SiteInstanceGroup* group);
 
   // Returns the ID used for the RenderViewHost associated with
@@ -555,6 +581,33 @@
   // more RenderFrameHosts or RenderFrameProxyHosts using it.
   RenderViewHostMap render_view_host_map_;
 
+  // A speculative RenderViewHost is created for all speculative cross-page
+  // same-SiteInstanceGroup RenderFrameHosts. When the corresponding
+  // RenderFrameHost gets committed and becomes the current RenderFrameHost,
+  // `speculative_render_view_host_` will be moved to `render_view_host_map_`,
+  // overwriting the previous RenderViewHost of the same SiteInstanceGroup, if
+  // applicable. This field will also be reset at that time, or if the
+  // speculative RenderFrameHost gets deleted.
+  //
+  // For any given FrameTree, there will be at most one
+  // `speculative_render_view_host_`, because only main-frame speculative
+  // RenderFrameHosts have speculative RenderViewHosts, and there is at most one
+  // such RenderFrameHost per FrameTree at a time.
+  // This is a WeakPtr, since the RenderViewHost is owned by the
+  // RenderFrameHostImpl, not the FrameTree. This implies that if the owning
+  // RenderFrameHostImpl gets deleted, this will too.
+  //
+  // This supports but is independent of RenderDocument, which introduces cases
+  // where there may be more than one RenderViewHost per SiteInstanceGroup, such
+  // as cross-page same-SiteInstanceGroup navigations. The speculative
+  // RenderFrameHost has an associated RenderViewHost, but it cannot be put in
+  // `render_view_host_map_` when it is created, as the existing RenderViewHost
+  // will be incorrectly overwritten.
+  // TODO(yangsharon, crbug.com/1336305): Expand support to include
+  // cross-SiteInstanceGroup main-frame navigations, so all main-frame
+  // navigations use speculative RenderViewHost.
+  base::WeakPtr<RenderViewHostImpl> speculative_render_view_host_;
+
   // Indicates type of frame tree.
   const Type type_;
 
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc
index 42e8342..e678cc3 100644
--- a/content/browser/renderer_host/render_frame_host_manager.cc
+++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -46,6 +46,7 @@
 #include "content/browser/renderer_host/render_frame_host_owner.h"
 #include "content/browser/renderer_host/render_frame_proxy_host.h"
 #include "content/browser/renderer_host/render_process_host_impl.h"
+#include "content/browser/renderer_host/render_view_host_enums.h"
 #include "content/browser/renderer_host/render_view_host_factory.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
@@ -1228,9 +1229,9 @@
     use_current_rfh = false;
 
   // Force using a different RenderFrameHost when RenderDocument is enabled.
-  // TODO(arthursonzogni, fergal): Add support for the main frame.
-  if (ShouldCreateNewHostForSameSiteSubframe() &&
-      !frame_tree_node_->IsMainFrame() &&
+  if (((ShouldCreateNewHostForSameSiteSubframe() &&
+        !frame_tree_node_->IsMainFrame()) ||
+       ShouldCreateNewHostForAllFrames()) &&
       render_frame_host_->has_committed_any_navigation()) {
     use_current_rfh = false;
   }
@@ -2950,8 +2951,27 @@
     frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
   }
 
-  scoped_refptr<RenderViewHostImpl> render_view_host =
-      frame_tree.GetRenderViewHost(site_instance->group());
+  // Check to see if a speculative RenderViewHost is needed. It is needed for
+  // cross-page same-SiteInstanceGroup navigations when the feature is enabled.
+  // TODO(yangsharon, rakina, crbug.com/1336305): Handle the
+  // cross-SiteInstanceGroup  and crashed frame cases.
+  CreateRenderViewHostCase create_rvh_case =
+      (ShouldCreateNewHostForAllFrames() &&
+       create_frame_case == CreateFrameCase::kCreateSpeculative &&
+       static_cast<SiteInstanceImpl*>(site_instance)->group() ==
+           render_frame_host_->GetSiteInstance()->group() &&
+       frame_tree_node_->IsMainFrame() &&
+       !render_frame_host_->must_be_replaced())
+          ? CreateRenderViewHostCase::kSpeculative
+          : CreateRenderViewHostCase::kDefault;
+
+  scoped_refptr<RenderViewHostImpl> render_view_host = nullptr;
+  // In the case a speculative RenderViewHost will be created, we don't need to
+  // check if there's an existing RenderViewHost. Otherwise, get the appropriate
+  // RenderViewHost.
+  if (create_rvh_case == CreateRenderViewHostCase::kDefault) {
+    render_view_host = frame_tree.GetRenderViewHost(site_instance->group());
+  }
 
   switch (create_frame_case) {
     case CreateFrameCase::kInitChild:
@@ -2991,7 +3011,8 @@
                 features::BrowsingContextStateImplementationType::
                     kSwapForCrossBrowsingInstanceNavigations
             ? browsing_context_state
-            : nullptr);
+            : nullptr,
+        create_rvh_case);
   }
   CHECK(render_view_host);
 
@@ -3070,6 +3091,9 @@
       // BrowsingContextState.
       browsing_context_state = render_frame_host_->browsing_context_state();
     } else {
+      // TODO(crbug.com/936696, rakina, yangsharon): Once RenderDocument is
+      // implemented, there will never be an existing RenderViewHost, so getting
+      // the RenderViewHost and checking if there's a value can be removed.
       scoped_refptr<RenderViewHostImpl> render_view_host =
           frame_tree_node_->frame_tree().GetRenderViewHost(
               new_instance->group());
@@ -3261,7 +3285,8 @@
                   features::BrowsingContextStateImplementationType::
                       kSwapForCrossBrowsingInstanceNavigations
               ? render_frame_host_->browsing_context_state()
-              : nullptr);
+              : nullptr,
+          CreateRenderViewHostCase::kDefault);
     } else {
       TRACE_EVENT_INSTANT("navigation",
                           "RenderFrameHostManager::CreateRenderFrameProxy_RVH",
@@ -4052,6 +4077,15 @@
 
   FrameTree& frame_tree = frame_tree_node_->frame_tree();
 
+  // If the feature is enabled, check if there is a corresponding speculative
+  // RenderViewHost that also needs to be swapped in.
+  if (ShouldCreateNewHostForAllFrames() && render_frame_host_ &&
+      render_frame_host_->GetRenderViewHost() ==
+          frame_tree.speculative_render_view_host()) {
+    CHECK(frame_tree_node_->IsMainFrame());
+    frame_tree.MakeSpeculativeRVHCurrent();
+  }
+
   // Swapping the current RenderFrameHost in a FrameTreeNode comes along with an
   // update to its LifecycleStateImpl.
 
diff --git a/content/browser/renderer_host/render_view_host_enums.h b/content/browser/renderer_host/render_view_host_enums.h
new file mode 100644
index 0000000..2fabced2
--- /dev/null
+++ b/content/browser/renderer_host/render_view_host_enums.h
@@ -0,0 +1,30 @@
+// 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 CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_ENUMS_H_
+#define CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_ENUMS_H_
+
+#include "content/common/content_export.h"
+
+namespace content {
+
+// Case for creating a RenderViewHost.
+enum class CreateRenderViewHostCase {
+  // This is a RenderViewHost created for a speculative RenderFrameHost for a
+  // main-frame cross-document navigation. Currently this only applies to
+  // same-SiteInstanceGroup navigations. When RenderDocument is enabled, it
+  // will be possible to have cross-document same-SiteInstanceGroup navigations
+  // use new RenderViewHosts (as well as new RenderFrameHosts).
+  kSpeculative,
+
+  // This covers all other cases for RenderViewHost creation, including for
+  // subframe navigations, opener proxy creation and frame creation. Currently
+  // this also covers main-frame navigations that don't create speculative
+  // RenderViewHosts.
+  kDefault,
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_RENDERER_HOST_RENDER_VIEW_HOST_ENUMS_H_
diff --git a/content/browser/renderer_host/render_view_host_factory.cc b/content/browser/renderer_host/render_view_host_factory.cc
index ea150c6..0c22652 100644
--- a/content/browser/renderer_host/render_view_host_factory.cc
+++ b/content/browser/renderer_host/render_view_host_factory.cc
@@ -30,7 +30,8 @@
     RenderWidgetHostDelegate* widget_delegate,
     int32_t main_frame_routing_id,
     bool renderer_initiated_creation,
-    scoped_refptr<BrowsingContextState> main_browsing_context_state) {
+    scoped_refptr<BrowsingContextState> main_browsing_context_state,
+    CreateRenderViewHostCase create_case) {
   int32_t routing_id = group->process()->GetNextRoutingID();
   int32_t widget_routing_id = group->process()->GetNextRoutingID();
 
@@ -38,7 +39,7 @@
     return factory_->CreateRenderViewHost(
         frame_tree, group, storage_partition_config, delegate, widget_delegate,
         routing_id, main_frame_routing_id, widget_routing_id,
-        std::move(main_browsing_context_state));
+        std::move(main_browsing_context_state), create_case);
   }
 
   RenderViewHostImpl* view_host = new RenderViewHostImpl(
@@ -48,7 +49,7 @@
           /*hidden=*/true, renderer_initiated_creation),
       delegate, routing_id, main_frame_routing_id,
       true /* has_initialized_audio_host */,
-      std::move(main_browsing_context_state));
+      std::move(main_browsing_context_state), create_case);
   return view_host;
 }
 
diff --git a/content/browser/renderer_host/render_view_host_factory.h b/content/browser/renderer_host/render_view_host_factory.h
index 3de76b0..ea8477d0 100644
--- a/content/browser/renderer_host/render_view_host_factory.h
+++ b/content/browser/renderer_host/render_view_host_factory.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "content/browser/renderer_host/browsing_context_state.h"
+#include "content/browser/renderer_host/render_view_host_enums.h"
 #include "content/common/content_export.h"
 
 namespace content {
@@ -33,7 +34,8 @@
       RenderWidgetHostDelegate* widget_delegate,
       int32_t main_frame_routing_id,
       bool renderer_initiated_creation,
-      scoped_refptr<BrowsingContextState> main_browsing_context_state);
+      scoped_refptr<BrowsingContextState> main_browsing_context_state,
+      CreateRenderViewHostCase create_case);
 
   RenderViewHostFactory(const RenderViewHostFactory&) = delete;
   RenderViewHostFactory& operator=(const RenderViewHostFactory&) = delete;
@@ -70,7 +72,8 @@
       int32_t routing_id,
       int32_t main_frame_routing_id,
       int32_t widget_routing_id,
-      scoped_refptr<BrowsingContextState> main_browsing_context_state) = 0;
+      scoped_refptr<BrowsingContextState> main_browsing_context_state,
+      CreateRenderViewHostCase create_case) = 0;
 
   // Registers your factory to be called when new RenderViewHosts are created.
   // We have only one global factory, so there must be no factory registered
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 47c493d..39bd6ef 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -281,7 +281,8 @@
     int32_t routing_id,
     int32_t main_frame_routing_id,
     bool has_initialized_audio_host,
-    scoped_refptr<BrowsingContextState> main_browsing_context_state)
+    scoped_refptr<BrowsingContextState> main_browsing_context_state,
+    CreateRenderViewHostCase create_case)
     : render_widget_host_(std::move(widget)),
       delegate_(delegate),
       render_view_host_map_id_(frame_tree->GetRenderViewHostMapId(group)),
@@ -293,7 +294,8 @@
       main_browsing_context_state_(
           main_browsing_context_state
               ? absl::make_optional(main_browsing_context_state->GetSafeRef())
-              : absl::nullopt) {
+              : absl::nullopt),
+      is_speculative_(create_case == CreateRenderViewHostCase::kSpeculative) {
   TRACE_EVENT("navigation", "RenderViewHostImpl::RenderViewHostImpl",
               ChromeTrackEvent::kRenderViewHost, *this);
   TRACE_EVENT_BEGIN("navigation", "RenderViewHost",
@@ -335,8 +337,6 @@
                              : blink::mojom::PageVisibilityState::kVisible);
 
   GetWidget()->set_owner_delegate(this);
-  frame_tree_->RegisterRenderViewHost(render_view_host_map_id_, this);
-  registered_with_frame_tree_ = true;
 }
 
 RenderViewHostImpl::~RenderViewHostImpl() {
@@ -358,8 +358,8 @@
   delegate_->RenderViewDeleted(this);
   GetProcess()->RemoveObserver(this);
 
-  // We may have already unregistered the RenderViewHost when marking this
-  // not available for reuse.
+  // We may have already unregistered the RenderViewHost when marking this not
+  // available for reuse.
   if (registered_with_frame_tree_)
     frame_tree_->UnregisterRenderViewHost(render_view_host_map_id_, this);
 
@@ -371,6 +371,10 @@
   return delegate_;
 }
 
+base::WeakPtr<RenderViewHostImpl> RenderViewHostImpl::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
 void RenderViewHostImpl::DisallowReuse() {
   if (registered_with_frame_tree_) {
     frame_tree_->UnregisterRenderViewHost(render_view_host_map_id_, this);
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 5e854e6c..574e1f3 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -123,7 +123,8 @@
       int32_t routing_id,
       int32_t main_frame_routing_id,
       bool has_initialized_audio_host,
-      scoped_refptr<BrowsingContextState> main_browsing_context_state);
+      scoped_refptr<BrowsingContextState> main_browsing_context_state,
+      CreateRenderViewHostCase create_case);
 
   RenderViewHostImpl(const RenderViewHostImpl&) = delete;
   RenderViewHostImpl& operator=(const RenderViewHostImpl&) = delete;
@@ -163,6 +164,20 @@
 
   RenderViewHostDelegate* GetDelegate();
 
+  bool is_speculative() { return is_speculative_; }
+  void set_is_speculative(bool is_speculative) {
+    is_speculative_ = is_speculative;
+  }
+  void set_is_registered_with_frame_tree(bool is_registered) {
+    registered_with_frame_tree_ = is_registered;
+  }
+
+  FrameTree::RenderViewHostMapId rvh_map_id() const {
+    return render_view_host_map_id_;
+  }
+
+  base::WeakPtr<RenderViewHostImpl> GetWeakPtr();
+
   // Tracks whether this RenderViewHost is in an active state (rather than
   // pending unload or unloaded), according to its main frame
   // RenderFrameHost.
diff --git a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
index 7b9024e..93099b0 100644
--- a/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android_unittest.cc
@@ -213,7 +213,8 @@
       frame_tree_.get(), site_instance_group_.get(),
       site_instance_->GetStoragePartitionConfig(), std::move(mock_host),
       web_contents_.get(), process_->GetNextRoutingID(),
-      process_->GetNextRoutingID(), nullptr);
+      process_->GetNextRoutingID(), nullptr,
+      CreateRenderViewHostCase::kDefault);
   parent_layer_ = cc::Layer::Create();
   parent_view_.SetLayer(parent_layer_);
   layer_ = cc::Layer::Create();
diff --git a/content/browser/renderer_host/speculative_render_view_host_browsertest.cc b/content/browser/renderer_host/speculative_render_view_host_browsertest.cc
new file mode 100644
index 0000000..569c0b1
--- /dev/null
+++ b/content/browser/renderer_host/speculative_render_view_host_browsertest.cc
@@ -0,0 +1,392 @@
+// 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 "base/test/scoped_feature_list.h"
+#include "content/browser/renderer_host/render_frame_host_manager_browsertest.h"
+#include "content/browser/web_contents/web_contents_impl.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/test_utils.h"
+#include "content/shell/browser/shell.h"
+#include "content/test/content_browser_test_utils_internal.h"
+#include "content/test/render_document_feature.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+
+namespace content {
+
+// Fully enable RenderDocument for speculative RenderViewHost tests. This is
+// done by parameterizing this test suite with a single test parameter.
+using SpeculativeRenderViewHostTest = RenderFrameHostManagerTest;
+
+// Check that FrameTree::speculative_render_view_host_ is used correctly.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest,
+                       SameSiteInstanceGroupCase) {
+  // Disable BFCache because otherwise the BrowsingInstances will be proactively
+  // swapped and the navigation will not be same-SiteInstanceGroup, which is
+  // the only case a speculative RenderViewHost is used.
+  DisableBackForwardCache(
+      BackForwardCacheImpl::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE);
+
+  StartEmbeddedServer();
+
+  // Open a page in SiteInstanceGroup A.
+  GURL url1(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+
+  // Open a different page in SiteInstanceGroup A. Stop the navigation when
+  // there's a speculative RenderFrameHost for page 2.
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  GURL url2(embedded_test_server()->GetURL("a.com", "/title2.html"));
+  TestNavigationManager navigation(web_contents, url2);
+  shell()->LoadURL(url2);
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+
+  // Check that the speculative RenderViewHost exists, and that it matches the
+  // RenderViewHost of the speculative RenderFrameHost.
+  FrameTree& frame_tree = web_contents->GetPrimaryFrameTree();
+  FrameTreeNode* root = frame_tree.root();
+  RenderFrameHostImpl* speculative_rfh =
+      root->render_manager()->speculative_frame_host();
+  EXPECT_TRUE(speculative_rfh);
+  EXPECT_TRUE(frame_tree.speculative_render_view_host());
+  RenderViewHostImpl* speculative_rvh = speculative_rfh->render_view_host();
+  EXPECT_EQ(speculative_rvh, frame_tree.speculative_render_view_host());
+  EXPECT_EQ(speculative_rvh->rvh_map_id(),
+            frame_tree.GetRenderViewHostMapId(
+                speculative_rfh->GetSiteInstance()->group()));
+
+  // The speculative RenderViewHost and the current main frame RenderViewHost
+  // should have the same RenderViewHostMap ID, since they're in the same
+  // SiteInstanceGroup, but are two different RenderViewHosts.
+  EXPECT_NE(speculative_rvh, root->current_frame_host()->render_view_host());
+  EXPECT_EQ(speculative_rvh->rvh_map_id(),
+            root->current_frame_host()->render_view_host()->rvh_map_id());
+
+  // Expect that the speculative RenderViewHost was swapped in correctly.
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+  EXPECT_EQ(root->current_frame_host()->render_view_host(), speculative_rvh);
+  EXPECT_FALSE(frame_tree.speculative_render_view_host());
+}
+
+// Test that cross-SiteInstanceGroup navigations do not yet use speculative
+// RenderViewHosts.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest,
+                       CrossSiteInstanceGroupNavigation) {
+  StartEmbeddedServer();
+
+  // Open a page in SiteInstanceGroup A.
+  GURL url1(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+
+  // Open a different page in SiteInstanceGroup B. Stop the navigation when
+  // there's a speculative RenderFrameHost for page 2.
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  GURL url2(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  TestNavigationManager navigation(web_contents, url2);
+  shell()->LoadURL(url2);
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+
+  // There should be a speculative RenderFrameHost with a RenderViewHost, but
+  // the RenderViewHost should not be speculative.
+  FrameTree& frame_tree = web_contents->GetPrimaryFrameTree();
+  RenderFrameHostImpl* speculative_rfh =
+      frame_tree.root()->render_manager()->speculative_frame_host();
+  EXPECT_TRUE(speculative_rfh);
+  EXPECT_TRUE(speculative_rfh->render_view_host());
+  EXPECT_FALSE(frame_tree.speculative_render_view_host());
+
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+}
+
+// Check that FrameTree::speculative_render_view_host_ is removed when the
+// navigation is cancelled before completing.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest,
+                       SpeculativeRenderViewHostCreatedNotUsed) {
+  // Disable BFCache because otherwise the BrowsingInstances will be proactively
+  // swapped and the navigation will not be same-SiteInstanceGroup, which is
+  // the only case a speculative RenderViewHost is used.
+  DisableBackForwardCache(
+      BackForwardCacheImpl::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE);
+
+  StartEmbeddedServer();
+
+  // Open a page in SiteInstanceGroup A.
+  GURL url1(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+
+  // Open a different page in SiteInstanceGroup A. Stop the navigation when
+  // there's a speculative RenderFrameHost for page2.
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  GURL url2(embedded_test_server()->GetURL("a.com", "/title2.html"));
+  TestNavigationManager navigation(web_contents, url2);
+  shell()->LoadURL(url2);
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+  FrameTree& frame_tree = web_contents->GetPrimaryFrameTree();
+  EXPECT_TRUE(frame_tree.speculative_render_view_host());
+
+  // Cancel the navigation while there's still a speculative RenderFrameHost and
+  // RenderViewHost.
+  FrameTreeNode* root = frame_tree.root();
+  root->navigator().CancelNavigation(root, NavigationDiscardReason::kCancelled);
+
+  // Expect that the navigation finishes but doesn't commit. There should no
+  // longer be a speculative RenderViewHost or RenderFrameHost. The current
+  // RenderFrameHost's RenderViewHost should still be around.
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+  EXPECT_FALSE(navigation.was_committed());
+  EXPECT_FALSE(frame_tree.speculative_render_view_host());
+  EXPECT_FALSE(root->render_manager()->speculative_frame_host());
+  EXPECT_TRUE(root->current_frame_host()->render_view_host());
+}
+
+// With RenderDocument, a same-SiteInstanceGroup history navigation page should
+// not be reusing RenderViewHosts, so check that a new speculative
+// RenderViewHost is being created for history navigations.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest, HistoryNavigation) {
+  // Disable BFCache because otherwise the BrowsingInstances will be proactively
+  // swapped and the navigation will not be same-SiteInstanceGroup, which is
+  // the only case a speculative RenderViewHost is used.
+  DisableBackForwardCache(
+      BackForwardCacheImpl::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE);
+
+  StartEmbeddedServer();
+
+  // Open two pages in SiteInstanceGroup A, one after the other..
+  GURL url1(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+  GURL url2(embedded_test_server()->GetURL("a.com", "/title2.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url2));
+
+  // Go back to the first page, but pause before it commits.
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  NavigationControllerImpl& controller =
+      static_cast<NavigationControllerImpl&>(web_contents->GetController());
+  TestNavigationManager navigation(web_contents, url1);
+  ASSERT_TRUE(controller.CanGoBack());
+  controller.GoBack();
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+
+  // Check that the speculative RenderViewHost exists, and that it matches the
+  // RenderViewHost of the speculative RenderFrameHost.
+  RenderFrameHostImpl* speculative_rfh = web_contents->GetPrimaryFrameTree()
+                                             .root()
+                                             ->render_manager()
+                                             ->speculative_frame_host();
+  FrameTree& frame_tree = web_contents->GetPrimaryFrameTree();
+  EXPECT_TRUE(speculative_rfh);
+  RenderViewHostImpl* speculative_rvh = speculative_rfh->render_view_host();
+  EXPECT_TRUE(frame_tree.speculative_render_view_host());
+  EXPECT_EQ(speculative_rvh->rvh_map_id(),
+            frame_tree.GetRenderViewHostMapId(
+                speculative_rfh->GetSiteInstance()->group()));
+  EXPECT_NE(frame_tree.root()->current_frame_host()->render_view_host(),
+            speculative_rvh);
+
+  // Expect that the former speculative RenderViewHost is now the RenderViewHost
+  // of the current main frame RenderFrameHost.
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+  EXPECT_EQ(frame_tree.root()->current_frame_host()->render_view_host(),
+            speculative_rvh);
+}
+
+// Check that opener proxies are unaffected in a navigation that has a
+// speculative RenderViewHost. When navigating a tab with an opener proxy, the
+// opener proxy to the tab shouldn't change when the page that was opened
+// navigates.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest, OpenerProxies) {
+  // Disable BFCache because otherwise the BrowsingInstances will be proactively
+  // swapped and the navigation will not be same-SiteInstanceGroup, which is
+  // the only case a speculative RenderViewHost is used.
+  DisableBackForwardCache(
+      BackForwardCacheImpl::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE);
+
+  StartEmbeddedServer();
+  IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess());
+
+  // Open page A in a tab. From there, window.open page B in another tab.
+  GURL url1(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+  WebContentsImpl* contents_a =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  FrameTreeNode* root_a = contents_a->GetPrimaryFrameTree().root();
+  RenderViewHost* rvh_a = root_a->current_frame_host()->render_view_host();
+
+  GURL url2(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  ShellAddedObserver new_shell_observer;
+  EXPECT_TRUE(ExecJs(root_a, JsReplace("window.open($1)", url2)));
+  Shell* new_shell = new_shell_observer.GetShell();
+  WebContentsImpl* contents_b =
+      static_cast<WebContentsImpl*>(new_shell->web_contents());
+  EXPECT_TRUE(WaitForLoadStop(contents_b));
+
+  // Store the current proxies.
+  FrameTreeNode* root_b = contents_b->GetPrimaryFrameTree().root();
+  RenderViewHost* rvh_b = root_b->current_frame_host()->render_view_host();
+  SiteInstanceGroup* site_instance_group_a =
+      root_a->current_frame_host()->GetSiteInstance()->group();
+  SiteInstanceGroup* site_instance_group_b =
+      root_b->current_frame_host()->GetSiteInstance()->group();
+  RenderFrameProxyHost* proxy_of_root_a_in_sig_b =
+      root_a->current_frame_host()
+          ->browsing_context_state()
+          ->GetRenderFrameProxyHost(site_instance_group_b);
+  RenderFrameProxyHost* proxy_of_root_b_in_sig_a =
+      root_b->current_frame_host()
+          ->browsing_context_state()
+          ->GetRenderFrameProxyHost(site_instance_group_a);
+
+  // The RenderViewHosts of the proxies and the pages should be different.
+  EXPECT_NE(proxy_of_root_a_in_sig_b->GetRenderViewHost(), rvh_a);
+  EXPECT_NE(proxy_of_root_b_in_sig_a->GetRenderViewHost(), rvh_b);
+
+  // Do a same-SiteInstanceGroup navigation on B's tab. Check that a speculative
+  // RenderViewHost is created. See SpeculativeRenderViewHost for more detailed
+  // checks on the speculative RenderViewHost.
+  GURL url3(embedded_test_server()->GetURL("b.com", "/title2.html"));
+  TestNavigationManager navigation(contents_b, url3);
+  new_shell->LoadURL(url3);
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+  EXPECT_TRUE(contents_b->GetPrimaryFrameTree().speculative_render_view_host());
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+
+  // Check that the proxies are still the same.
+  EXPECT_EQ(site_instance_group_b,
+            root_b->current_frame_host()->GetSiteInstance()->group());
+  EXPECT_EQ(proxy_of_root_a_in_sig_b,
+            root_a->current_frame_host()
+                ->browsing_context_state()
+                ->GetRenderFrameProxyHost(site_instance_group_b));
+  EXPECT_EQ(proxy_of_root_b_in_sig_a,
+            root_b->current_frame_host()
+                ->browsing_context_state()
+                ->GetRenderFrameProxyHost(site_instance_group_a));
+
+  // The RenderViewHosts of the proxies and the pages should still be different.
+  EXPECT_NE(proxy_of_root_a_in_sig_b->GetRenderViewHost(),
+            root_a->current_frame_host()->render_view_host());
+  EXPECT_NE(proxy_of_root_b_in_sig_a->GetRenderViewHost(),
+            root_b->current_frame_host()->render_view_host());
+
+  // Since page B had a navigation, that should result in a new RenderViewHost
+  // being created. Page A didn't change, so the RenderViewHost should be the
+  // same as before B navigated.
+  EXPECT_NE(rvh_b, root_b->current_frame_host()->render_view_host());
+  EXPECT_EQ(rvh_a, root_a->current_frame_host()->render_view_host());
+}
+
+// Make sure any subframe proxies are deleted after a navigation that uses
+// speculative RenderViewHosts.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest, SubframeProxies) {
+  // Disable BFCache because otherwise the BrowsingInstances will be proactively
+  // swapped and the navigation will not be same-SiteInstanceGroup, which is
+  // the only case a speculative RenderViewHost is used.
+  DisableBackForwardCache(
+      BackForwardCacheImpl::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE);
+
+  StartEmbeddedServer();
+
+  IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess());
+  // Open page A with a cross site subframe.
+  GURL url1(embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(b)"));
+  EXPECT_TRUE(NavigateToURL(shell(), url1));
+
+  // Expect that there are proxies to the subframe.
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  FrameTreeNode* root_a = web_contents->GetPrimaryFrameTree().root();
+  FrameTreeNode* subframe = root_a->current_frame_host()->child_at(0);
+  SiteInstanceGroup* site_instance_group_b =
+      subframe->current_frame_host()->GetSiteInstance()->group();
+  EXPECT_TRUE(root_a->current_frame_host()
+                  ->browsing_context_state()
+                  ->GetRenderFrameProxyHost(site_instance_group_b));
+
+  // Open a different page, without subframes, in SiteInstanceGroup A. Stop the
+  // navigation when there's a speculative RenderFrameHost for page 2.
+  GURL url2(embedded_test_server()->GetURL("a.com", "/title2.html"));
+  TestNavigationManager navigation(web_contents, url2);
+  shell()->LoadURL(url2);
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+
+  // Make sure a speculative RenderViewHost is involved.
+  FrameTree& frame_tree = web_contents->GetPrimaryFrameTree();
+  EXPECT_TRUE(frame_tree.speculative_render_view_host());
+
+  // Complete the navigation. Expect that there is no longer a speculative
+  // RenderViewHost, or any proxies.
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+  EXPECT_FALSE(frame_tree.speculative_render_view_host());
+  EXPECT_EQ(0u, root_a->current_frame_host()
+                    ->browsing_context_state()
+                    ->proxy_hosts()
+                    .size());
+}
+
+// Crash a page, then navigate to a same-site URL. The new navigation should use
+// a new RenderFrameHost and speculative RenderViewHost.
+// TODO(crbug.com/1336305, yangsharon): This navigation is not using a
+// speculative RenderViewHost, when it should be. Fix and enable this test.
+IN_PROC_BROWSER_TEST_P(SpeculativeRenderViewHostTest,
+                       DISABLED_CrashedRenderFrameHost) {
+  // Disable BFCache because otherwise the BrowsingInstances will be proactively
+  // swapped and the navigation will not be same-SiteInstanceGroup, which is
+  // the only case a speculative RenderViewHost is used.
+  DisableBackForwardCache(
+      BackForwardCacheImpl::TEST_ASSUMES_NO_RENDER_FRAME_CHANGE);
+
+  StartEmbeddedServer();
+
+  // Open a page in SiteInstanceGroup A.
+  GURL url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  WebContentsImpl* web_contents =
+      static_cast<WebContentsImpl*>(shell()->web_contents());
+  TestNavigationObserver observer(web_contents);
+
+  // Crash the page.
+  RenderProcessHost* process =
+      web_contents->GetPrimaryMainFrame()->GetProcess();
+  RenderProcessHostWatcher crash_observer(
+      process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
+  process->Shutdown(0);
+  crash_observer.Wait();
+
+  // Navigate to a same SiteInstanceGroup URL.
+  GURL url2(embedded_test_server()->GetURL("a.com", "/title2.html"));
+  TestNavigationManager navigation(web_contents, url2);
+  shell()->LoadURL(url);
+  EXPECT_TRUE(navigation.WaitForRequestStart());
+
+  // Check that a speculative RenderViewHost is used for the navigation.
+  FrameTree& frame_tree = web_contents->GetPrimaryFrameTree();
+  RenderFrameHostImpl* speculative_rfh =
+      frame_tree.root()->render_manager()->speculative_frame_host();
+  EXPECT_TRUE(speculative_rfh);
+  EXPECT_TRUE(frame_tree.speculative_render_view_host());
+  RenderViewHostImpl* speculative_rvh = speculative_rfh->render_view_host();
+  EXPECT_EQ(speculative_rvh->rvh_map_id(),
+            frame_tree.GetRenderViewHostMapId(
+                speculative_rfh->GetSiteInstance()->group()));
+
+  // Expect that the speculative RenderViewHost was swapped in correctly.
+  EXPECT_TRUE(navigation.WaitForNavigationFinished());
+  EXPECT_EQ(frame_tree.root()->current_frame_host()->render_view_host(),
+            speculative_rvh);
+  EXPECT_FALSE(frame_tree.speculative_render_view_host());
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    SpeculativeRenderViewHostTest,
+    testing::ValuesIn(RenderDocumentFeatureFullyEnabled()));
+
+}  // namespace content
diff --git a/content/browser/sms/sms_browsertest.cc b/content/browser/sms/sms_browsertest.cc
index 2339b70..58729a7 100644
--- a/content/browser/sms/sms_browsertest.cc
+++ b/content/browser/sms/sms_browsertest.cc
@@ -1259,8 +1259,9 @@
                     const std::string&,
                     base::OnceCallback<void()> on_confirm,
                     base::OnceCallback<void()> on_cancel));
-  bool IsPrerender2Supported(WebContents& web_contents) override {
-    return true;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override {
+    return PreloadingEligibility::kEligible;
   }
 };
 
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 25e7826..39109dd 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -9596,8 +9596,12 @@
   prerender2_disabled_ = false;
 }
 
-bool WebContentsImpl::IsPrerender2Disabled() {
-  return prerender2_disabled_ || !GetDelegate()->IsPrerender2Supported(*this);
+PreloadingEligibility WebContentsImpl::IsPrerender2Disabled() {
+  if (prerender2_disabled_) {
+    return PreloadingEligibility::kPreloadingDisabled;
+  }
+
+  return GetDelegate()->IsPrerender2Supported(*this);
 }
 
 void WebContentsImpl::AboutToBeDiscarded(WebContents* new_contents) {
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 8d30bd7..a100c626 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -585,7 +585,7 @@
   void ResetPrerender2Disabled() override;
   // Resets the bit to explicitly disable Prerender2 for this WebContents. Note
   // that this may not equate to the feature being enabled.
-  bool IsPrerender2Disabled();
+  PreloadingEligibility IsPrerender2Disabled();
 
   void AboutToBeDiscarded(WebContents* new_contents) override;
 
diff --git a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java
index fc05d31..441ccfb 100644
--- a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java
@@ -51,8 +51,10 @@
     private final WebContentsImpl mWebContents;
     private final ObserverList<GestureStateListener> mListeners;
     private final RewindableIterator<GestureStateListener> mIterator;
+    private final SelectionPopupControllerImpl mSelectionPopupController;
     private ViewAndroidDelegate mViewDelegate;
     private InternalAccessDelegate mScrollDelegate;
+    private final Point mRootScrollOffsetStruct = new Point();
 
     private long mNativeGestureListenerManager;
 
@@ -93,6 +95,7 @@
         mWebContents = (WebContentsImpl) webContents;
         mListeners = new ObserverList<GestureStateListener>();
         mIterator = mListeners.rewindableIterator();
+        mSelectionPopupController = SelectionPopupControllerImpl.fromWebContents(mWebContents);
         mViewDelegate = mWebContents.getViewAndroidDelegate();
         mViewDelegate.addVerticalScrollDirectionChangeListener(this);
         WindowEventObserverManager.from(mWebContents).addObserver(this);
@@ -300,11 +303,11 @@
      * @param scrollOffsetX Horizontal scroll offset in pixels.
      * @param scrollOffsetY Vertical scroll offset in pixels.
      */
-    private static @Nullable Point getRootScrollOffsetStruct(
-            float scrollOffsetX, float scrollOffsetY) {
+    private @Nullable Point getRootScrollOffsetStruct(float scrollOffsetX, float scrollOffsetY) {
         if (scrollOffsetX < 0 || scrollOffsetY < 0) return null;
 
-        return new Point((int) scrollOffsetX, (int) scrollOffsetY);
+        mRootScrollOffsetStruct.set((int) scrollOffsetX, (int) scrollOffsetY);
+        return mRootScrollOffsetStruct;
     }
 
     /**
@@ -335,8 +338,7 @@
     }
 
     private void destroyPastePopup() {
-        SelectionPopupControllerImpl controller = getSelectionPopupController();
-        if (controller != null) controller.destroyPastePopup();
+        if (mSelectionPopupController != null) mSelectionPopupController.destroyPastePopup();
     }
 
     @CalledByNative
@@ -457,7 +459,7 @@
         // Use the active scroll signal for hiding. The animation movement by
         // fling will naturally hide the ActionMode by invalidating its content
         // rect.
-        getSelectionPopupController().setScrollInProgress(isScrollInProgress());
+        mSelectionPopupController.setScrollInProgress(isScrollInProgress());
     }
 
     /**
@@ -475,10 +477,6 @@
         resetFlingGesture();
     }
 
-    private SelectionPopupControllerImpl getSelectionPopupController() {
-        return SelectionPopupControllerImpl.fromWebContents(mWebContents);
-    }
-
     /**
      * Offer a long press gesture to the embedding View, primarily for WebView compatibility.
      *
diff --git a/content/public/android/junit/src/org/chromium/content/browser/GestureListenerManagerImplUnitTest.java b/content/public/android/junit/src/org/chromium/content/browser/GestureListenerManagerImplUnitTest.java
index 8383dff8..77bd8a2 100644
--- a/content/public/android/junit/src/org/chromium/content/browser/GestureListenerManagerImplUnitTest.java
+++ b/content/public/android/junit/src/org/chromium/content/browser/GestureListenerManagerImplUnitTest.java
@@ -9,7 +9,6 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
 import android.graphics.Point;
@@ -20,8 +19,6 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnit;
@@ -55,8 +52,6 @@
     GestureListenerManagerImpl.Natives mMockJniGestureListenerManager;
     @Mock
     GestureStateListenerWithScroll mGestureStateListener;
-    @Captor
-    ArgumentCaptor<Point> mPointCaptor;
 
     private GestureListenerManagerImpl mGestureManager;
 
@@ -96,17 +91,11 @@
 
         mGestureManager.onEventAck(EventType.GESTURE_SCROLL_UPDATE, /*consumed*/ true,
                 /*scrollOffsetX*/ 0.f, /*scrollOffsetY*/ 1.f);
+        verify(mGestureStateListener).onScrollUpdateGestureConsumed(eq(new Point(0, 1)));
+        Mockito.reset(mGestureStateListener);
         mGestureManager.onEventAck(EventType.GESTURE_SCROLL_UPDATE, /*consumed*/ true,
                 /*scrollOffsetX*/ 1.f, /*scrollOffsetY*/ 0.f);
-        verify(mGestureStateListener, times(2))
-                .onScrollUpdateGestureConsumed(mPointCaptor.capture());
-
-        Assert.assertEquals(
-                "Number of points captured is different.", 2, mPointCaptor.getAllValues().size());
-        Assert.assertEquals(
-                "Points doesn't match.", new Point(0, 1), mPointCaptor.getAllValues().get(0));
-        Assert.assertEquals(
-                "Points doesn't match.", new Point(1, 0), mPointCaptor.getAllValues().get(1));
+        verify(mGestureStateListener).onScrollUpdateGestureConsumed(eq(new Point(1, 0)));
 
         mGestureManager.onEventAck(EventType.GESTURE_SCROLL_END, /*consumed*/ true,
                 /*scrollOffsetX*/ 0.f, /*scrollOffsetY*/ 0.f);
diff --git a/content/public/browser/web_contents_delegate.cc b/content/public/browser/web_contents_delegate.cc
index 7122abf..3c6897e 100644
--- a/content/public/browser/web_contents_delegate.cc
+++ b/content/public/browser/web_contents_delegate.cc
@@ -354,8 +354,11 @@
   return false;
 }
 
-bool WebContentsDelegate::IsPrerender2Supported(WebContents& web_contents) {
-  return false;
+content::PreloadingEligibility WebContentsDelegate::IsPrerender2Supported(
+    WebContents& web_contents) {
+  // TODO(crbug.com/1382315): add
+  // PreloadingEligibility::kPreloadingUnsupportedByWebContents
+  return content::PreloadingEligibility::kPreloadingDisabled;
 }
 
 std::unique_ptr<WebContents> WebContentsDelegate::ActivatePortalWebContents(
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h
index 3cec5f88..2717fd39 100644
--- a/content/public/browser/web_contents_delegate.h
+++ b/content/public/browser/web_contents_delegate.h
@@ -705,9 +705,11 @@
   // indication that the cache will be used.
   virtual bool IsBackForwardCacheSupported();
 
-  // Returns true if Prerender2 (see
+  // Returns content::PreloadingEligibility::kEligible if Prerender2 (see
   // content/browser/preloading/prerender/README.md for details) is supported.
-  virtual bool IsPrerender2Supported(WebContents& web_contents);
+  // If it is not supported, returns the reason.
+  virtual content::PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents);
 
   // Requests the delegate to replace |predecessor_contents| with
   // |portal_contents| in the container that holds |predecessor_contents|. If
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index 2d15cd6..440f3f45 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -531,9 +531,9 @@
   ToRenderFrameHost(T* frame_convertible_value)
       : render_frame_host_(ConvertToRenderFrameHost(frame_convertible_value)) {}
 
-  template <typename T, typename RawPtrType>
+  template <typename T, typename Traits>
   // NOLINTNEXTLINE(google-explicit-constructor)
-  ToRenderFrameHost(const raw_ptr<T, RawPtrType>& frame_convertible_value)
+  ToRenderFrameHost(const raw_ptr<T, Traits>& frame_convertible_value)
       : ToRenderFrameHost(frame_convertible_value.get()) {}
 
   // Extract the underlying frame.
diff --git a/content/public/test/prerender_test_util.cc b/content/public/test/prerender_test_util.cc
index 395a941..6474fc3 100644
--- a/content/public/test/prerender_test_util.cc
+++ b/content/public/test/prerender_test_util.cc
@@ -561,9 +561,9 @@
     web_contents_.get()->SetDelegate(nullptr);
 }
 
-bool ScopedPrerenderWebContentsDelegate::IsPrerender2Supported(
+PreloadingEligibility ScopedPrerenderWebContentsDelegate::IsPrerender2Supported(
     WebContents& web_contents) {
-  return true;
+  return PreloadingEligibility::kEligible;
 }
 
 }  // namespace test
diff --git a/content/public/test/prerender_test_util.h b/content/public/test/prerender_test_util.h
index 3ac6b1e..2233d56d 100644
--- a/content/public/test/prerender_test_util.h
+++ b/content/public/test/prerender_test_util.h
@@ -210,7 +210,8 @@
   ~ScopedPrerenderWebContentsDelegate() override;
 
   // WebContentsDelegate override.
-  bool IsPrerender2Supported(content::WebContents& web_contents) override;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override;
 
  private:
   base::WeakPtr<WebContents> web_contents_;
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.cc b/content/renderer/media/renderer_webaudiodevice_impl.cc
index 0061cf7..ea29dc7 100644
--- a/content/renderer/media/renderer_webaudiodevice_impl.cc
+++ b/content/renderer/media/renderer_webaudiodevice_impl.cc
@@ -92,10 +92,9 @@
 
 media::AudioParameters GetOutputDeviceParameters(
     const blink::LocalFrameToken& frame_token,
-    const base::UnguessableToken& session_id,
     const std::string& device_id) {
   return AudioDeviceFactory::GetInstance()
-      ->GetOutputDeviceInfo(frame_token, {session_id, device_id})
+      ->GetOutputDeviceInfo(frame_token, {base::UnguessableToken(), device_id})
       .output_params();
 }
 
@@ -111,12 +110,11 @@
     media::ChannelLayout layout,
     int number_of_output_channels,
     const blink::WebAudioLatencyHint& latency_hint,
-    media::AudioRendererSink::RenderCallback* callback,
-    const base::UnguessableToken& session_id) {
+    media::AudioRendererSink::RenderCallback* callback) {
   return std::unique_ptr<RendererWebAudioDeviceImpl>(
       new RendererWebAudioDeviceImpl(
           sink_descriptor, layout, number_of_output_channels, latency_hint,
-          callback, session_id, base::BindOnce(&GetOutputDeviceParameters),
+          callback, base::BindOnce(&GetOutputDeviceParameters),
           base::BindRepeating(&GetNullAudioSink)));
 }
 
@@ -126,13 +124,11 @@
     int number_of_output_channels,
     const blink::WebAudioLatencyHint& latency_hint,
     media::AudioRendererSink::RenderCallback* callback,
-    const base::UnguessableToken& session_id,
     OutputDeviceParamsCallback device_params_cb,
     CreateSilentSinkCallback create_silent_sink_cb)
     : sink_descriptor_(sink_descriptor),
       latency_hint_(latency_hint),
       client_callback_(callback),
-      session_id_(session_id),
       frame_token_(sink_descriptor.Token()),
       create_silent_sink_cb_(std::move(create_silent_sink_cb)) {
   DCHECK(client_callback_);
@@ -150,7 +146,7 @@
   }
 
   media::AudioParameters hardware_params(
-      std::move(device_params_cb).Run(frame_token_, session_id_, device_id));
+      std::move(device_params_cb).Run(frame_token_, device_id));
 
   // On systems without audio hardware the returned parameters may be invalid.
   // In which case just choose whatever we want for the fake device.
@@ -196,7 +192,7 @@
     case blink::WebAudioSinkDescriptor::kAudible:
       sink_ = AudioDeviceFactory::GetInstance()->NewAudioRendererSink(
           GetLatencyHintSourceType(latency_hint_.Category()), frame_token_,
-          media::AudioSinkParameters(session_id_,
+          media::AudioSinkParameters(base::UnguessableToken(),
                                      sink_descriptor_.SinkId().Utf8()));
 
       // Use a task runner instead of the render thread for fake Render() calls
@@ -296,14 +292,7 @@
 }
 
 void RendererWebAudioDeviceImpl::SendLogMessage(const std::string& message) {
-  if (session_id_.is_empty()) {
-    blink::WebRtcLogMessage(
-        base::StringPrintf("[WA]RWADI::%s", message.c_str()));
-  } else {
-    blink::WebRtcLogMessage(base::StringPrintf("[WA]RWADI::%s [session_id=%s]",
-                                               message.c_str(),
-                                               session_id_.ToString().c_str()));
-  }
+  blink::WebRtcLogMessage(base::StringPrintf("[WA]RWADI::%s", message.c_str()));
 }
 
 }  // namespace content
diff --git a/content/renderer/media/renderer_webaudiodevice_impl.h b/content/renderer/media/renderer_webaudiodevice_impl.h
index 596c183..c6e8fc1 100644
--- a/content/renderer/media/renderer_webaudiodevice_impl.h
+++ b/content/renderer/media/renderer_webaudiodevice_impl.h
@@ -47,8 +47,7 @@
       media::ChannelLayout layout,
       int number_of_output_channels,
       const blink::WebAudioLatencyHint& latency_hint,
-      media::AudioRendererSink::RenderCallback* callback,
-      const base::UnguessableToken& session_id);
+      media::AudioRendererSink::RenderCallback* callback);
 
   // blink::WebAudioDevice implementation.
   void Start() override;
@@ -81,7 +80,6 @@
   // Callback to get output device params (for tests).
   using OutputDeviceParamsCallback = base::OnceCallback<media::AudioParameters(
       const blink::LocalFrameToken& frame_token,
-      const base::UnguessableToken& session_id,
       const std::string& device_id)>;
 
   using CreateSilentSinkCallback =
@@ -94,7 +92,6 @@
       int number_of_output_channels,
       const blink::WebAudioLatencyHint& latency_hint,
       media::AudioRendererSink::RenderCallback* callback,
-      const base::UnguessableToken& session_id,
       OutputDeviceParamsCallback device_params_cb,
       CreateSilentSinkCallback create_silent_sink_cb);
 
@@ -120,9 +117,6 @@
   // When non-NULL, we are started.  When NULL, we are stopped.
   scoped_refptr<media::AudioRendererSink> sink_;
 
-  // ID to allow browser to select the correct input device for unified IO.
-  const base::UnguessableToken session_id_;
-
   // Used to suspend |sink_| usage when silence has been detected for too long.
   std::unique_ptr<media::SilentSinkSuspender> silent_sink_suspender_;
 
diff --git a/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc b/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc
index ece701fe..d1dc164 100644
--- a/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc
+++ b/content/renderer/media/renderer_webaudiodevice_impl_unittest.cc
@@ -61,7 +61,6 @@
 
 media::AudioParameters MockGetOutputDeviceParameters(
     const blink::LocalFrameToken& frame_token,
-    const base::UnguessableToken& session_id,
     const std::string& device_id) {
   return media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
                                 media::ChannelLayoutConfig::Stereo(),
@@ -76,7 +75,6 @@
       int number_of_output_channels,
       const blink::WebAudioLatencyHint& latency_hint,
       media::AudioRendererSink::RenderCallback* callback,
-      const base::UnguessableToken& session_id,
       CreateSilentSinkCallback silent_sink_callback)
       : RendererWebAudioDeviceImpl(
             sink_descriptor,
@@ -84,7 +82,6 @@
             number_of_output_channels,
             latency_hint,
             callback,
-            session_id,
             base::BindOnce(&MockGetOutputDeviceParameters),
             std::move(silent_sink_callback)) {}
 };
@@ -121,7 +118,6 @@
         blink::WebString::FromUTF8(std::string()), kFrameToken);
     webaudio_device_ = std::make_unique<RendererWebAudioDeviceImplUnderTest>(
         sink_descriptor, media::CHANNEL_LAYOUT_MONO, 1, latencyHint, this,
-        base::UnguessableToken(),
         base::BindRepeating(
             &RendererWebAudioDeviceImplTest::MockCreateSilentSink,
             // Guaranteed to be valid because |this| owns |webaudio_device_| and
@@ -138,7 +134,7 @@
         sink_descriptor, layout, channels,
         blink::WebAudioLatencyHint(
             blink::WebAudioLatencyHint::kCategoryInteractive),
-        this, base::UnguessableToken(),
+        this,
         base::BindRepeating(
             &RendererWebAudioDeviceImplTest::MockCreateSilentSink,
             // Guaranteed to be valid because |this| owns |webaudio_device_| and
@@ -153,7 +149,7 @@
         sink_descriptor, media::CHANNEL_LAYOUT_MONO, 1,
         blink::WebAudioLatencyHint(
             blink::WebAudioLatencyHint::kCategoryInteractive),
-        this, base::UnguessableToken(),
+        this,
         base::BindRepeating(
             &RendererWebAudioDeviceImplTest::MockCreateSilentSink,
             // Guaranteed to be valid because |this| owns |webaudio_device_| and
@@ -170,8 +166,7 @@
     scoped_refptr<media::MockAudioRendererSink> mock_sink =
         new media::MockAudioRendererSink(
             params.device_id, media::OUTPUT_DEVICE_STATUS_OK,
-            MockGetOutputDeviceParameters(frame_token, params.session_id,
-                                          params.device_id));
+            MockGetOutputDeviceParameters(frame_token, params.device_id));
 
     EXPECT_CALL(*mock_sink.get(), Start());
     EXPECT_CALL(*mock_sink.get(), Play());
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
index 3eb8c86..97cfabc1 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -90,12 +90,19 @@
     if (is_single_buffered_)
       usage |= gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
 
+    // It's possible to create Graphics3D with zero size. To avoid creating
+    // shared image with zero size which will fail, we create 1x1. This matches
+    // legacy behaviour where command decoders would use 1x1 for any empty
+    // `offscreen_framebuffer_size`. Note, that to avoid any size mismatches, we
+    // keep `size_` intact.
+    auto shared_image_size = size.IsEmpty() ? gfx::Size(1, 1) : size;
+
     // Note, that we intentionally don't handle SCANOUT here. While
     // kPepper3DImageChromium is enabled on some CrOS devices, SkiaRenderer
     // don't support overlays for legacy mailboxes. To avoid any problems with
     // overlays, we don't introduce them here.
     mailbox_ = sii_->CreateSharedImage(
-        has_alpha ? viz::RGBA_8888 : viz::RGBX_8888, size,
+        has_alpha ? viz::RGBA_8888 : viz::RGBX_8888, shared_image_size,
         gfx::ColorSpace::CreateSRGB(), kTopLeft_GrSurfaceOrigin,
         kUnpremul_SkAlphaType, usage, gpu::SurfaceHandle());
 
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index ba197fd..360924f 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -489,11 +489,9 @@
     layout = media::CHANNEL_LAYOUT_DISCRETE;
   }
 
-  // Using `UnguessableToken()` prevents from guessing the session ID to gain
-  // access to a capture stream.
-  return RendererWebAudioDeviceImpl::Create(
-      sink_descriptor, layout, number_of_output_channels, latency_hint,
-      callback, /*session_id=*/base::UnguessableToken());
+  return RendererWebAudioDeviceImpl::Create(sink_descriptor, layout,
+                                            number_of_output_channels,
+                                            latency_hint, callback);
 }
 
 bool RendererBlinkPlatformImpl::DecodeAudioFileData(
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc
index 6a1878b..e50043b 100644
--- a/content/shell/browser/shell.cc
+++ b/content/shell/browser/shell.cc
@@ -640,8 +640,8 @@
   return true;
 }
 
-bool Shell::IsPrerender2Supported(WebContents& web_contents) {
-  return true;
+PreloadingEligibility Shell::IsPrerender2Supported(WebContents& web_contents) {
+  return PreloadingEligibility::kEligible;
 }
 
 std::unique_ptr<WebContents> Shell::ActivatePortalWebContents(
diff --git a/content/shell/browser/shell.h b/content/shell/browser/shell.h
index d77a5d2..a5b5842 100644
--- a/content/shell/browser/shell.h
+++ b/content/shell/browser/shell.h
@@ -162,7 +162,8 @@
       base::RepeatingClosure hang_monitor_restarter) override;
   void ActivateContents(WebContents* contents) override;
   bool IsBackForwardCacheSupported() override;
-  bool IsPrerender2Supported(WebContents& web_contents) override;
+  PreloadingEligibility IsPrerender2Supported(
+      WebContents& web_contents) override;
   std::unique_ptr<WebContents> ActivatePortalWebContents(
       WebContents* predecessor_contents,
       std::unique_ptr<WebContents> portal_contents) override;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index d5b94ba7..27e10e0 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1427,6 +1427,7 @@
     "../browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc",
     "../browser/renderer_host/scroll_into_view_browsertest.cc",
     "../browser/renderer_host/sec_fetch_browsertest.cc",
+    "../browser/renderer_host/speculative_render_view_host_browsertest.cc",
     "../browser/renderer_host/unassigned_site_instance_browsertest.cc",
     "../browser/resource_loading_browsertest.cc",
     "../browser/screen_details/screen_details_browsertest.cc",
diff --git a/content/test/attribution_simulator_impl.cc b/content/test/attribution_simulator_impl.cc
index 44152c9..3c725aa 100644
--- a/content/test/attribution_simulator_impl.cc
+++ b/content/test/attribution_simulator_impl.cc
@@ -299,8 +299,8 @@
         base::BindOnce(&AttributionManagerImpl::ClearData,
                        base::Unretained(manager_), clear.delete_begin,
                        clear.delete_end, std::move(filter),
-                       /*filter_builder=*/nullptr,
-                       /*delete_rate_limit_data=*/true, base::DoNothing()));
+                       /*filter_builder=*/nullptr, clear.delete_rate_limit_data,
+                       base::DoNothing()));
   }
 
   base::Value::Dict TakeOutput() {
diff --git a/content/test/attribution_simulator_input_parser.cc b/content/test/attribution_simulator_input_parser.cc
index 0ecaca4..471a42c 100644
--- a/content/test/attribution_simulator_input_parser.cc
+++ b/content/test/attribution_simulator_input_parser.cc
@@ -218,11 +218,15 @@
           }));
     }
 
+    bool delete_rate_limit_data =
+        ParseBool(dict, "delete_rate_limit_data").value_or(true);
+
     if (has_error())
       return;
 
     events_.push_back(AttributionDataClear(time, delete_begin, delete_end,
-                                           std::move(origin_set)));
+                                           std::move(origin_set),
+                                           delete_rate_limit_data));
   }
 
   void ParseSource(base::Value&& source) {
@@ -335,6 +339,23 @@
     return base::Time();
   }
 
+  absl::optional<bool> ParseBool(const base::Value::Dict& dict,
+                                 base::StringPiece key) {
+    auto context = PushContext(key);
+
+    const base::Value* v = dict.Find(key);
+    if (!v) {
+      return absl::nullopt;
+    }
+
+    if (!v->is_bool()) {
+      *Error() << "must be a bool";
+      return absl::nullopt;
+    }
+
+    return v->GetBool();
+  }
+
   absl::optional<AttributionSourceType> ParseSourceType(
       const base::Value::Dict& dict) {
     static constexpr char kKey[] = "source_type";
@@ -395,11 +416,13 @@
     base::Time time,
     base::Time delete_begin,
     base::Time delete_end,
-    absl::optional<base::flat_set<url::Origin>> origins)
+    absl::optional<base::flat_set<url::Origin>> origins,
+    bool delete_rate_limit_data)
     : time(time),
       delete_begin(delete_begin),
       delete_end(delete_end),
-      origins(std::move(origins)) {}
+      origins(std::move(origins)),
+      delete_rate_limit_data(delete_rate_limit_data) {}
 
 AttributionDataClear::~AttributionDataClear() = default;
 
diff --git a/content/test/attribution_simulator_input_parser.h b/content/test/attribution_simulator_input_parser.h
index aa5b4f9..630bf7a2 100644
--- a/content/test/attribution_simulator_input_parser.h
+++ b/content/test/attribution_simulator_input_parser.h
@@ -44,11 +44,13 @@
   base::Time delete_end;
   // If null, matches all origins.
   absl::optional<base::flat_set<url::Origin>> origins;
+  bool delete_rate_limit_data;
 
   AttributionDataClear(base::Time time,
                        base::Time delete_begin,
                        base::Time delete_end,
-                       absl::optional<base::flat_set<url::Origin>> origins);
+                       absl::optional<base::flat_set<url::Origin>> origins,
+                       bool delete_rate_limit_data);
 
   ~AttributionDataClear();
 
diff --git a/content/test/attribution_simulator_input_parser_unittest.cc b/content/test/attribution_simulator_input_parser_unittest.cc
index c60f595..20c776d 100644
--- a/content/test/attribution_simulator_input_parser_unittest.cc
+++ b/content/test/attribution_simulator_input_parser_unittest.cc
@@ -59,7 +59,8 @@
 
 bool operator==(const AttributionDataClear& a, const AttributionDataClear& b) {
   return a.time == b.time && a.delete_begin == b.delete_begin &&
-         a.delete_end == b.delete_end && a.origins == b.origins;
+         a.delete_end == b.delete_end && a.origins == b.origins &&
+         a.delete_rate_limit_data == b.delete_rate_limit_data;
 }
 
 std::ostream& operator<<(std::ostream& out, const AttributionDataClear& c) {
@@ -80,7 +81,7 @@
     out << "null";
   }
 
-  return out;
+  return out << ",delete_rate_limit_data=" << c.delete_rate_limit_data << "}";
 }
 
 namespace {
@@ -507,7 +508,8 @@
       "origins": [
         "https://r.test",
         "https://s.test"
-      ]
+      ],
+      "delete_rate_limit_data": false
     }
   ]})json";
 
@@ -521,7 +523,8 @@
               /*time=*/kOffsetTime + base::Milliseconds(1643235574123),
               /*delete_begin=*/kOffsetTime + base::Milliseconds(1643235573123),
               /*delete_end=*/base::Time::Max(),
-              /*origins=*/absl::nullopt),
+              /*origins=*/absl::nullopt,
+              /*delete_rate_limit_data=*/true),
           AttributionDataClear(
               /*time=*/kOffsetTime + base::Milliseconds(1643235574123),
               /*delete_begin=*/base::Time::Min(),
@@ -530,7 +533,8 @@
               base::flat_set<url::Origin>{
                   url::Origin::Create(GURL("https://r.test")),
                   url::Origin::Create(GURL("https://s.test")),
-              }))));
+              },
+              /*delete_rate_limit_data=*/false))));
   EXPECT_THAT(error_stream.str(), IsEmpty());
 }
 
diff --git a/content/test/gpu/unexpected_pass_finder.py b/content/test/gpu/unexpected_pass_finder.py
index 894fa93..341b9909 100755
--- a/content/test/gpu/unexpected_pass_finder.py
+++ b/content/test/gpu/unexpected_pass_finder.py
@@ -165,13 +165,6 @@
                         'etc. may still need to be removed.\n' %
                         expectation_file)
 
-  # These two options are mutually exclusive.
-  if args.modify_semi_stale_expectations:
-    affected_urls |= expectations_instance.ModifySemiStaleExpectations(
-        semi_stale)
-    stale_message += ('Semi-stale expectations modified in %s. Stale '
-                      'comments, etc. may still need to be removed.\n' %
-                      args.expectation_file)
   if args.narrow_semi_stale_expectation_scope:
     affected_urls |= expectations_instance.NarrowSemiStaleExpectationScope(
         semi_stale)
diff --git a/content/test/render_document_feature.cc b/content/test/render_document_feature.cc
index e6de788..2a00020 100644
--- a/content/test/render_document_feature.cc
+++ b/content/test/render_document_feature.cc
@@ -20,12 +20,20 @@
 }
 
 std::vector<std::string> RenderDocumentFeatureLevelValues() {
+  // TODO(https://crbug.com/936696, rakina): Handle the
+  // RenderDocumentLevel::kAllFrames case.
   return {
       GetRenderDocumentLevelName(RenderDocumentLevel::kCrashedFrame),
       GetRenderDocumentLevelName(RenderDocumentLevel::kSubframe),
   };
 }
 
+std::vector<std::string> RenderDocumentFeatureFullyEnabled() {
+  return {
+      GetRenderDocumentLevelName(RenderDocumentLevel::kAllFrames),
+  };
+}
+
 std::string GetRenderDocumentLevelNameForTestParams(
     std::string render_document_level) {
   if (render_document_level ==
diff --git a/content/test/render_document_feature.h b/content/test/render_document_feature.h
index 816343ba..03363a0 100644
--- a/content/test/render_document_feature.h
+++ b/content/test/render_document_feature.h
@@ -25,6 +25,12 @@
 // The list of values to test for the "level" parameter.
 std::vector<std::string> RenderDocumentFeatureLevelValues();
 
+// Returns a list containing only the highest level of RenderDocument enabled
+// in the "level" parameter. This is useful for RenderDocument tests that expect
+// to enable the mode via this parameter, even if this is the only mode being
+// tested.
+std::vector<std::string> RenderDocumentFeatureFullyEnabled();
+
 // Returns the name for |render_document_level| that's valid for test params
 // (only contains alphanumeric characters or underscores).
 std::string GetRenderDocumentLevelNameForTestParams(
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc
index 028928c..e12bf00a 100644
--- a/content/test/test_render_view_host.cc
+++ b/content/test/test_render_view_host.cc
@@ -352,7 +352,8 @@
     RenderViewHostDelegate* delegate,
     int32_t routing_id,
     int32_t main_frame_routing_id,
-    scoped_refptr<BrowsingContextState> main_browsing_context_state)
+    scoped_refptr<BrowsingContextState> main_browsing_context_state,
+    CreateRenderViewHostCase create_case)
     : RenderViewHostImpl(frame_tree,
                          group,
                          storage_partition_config,
@@ -361,7 +362,8 @@
                          routing_id,
                          main_frame_routing_id,
                          false /* has_initialized_audio_host */,
-                         std::move(main_browsing_context_state)),
+                         std::move(main_browsing_context_state),
+                         create_case),
       delete_counter_(nullptr) {
   if (frame_tree->type() == FrameTree::Type::kFencedFrame) {
     // TestRenderWidgetHostViewChildFrame deletes itself in
diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h
index 91803e7..faef41a 100644
--- a/content/test/test_render_view_host.h
+++ b/content/test/test_render_view_host.h
@@ -266,7 +266,8 @@
       RenderViewHostDelegate* delegate,
       int32_t routing_id,
       int32_t main_frame_routing_id,
-      scoped_refptr<BrowsingContextState> main_browsing_context_state);
+      scoped_refptr<BrowsingContextState> main_browsing_context_state,
+      CreateRenderViewHostCase create_case);
 
   TestRenderViewHost(const TestRenderViewHost&) = delete;
   TestRenderViewHost& operator=(const TestRenderViewHost&) = delete;
diff --git a/content/test/test_render_view_host_factory.cc b/content/test/test_render_view_host_factory.cc
index 98c07b12..0d1668c7 100644
--- a/content/test/test_render_view_host_factory.cc
+++ b/content/test/test_render_view_host_factory.cc
@@ -47,14 +47,15 @@
     int32_t routing_id,
     int32_t main_frame_routing_id,
     int32_t widget_routing_id,
-    scoped_refptr<BrowsingContextState> main_browsing_context_state) {
+    scoped_refptr<BrowsingContextState> main_browsing_context_state,
+    CreateRenderViewHostCase create_case) {
   return new TestRenderViewHost(
       frame_tree, group, storage_partition_config,
       TestRenderWidgetHost::Create(frame_tree, widget_delegate,
                                    group->GetSafeRef(), widget_routing_id,
                                    false),
       delegate, routing_id, main_frame_routing_id,
-      std::move(main_browsing_context_state));
+      std::move(main_browsing_context_state), create_case);
 }
 
 }  // namespace content
diff --git a/content/test/test_render_view_host_factory.h b/content/test/test_render_view_host_factory.h
index 39fc9cd..2748630 100644
--- a/content/test/test_render_view_host_factory.h
+++ b/content/test/test_render_view_host_factory.h
@@ -42,7 +42,8 @@
       int32_t routing_id,
       int32_t main_frame_routing_id,
       int32_t widget_routing_id,
-      scoped_refptr<BrowsingContextState> main_browsing_context_state) override;
+      scoped_refptr<BrowsingContextState> main_browsing_context_state,
+      CreateRenderViewHostCase create_case) override;
 };
 
 }  // namespace content
diff --git a/docs/dangling_ptr_guide.md b/docs/dangling_ptr_guide.md
index faa7dcf..a416868 100644
--- a/docs/dangling_ptr_guide.md
+++ b/docs/dangling_ptr_guide.md
@@ -50,7 +50,7 @@
 This represents ~25% of the dangling pointers.
 
 In the majority of cases, this happens when dependent objects are declared in
-the wrong order in a class, causing the dependency to be released first, thus 
+the wrong order in a class, causing the dependency to be released first, thus
 creating a dangling pointer in the other.
 
 It is important to reorder them correctly to prevent pre-existing and future UAF
@@ -96,9 +96,10 @@
 // Usage:
 // raw_ptr<T, DisableDanglingPtrDetection> dangling_ptr;
 //
-// When using it, please provide a justification about what guarantees it will
-// never be dereferenced after becoming dangling.
-using DisableDanglingPtrDetection = base::RawPtrMayDangle;
+// When using it, please provide a justification about what guarantees that it
+// will never be dereferenced after becoming dangling.
+using DisableDanglingPtrDetection =
+    base::raw_ptr_traits::TraitBundle<base::raw_ptr_traits::MayDangle>;
 ```
 
 **In emergency situations**: `DanglingUntriaged` can be used similarly, in case
diff --git a/fuchsia_web/runners/cast/cast_runner_integration_test.cc b/fuchsia_web/runners/cast/cast_runner_integration_test.cc
index 4b5ad6e..931e907 100644
--- a/fuchsia_web/runners/cast/cast_runner_integration_test.cc
+++ b/fuchsia_web/runners/cast/cast_runner_integration_test.cc
@@ -958,7 +958,13 @@
 // Verifies that the ComponentController reports TerminationReason::EXITED and
 // exit code ZX_OK if the web content terminates itself.
 // TODO(https://crbug.com/1066833): Make this a WebRunner test.
-TEST_F(CastRunnerIntegrationTest, OnTerminated_WindowClose) {
+// TODO(crbug.com/1408810): Re-enable this test
+#if BUILDFLAG(IS_FUCHSIA)
+#define MAYBE_OnTerminated_WindowClose DISABLED_OnTerminated_WindowClose
+#else
+#define MAYBE_OnTerminated_WindowClose OnTerminated_WindowClose
+#endif
+TEST_F(CastRunnerIntegrationTest, MAYBE_OnTerminated_WindowClose) {
   TestCastComponent component(cast_runner());
   const GURL url = test_server().GetURL(kBlankAppUrl);
   app_config_manager().AddApp(kTestAppId, url);
diff --git a/gin/v8_initializer.cc b/gin/v8_initializer.cc
index 07b756a..c10536b3 100644
--- a/gin/v8_initializer.cc
+++ b/gin/v8_initializer.cc
@@ -9,6 +9,9 @@
 
 #include <cstdint>
 #include <memory>
+#include <string>
+#include <utility>
+#include <vector>
 
 #include "base/allocator/partition_allocator/page_allocator.h"
 #include "base/allocator/partition_allocator/partition_address_space.h"
@@ -41,10 +44,6 @@
 #include "v8/include/v8-initialization.h"
 #include "v8/include/v8-snapshot.h"
 
-#if BUILDFLAG(IS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
 #if defined(V8_USE_EXTERNAL_STARTUP_DATA)
 #if BUILDFLAG(IS_ANDROID)
 #include "base/android/apk_assets.h"
@@ -454,22 +453,6 @@
   const size_t min_pool_size = partition_alloc::internal::
       PartitionAddressSpace::ConfigurablePoolMinSize();
   size_t pool_size = max_pool_size;
-#if BUILDFLAG(IS_WIN)
-  // On Windows prior to 8.1 we allocate a smaller Pool since reserving
-  // virtual memory is expensive on these OSes.
-  if (base::win::GetVersion() < base::win::Version::WIN8_1) {
-    // The size chosen here should be synchronized with the size of the
-    // virtual memory reservation for the V8 sandbox on these platforms.
-    // Currently, that is 8GB, of which 4GB are used for V8's pointer
-    // compression region.
-    // TODO(saelo) give this constant a proper name and maybe move it
-    // somewhere else.
-    constexpr size_t kGB = 1ULL << 30;
-    pool_size = 4ULL * kGB;
-    DCHECK_LE(pool_size, max_pool_size);
-    DCHECK_GE(pool_size, min_pool_size);
-  }
-#endif
   // Try to reserve the maximum size of the pool at first, then keep halving
   // the size on failure until it succeeds.
   uintptr_t pool_base = 0;
diff --git a/headless/lib/browser/headless_browser_impl.cc b/headless/lib/browser/headless_browser_impl.cc
index e16d684..9e4ca64d 100644
--- a/headless/lib/browser/headless_browser_impl.cc
+++ b/headless/lib/browser/headless_browser_impl.cc
@@ -148,7 +148,6 @@
 
 void HeadlessBrowserImpl::Shutdown() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  did_shutdown_ = true;
 
   weak_ptr_factory_.InvalidateWeakPtrs();
   // Make sure GetAllBrowserContexts is sane if called after this point.
@@ -199,8 +198,6 @@
     HeadlessBrowserContext::Builder* builder) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  CHECK(!did_shutdown_);
-
   auto browser_context = HeadlessBrowserContextImpl::Create(builder);
   HeadlessBrowserContext* result = browser_context.get();
   browser_contexts_[browser_context->Id()] = std::move(browser_context);
diff --git a/headless/lib/browser/headless_browser_impl.h b/headless/lib/browser/headless_browser_impl.h
index a43fd8f..8c8e671 100644
--- a/headless/lib/browser/headless_browser_impl.h
+++ b/headless/lib/browser/headless_browser_impl.h
@@ -121,8 +121,6 @@
   policy::PolicyService* GetPolicyService();
 #endif
 
-  bool did_shutdown() const { return did_shutdown_; }
-
  private:
 #if BUILDFLAG(IS_MAC)
   std::unique_ptr<display::ScopedNativeScreen> screen_;
@@ -137,7 +135,6 @@
       browser_contexts_;
   raw_ptr<HeadlessBrowserContext, DanglingUntriaged> default_browser_context_ =
       nullptr;
-  bool did_shutdown_ = false;  // TODO(1342152): remove once the bug is fixed.
   scoped_refptr<content::DevToolsAgentHost> agent_host_;
   std::unique_ptr<HeadlessRequestContextManager>
       system_request_context_manager_;
diff --git a/headless/lib/headless_content_main_delegate.cc b/headless/lib/headless_content_main_delegate.cc
index 6283b5f..a6723a32 100644
--- a/headless/lib/headless_content_main_delegate.cc
+++ b/headless/lib/headless_content_main_delegate.cc
@@ -380,7 +380,6 @@
                              "HeadlessContentMainDelegate::RunProcess";
 
   browser_runner->Run();
-  CHECK(browser_->did_shutdown());
   browser_runner->Shutdown();
   browser_.reset();
 
diff --git a/ios/chrome/browser/ui/bookmarks/BUILD.gn b/ios/chrome/browser/ui/bookmarks/BUILD.gn
index fe08fed..2c7ab429 100644
--- a/ios/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/ios/chrome/browser/ui/bookmarks/BUILD.gn
@@ -5,13 +5,6 @@
 source_set("bookmarks") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "bookmark_home_consumer.h",
-    "bookmark_home_mediator.h",
-    "bookmark_home_mediator.mm",
-    "bookmark_home_shared_state.h",
-    "bookmark_home_shared_state.mm",
-    "bookmark_home_view_controller.h",
-    "bookmark_home_view_controller.mm",
     "bookmark_interaction_controller.h",
     "bookmark_interaction_controller.mm",
     "bookmark_interaction_controller_delegate.h",
@@ -21,6 +14,13 @@
     "bookmark_navigation_controller_delegate.mm",
     "bookmark_promo_controller.h",
     "bookmark_promo_controller.mm",
+    "bookmarks_home_consumer.h",
+    "bookmarks_home_mediator.h",
+    "bookmarks_home_mediator.mm",
+    "bookmarks_home_shared_state.h",
+    "bookmarks_home_shared_state.mm",
+    "bookmarks_home_view_controller.h",
+    "bookmarks_home_view_controller.mm",
     "synced_bookmarks_bridge.h",
     "synced_bookmarks_bridge.mm",
   ]
@@ -144,9 +144,9 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
-    "bookmark_home_view_controller_unittest.mm",
     "bookmark_path_cache_unittest.mm",
     "bookmark_utils_ios_unittest.mm",
+    "bookmarks_home_view_controller_unittest.mm",
   ]
   deps = [
     ":bookmarks",
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h
index 2a1a1b2..1fc9199d 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.h
@@ -38,7 +38,7 @@
 id<GREYMatcher> BookmarksDeleteSwipeButton();
 
 // Matcher for the DONE button on the bookmarks UI.
-id<GREYMatcher> BookmarkHomeDoneButton();
+id<GREYMatcher> BookmarksHomeDoneButton();
 
 // Matcher for the DONE button on the bookmarks edit UI.
 id<GREYMatcher> BookmarksSaveEditDoneButton();
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm
index 0a86f80..14381bd3 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_earl_grey_ui.mm
@@ -70,7 +70,7 @@
   return ButtonWithAccessibilityLabelId(IDS_IOS_BOOKMARK_ACTION_DELETE);
 }
 
-id<GREYMatcher> BookmarkHomeDoneButton() {
+id<GREYMatcher> BookmarksHomeDoneButton() {
   return grey_accessibilityID(kBookmarkHomeNavigationBarDoneButtonIdentifier);
 }
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
index 05f8468..88577b0 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
@@ -22,13 +22,13 @@
 #import "ios/chrome/browser/main/browser.h"
 #import "ios/chrome/browser/metrics/new_tab_page_uma.h"
 #import "ios/chrome/browser/tabs/tab_title_util.h"
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller_delegate.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_mediator.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller_delegate.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/editor/bookmarks_editor_view_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_view_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/folder_editor/bookmarks_folder_editor_view_controller.h"
@@ -72,7 +72,7 @@
     BookmarksEditorViewControllerDelegate,
     BookmarksFolderEditorViewControllerDelegate,
     BookmarksFolderChooserViewControllerDelegate,
-    BookmarkHomeViewControllerDelegate> {
+    BookmarksHomeViewControllerDelegate> {
   // The browser bookmarks are presented in.
   Browser* _browser;  // weak
 
@@ -105,7 +105,7 @@
 
 // A reference to the potentially presented bookmark browser. This will be
 // non-nil when `currentPresentedState` is BOOKMARK_BROWSER.
-@property(nonatomic, strong) BookmarkHomeViewController* bookmarkBrowser;
+@property(nonatomic, strong) BookmarksHomeViewController* bookmarkBrowser;
 
 // A reference to the potentially presented single bookmark editor. This will be
 // non-nil when `currentPresentedState` is BOOKMARK_EDITOR.
@@ -254,17 +254,17 @@
   DCHECK(!self.bookmarkNavigationController);
 
   self.bookmarkBrowser =
-      [[BookmarkHomeViewController alloc] initWithBrowser:_browser];
+      [[BookmarksHomeViewController alloc] initWithBrowser:_browser];
   self.bookmarkBrowser.homeDelegate = self;
   self.bookmarkBrowser.applicationCommandsHandler =
       self.applicationCommandsHandler;
   self.bookmarkBrowser.snackbarCommandsHandler = self.snackbarCommandsHandler;
 
-  NSArray<BookmarkHomeViewController*>* replacementViewControllers = nil;
+  NSArray<BookmarksHomeViewController*>* replacementViewControllers = nil;
   if (self.bookmarkModel->loaded()) {
     // Set the root node if the model has been loaded. If the model has not been
-    // loaded yet, the root node will be set in BookmarkHomeViewController after
-    // the model is finished loading.
+    // loaded yet, the root node will be set in BookmarksHomeViewController
+    // after the model is finished loading.
     [self.bookmarkBrowser setRootNode:self.bookmarkModel->root_node()];
     replacementViewControllers =
         [self.bookmarkBrowser cachedViewControllerStack];
@@ -528,10 +528,10 @@
   [self dismissFolderSelectionAnimated:YES];
 }
 
-#pragma mark - BookmarkHomeViewControllerDelegate
+#pragma mark - BookmarksHomeViewControllerDelegate
 
 - (void)bookmarkHomeViewControllerWantsDismissal:
-            (BookmarkHomeViewController*)controller
+            (BookmarksHomeViewController*)controller
                                 navigationToUrls:
                                     (const std::vector<GURL>&)urls {
   [self bookmarkHomeViewControllerWantsDismissal:controller
@@ -542,7 +542,7 @@
 }
 
 - (void)bookmarkHomeViewControllerWantsDismissal:
-            (BookmarkHomeViewController*)controller
+            (BookmarksHomeViewController*)controller
                                 navigationToUrls:(const std::vector<GURL>&)urls
                                      inIncognito:(BOOL)inIncognito
                                           newTab:(BOOL)newTab {
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h b/ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h
index 75c610a..940d6d7 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h
@@ -27,7 +27,7 @@
 // UINavigationBar accessibility constants:
 // Accessibility identifier of the Bookmark navigation bar.
 extern NSString* const kBookmarkNavigationBarIdentifier;
-// Accessibility identifier of the BookmarkHome VC navigation bar done button.
+// Accessibility identifier of the BookmarksHome VC navigation bar done button.
 extern NSString* const kBookmarkHomeNavigationBarDoneButtonIdentifier;
 // Accessibility identifier of the BookmarkEdit VC navigation bar done button.
 extern NSString* const kBookmarkEditNavigationBarDoneButtonIdentifier;
@@ -40,15 +40,15 @@
 extern NSString* const kBookmarkEditDeleteButtonIdentifier;
 // Accessibility identifier of the BookmarkFolderEditorVC toolbar delete button.
 extern NSString* const kBookmarkFolderEditorDeleteButtonIdentifier;
-// Accessibility identifier of the BookmarkHomeVC leading button.
+// Accessibility identifier of the BookmarksHomeVC leading button.
 extern NSString* const kBookmarkHomeLeadingButtonIdentifier;
-// Accessibility identifier of the BookmarkHomeVC center button.
+// Accessibility identifier of the BookmarksHomeVC center button.
 extern NSString* const kBookmarkHomeCenterButtonIdentifier;
-// Accessibility identifier of the BookmarkHomeVC trailing button.
+// Accessibility identifier of the BookmarksHomeVC trailing button.
 extern NSString* const kBookmarkHomeTrailingButtonIdentifier;
-// Accessibility identifier of the BookmarkHomeVC UIToolbar.
+// Accessibility identifier of the BookmarksHomeVC UIToolbar.
 extern NSString* const kBookmarkHomeUIToolbarIdentifier;
-// Accessibility identifier of the BookmarkHomeVC search bar.
+// Accessibility identifier of the BookmarksHomeVC search bar.
 extern NSString* const kBookmarkHomeSearchBarIdentifier;
 // Accessibility identifier of the search scrim.
 extern NSString* const kBookmarkHomeSearchScrimIdentifier;
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index f359c9c..c53aa97 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -27,7 +27,7 @@
 #error "This file requires ARC support."
 #endif
 
-using chrome_test_util::BookmarkHomeDoneButton;
+using chrome_test_util::BookmarksHomeDoneButton;
 using chrome_test_util::BookmarksNavigationBarBackButton;
 using chrome_test_util::BookmarksSaveEditDoneButton;
 using chrome_test_util::ButtonWithAccessibilityLabelId;
@@ -174,7 +174,7 @@
   [BookmarkEarlGrey verifyChildCount:1 inFolderWithName:@"New Folder"];
 
   // Close bookmarks
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Check that the new folder still contains the bookmark.
@@ -617,7 +617,7 @@
       assertWithMatcher:grey_sufficientlyVisible()];
 
   // Close bookmarks
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Reopen bookmarks.
@@ -645,7 +645,7 @@
       performAction:grey_tap()];
 
   // Close bookmarks, it will store Folder 2 as the cache position.
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Delete Folder 2.
@@ -667,7 +667,7 @@
   [BookmarkEarlGreyUI openMobileBookmarks];
 
   // Close bookmarks, it will store Mobile Bookmarks as the cache position.
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Delete all bookmarks and folders under Mobile Bookmarks.
@@ -705,7 +705,7 @@
       performAction:grey_tap()];
 
   // Close bookmarks
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Move Folder 3 under Folder 1.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_consumer.h b/ios/chrome/browser/ui/bookmarks/bookmarks_home_consumer.h
similarity index 70%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_consumer.h
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_consumer.h
index 94edb9d4..1bed4d7 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_consumer.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_consumer.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_CONSUMER_H_
-#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_CONSUMER_H_
+#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_CONSUMER_H_
+#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_CONSUMER_H_
 
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_consumer.h"
 
@@ -11,19 +11,19 @@
 @class ShowSigninCommand;
 @class SigninPromoViewConfigurator;
 
-typedef NS_ENUM(NSInteger, BookmarkHomeBackgroundStyle) {
+typedef NS_ENUM(NSInteger, BookmarksHomeBackgroundStyle) {
   // The default background style.
-  BookmarkHomeBackgroundStyleDefault,
+  BookmarksHomeBackgroundStyleDefault,
 
   // A background style that indicates that bookmarks are loading.
-  BookmarkHomeBackgroundStyleLoading,
+  BookmarksHomeBackgroundStyleLoading,
 
   // A background style that indicates that no bookmarks are present.
-  BookmarkHomeBackgroundStyleEmpty,
+  BookmarksHomeBackgroundStyleEmpty,
 };
 
-// BookmarkHomeConsumer provides methods that allow mediators to update the UI.
-@protocol BookmarkHomeConsumer <ChromeTableViewConsumer>
+// BookmarksHomeConsumer provides methods that allow mediators to update the UI.
+@protocol BookmarksHomeConsumer <ChromeTableViewConsumer>
 
 // Refreshes the UI.
 - (void)refreshContents;
@@ -35,7 +35,7 @@
         fallbackToGoogleServer:(BOOL)fallbackToGoogleServer;
 
 // Displays the table view background for the given `style`.
-- (void)updateTableViewBackgroundStyle:(BookmarkHomeBackgroundStyle)style;
+- (void)updateTableViewBackgroundStyle:(BookmarksHomeBackgroundStyle)style;
 
 // Sets the editing mode for tableView, update context bar and search state
 // accordingly.
@@ -51,4 +51,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_CONSUMER_H_
+#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.h b/ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.h
similarity index 67%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.h
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.h
index 46c21c5..a42468f 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.h
@@ -2,22 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_MEDIATOR_H_
-#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_MEDIATOR_H_
+#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_MEDIATOR_H_
+#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_MEDIATOR_H_
 
 #import <Foundation/Foundation.h>
 
 class ChromeBrowserState;
-@protocol BookmarkHomeConsumer;
-@class BookmarkHomeSharedState;
+@protocol BookmarksHomeConsumer;
+@class BookmarksHomeSharedState;
 
-// BookmarkHomeMediator manages model interactions for the
-// BookmarkHomeViewController.
-@interface BookmarkHomeMediator : NSObject
+// BookmarksHomeMediator manages model interactions for the
+// BookmarksHomeViewController.
+@interface BookmarksHomeMediator : NSObject
 
-@property(nonatomic, weak) id<BookmarkHomeConsumer> consumer;
+@property(nonatomic, weak) id<BookmarksHomeConsumer> consumer;
 
-- (instancetype)initWithSharedState:(BookmarkHomeSharedState*)sharedState
+- (instancetype)initWithSharedState:(BookmarksHomeSharedState*)sharedState
                        browserState:(ChromeBrowserState*)browserState
     NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
@@ -44,4 +44,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_MEDIATOR_H_
+#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.mm
similarity index 82%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.mm
index e76b44c7..eed10ca 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.h"
 
 #import "base/check.h"
 #import "base/mac/foundation_util.h"
@@ -24,9 +24,9 @@
 #import "ios/chrome/browser/ui/authentication/enterprise/enterprise_utils.h"
 #import "ios/chrome/browser/ui/authentication/signin_presenter.h"
 #import "ios/chrome/browser/ui/authentication/signin_promo_view_mediator.h"
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_consumer.h"
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_promo_controller.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_consumer.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.h"
 #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.h"
 #import "ios/chrome/browser/ui/bookmarks/synced_bookmarks_bridge.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
@@ -47,11 +47,11 @@
 const int kMaxBookmarksSearchResults = 50;
 }  // namespace
 
-@interface BookmarkHomeMediator () <BookmarkModelBridgeObserver,
-                                    BookmarkPromoControllerDelegate,
-                                    PrefObserverDelegate,
-                                    SigninPresenter,
-                                    SyncObserverModelBridge> {
+@interface BookmarksHomeMediator () <BookmarkModelBridgeObserver,
+                                     BookmarkPromoControllerDelegate,
+                                     PrefObserverDelegate,
+                                     SigninPresenter,
+                                     SyncObserverModelBridge> {
   // Bridge to register for bookmark changes.
   std::unique_ptr<BookmarkModelBridge> _modelBridge;
 
@@ -66,7 +66,7 @@
 }
 
 // Shared state between Bookmark home classes.
-@property(nonatomic, strong) BookmarkHomeSharedState* sharedState;
+@property(nonatomic, strong) BookmarksHomeSharedState* sharedState;
 
 // The browser state for this mediator.
 @property(nonatomic, assign) ChromeBrowserState* browserState;
@@ -80,13 +80,13 @@
 
 @end
 
-@implementation BookmarkHomeMediator
+@implementation BookmarksHomeMediator
 @synthesize bookmarkPromoController = _bookmarkPromoController;
 @synthesize browserState = _browserState;
 @synthesize consumer = _consumer;
 @synthesize sharedState = _sharedState;
 
-- (instancetype)initWithSharedState:(BookmarkHomeSharedState*)sharedState
+- (instancetype)initWithSharedState:(BookmarksHomeSharedState*)sharedState
                        browserState:(ChromeBrowserState*)browserState {
   if ((self = [super init])) {
     _sharedState = sharedState;
@@ -144,9 +144,9 @@
 // Computes the bookmarks table view based on the current root node.
 - (void)computeBookmarkTableViewData {
   [self deleteAllItemsOrAddSectionWithIdentifier:
-            BookmarkHomeSectionIdentifierBookmarks];
+            BookmarksHomeSectionIdentifierBookmarks];
   [self deleteAllItemsOrAddSectionWithIdentifier:
-            BookmarkHomeSectionIdentifierMessages];
+            BookmarksHomeSectionIdentifierMessages];
 
   // Regenerate the list of all bookmarks.
   if (!self.sharedState.bookmarkModel->loaded() ||
@@ -173,12 +173,12 @@
   // Add all bookmarks and folders of the current root node to the table.
   for (const auto& child :
        self.sharedState.tableViewDisplayedRootNode->children()) {
-    BookmarkHomeNodeItem* nodeItem =
-        [[BookmarkHomeNodeItem alloc] initWithType:BookmarkHomeItemTypeBookmark
-                                      bookmarkNode:child.get()];
+    BookmarksHomeNodeItem* nodeItem = [[BookmarksHomeNodeItem alloc]
+        initWithType:BookmarksHomeItemTypeBookmark
+        bookmarkNode:child.get()];
     [self.sharedState.tableViewModel
                         addItem:nodeItem
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   }
 }
 
@@ -193,34 +193,34 @@
   // Add "Mobile Bookmarks" to the table.
   const BookmarkNode* mobileNode =
       self.sharedState.bookmarkModel->mobile_node();
-  BookmarkHomeNodeItem* mobileItem =
-      [[BookmarkHomeNodeItem alloc] initWithType:BookmarkHomeItemTypeBookmark
-                                    bookmarkNode:mobileNode];
+  BookmarksHomeNodeItem* mobileItem =
+      [[BookmarksHomeNodeItem alloc] initWithType:BookmarksHomeItemTypeBookmark
+                                     bookmarkNode:mobileNode];
   [self.sharedState.tableViewModel
                       addItem:mobileItem
-      toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+      toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
 
   // Add "Bookmarks Bar" and "Other Bookmarks" only when they are not empty.
   const BookmarkNode* bookmarkBar =
       self.sharedState.bookmarkModel->bookmark_bar_node();
   if (!bookmarkBar->children().empty()) {
-    BookmarkHomeNodeItem* barItem =
-        [[BookmarkHomeNodeItem alloc] initWithType:BookmarkHomeItemTypeBookmark
-                                      bookmarkNode:bookmarkBar];
+    BookmarksHomeNodeItem* barItem = [[BookmarksHomeNodeItem alloc]
+        initWithType:BookmarksHomeItemTypeBookmark
+        bookmarkNode:bookmarkBar];
     [self.sharedState.tableViewModel
                         addItem:barItem
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   }
 
   const BookmarkNode* otherBookmarks =
       self.sharedState.bookmarkModel->other_node();
   if (!otherBookmarks->children().empty()) {
-    BookmarkHomeNodeItem* otherItem =
-        [[BookmarkHomeNodeItem alloc] initWithType:BookmarkHomeItemTypeBookmark
-                                      bookmarkNode:otherBookmarks];
+    BookmarksHomeNodeItem* otherItem = [[BookmarksHomeNodeItem alloc]
+        initWithType:BookmarksHomeItemTypeBookmark
+        bookmarkNode:otherBookmarks];
     [self.sharedState.tableViewModel
                         addItem:otherItem
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   }
 
   // Add "Managed Bookmarks" to the table if it exists.
@@ -228,21 +228,21 @@
       ManagedBookmarkServiceFactory::GetForBrowserState(self.browserState);
   const BookmarkNode* managedNode = managedBookmarkService->managed_node();
   if (managedNode && managedNode->IsVisible()) {
-    BookmarkHomeNodeItem* managedItem =
-        [[BookmarkHomeNodeItem alloc] initWithType:BookmarkHomeItemTypeBookmark
-                                      bookmarkNode:managedNode];
+    BookmarksHomeNodeItem* managedItem = [[BookmarksHomeNodeItem alloc]
+        initWithType:BookmarksHomeItemTypeBookmark
+        bookmarkNode:managedNode];
     [self.sharedState.tableViewModel
                         addItem:managedItem
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   }
 }
 
 - (void)computeBookmarkTableViewDataMatching:(NSString*)searchText
                   orShowMessageWhenNoResults:(NSString*)noResults {
   [self deleteAllItemsOrAddSectionWithIdentifier:
-            BookmarkHomeSectionIdentifierBookmarks];
+            BookmarksHomeSectionIdentifierBookmarks];
   [self deleteAllItemsOrAddSectionWithIdentifier:
-            BookmarkHomeSectionIdentifierMessages];
+            BookmarksHomeSectionIdentifierMessages];
 
   std::vector<const BookmarkNode*> nodes;
   bookmarks::QueryFields query;
@@ -253,24 +253,24 @@
 
   int count = 0;
   for (const BookmarkNode* node : nodes) {
-    BookmarkHomeNodeItem* nodeItem =
-        [[BookmarkHomeNodeItem alloc] initWithType:BookmarkHomeItemTypeBookmark
-                                      bookmarkNode:node];
+    BookmarksHomeNodeItem* nodeItem = [[BookmarksHomeNodeItem alloc]
+        initWithType:BookmarksHomeItemTypeBookmark
+        bookmarkNode:node];
     [self.sharedState.tableViewModel
                         addItem:nodeItem
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
     count++;
   }
 
   if (count == 0) {
     TableViewTextItem* item =
-        [[TableViewTextItem alloc] initWithType:BookmarkHomeItemTypeMessage];
+        [[TableViewTextItem alloc] initWithType:BookmarksHomeItemTypeMessage];
     item.textAlignment = NSTextAlignmentLeft;
     item.textColor = [UIColor colorNamed:kTextPrimaryColor];
     item.text = noResults;
     [self.sharedState.tableViewModel
                         addItem:item
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierMessages];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierMessages];
     return;
   }
 
@@ -286,13 +286,13 @@
     if (self.sharedState.bookmarkModel->HasNoUserCreatedBookmarksOrFolders() &&
         _syncedBookmarksObserver->IsPerformingInitialSync()) {
       [self.consumer
-          updateTableViewBackgroundStyle:BookmarkHomeBackgroundStyleLoading];
+          updateTableViewBackgroundStyle:BookmarksHomeBackgroundStyleLoading];
     } else if (![self hasBookmarksOrFolders]) {
       [self.consumer
-          updateTableViewBackgroundStyle:BookmarkHomeBackgroundStyleEmpty];
+          updateTableViewBackgroundStyle:BookmarksHomeBackgroundStyleEmpty];
     } else {
       [self.consumer
-          updateTableViewBackgroundStyle:BookmarkHomeBackgroundStyleDefault];
+          updateTableViewBackgroundStyle:BookmarksHomeBackgroundStyleDefault];
     }
     return;
   }
@@ -300,10 +300,10 @@
   if (![self hasBookmarksOrFolders] &&
       !self.sharedState.currentlyShowingSearchResults) {
     [self.consumer
-        updateTableViewBackgroundStyle:BookmarkHomeBackgroundStyleEmpty];
+        updateTableViewBackgroundStyle:BookmarksHomeBackgroundStyleEmpty];
   } else {
     [self.consumer
-        updateTableViewBackgroundStyle:BookmarkHomeBackgroundStyleDefault];
+        updateTableViewBackgroundStyle:BookmarksHomeBackgroundStyleDefault];
   }
 }
 
@@ -327,14 +327,14 @@
       self.bookmarkPromoController.signinPromoViewMediator;
   if (self.sharedState.promoVisible) {
     DCHECK(![self.sharedState.tableViewModel
-        hasSectionForSectionIdentifier:BookmarkHomeSectionIdentifierPromo]);
+        hasSectionForSectionIdentifier:BookmarksHomeSectionIdentifierPromo]);
     [self.sharedState.tableViewModel
-        insertSectionWithIdentifier:BookmarkHomeSectionIdentifierPromo
+        insertSectionWithIdentifier:BookmarksHomeSectionIdentifierPromo
                             atIndex:0];
 
     TableViewSigninPromoItem* signinPromoItem =
         [[TableViewSigninPromoItem alloc]
-            initWithType:BookmarkHomeItemTypePromo];
+            initWithType:BookmarksHomeItemTypePromo];
     signinPromoItem.configurator = [signinPromoViewMediator createConfigurator];
     signinPromoItem.text =
         l10n_util::GetNSString(IDS_IOS_SIGNIN_PROMO_BOOKMARKS_WITH_UNITY);
@@ -343,7 +343,7 @@
 
     [self.sharedState.tableViewModel
                         addItem:signinPromoItem
-        toSectionWithIdentifier:BookmarkHomeSectionIdentifierPromo];
+        toSectionWithIdentifier:BookmarksHomeSectionIdentifierPromo];
   } else {
     if (!signinPromoViewMediator.invalidClosedOrNeverVisible) {
       // When the sign-in view is closed, the promo state changes, but
@@ -353,9 +353,9 @@
     }
 
     DCHECK([self.sharedState.tableViewModel
-        hasSectionForSectionIdentifier:BookmarkHomeSectionIdentifierPromo]);
+        hasSectionForSectionIdentifier:BookmarksHomeSectionIdentifierPromo]);
     [self.sharedState.tableViewModel
-        removeSectionWithIdentifier:BookmarkHomeSectionIdentifierPromo];
+        removeSectionWithIdentifier:BookmarksHomeSectionIdentifierPromo];
   }
   [self.sharedState.tableView reloadData];
   // Update the TabelView background to make sure the new state of the promo
@@ -437,7 +437,7 @@
   DCHECK(bookmarkNode->is_url());
 
   // Update image of corresponding cell.
-  BookmarkHomeNodeItem* nodeItem = [self itemForNode:bookmarkNode];
+  BookmarksHomeNodeItem* nodeItem = [self itemForNode:bookmarkNode];
   if (!nodeItem) {
     return;
   }
@@ -454,14 +454,14 @@
   [self.consumer loadFaviconAtIndexPath:indexPath fallbackToGoogleServer:NO];
 }
 
-- (BookmarkHomeNodeItem*)itemForNode:
+- (BookmarksHomeNodeItem*)itemForNode:
     (const bookmarks::BookmarkNode*)bookmarkNode {
   NSArray<TableViewItem*>* items = [self.sharedState.tableViewModel
-      itemsInSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+      itemsInSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   for (TableViewItem* item in items) {
-    if (item.type == BookmarkHomeItemTypeBookmark) {
-      BookmarkHomeNodeItem* nodeItem =
-          base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
+    if (item.type == BookmarksHomeItemTypeBookmark) {
+      BookmarksHomeNodeItem* nodeItem =
+          base::mac::ObjCCastStrict<BookmarksHomeNodeItem>(item);
       if (nodeItem.bookmarkNode == bookmarkNode) {
         return nodeItem;
       }
@@ -480,14 +480,14 @@
             (SigninPromoViewConfigurator*)configurator
                              identityChanged:(BOOL)identityChanged {
   if (![self.sharedState.tableViewModel
-          hasSectionForSectionIdentifier:BookmarkHomeSectionIdentifierPromo] ||
+          hasSectionForSectionIdentifier:BookmarksHomeSectionIdentifierPromo] ||
       !identityChanged) {
     return;
   }
 
   NSIndexPath* indexPath = [self.sharedState.tableViewModel
-      indexPathForItemType:BookmarkHomeItemTypePromo
-         sectionIdentifier:BookmarkHomeSectionIdentifierPromo];
+      indexPathForItemType:BookmarksHomeItemTypePromo
+         sectionIdentifier:BookmarksHomeSectionIdentifierPromo];
   [self.consumer configureSigninPromoWithConfigurator:configurator
                                           atIndexPath:indexPath];
 }
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h b/ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.h
similarity index 75%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.h
index 28584fe7..f33bc4f 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_SHARED_STATE_H_
-#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_SHARED_STATE_H_
+#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_SHARED_STATE_H_
+#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_SHARED_STATE_H_
 
 #import <UIKit/UIKit.h>
 
@@ -12,7 +12,7 @@
 #import "ios/chrome/browser/ui/list_model/list_model.h"
 
 @protocol BookmarkTableCellTitleEditing;
-@class BookmarkHomeSharedState;
+@class BookmarksHomeSharedState;
 @class BookmarkTableCell;
 @class TableViewModel;
 
@@ -21,27 +21,27 @@
 class BookmarkNode;
 }  // namespace bookmarks
 
-typedef NS_ENUM(NSInteger, BookmarkHomeSectionIdentifier) {
-  BookmarkHomeSectionIdentifierPromo = kSectionIdentifierEnumZero,
-  BookmarkHomeSectionIdentifierBookmarks,
-  BookmarkHomeSectionIdentifierMessages,
+typedef NS_ENUM(NSInteger, BookmarksHomeSectionIdentifier) {
+  BookmarksHomeSectionIdentifierPromo = kSectionIdentifierEnumZero,
+  BookmarksHomeSectionIdentifierBookmarks,
+  BookmarksHomeSectionIdentifierMessages,
 };
 
-typedef NS_ENUM(NSInteger, BookmarkHomeItemType) {
-  BookmarkHomeItemTypePromo = kItemTypeEnumZero,
-  BookmarkHomeItemTypeBookmark,
-  BookmarkHomeItemTypeMessage,
+typedef NS_ENUM(NSInteger, BookmarksHomeItemType) {
+  BookmarksHomeItemTypePromo = kItemTypeEnumZero,
+  BookmarksHomeItemTypeBookmark,
+  BookmarksHomeItemTypeMessage,
 };
 
-@protocol BookmarkHomeSharedStateObserver
+@protocol BookmarksHomeSharedStateObserver
 // Called when the set of edit nodes is cleared.
-- (void)sharedStateDidClearEditNodes:(BookmarkHomeSharedState*)sharedState;
+- (void)sharedStateDidClearEditNodes:(BookmarksHomeSharedState*)sharedState;
 @end
 
-// BookmarkHomeSharedState is a data structure that contains a number of fields
+// BookmarksHomeSharedState is a data structure that contains a number of fields
 // that were previously ivars of BookmarkTableView. They are moved to a separate
 // data structure in order to ease moving code between files.
-@interface BookmarkHomeSharedState : NSObject
+@interface BookmarksHomeSharedState : NSObject
 
 // Models.
 
@@ -92,7 +92,7 @@
 @property(nonatomic, assign) BOOL promoVisible;
 
 // This object can have at most one observer.
-@property(nonatomic, weak) id<BookmarkHomeSharedStateObserver> observer;
+@property(nonatomic, weak) id<BookmarksHomeSharedStateObserver> observer;
 
 // Constants
 
@@ -117,4 +117,4 @@
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_SHARED_STATE_H_
+#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_SHARED_STATE_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.mm
similarity index 95%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.mm
index 8ea1485..53de20b 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.h"
 
 #import "base/check.h"
 #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_table_cell_title_editing.h"
@@ -23,7 +23,7 @@
 
 }  // namespace
 
-@implementation BookmarkHomeSharedState {
+@implementation BookmarksHomeSharedState {
   std::set<const bookmarks::BookmarkNode*> _editNodes;
 }
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.h
similarity index 77%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.h
index d0b1814..4f64eec 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_VIEW_CONTROLLER_H_
-#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_VIEW_CONTROLLER_H_
+#ifndef IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
 
 #import <UIKit/UIKit.h>
 
@@ -14,7 +14,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 
 @protocol ApplicationCommands;
-@class BookmarkHomeViewController;
+@class BookmarksHomeViewController;
 class Browser;
 namespace bookmarks {
 class BookmarkNode;
@@ -22,17 +22,17 @@
 class GURL;
 @protocol SnackbarCommands;
 
-@protocol BookmarkHomeViewControllerDelegate
+@protocol BookmarksHomeViewControllerDelegate
 // The view controller wants to be dismissed. If `urls` is not empty, then
 // the user has selected to navigate to those URLs in the current tab mode.
 - (void)bookmarkHomeViewControllerWantsDismissal:
-            (BookmarkHomeViewController*)controller
+            (BookmarksHomeViewController*)controller
                                 navigationToUrls:(const std::vector<GURL>&)urls;
 
 // The view controller wants to be dismissed. If `urls` is not empty, then
 // the user has selected to navigate to those URLs with specified tab mode.
 - (void)bookmarkHomeViewControllerWantsDismissal:
-            (BookmarkHomeViewController*)controller
+            (BookmarksHomeViewController*)controller
                                 navigationToUrls:(const std::vector<GURL>&)urls
                                      inIncognito:(BOOL)inIncognito
                                           newTab:(BOOL)newTab;
@@ -40,14 +40,14 @@
 @end
 
 // Class to navigate the bookmark hierarchy.
-@interface BookmarkHomeViewController
+@interface BookmarksHomeViewController
     : ChromeTableViewController <KeyCommandActions,
                                  UIAdaptivePresentationControllerDelegate>
 
 // Delegate for presenters. Note that this delegate is currently being set only
 // in case of handset, and not tablet. In the future it will be used by both
 // cases.
-@property(nonatomic, weak) id<BookmarkHomeViewControllerDelegate> homeDelegate;
+@property(nonatomic, weak) id<BookmarksHomeViewControllerDelegate> homeDelegate;
 
 // Handler for Application Commands.
 @property(nonatomic, weak) id<ApplicationCommands> applicationCommandsHandler;
@@ -65,13 +65,13 @@
 // Setter to set _rootNode value.
 - (void)setRootNode:(const bookmarks::BookmarkNode*)rootNode;
 
-// Returns an array of BookmarkHomeViewControllers, one per BookmarkNode in the
+// Returns an array of BookmarksHomeViewControllers, one per BookmarkNode in the
 // path from this view controller's node to the latest cached node (as
 // determined by BookmarkPathCache).  Includes `self` as the first element of
 // the returned array.  Sets the cached scroll position for the last element of
 // the returned array, if appropriate.
-- (NSArray<BookmarkHomeViewController*>*)cachedViewControllerStack;
+- (NSArray<BookmarksHomeViewController*>*)cachedViewControllerStack;
 
 @end
 
-#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARK_HOME_VIEW_CONTROLLER_H_
+#endif  // IOS_CHROME_BROWSER_UI_BOOKMARKS_BOOKMARKS_HOME_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.mm
similarity index 92%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.mm
index 0e9c74b7..3cbed58b 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.h"
 
 #import "base/ios/ios_util.h"
 #import "base/mac/foundation_util.h"
@@ -34,15 +34,15 @@
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
 #import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h"
 #import "ios/chrome/browser/ui/authentication/cells/table_view_signin_promo_item.h"
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_consumer.h"
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_mediator.h"
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_shared_state.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller_delegate.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_navigation_controller.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_path_cache.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
 #import "ios/chrome/browser/ui/bookmarks/bookmark_utils_ios.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_consumer.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_mediator.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_shared_state.h"
 #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_folder_item.h"
 #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.h"
 #import "ios/chrome/browser/ui/bookmarks/cells/bookmark_table_cell_title_edit_delegate.h"
@@ -123,10 +123,10 @@
 
 }  // namespace
 
-@interface BookmarkHomeViewController () <
+@interface BookmarksHomeViewController () <
     BookmarksFolderChooserViewControllerDelegate,
-    BookmarkHomeConsumer,
-    BookmarkHomeSharedStateObserver,
+    BookmarksHomeConsumer,
+    BookmarksHomeSharedStateObserver,
     BookmarkInteractionControllerDelegate,
     BookmarkModelBridgeObserver,
     BookmarkTableCellTitleEditDelegate,
@@ -144,9 +144,9 @@
   const bookmarks::BookmarkNode* _rootNode;
 }
 
-// Shared state between BookmarkHome classes.  Used as a temporary refactoring
+// Shared state between BookmarksHome classes.  Used as a temporary refactoring
 // aid.
-@property(nonatomic, strong) BookmarkHomeSharedState* sharedState;
+@property(nonatomic, strong) BookmarksHomeSharedState* sharedState;
 
 // The bookmark model used.
 @property(nonatomic, assign) bookmarks::BookmarkModel* bookmarks;
@@ -158,7 +158,7 @@
 @property(nonatomic, assign) ChromeBrowserState* browserState;
 
 // The mediator that provides data for this view controller.
-@property(nonatomic, strong) BookmarkHomeMediator* mediator;
+@property(nonatomic, strong) BookmarksHomeMediator* mediator;
 
 // The view controller used to pick a folder in which to move the selected
 // bookmarks.
@@ -220,7 +220,7 @@
 
 @end
 
-@implementation BookmarkHomeViewController
+@implementation BookmarksHomeViewController
 
 #pragma mark - Initializer
 
@@ -264,18 +264,18 @@
   _rootNode = rootNode;
 }
 
-- (NSArray<BookmarkHomeViewController*>*)cachedViewControllerStack {
+- (NSArray<BookmarksHomeViewController*>*)cachedViewControllerStack {
   // This method is only designed to be called for the view controller
   // associated with the root node.
   DCHECK(self.bookmarks->loaded());
   DCHECK([self isDisplayingBookmarkRoot]);
 
-  NSMutableArray<BookmarkHomeViewController*>* stack = [NSMutableArray array];
+  NSMutableArray<BookmarksHomeViewController*>* stack = [NSMutableArray array];
   // Configure the root controller Navigationbar at this time when
   // reconstructing from cache, or there will be a loading flicker if this gets
   // done on viewDidLoad.
-  [self setupNavigationForBookmarkHomeViewController:self
-                                   usingBookmarkNode:_rootNode];
+  [self setupNavigationForBookmarksHomeViewController:self
+                                    usingBookmarkNode:_rootNode];
   [stack addObject:self];
 
   int64_t cachedFolderID;
@@ -311,13 +311,13 @@
       break;
     }
 
-    BookmarkHomeViewController* controller =
+    BookmarksHomeViewController* controller =
         [self createControllerWithRootFolder:node];
     // Configure the controller's Navigationbar at this time when
     // reconstructing from cache, or there will be a loading flicker if this
     // gets done on viewDidLoad.
-    [self setupNavigationForBookmarkHomeViewController:controller
-                                     usingBookmarkNode:node];
+    [self setupNavigationForBookmarksHomeViewController:controller
+                                      usingBookmarkNode:node];
     if (nodeID == cachedFolderID) {
       controller.cachedIndexPathRow = cachedIndexPathRow;
     }
@@ -452,8 +452,8 @@
   [self loadModel];
 
   self.sharedState =
-      [[BookmarkHomeSharedState alloc] initWithBookmarkModel:_bookmarks
-                                           displayedRootNode:_rootNode];
+      [[BookmarksHomeSharedState alloc] initWithBookmarkModel:_bookmarks
+                                            displayedRootNode:_rootNode];
   self.sharedState.tableViewModel = self.tableViewModel;
   self.sharedState.tableView = self.tableView;
   self.sharedState.observer = self;
@@ -480,13 +480,13 @@
 
   // Create the mediator and hook up the table view.
   self.mediator =
-      [[BookmarkHomeMediator alloc] initWithSharedState:self.sharedState
-                                           browserState:self.browserState];
+      [[BookmarksHomeMediator alloc] initWithSharedState:self.sharedState
+                                            browserState:self.browserState];
   self.mediator.consumer = self;
   [self.mediator startMediating];
 
-  [self setupNavigationForBookmarkHomeViewController:self
-                                   usingBookmarkNode:_rootNode];
+  [self setupNavigationForBookmarksHomeViewController:self
+                                    usingBookmarkNode:_rootNode];
 
   [self setupContextBar];
 
@@ -516,7 +516,7 @@
   }
 }
 
-#pragma mark - BookmarkHomeConsumer
+#pragma mark - BookmarksHomeConsumer
 
 - (void)setTableViewEditing:(BOOL)editing {
   self.sharedState.currentlyInEditMode = editing;
@@ -568,10 +568,10 @@
   }
 
   // Start loading a favicon.
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   GURL blockURL(node->url());
   auto faviconLoadedBlock = ^(FaviconAttributes* attributes) {
-    BookmarkHomeViewController* strongSelf = weakSelf;
+    BookmarksHomeViewController* strongSelf = weakSelf;
     if (!strongSelf) {
       return;
     }
@@ -587,22 +587,22 @@
   };
 
   CGFloat desiredFaviconSizeInPoints =
-      [BookmarkHomeSharedState desiredFaviconSizePt];
-  CGFloat minFaviconSizeInPoints = [BookmarkHomeSharedState minFaviconSizePt];
+      [BookmarksHomeSharedState desiredFaviconSizePt];
+  CGFloat minFaviconSizeInPoints = [BookmarksHomeSharedState minFaviconSizePt];
 
   self.faviconLoader->FaviconForPageUrl(
       blockURL, desiredFaviconSizeInPoints, minFaviconSizeInPoints,
       /*fallback_to_google_server=*/fallbackToGoogleServer, faviconLoadedBlock);
 }
 
-- (void)updateTableViewBackgroundStyle:(BookmarkHomeBackgroundStyle)style {
-  if (style == BookmarkHomeBackgroundStyleDefault) {
+- (void)updateTableViewBackgroundStyle:(BookmarksHomeBackgroundStyle)style {
+  if (style == BookmarksHomeBackgroundStyleDefault) {
     [self hideLoadingSpinnerBackground];
     [self hideEmptyBackground];
-  } else if (style == BookmarkHomeBackgroundStyleLoading) {
+  } else if (style == BookmarksHomeBackgroundStyleLoading) {
     [self hideEmptyBackground];
     [self showLoadingSpinnerBackground];
-  } else if (style == BookmarkHomeBackgroundStyleEmpty) {
+  } else if (style == BookmarksHomeBackgroundStyleEmpty) {
     [self hideLoadingSpinnerBackground];
     [self showEmptyBackground];
   }
@@ -680,7 +680,7 @@
         agentFromScene:SceneStateBrowserAgent::FromBrowser(self.browser)
                            ->GetSceneState()];
     if (reauthAgent.authenticationRequired) {
-      __weak BookmarkHomeViewController* weakSelf = self;
+      __weak BookmarksHomeViewController* weakSelf = self;
       [reauthAgent
           authenticateIncognitoContentWithCompletionBlock:^(BOOL success) {
             if (success) {
@@ -729,7 +729,8 @@
     }
 
     // Rebuild folder controller list, going back up the tree.
-    NSMutableArray<BookmarkHomeViewController*>* stack = [NSMutableArray array];
+    NSMutableArray<BookmarksHomeViewController*>* stack =
+        [NSMutableArray array];
     std::vector<const bookmarks::BookmarkNode*> nodes;
     const bookmarks::BookmarkNode* cursor = folder;
     while (cursor) {
@@ -737,14 +738,14 @@
       nodes.insert(nodes.begin(), cursor);
 
       // Build reversed list of controllers.
-      BookmarkHomeViewController* controller =
+      BookmarksHomeViewController* controller =
           [self createControllerWithRootFolder:cursor];
       [stack insertObject:controller atIndex:0];
 
       // Setup now, so that the back button labels shows parent folder
       // title and that we don't show large title everywhere.
-      [self setupNavigationForBookmarkHomeViewController:controller
-                                       usingBookmarkNode:cursor];
+      [self setupNavigationForBookmarksHomeViewController:controller
+                                        usingBookmarkNode:cursor];
 
       cursor = cursor->parent();
     }
@@ -770,7 +771,7 @@
           UINavigationItemLargeTitleDisplayModeNever;
     }
 
-    __weak BookmarkHomeViewController* weakSelf = self;
+    __weak BookmarksHomeViewController* weakSelf = self;
     auto completion = ^{
       [weakSelf.navigationController setViewControllers:stack animated:YES];
     };
@@ -779,7 +780,7 @@
                                               completion:completion];
     return;
   }
-  BookmarkHomeViewController* controller =
+  BookmarksHomeViewController* controller =
       [self createControllerWithRootFolder:folder];
   [self.navigationController pushViewController:controller animated:YES];
 }
@@ -957,10 +958,10 @@
   }
 
   DCHECK(self.spinnerView);
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   [self.spinnerView stopWaitingWithCompletion:^{
     // Early return if the controller has been deallocated.
-    BookmarkHomeViewController* strongSelf = weakSelf;
+    BookmarksHomeViewController* strongSelf = weakSelf;
     if (!strongSelf) {
       return;
     }
@@ -969,7 +970,7 @@
           weakSelf.spinnerView.alpha = 0.0;
         }
         completion:^(BOOL finished) {
-          BookmarkHomeViewController* innerStrongSelf = weakSelf;
+          BookmarksHomeViewController* innerStrongSelf = weakSelf;
           if (!innerStrongSelf) {
             return;
           }
@@ -989,17 +990,17 @@
 }
 
 - (void)bookmarkNodeChanged:(const BookmarkNode*)node {
-  // No-op here.  Bookmarks might be refreshed in BookmarkHomeMediator.
+  // No-op here.  Bookmarks might be refreshed in BookmarksHomeMediator.
 }
 
 - (void)bookmarkNodeChildrenChanged:(const BookmarkNode*)bookmarkNode {
-  // No-op here.  Bookmarks might be refreshed in BookmarkHomeMediator.
+  // No-op here.  Bookmarks might be refreshed in BookmarksHomeMediator.
 }
 
 - (void)bookmarkNode:(const BookmarkNode*)bookmarkNode
      movedFromParent:(const BookmarkNode*)oldParent
             toParent:(const BookmarkNode*)newParent {
-  // No-op here.  Bookmarks might be refreshed in BookmarkHomeMediator.
+  // No-op here.  Bookmarks might be refreshed in BookmarksHomeMediator.
 }
 
 - (void)bookmarkNodeDeleted:(const BookmarkNode*)node
@@ -1040,7 +1041,7 @@
 - (void)setupUIStackCacheIfApplicable {
   self.isReconstructingFromCache = NO;
 
-  NSArray<BookmarkHomeViewController*>* replacementViewControllers =
+  NSArray<BookmarksHomeViewController*>* replacementViewControllers =
       [self cachedViewControllerStack];
   DCHECK(replacementViewControllers);
   [self.navigationController setViewControllers:replacementViewControllers];
@@ -1058,10 +1059,10 @@
 }
 
 // Set up navigation bar for `viewController`'s navigationBar using `node`.
-- (void)setupNavigationForBookmarkHomeViewController:
-            (BookmarkHomeViewController*)viewController
-                                   usingBookmarkNode:
-                                       (const bookmarks::BookmarkNode*)node {
+- (void)setupNavigationForBookmarksHomeViewController:
+            (BookmarksHomeViewController*)viewController
+                                    usingBookmarkNode:
+                                        (const bookmarks::BookmarkNode*)node {
   viewController.navigationItem.leftBarButtonItem.action = @selector(back);
   // Disable large titles on every VC but the root controller.
   if (node != self.bookmarks->root_node()) {
@@ -1111,7 +1112,7 @@
     // Before passing the URL to the block, make sure the block has a copy of
     // the URL and not just a reference.
     const GURL localUrl(url);
-    __weak BookmarkHomeViewController* weakSelf = self;
+    __weak BookmarksHomeViewController* weakSelf = self;
     dispatch_async(dispatch_get_main_queue(), ^{
       [weakSelf loadURL:localUrl];
     });
@@ -1149,12 +1150,12 @@
           self.sharedState.tableViewDisplayedRootNode->children().size(),
           folderTitle);
 
-  BookmarkHomeNodeItem* nodeItem = [[BookmarkHomeNodeItem alloc]
-      initWithType:BookmarkHomeItemTypeBookmark
+  BookmarksHomeNodeItem* nodeItem = [[BookmarksHomeNodeItem alloc]
+      initWithType:BookmarksHomeItemTypeBookmark
       bookmarkNode:self.sharedState.editingFolderNode];
   [self.sharedState.tableViewModel
                       addItem:nodeItem
-      toSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+      toSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
 
   // Insert the new folder cell at the end of the table.
   NSIndexPath* newRowIndexPath =
@@ -1174,10 +1175,10 @@
                     animated:YES];
 }
 
-- (BookmarkHomeViewController*)createControllerWithRootFolder:
+- (BookmarksHomeViewController*)createControllerWithRootFolder:
     (const bookmarks::BookmarkNode*)folder {
-  BookmarkHomeViewController* controller =
-      [[BookmarkHomeViewController alloc] initWithBrowser:self.browser];
+  BookmarksHomeViewController* controller =
+      [[BookmarksHomeViewController alloc] initWithBrowser:self.browser];
   [controller setRootNode:folder];
   controller.homeDelegate = self.homeDelegate;
   controller.applicationCommandsHandler = self.applicationCommandsHandler;
@@ -1196,10 +1197,10 @@
   // Add selected nodes to editNodes only if they are not removed (still exist
   // in the table).
   NSArray<TableViewItem*>* items = [self.sharedState.tableViewModel
-      itemsInSectionWithIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+      itemsInSectionWithIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   for (TableViewItem* item in items) {
-    BookmarkHomeNodeItem* nodeItem =
-        base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
+    BookmarksHomeNodeItem* nodeItem =
+        base::mac::ObjCCastStrict<BookmarksHomeNodeItem>(item);
     const BookmarkNode* node = nodeItem.bookmarkNode;
     if (self.sharedState.editNodes.find(node) !=
         self.sharedState.editNodes.end()) {
@@ -1292,9 +1293,9 @@
   TableViewItem* item =
       [self.sharedState.tableViewModel itemAtIndexPath:indexPath];
 
-  if (item.type == BookmarkHomeItemTypeBookmark) {
-    BookmarkHomeNodeItem* nodeItem =
-        base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
+  if (item.type == BookmarksHomeItemTypeBookmark) {
+    BookmarksHomeNodeItem* nodeItem =
+        base::mac::ObjCCastStrict<BookmarksHomeNodeItem>(item);
     return nodeItem.bookmarkNode;
   }
 
@@ -1312,7 +1313,7 @@
   }
   if (self.sharedState.currentlyShowingSearchResults) {
     return [self
-        hasItemsInSectionIdentifier:BookmarkHomeSectionIdentifierBookmarks];
+        hasItemsInSectionIdentifier:BookmarksHomeSectionIdentifierBookmarks];
   } else {
     return !self.sharedState.tableViewDisplayedRootNode->children().empty();
   }
@@ -1364,10 +1365,10 @@
   AddSameConstraints(self.scrimView, self.view.superview);
   self.tableView.accessibilityElementsHidden = YES;
   self.tableView.scrollEnabled = NO;
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   [UIView animateWithDuration:kTableViewNavigationScrimFadeDuration
                    animations:^{
-                     BookmarkHomeViewController* strongSelf = weakSelf;
+                     BookmarksHomeViewController* strongSelf = weakSelf;
                      if (!strongSelf) {
                        return;
                      }
@@ -1378,13 +1379,13 @@
 
 // Hide scrim and restore toolbar.
 - (void)hideScrim {
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   [UIView animateWithDuration:kTableViewNavigationScrimFadeDuration
       animations:^{
         weakSelf.scrimView.alpha = 0.0f;
       }
       completion:^(BOOL finished) {
-        BookmarkHomeViewController* strongSelf = weakSelf;
+        BookmarksHomeViewController* strongSelf = weakSelf;
         if (!strongSelf) {
           return;
         }
@@ -1443,14 +1444,14 @@
 // Hide the loading spinner if it is showing.
 - (void)hideLoadingSpinnerBackground {
   if (self.spinnerView) {
-    __weak BookmarkHomeViewController* weakSelf = self;
+    __weak BookmarksHomeViewController* weakSelf = self;
     [self.spinnerView stopWaitingWithCompletion:^{
       [UIView animateWithDuration:0.2
           animations:^{
             weakSelf.spinnerView.alpha = 0.0;
           }
           completion:^(BOOL finished) {
-            BookmarkHomeViewController* strongSelf = weakSelf;
+            BookmarksHomeViewController* strongSelf = weakSelf;
             if (!strongSelf) {
               return;
             }
@@ -1722,7 +1723,7 @@
 
 - (void)configureCoordinator:(AlertCoordinator*)coordinator
      forMultipleBookmarkURLs:(const std::set<const BookmarkNode*>)nodes {
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   coordinator.alertController.view.accessibilityIdentifier =
       kBookmarkHomeContextMenuIdentifier;
 
@@ -1730,7 +1731,7 @@
   [coordinator
       addItemWithTitle:titleString
                 action:^{
-                  BookmarkHomeViewController* strongSelf = weakSelf;
+                  BookmarksHomeViewController* strongSelf = weakSelf;
                   if (!strongSelf) {
                     return;
                   }
@@ -1750,7 +1751,7 @@
   [coordinator
       addItemWithTitle:titleString
                 action:^{
-                  BookmarkHomeViewController* strongSelf = weakSelf;
+                  BookmarksHomeViewController* strongSelf = weakSelf;
                   if (!strongSelf) {
                     return;
                   }
@@ -1775,7 +1776,7 @@
   [coordinator
       addItemWithTitle:titleString
                 action:^{
-                  BookmarkHomeViewController* strongSelf = weakSelf;
+                  BookmarksHomeViewController* strongSelf = weakSelf;
                   if (!strongSelf) {
                     return;
                   }
@@ -1792,7 +1793,7 @@
 
 - (void)configureCoordinator:(AlertCoordinator*)coordinator
         forSingleBookmarkURL:(const BookmarkNode*)node {
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   std::string urlString = node->url().possibly_invalid_spec();
   coordinator.alertController.view.accessibilityIdentifier =
       kBookmarkHomeContextMenuIdentifier;
@@ -1806,7 +1807,7 @@
 
   [coordinator addItemWithTitle:titleString
                          action:^{
-                           BookmarkHomeViewController* strongSelf = weakSelf;
+                           BookmarksHomeViewController* strongSelf = weakSelf;
                            if (!strongSelf) {
                              return;
                            }
@@ -1867,7 +1868,7 @@
                   // Use strongSelf even though the object is only used once
                   // because we do not want to change the global pasteboard
                   // if the view has been deallocated.
-                  BookmarkHomeViewController* strongSelf = weakSelf;
+                  BookmarksHomeViewController* strongSelf = weakSelf;
                   if (!strongSelf) {
                     return;
                   }
@@ -1880,7 +1881,7 @@
 
 - (void)configureCoordinator:(AlertCoordinator*)coordinator
      forSingleBookmarkFolder:(const BookmarkNode*)node {
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   coordinator.alertController.view.accessibilityIdentifier =
       kBookmarkHomeContextMenuIdentifier;
 
@@ -1894,7 +1895,7 @@
 
   [coordinator addItemWithTitle:titleString
                          action:^{
-                           BookmarkHomeViewController* strongSelf = weakSelf;
+                           BookmarksHomeViewController* strongSelf = weakSelf;
                            if (!strongSelf) {
                              return;
                            }
@@ -1911,7 +1912,7 @@
   titleString = GetNSString(IDS_IOS_BOOKMARK_CONTEXT_MENU_MOVE);
   [coordinator addItemWithTitle:titleString
                          action:^{
-                           BookmarkHomeViewController* strongSelf = weakSelf;
+                           BookmarksHomeViewController* strongSelf = weakSelf;
                            if (!strongSelf) {
                              return;
                            }
@@ -1930,7 +1931,7 @@
 - (void)configureCoordinator:(AlertCoordinator*)coordinator
     forMixedAndMultiFolderSelection:
         (const std::set<const bookmarks::BookmarkNode*>)nodes {
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   coordinator.alertController.view.accessibilityIdentifier =
       kBookmarkHomeContextMenuIdentifier;
 
@@ -1943,7 +1944,7 @@
   [coordinator
       addItemWithTitle:titleString
                 action:^{
-                  BookmarkHomeViewController* strongSelf = weakSelf;
+                  BookmarksHomeViewController* strongSelf = weakSelf;
                   if (!strongSelf) {
                     return;
                   }
@@ -2018,7 +2019,7 @@
   if (indexPath == nil ||
       [self.sharedState.tableViewModel
           sectionIdentifierForSectionIndex:indexPath.section] !=
-          BookmarkHomeSectionIdentifierBookmarks) {
+          BookmarksHomeSectionIdentifierBookmarks) {
     return NO;
   }
 
@@ -2083,9 +2084,9 @@
   [self hideScrim];
 }
 
-#pragma mark - BookmarkHomeSharedStateObserver
+#pragma mark - BookmarksHomeSharedStateObserver
 
-- (void)sharedStateDidClearEditNodes:(BookmarkHomeSharedState*)sharedState {
+- (void)sharedStateDidClearEditNodes:(BookmarksHomeSharedState*)sharedState {
   [self handleSelectEditNodes:sharedState.editNodes];
 }
 
@@ -2098,11 +2099,11 @@
   TableViewItem* item =
       [self.sharedState.tableViewModel itemAtIndexPath:indexPath];
 
-  cell.userInteractionEnabled = (item.type != BookmarkHomeItemTypeMessage);
+  cell.userInteractionEnabled = (item.type != BookmarksHomeItemTypeMessage);
 
-  if (item.type == BookmarkHomeItemTypeBookmark) {
-    BookmarkHomeNodeItem* nodeItem =
-        base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
+  if (item.type == BookmarksHomeItemTypeBookmark) {
+    BookmarksHomeNodeItem* nodeItem =
+        base::mac::ObjCCastStrict<BookmarksHomeNodeItem>(item);
     if (nodeItem.bookmarkNode->is_folder() &&
         nodeItem.bookmarkNode == self.sharedState.editingFolderNode) {
       TableViewBookmarkFolderCell* tableCell =
@@ -2111,9 +2112,9 @@
       // needed when scrolling away and then back into the editingCell,
       // without the delay the cell will resign first responder before its
       // created.
-      __weak BookmarkHomeViewController* weakSelf = self;
+      __weak BookmarksHomeViewController* weakSelf = self;
       dispatch_async(dispatch_get_main_queue(), ^{
-        BookmarkHomeViewController* strongSelf = weakSelf;
+        BookmarksHomeViewController* strongSelf = weakSelf;
         if (!strongSelf) {
           return;
         }
@@ -2137,7 +2138,7 @@
     canEditRowAtIndexPath:(NSIndexPath*)indexPath {
   TableViewItem* item =
       [self.sharedState.tableViewModel itemAtIndexPath:indexPath];
-  if (item.type != BookmarkHomeItemTypeBookmark) {
+  if (item.type != BookmarksHomeItemTypeBookmark) {
     // Can only edit bookmarks.
     return NO;
   }
@@ -2152,8 +2153,8 @@
   // Enable the swipe-to-delete gesture and reordering control for editable
   // nodes of type URL or Folder, but not the permanent ones. Only enable
   // swipe-to-delete if editing bookmarks is allowed.
-  BookmarkHomeNodeItem* nodeItem =
-      base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
+  BookmarksHomeNodeItem* nodeItem =
+      base::mac::ObjCCastStrict<BookmarksHomeNodeItem>(item);
   const BookmarkNode* node = nodeItem.bookmarkNode;
   return [self isEditBookmarksEnabled] && [self isUrlOrFolder:node] &&
          [self isNodeEditableByUser:node];
@@ -2164,14 +2165,14 @@
      forRowAtIndexPath:(NSIndexPath*)indexPath {
   TableViewItem* item =
       [self.sharedState.tableViewModel itemAtIndexPath:indexPath];
-  if (item.type != BookmarkHomeItemTypeBookmark) {
+  if (item.type != BookmarksHomeItemTypeBookmark) {
     // Can only commit edits for bookmarks.
     return;
   }
 
   if (editingStyle == UITableViewCellEditingStyleDelete) {
-    BookmarkHomeNodeItem* nodeItem =
-        base::mac::ObjCCastStrict<BookmarkHomeNodeItem>(item);
+    BookmarksHomeNodeItem* nodeItem =
+        base::mac::ObjCCastStrict<BookmarksHomeNodeItem>(item);
     const BookmarkNode* node = nodeItem.bookmarkNode;
     std::set<const BookmarkNode*> nodes;
     nodes.insert(node);
@@ -2191,7 +2192,7 @@
   }
   TableViewItem* item =
       [self.sharedState.tableViewModel itemAtIndexPath:indexPath];
-  if (item.type != BookmarkHomeItemTypeBookmark) {
+  if (item.type != BookmarksHomeItemTypeBookmark) {
     // Can only move bookmarks.
     return NO;
   }
@@ -2237,7 +2238,7 @@
     didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
   NSInteger sectionIdentifier = [self.sharedState.tableViewModel
       sectionIdentifierForSectionIndex:indexPath.section];
-  if (sectionIdentifier == BookmarkHomeSectionIdentifierBookmarks) {
+  if (sectionIdentifier == BookmarksHomeSectionIdentifierBookmarks) {
     const BookmarkNode* node = [self nodeAtIndexPath:indexPath];
     DCHECK(node);
     // If table is in edit mode, record all the nodes added to edit set.
@@ -2275,7 +2276,7 @@
     didDeselectRowAtIndexPath:(NSIndexPath*)indexPath {
   NSInteger sectionIdentifier = [self.sharedState.tableViewModel
       sectionIdentifierForSectionIndex:indexPath.section];
-  if (sectionIdentifier == BookmarkHomeSectionIdentifierBookmarks &&
+  if (sectionIdentifier == BookmarksHomeSectionIdentifierBookmarks &&
       self.sharedState.currentlyInEditMode) {
     const BookmarkNode* node = [self nodeAtIndexPath:indexPath];
     DCHECK(node);
@@ -2305,11 +2306,11 @@
   UIContextMenuActionProvider actionProvider;
 
   int64_t nodeId = node->id();
-  __weak BookmarkHomeViewController* weakSelf = self;
+  __weak BookmarksHomeViewController* weakSelf = self;
   if (node->is_url()) {
     GURL nodeURL = node->url();
     actionProvider = ^(NSArray<UIMenuElement*>* suggestedActions) {
-      BookmarkHomeViewController* strongSelf = weakSelf;
+      BookmarksHomeViewController* strongSelf = weakSelf;
       if (!strongSelf) {
         return [UIMenu menuWithTitle:@"" children:@[]];
       }
@@ -2358,7 +2359,7 @@
       [menuElements addObject:[actionFactory actionToCopyURL:nodeURL]];
 
       UIAction* editAction = [actionFactory actionToEditWithBlock:^{
-        BookmarkHomeViewController* innerStrongSelf = weakSelf;
+        BookmarksHomeViewController* innerStrongSelf = weakSelf;
         if (!innerStrongSelf) {
           return;
         }
@@ -2372,7 +2373,7 @@
 
       [menuElements
           addObject:[actionFactory actionToShareWithBlock:^{
-            BookmarkHomeViewController* innerStrongSelf = weakSelf;
+            BookmarksHomeViewController* innerStrongSelf = weakSelf;
             if (!innerStrongSelf) {
               return;
             }
@@ -2388,7 +2389,7 @@
           }]];
 
       UIAction* deleteAction = [actionFactory actionToDeleteWithBlock:^{
-        BookmarkHomeViewController* innerStrongSelf = weakSelf;
+        BookmarksHomeViewController* innerStrongSelf = weakSelf;
         if (!innerStrongSelf) {
           return;
         }
@@ -2413,7 +2414,7 @@
     };
   } else if (node->is_folder()) {
     actionProvider = ^(NSArray<UIMenuElement*>* suggestedActions) {
-      BookmarkHomeViewController* strongSelf = weakSelf;
+      BookmarksHomeViewController* strongSelf = weakSelf;
       if (!strongSelf) {
         return [UIMenu menuWithTitle:@"" children:@[]];
       }
@@ -2428,7 +2429,7 @@
           [[NSMutableArray alloc] init];
 
       UIAction* editAction = [actionFactory actionToEditWithBlock:^{
-        BookmarkHomeViewController* innerStrongSelf = weakSelf;
+        BookmarksHomeViewController* innerStrongSelf = weakSelf;
         if (!innerStrongSelf) {
           return;
         }
@@ -2439,7 +2440,7 @@
         }
       }];
       UIAction* moveAction = [actionFactory actionToMoveFolderWithBlock:^{
-        BookmarkHomeViewController* innerStrongSelf = weakSelf;
+        BookmarksHomeViewController* innerStrongSelf = weakSelf;
         if (!innerStrongSelf) {
           return;
         }
@@ -2494,7 +2495,7 @@
     URLInfoAtIndexPath:(NSIndexPath*)indexPath {
   if (indexPath.section ==
       [self.tableViewModel
-          sectionForSectionIdentifier:BookmarkHomeSectionIdentifierMessages]) {
+          sectionForSectionIdentifier:BookmarksHomeSectionIdentifierMessages]) {
     return nil;
   }
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller_unittest.mm
similarity index 88%
rename from ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
rename to ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller_unittest.mm
index 5a4c9bb..c916098 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller_unittest.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.h"
+#import "ios/chrome/browser/ui/bookmarks/bookmarks_home_view_controller.h"
 
 #import "base/test/metrics/user_action_tester.h"
 #import "components/bookmarks/browser/bookmark_model.h"
@@ -21,9 +21,9 @@
 
 namespace {
 
-using BookmarkHomeViewControllerTest = BookmarkIOSUnitTestSupport;
+using BookmarksHomeViewControllerTest = BookmarkIOSUnitTestSupport;
 
-TEST_F(BookmarkHomeViewControllerTest,
+TEST_F(BookmarksHomeViewControllerTest,
        TableViewPopulatedAfterBookmarkModelLoaded) {
   @autoreleasepool {
     id mockSnackbarCommandHandler =
@@ -46,8 +46,8 @@
         startDispatchingToTarget:mockApplicationSettingsCommandHandler
                      forProtocol:@protocol(ApplicationSettingsCommands)];
 
-    BookmarkHomeViewController* controller =
-        [[BookmarkHomeViewController alloc] initWithBrowser:browser_.get()];
+    BookmarksHomeViewController* controller =
+        [[BookmarksHomeViewController alloc] initWithBrowser:browser_.get()];
     controller.applicationCommandsHandler = mockApplicationCommandHandler;
     controller.snackbarCommandsHandler = mockSnackbarCommandHandler;
 
@@ -58,7 +58,7 @@
 }
 
 // Checks that metrics are correctly reported.
-TEST_F(BookmarkHomeViewControllerTest, Metrics) {
+TEST_F(BookmarksHomeViewControllerTest, Metrics) {
   @autoreleasepool {
     id mockSnackbarCommandHandler =
         OCMProtocolMock(@protocol(SnackbarCommands));
@@ -80,8 +80,8 @@
         startDispatchingToTarget:mockApplicationSettingsCommandHandler
                      forProtocol:@protocol(ApplicationSettingsCommands)];
 
-    BookmarkHomeViewController* controller =
-        [[BookmarkHomeViewController alloc] initWithBrowser:browser_.get()];
+    BookmarksHomeViewController* controller =
+        [[BookmarksHomeViewController alloc] initWithBrowser:browser_.get()];
     controller.applicationCommandsHandler = mockApplicationCommandHandler;
     controller.snackbarCommandsHandler = mockSnackbarCommandHandler;
 
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_promo_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_promo_egtest.mm
index d3f43b7..9c361226 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_promo_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_promo_egtest.mm
@@ -31,7 +31,7 @@
 #error "This file requires ARC support."
 #endif
 
-using chrome_test_util::BookmarkHomeDoneButton;
+using chrome_test_util::BookmarksHomeDoneButton;
 using chrome_test_util::BookmarksNavigationBarBackButton;
 using chrome_test_util::IdentityCellMatcherForEmail;
 using chrome_test_util::PrimarySignInButton;
@@ -246,7 +246,7 @@
                   @"Should have incremented the display count");
 
   // Close the bookmark view and open it again.
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
   [BookmarkEarlGreyUI openBookmarks];
   [ChromeEarlGreyUI waitForAppToIdle];
diff --git a/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.h b/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.h
index 0b6fee3..a9b04c41 100644
--- a/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.h
+++ b/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.h
@@ -11,9 +11,9 @@
 class BookmarkNode;
 }
 
-// BookmarkHomeNodeItem provides data for a table view row that displays a
+// BookmarksHomeNodeItem provides data for a table view row that displays a
 // single bookmark.
-@interface BookmarkHomeNodeItem : TableViewItem
+@interface BookmarksHomeNodeItem : TableViewItem
 
 // The BookmarkNode that backs this item.
 @property(nonatomic, readwrite, assign)
diff --git a/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.mm b/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.mm
index 6e333a8..d4f13503 100644
--- a/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.mm
+++ b/ios/chrome/browser/ui/bookmarks/cells/bookmark_home_node_item.mm
@@ -16,7 +16,7 @@
 #error "This file requires ARC support."
 #endif
 
-@implementation BookmarkHomeNodeItem
+@implementation BookmarksHomeNodeItem
 @synthesize bookmarkNode = _bookmarkNode;
 
 - (instancetype)initWithType:(NSInteger)type
diff --git a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_egtest.mm b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_egtest.mm
index 5d3598ab..4421a79 100644
--- a/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/folder_chooser/bookmarks_folder_chooser_egtest.mm
@@ -26,8 +26,8 @@
 #error "This file requires ARC support."
 #endif
 
-using chrome_test_util::BookmarkHomeDoneButton;
 using chrome_test_util::BookmarksDeleteSwipeButton;
+using chrome_test_util::BookmarksHomeDoneButton;
 using chrome_test_util::BookmarksNavigationBarBackButton;
 using chrome_test_util::BookmarksSaveEditDoneButton;
 using chrome_test_util::BookmarksSaveEditFolderButton;
@@ -815,7 +815,7 @@
       assertWithMatcher:grey_notVisible()];
 
   // Close bookmarks
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Second, bookmark a page.
@@ -881,7 +881,7 @@
                                                  pressReturn:NO];
 
   // Interrupt the folder name editing by tapping on done.
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
   // Reopen bookmarks.
   [BookmarkEarlGreyUI openBookmarks];
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index b7c2439..6ec0268c 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -1070,7 +1070,8 @@
 
 // Tests the "new search" menu item from the new tab menu after disabling the
 // feed.
-- (void)testNewSearchFromNewTabMenuAfterTogglingFeed {
+// TODO(crbug.com/1408823): This test is flaky.
+- (void)FLAKY_testNewSearchFromNewTabMenuAfterTogglingFeed {
   if ([ChromeEarlGrey isIPadIdiom]) {
     EARL_GREY_TEST_SKIPPED(@"New Search is only available in phone layout.");
   }
diff --git a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
index c1983ede..2317130 100644
--- a/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/google_services_settings_egtest.mm
@@ -40,7 +40,7 @@
 #endif
 
 using base::test::ios::kWaitForActionTimeout;
-using chrome_test_util::BookmarkHomeDoneButton;
+using chrome_test_util::BookmarksHomeDoneButton;
 using chrome_test_util::ButtonWithAccessibilityLabelId;
 using chrome_test_util::GoogleServicesSettingsButton;
 using chrome_test_util::PrimarySignInButton;
@@ -235,7 +235,7 @@
   // Verify bookmarks are cleared.
   [BookmarkEarlGreyUI openBookmarks];
   [BookmarkEarlGreyUI verifyEmptyBackgroundAppears];
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Turn on "Allow Chrome Sign-in" feature.
@@ -304,7 +304,7 @@
   // Verify bookmarks are available.
   [BookmarkEarlGreyUI openBookmarks];
   [BookmarkEarlGreyUI verifyEmptyBackgroundIsAbsent];
-  [[EarlGrey selectElementWithMatcher:BookmarkHomeDoneButton()]
+  [[EarlGrey selectElementWithMatcher:BookmarksHomeDoneButton()]
       performAction:grey_tap()];
 
   // Turn on "Allow Chrome Sign-in" feature.
diff --git a/ios/chrome/browser/ui/settings/password/legacy_password_settings_egtest.mm b/ios/chrome/browser/ui/settings/password/legacy_password_settings_egtest.mm
index 299a441..691d20ab 100644
--- a/ios/chrome/browser/ui/settings/password/legacy_password_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/password/legacy_password_settings_egtest.mm
@@ -1933,7 +1933,8 @@
 // Tests that adding new password credential where the username and website
 // matches with an existing credential results in showing a section alert for
 // the existing credential.
-- (void)testAddNewDuplicatedPasswordCredential {
+// TODO(crbug.com/1408773): Test is consistently failing.
+- (void)DISABLED_testAddNewDuplicatedPasswordCredential {
   SaveExamplePasswordForm();
 
   OpenPasswordSettings();
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index c7f1daf..8a586c2e 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-8c122ef0a50d16aa6d4beabd99aff9f945351985
\ No newline at end of file
+6d517d4f2fa9f6a627b2a5483d3a794c161c78da
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 8735881..65f39f1 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-7d616128bfe4397452c1201ff7d3908f93bc10e5
\ No newline at end of file
+a3a13c93fb5505e32ccaf33e8900be2a415defe7
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 6ea4b5da..d13056a 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-27eb00ae93c1cc7c7090d3d69f0a3246695ec7ff
\ No newline at end of file
+76f46aa2754ebdf02d09f5164c31a200abc3dc1c
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index ccad5f9..56a6c63 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-b3de4ddff65c49fb42963b2820ac9dc3626d7a66
\ No newline at end of file
+f074b2ba85c76775a05efda0197915e9321f0c3a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index e67673a7..75c44c2 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-079167680160f90051c85b4dbfeeae95291735fd
\ No newline at end of file
+2effcc1b04813c09bc8088e541b601d4cd7ff34b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index df490d4..3c40f56 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8e0530b7176674389348e6653b7bf68d6a21e951
\ No newline at end of file
+db5997b6c4f94f34db78d8d50f6ec4f76d064545
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 982b04b..1726a6f 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-927da5a5a6ef1f1ce6f5064ec0c8d03a97ab0ab0
\ No newline at end of file
+a85384fa2def594e3977b45ddcf31a078434070a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 664dcd9c..162a3b9 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-a5ac10f73b3d192d94d93cfdcc0b3e8733d29f00
\ No newline at end of file
+e23fa67af176babf6426cba03d2b8852afc22e53
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 0355f0e..67946bc 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-c84fb526f37f7f67a7651544137cbf13e41862dd
\ No newline at end of file
+5ea59f91d9e1b4069019e62b4e1a20a7feb967af
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 39a9e13..d4ae02d 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-ba795b781dd4f37af8b1bd765633fa33acf3ef10
\ No newline at end of file
+e5a5fc2d9535acca533bfb98f3e78d6d2521a93b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 6249e8b3..f5a88c7 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-a5a12c60a0b6ea5b89f36685ca14906f7f793cee
\ No newline at end of file
+5fc79db478cba0bd1d029c41d8226eea838609b9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 8be8293..5b6356fc 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-8a64bd21cfba759eda5a9ec4fa8eb4d5aa470002
\ No newline at end of file
+910268e6049939271c1806ea1645e34772b3b92c
\ No newline at end of file
diff --git a/ios/web/find_in_page/BUILD.gn b/ios/web/find_in_page/BUILD.gn
index 36f08a7..f3c1a63 100644
--- a/ios/web/find_in_page/BUILD.gn
+++ b/ios/web/find_in_page/BUILD.gn
@@ -23,7 +23,10 @@
     "find_in_page_constants.mm",
     "find_in_page_java_script_feature.h",
     "find_in_page_java_script_feature.mm",
+    "find_in_page_manager.mm",
     "find_in_page_manager_delegate_bridge.mm",
+    "find_in_page_manager_impl.h",
+    "find_in_page_manager_impl.mm",
     "java_script_find_in_page_manager_impl.h",
     "java_script_find_in_page_manager_impl.mm",
     "java_script_find_in_page_request.h",
diff --git a/ios/web/find_in_page/find_in_page_manager.mm b/ios/web/find_in_page/find_in_page_manager.mm
new file mode 100644
index 0000000..ac7a1db
--- /dev/null
+++ b/ios/web/find_in_page/find_in_page_manager.mm
@@ -0,0 +1,27 @@
+// 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 "ios/web/public/find_in_page/find_in_page_manager.h"
+#import "ios/web/find_in_page/find_in_page_manager_impl.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace web {
+
+FindInPageManager* FindInPageManager::GetOrCreateForWebState(
+    WebState* web_state,
+    bool use_find_interaction) {
+  auto* manager = FindInPageManager::FromWebState(web_state);
+  if (!manager) {
+    FindInPageManagerImpl::CreateForWebState(web_state, use_find_interaction);
+    manager = FindInPageManager::FromWebState(web_state);
+    DCHECK(manager);
+  }
+
+  return manager;
+}
+
+}  // namespace web
diff --git a/ios/web/find_in_page/find_in_page_manager_impl.h b/ios/web/find_in_page/find_in_page_manager_impl.h
new file mode 100644
index 0000000..26abc16
--- /dev/null
+++ b/ios/web/find_in_page/find_in_page_manager_impl.h
@@ -0,0 +1,104 @@
+// 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 IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_IMPL_H_
+#define IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_IMPL_H_
+
+#import "base/timer/timer.h"
+#import "ios/web/public/find_in_page/find_in_page_manager.h"
+#import "ios/web/public/web_state_observer.h"
+
+#import "base/memory/weak_ptr.h"
+
+@class UIFindSession;
+@class UITextSearchingFindSession;
+
+namespace web {
+
+class FindInPageManagerImpl : public FindInPageManager,
+                              public web::WebStateObserver {
+ public:
+  // Need to overload as the default implementation inherited from
+  // WebStateUserData<FindInPageManager> would create a
+  // FindInPageManager which is a pure abstract class.
+  static void CreateForWebState(WebState* web_state, bool use_find_interaction);
+
+  explicit FindInPageManagerImpl(web::WebState* web_state,
+                                 bool use_find_interaction);
+  ~FindInPageManagerImpl() override;
+
+  // AbstractFindInPageManager:
+  void Find(NSString* query, FindInPageOptions options) override;
+  void StopFinding() override;
+  bool CanSearchContent() override;
+  FindInPageManagerDelegate* GetDelegate() override;
+  void SetDelegate(FindInPageManagerDelegate* delegate) override;
+
+ private:
+  friend class web::WebStateUserData<FindInPageManagerImpl>;
+
+  // Lazily creates the Find interaction in the web state and returns it. Should
+  // only be called if `use_find_interaction_`.
+  UIFindInteraction* GetOrCreateFindInteraction() API_AVAILABLE(ios(16));
+
+  // Executes find logic for `FindInPageSearch` option.
+  void StartSearch(NSString* query) API_AVAILABLE(ios(16));
+  // Executes find logic for `FindInPageNext` option.
+  void SelectNextMatch() API_AVAILABLE(ios(16));
+  // Executes find logic for `FindInPagePrevious` option.
+  void SelectPreviousMatch() API_AVAILABLE(ios(16));
+  // Executes `StopFinding` logic.
+  void StopSearch() API_AVAILABLE(ios(16));
+
+  // Returns the currently active Find session if any. If there is a Find
+  // interaction in the web state, then its active Find session is returned. If
+  // not, `find_session_` is returned.
+  UIFindSession* GetActiveFindSession() API_AVAILABLE(ios(16));
+  // Start calling `PollActiveFindSession` repeatedly to report Find session
+  // results to `delegate_` using `find_session_polling_timer_`.
+  void StartPollingActiveFindSession() API_AVAILABLE(ios(16));
+  // Stop calling `PollActiveFindSession` repeatedly using
+  // `find_session_polling_timer_`.
+  void StopPollingActiveFindSession() API_AVAILABLE(ios(16));
+  // Report the current Find session's results to `delegate_`.
+  void PollActiveFindSession() API_AVAILABLE(ios(16));
+
+  // WebStateObserver overrides
+  void WasShown(WebState* web_state) override;
+  void WasHidden(WebState* web_state) override;
+  void WebStateDestroyed(WebState* web_state) override;
+
+ protected:
+  // Whether the manager should use a Find interaction, or instead use its own
+  // `UIFindSession` instance stored in `find_session_`.
+  bool use_find_interaction_;
+
+  // Last value given to `StartSearch`. This is used in `PollActiveFindSession`
+  // so a query value can be provided to the delegate.
+  NSString* current_query_ = nil;
+  // Last result count reported to the delegate through `DidHighlightMatches`.
+  // This is used to ensure nothing is reported if the value has not changed.
+  NSInteger current_result_count_ = -1;
+  // Last highlighted result index reported to the delegate through
+  // `DidSelectMatch`. This is used to ensure nothing is reported if the value
+  // has not changed.
+  NSInteger current_highlighted_result_index_ = NSNotFound;
+  // Timer started in `StartPollingActiveFindSession()` and stopped in
+  // `StopPollingActiveFindSession()` to periodically call
+  // `PollActiveFindSession()` so as to report any changes in the state of the
+  // active Find session to the delegate.
+  base::RepeatingTimer find_session_polling_timer_;
+
+  // Current Find session if `use_find_interaction_` is not `true`. Instantiated
+  // in `StartSearch` and set back to `nil` in `StopSearch`.
+  UITextSearchingFindSession* find_session_ API_AVAILABLE(ios(16)) = nil;
+
+  FindInPageManagerDelegate* delegate_ = nullptr;
+  web::WebState* web_state_ = nullptr;
+  base::WeakPtrFactory<FindInPageManagerImpl> weak_factory_;
+};
+
+}  // namespace web
+
+#endif  // IOS_WEB_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_IMPL_H_
diff --git a/ios/web/find_in_page/find_in_page_manager_impl.mm b/ios/web/find_in_page/find_in_page_manager_impl.mm
new file mode 100644
index 0000000..8707dec
--- /dev/null
+++ b/ios/web/find_in_page/find_in_page_manager_impl.mm
@@ -0,0 +1,261 @@
+// 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 "ios/web/find_in_page/find_in_page_manager_impl.h"
+#import "ios/web/public/find_in_page/find_in_page_manager_delegate.h"
+#import "ios/web/public/thread/web_task_traits.h"
+#import "ios/web/public/thread/web_thread.h"
+#import "ios/web/public/web_client.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+// Delay between each call to `PollActiveFindSession`.
+auto kPollActiveFindSessionDelay = base::Milliseconds(100);
+
+}  // namespace
+
+namespace web {
+
+void FindInPageManagerImpl::CreateForWebState(WebState* web_state,
+                                              bool use_find_interaction) {
+  DCHECK(web_state);
+  // Should not create this if the web state is not realized.
+  DCHECK(web_state->IsRealized());
+  if (!FromWebState(web_state)) {
+    web_state->SetUserData(UserDataKey(),
+                           std::make_unique<FindInPageManagerImpl>(
+                               web_state, use_find_interaction));
+  }
+}
+
+FindInPageManagerImpl::FindInPageManagerImpl(web::WebState* web_state,
+                                             bool use_find_interaction)
+    : use_find_interaction_(use_find_interaction),
+      web_state_(web_state),
+      weak_factory_(this) {
+  web_state_->AddObserver(this);
+  find_session_polling_timer_.SetTaskRunner(GetUIThreadTaskRunner({}));
+}
+
+FindInPageManagerImpl::~FindInPageManagerImpl() {
+  if (web_state_) {
+    web_state_->RemoveObserver(this);
+    web_state_ = nullptr;
+  }
+}
+
+void FindInPageManagerImpl::Find(NSString* query, FindInPageOptions options) {
+  if (@available(iOS 16, *)) {
+    switch (options) {
+      case FindInPageOptions::FindInPageSearch:
+        DCHECK(query);
+        StartSearch(query);
+        break;
+      case FindInPageOptions::FindInPageNext:
+        SelectNextMatch();
+        break;
+      case FindInPageOptions::FindInPagePrevious:
+        SelectPreviousMatch();
+        break;
+    }
+  }
+}
+
+UIFindSession* FindInPageManagerImpl::GetActiveFindSession()
+    API_AVAILABLE(ios(16)) {
+  // If a Find interaction should be used, then the Find session to be used is
+  // the one provided by this Find interaction.
+  if (use_find_interaction_) {
+    UIFindInteraction* find_interaction = GetOrCreateFindInteraction();
+    // According to the official documentation, if `findNavigatorVisible` is
+    // `NO`, then `activeFindSession` should be `nil`. In practice, it is
+    // necessary to check the value of `findNavigatorVisible` to ensure a Find
+    // session is returned only if the Find navigator is visible.
+    if (!find_interaction.findNavigatorVisible) {
+      return nil;
+    }
+    return find_interaction.activeFindSession;
+  }
+  return find_session_;
+}
+
+UIFindInteraction* FindInPageManagerImpl::GetOrCreateFindInteraction()
+    API_AVAILABLE(ios(16)) {
+  DCHECK(use_find_interaction_);
+  UIFindInteraction* find_interaction = web_state_->GetFindInteraction();
+  if (!find_interaction) {
+    web_state_->SetFindInteractionEnabled(true);
+    find_interaction = web_state_->GetFindInteraction();
+  }
+  DCHECK(find_interaction);
+  return find_interaction;
+}
+
+// Executes find logic for `FindInPageSearch` option.
+void FindInPageManagerImpl::StartSearch(NSString* query)
+    API_AVAILABLE(ios(16)) {
+  // Stop polling Find session in case search is already ongoing.
+  StopPollingActiveFindSession();
+
+  // Reset latest reported Find session data.
+  current_query_ = [query copy];
+  current_result_count_ = -1;
+  current_highlighted_result_index_ = NSNotFound;
+
+  if (use_find_interaction_) {
+    UIFindInteraction* find_interaction = web_state_->GetFindInteraction();
+    // If a Find interaction should be used, prepopulate the Find navigator and
+    // present it.
+    find_interaction.searchText = query;
+    [find_interaction presentFindNavigatorShowingReplace:NO];
+  } else {
+    if (find_session_) {
+      // If a Find session already exists internally, invalidate its found
+      // results.
+      [find_session_ invalidateFoundResults];
+    }
+
+    web::GetWebClient()->StartTextSearchInWebState(web_state_);
+
+    // Instantiate a new internal Find session with the given `query`.
+    id<UITextSearching> searchableObject =
+        web::GetWebClient()->GetSearchableObjectForWebState(web_state_);
+    find_session_ = [[UITextSearchingFindSession alloc]
+        initWithSearchableObject:searchableObject];
+    [find_session_ performSearchWithQuery:query options:nil];
+  }
+
+  StartPollingActiveFindSession();
+}
+
+void FindInPageManagerImpl::SelectNextMatch() API_AVAILABLE(ios(16)) {
+  [GetActiveFindSession()
+      highlightNextResultInDirection:UITextStorageDirectionForward];
+}
+
+void FindInPageManagerImpl::SelectPreviousMatch() API_AVAILABLE(ios(16)) {
+  [GetActiveFindSession()
+      highlightNextResultInDirection:UITextStorageDirectionBackward];
+}
+
+void FindInPageManagerImpl::StopSearch() API_AVAILABLE(ios(16)) {
+  UIFindSession* find_session = GetActiveFindSession();
+  if (!find_session) {
+    return;
+  }
+
+  StopPollingActiveFindSession();
+  [find_session invalidateFoundResults];
+
+  if (use_find_interaction_) {
+    UIFindInteraction* find_interaction = web_state_->GetFindInteraction();
+    // If there is a Find interaction, dismiss the Find navigator. This will
+    // also stop and free the active Find session stored within the Find
+    // interaction.
+    [find_interaction dismissFindNavigator];
+  } else {
+    find_session_ = nil;
+    web::GetWebClient()->StopTextSearchInWebState(web_state_);
+  }
+
+  if (delegate_) {
+    // Calling `DidHighlightMatches` with zero matches and no query to respond
+    // to `StopFinding`.
+    delegate_->DidHighlightMatches(this, web_state_, /*match_count=*/0,
+                                   /*query=*/nil);
+  }
+}
+
+void FindInPageManagerImpl::StopFinding() {
+  if (@available(iOS 16, *)) {
+    StopSearch();
+  }
+}
+
+bool FindInPageManagerImpl::CanSearchContent() {
+  return web_state_->IsFindInteractionSupported();
+}
+
+FindInPageManagerDelegate* FindInPageManagerImpl::GetDelegate() {
+  return delegate_;
+}
+
+void FindInPageManagerImpl::SetDelegate(FindInPageManagerDelegate* delegate) {
+  delegate_ = delegate;
+}
+
+void FindInPageManagerImpl::StartPollingActiveFindSession()
+    API_AVAILABLE(ios(16)) {
+  find_session_polling_timer_.Start(
+      FROM_HERE, kPollActiveFindSessionDelay,
+      base::BindRepeating(&FindInPageManagerImpl::PollActiveFindSession,
+                          weak_factory_.GetWeakPtr()));
+}
+
+void FindInPageManagerImpl::StopPollingActiveFindSession()
+    API_AVAILABLE(ios(16)) {
+  find_session_polling_timer_.Stop();
+}
+
+void FindInPageManagerImpl::PollActiveFindSession() API_AVAILABLE(ios(16)) {
+  UIFindSession* findSession = GetActiveFindSession();
+  if (!findSession || !delegate_) {
+    StopPollingActiveFindSession();
+    return;
+  }
+
+  NSInteger result_count = findSession.resultCount;
+  NSInteger highlighted_result_index = findSession.highlightedResultIndex;
+
+  // If there are results but none is selected, select the first one.
+  if (highlighted_result_index == NSNotFound && result_count > 0) {
+    SelectNextMatch();
+  }
+
+  // If the result count differs from the last reported, report the new value.
+  if (current_result_count_ != result_count) {
+    delegate_->DidHighlightMatches(this, web_state_, result_count,
+                                   current_query_);
+    current_result_count_ = result_count;
+  }
+
+  // If the highlighted result index differs from the last reported, report the
+  // new value.
+  if (current_highlighted_result_index_ != highlighted_result_index &&
+      highlighted_result_index != NSNotFound) {
+    delegate_->DidSelectMatch(this, web_state_, highlighted_result_index,
+                              /*context_string=*/nil);
+    current_highlighted_result_index_ = highlighted_result_index;
+  }
+}
+
+void FindInPageManagerImpl::WasShown(WebState* web_state) {
+  if (@available(iOS 16, *)) {
+    if (!GetActiveFindSession()) {
+      return;
+    }
+    StartPollingActiveFindSession();
+  }
+}
+
+void FindInPageManagerImpl::WasHidden(WebState* web_state) {
+  if (@available(iOS 16, *)) {
+    StopPollingActiveFindSession();
+  }
+}
+
+void FindInPageManagerImpl::WebStateDestroyed(WebState* web_state) {
+  web_state_->RemoveObserver(this);
+  web_state_ = nullptr;
+}
+
+WEB_STATE_USER_DATA_KEY_IMPL(FindInPageManager)
+
+}  // namespace web
diff --git a/ios/web/public/find_in_page/BUILD.gn b/ios/web/public/find_in_page/BUILD.gn
index e13b348..bd7aefca 100644
--- a/ios/web/public/find_in_page/BUILD.gn
+++ b/ios/web/public/find_in_page/BUILD.gn
@@ -10,6 +10,7 @@
 
   sources = [
     "abstract_find_in_page_manager.h",
+    "find_in_page_manager.h",
     "find_in_page_manager_delegate.h",
     "find_in_page_manager_delegate_bridge.h",
     "java_script_find_in_page_manager.h",
diff --git a/ios/web/public/find_in_page/find_in_page_manager.h b/ios/web/public/find_in_page/find_in_page_manager.h
new file mode 100644
index 0000000..5a34beb
--- /dev/null
+++ b/ios/web/public/find_in_page/find_in_page_manager.h
@@ -0,0 +1,39 @@
+// 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 IOS_WEB_PUBLIC_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_H_
+#define IOS_WEB_PUBLIC_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_H_
+
+#import "ios/web/public/find_in_page/abstract_find_in_page_manager.h"
+#import "ios/web/public/web_state_user_data.h"
+
+namespace web {
+
+// Manager for searching text on a page. As opposed to the
+// JavaScriptFindInPageManager, this manager does not rely on JavaScript but on
+// the Find interaction API available on iOS 16 or later.
+class FindInPageManager : public AbstractFindInPageManager,
+                          public web::WebStateUserData<FindInPageManager> {
+ public:
+  // Lazily creates the `FindInPageManager`. If `use_find_interaction` is
+  // `true`, then the instantiated manager will use a Find interaction, else it
+  // will use its own `UIFindSession` instance. Should only be called on a
+  // realized web state.
+  static FindInPageManager* GetOrCreateForWebState(WebState* web_state,
+                                                   bool use_find_interaction);
+
+  FindInPageManager() = default;
+
+  FindInPageManager(const FindInPageManager&) = delete;
+  FindInPageManager& operator=(const FindInPageManager&) = delete;
+
+  WEB_STATE_USER_DATA_KEY_DECL();
+
+ protected:
+  ~FindInPageManager() override = default;
+};
+
+}  // namespace web
+
+#endif  // IOS_WEB_PUBLIC_FIND_IN_PAGE_FIND_IN_PAGE_MANAGER_H_
diff --git a/ios/web/test/web_int_test.mm b/ios/web/test/web_int_test.mm
index 15baab0..abcc881 100644
--- a/ios/web/test/web_int_test.mm
+++ b/ios/web/test/web_int_test.mm
@@ -84,16 +84,24 @@
 }
 
 void WebIntTest::TearDown() {
-  // Tests can create an unresponsive WebProcess. WebIntTest::TearDown will
-  // call ClearBrowingData, which can take a very long time with an unresponsive
-  // WebProcess. Work around this problem by force closing WKWebView via a
-  // private API.
+  // Tests can create an unresponsive WebProcess or NetworkProcess.
+  // WebIntTest::TearDown will call ClearBrowingData, which can take a very long
+  // time with an unresponsive WebProcess or NetworkProcess. Work around this
+  // problem by force closing WKWebView and killing the existing NetworkProcess
+  // using private API.
 #pragma clang diagnostic push
 #pragma clang diagnostic ignored "-Wundeclared-selector"
   WKWebView* web_view = base::mac::ObjCCast<WKWebView>(
       web::WebStateImpl::FromWebState(web_state())
           ->GetWebViewNavigationProxy());
   [web_view performSelector:@selector(_close)];
+
+  // This only deletes the data store object, not the underlying data store on
+  // disk. Since WKWebsiteDataStore owns the network process, this has the
+  // effect of killing the existing network process. A new network process
+  // will be created the next time the default data store is accessed, below.
+  [WKWebsiteDataStore
+      performSelector:@selector(_deleteDefaultDataStoreForTesting)];
 #pragma clang diagnostic pop
 
   RemoveWKWebViewCreatedData([WKWebsiteDataStore defaultDataStore],
diff --git a/media/gpu/v4l2/test/h264_decoder.cc b/media/gpu/v4l2/test/h264_decoder.cc
index ba5418c..7597bdb 100644
--- a/media/gpu/v4l2/test/h264_decoder.cc
+++ b/media/gpu/v4l2/test/h264_decoder.cc
@@ -261,13 +261,9 @@
 
 }  // namespace
 
-void H264DPB::ClearDPB() {
-  dpb_.clear();
-}
-
 int H264DPB::CountRefPics() {
   int ret = 0;
-  for (const auto& pic : dpb_) {
+  for (const auto& pic : *this) {
     if (pic->ref) {
       ++ret;
     }
@@ -277,25 +273,25 @@
 }
 
 void H264DPB::Delete(H264SliceMetadata* pic) {
-  for (auto it = dpb_.begin(); it != dpb_.end(); ++it) {
+  for (auto it = this->begin(); it != this->end(); ++it) {
     if ((*it).get() == pic) {
-      dpb_.erase(it);
+      this->erase(it);
       break;
     }
   }
 }
 
 void H264DPB::DeleteUnused() {
-  dpb_.erase(std::remove_if(dpb_.begin(), dpb_.end(),
+  this->erase(std::remove_if(this->begin(), this->end(),
                             [](const std::unique_ptr<H264SliceMetadata>& pic) {
                               return (pic->outputted && !pic->ref);
                             }),
-             dpb_.end());
+             this->end());
 }
 
 void H264DPB::UnmarkLowestFrameNumWrapShortRefPic() {
   H264SliceMetadata* ret = nullptr;
-  for (const auto& pic : dpb_) {
+  for (const auto& pic : *this) {
     if (pic->ref && (!ret || pic->frame_num_wrap < ret->frame_num_wrap)) {
       ret = pic.get();
     }
@@ -305,7 +301,7 @@
 
 std::vector<H264SliceMetadata*> H264DPB::GetNotOutputtedPicsAppending() {
   std::vector<H264SliceMetadata*> data;
-  for (const auto& pic : dpb_) {
+  for (const auto& pic : *this) {
     if (!pic->outputted) {
       data.push_back(pic.get());
     }
@@ -314,18 +310,18 @@
 }
 
 void H264DPB::MarkAllUnusedRef() {
-  for (const auto& pic : dpb_) {
+  for (const auto& pic : *this) {
     pic->ref = false;
   }
 }
 
 void H264DPB::StorePic(H264SliceMetadata* pic) {
-  dpb_.push_back(std::make_unique<H264SliceMetadata>(*pic));
+  this->push_back(std::make_unique<H264SliceMetadata>(*pic));
 }
 
 void H264DPB::UpdateFrameNumWrap(const int curr_frame_num,
                                  const int max_frame_num) {
-  for (auto& pic : dpb_) {
+  for (auto& pic : *this) {
     if (pic->ref) {
       continue;
     }
@@ -429,7 +425,7 @@
   global_pic_count_++;
 
   if (slice_hdr->idr_pic_flag) {
-    dpb_.ClearDPB();
+    dpb_.clear();
   }
 
   const int max_frame_num = 1 << (sps->log2_max_frame_num_minus4 + 4);
diff --git a/media/gpu/v4l2/test/h264_decoder.h b/media/gpu/v4l2/test/h264_decoder.h
index 4f0648f..3083a03 100644
--- a/media/gpu/v4l2/test/h264_decoder.h
+++ b/media/gpu/v4l2/test/h264_decoder.h
@@ -36,8 +36,6 @@
   H264DPB(const H264DPB&) = delete;
   H264DPB& operator=(const H264DPB&) = delete;
 
-  // Deletes all H264SliceMetadata elements from DPB.
-  void ClearDPB();
   // Returns number of Reference H264SliceMetadata elements
   // in the DPB.
   int CountRefPics();
@@ -62,11 +60,6 @@
   // Updates each H264SliceMetadata object in DPB's frame num wrap
   // based on the max frame num.
   void UpdateFrameNumWrap(const int curr_frame_num, const int max_frame_num);
-
- private:
-  // A vector of H264SliceMetadata objects which will be created by the H264
-  // Decoder and sent to this class for slice processing.
-  std::vector<std::unique_ptr<H264SliceMetadata>> dpb_;
 };
 
 class H264Decoder : public VideoDecoder {
diff --git a/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.cc b/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.cc
index 8d92e9c..a15add7d 100644
--- a/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/tests/bindings_test_base.h"
 #include "mojo/public/cpp/bindings/tests/js_interface_binder_unittest.test-mojom-js-interface-binder-impl.h"
 
@@ -13,8 +15,17 @@
   ~JsInterfaceBinderTest() override = default;
 };
 
-// Test to ensure generated impl file can be included.
-TEST_P(JsInterfaceBinderTest, Stub) {}
+// Tests binder methods are overridden and can be called. Calling them does
+// nothing for now.
+TEST_P(JsInterfaceBinderTest, Bind) {
+  mojom::FooJsInterfaceBinderImpl binder;
+
+  binder.BindFooPageHandler(mojo::PendingReceiver<mojom::FooPageHandler>(),
+                            mojo::PendingRemote<mojom::FooPage>());
+
+  binder.BindBar(mojo::PendingReceiver<mojom::Bar>());
+  binder.BindBarObserver(mojo::PendingRemote<mojom::BarObserver>());
+}
 
 INSTANTIATE_MOJO_BINDINGS_TEST_SUITE_P(JsInterfaceBinderTest);
 
diff --git a/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.test-mojom b/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.test-mojom
index b1fabc6..f912216d 100644
--- a/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.test-mojom
+++ b/mojo/public/cpp/bindings/tests/js_interface_binder_unittest.test-mojom
@@ -5,5 +5,18 @@
 module mojo.test.js_interface_binder.mojom;
 
 [JsInterfaceBinder]
-interface FooJSInterfaceBinder {
+interface FooJsInterfaceBinder {
+  BindFooPageHandler(pending_receiver<FooPageHandler> page_handler,
+                     pending_remote<FooPage> page);
+
+  BindBar(pending_receiver<Bar> bar);
+  BindBarObserver(pending_remote<BarObserver> observer);
 };
+
+interface FooPageHandler {};
+
+interface FooPage {};
+
+interface Bar {};
+
+interface BarObserver {};
diff --git a/mojo/public/tools/bindings/generators/js_interface_binder_templates/js_interface_binder_impl.h.tmpl b/mojo/public/tools/bindings/generators/js_interface_binder_templates/js_interface_binder_impl.h.tmpl
index 2c54a522..ea7a250b 100644
--- a/mojo/public/tools/bindings/generators/js_interface_binder_templates/js_interface_binder_impl.h.tmpl
+++ b/mojo/public/tools/bindings/generators/js_interface_binder_templates/js_interface_binder_impl.h.tmpl
@@ -1,3 +1,39 @@
 // 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.
+
+{%- set header_guard = "%s_JS_INTERFACE_BINDER_IMPL_H_"|format(
+        module.path|upper|replace("/","_")|replace(".","_")|
+            replace("-", "_")) %}
+
+#ifndef {{header_guard}}
+#define {{header_guard}}
+
+#include "{{module.path}}.h"
+
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+
+namespace {{module.namespace}} {
+
+{%  for interface_binder in interface_binders -%}
+
+class {{interface_binder.name}}Impl : public {{interface_binder.name}} {
+ public:
+  {{interface_binder.name}}Impl() = default;
+  ~{{interface_binder.name}}Impl() = default;
+
+{% for method in interface_binder.methods %}
+  void {{method.name}}(
+{%-  for param in method.parameters %}
+    {{param.kind|cpp_type}} {{param.name}}{{", " if not loop.last else ""}}
+{%-   endfor -%}
+  ) override {}
+{% endfor %}
+};
+
+{% endfor %}
+
+}  // {{module.namespace}}
+
+#endif // {{header_guard}}
diff --git a/mojo/public/tools/bindings/generators/mojom_js_interface_binder_generator.py b/mojo/public/tools/bindings/generators/mojom_js_interface_binder_generator.py
index b8abfd07..b025e63 100644
--- a/mojo/public/tools/bindings/generators/mojom_js_interface_binder_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_js_interface_binder_generator.py
@@ -33,6 +33,35 @@
 import mojom.generate.module as mojom
 
 
+class JsInterfaceBinderImplStylizer(generator.Stylizer):
+  def StylizeConstant(self, mojom_name):
+    return mojom_name
+
+  def StylizeField(self, mojom_name):
+    return mojom_name
+
+  def StylizeStruct(self, mojom_name):
+    return mojom_name
+
+  def StylizeUnion(self, mojom_name):
+    return mojom_name
+
+  def StylizeParameter(self, mojom_name):
+    return mojom_name
+
+  def StylizeMethod(self, mojom_name):
+    return mojom_name
+
+  def StylizeEnumField(self, mojom_name):
+    return mojom_name
+
+  def StylizeEnum(self, mojom_name):
+    return mojom_name
+
+  def StylizeModule(self, mojom_namespace):
+    return '::'.join(mojom_namespace.split('.'))
+
+
 class Generator(generator.Generator):
   def __init__(self, *args, **kwargs):
     super(Generator, self).__init__(*args, **kwargs)
@@ -41,17 +70,63 @@
   def GetTemplatePrefix():
     return "js_interface_binder_templates"
 
+  def _GetCppType(self, kind):
+    """Return a string representing the C++ type of `kind`
+
+     Returns None if the type is not supposed to be used in a JsInterfaceBinder.
+     """
+    if mojom.IsPendingRemoteKind(kind):
+      return "::mojo::PendingRemote<%s>" % kind.kind.name
+    if mojom.IsPendingReceiverKind(kind):
+      return "::mojo::PendingReceiver<%s>" % kind.kind.name
+
   def GetFilters(self):
-    return {}
+    return {
+        "cpp_type": self._GetCppType,
+    }
+
+  def _GetInterfaceBinders(self):
+    """Returns a list of Interface objects that are JsInterfaceBinders.
+
+    Raises an Exception if any JsInterfaceBinder don't satisfy JsInterfaceBinder
+    constraints.
+    """
+    interface_binders = [
+        interface for interface in self.module.interfaces if
+        (interface.attributes and interface.attributes.get('JsInterfaceBinder'))
+    ]
+
+    # Enforce JsInterfaceBinders constraints.
+    for interface_binder in interface_binders:
+      for method in interface_binder.methods:
+        print(method.response_parameters)
+        if method.response_parameters != None:
+          raise Exception(f'{interface_binder.name}.{method.name} has a '
+                          'response. JsInterfaceBinder\'s methods should not '
+                          'have responses.')
+
+        for param in method.parameters:
+          if not (mojom.IsPendingReceiverKind(param.kind)
+                  or mojom.IsPendingRemoteKind(param.kind)):
+            raise Exception(f'{interface_binder.name}.{method.name}\'s '
+                            f'"{param.name}" is not a pending_receiver or a '
+                            'pending_remote. JSInterfaceBinder\'s methods '
+                            'should only have pending_receiver or '
+                            'pending_remote parameters.')
+
+    return interface_binders
 
   def _GetParameters(self):
-    return {}
+    return {
+        "module": self.module,
+        "interface_binders": self._GetInterfaceBinders()
+    }
 
   @UseJinja("js_interface_binder_impl.h.tmpl")
   def _GenerateJsInterfaceBinderImpl(self):
     return self._GetParameters()
 
   def GenerateFiles(self, args):
-    self.module.Stylize(generator.Stylizer())
+    self.module.Stylize(JsInterfaceBinderImplStylizer())
     self.WriteWithComment(self._GenerateJsInterfaceBinderImpl(),
                           "%s-js-interface-binder-impl.h" % self.module.path)
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
index 96f1286..cfac2c1 100644
--- a/mojo/public/tools/bindings/mojom.gni
+++ b/mojo/public/tools/bindings/mojom.gni
@@ -1789,12 +1789,20 @@
         ]
       }
 
+      cpp_target_name = target_name
       source_set("${target_name}_js_interface_binder_impl") {
+        if (defined(invoker.testonly)) {
+          testonly = invoker.testonly
+        }
+
         sources = []
         foreach(base_path, output_file_base_paths) {
           sources = [ "$root_gen_dir/${base_path}-js-interface-binder-impl.h" ]
         }
-        deps = [ ":$generator_js_interface_binder_impl_target_name" ]
+        deps = [
+          ":$cpp_target_name",
+          ":$generator_js_interface_binder_impl_target_name",
+        ]
       }
     }
   }
diff --git a/net/base/features.cc b/net/base/features.cc
index 52cc6da..6462118f 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -182,7 +182,7 @@
 #endif /* BUILDFLAG(IS_MAC) */
 #endif /* BUILDFLAG(CHROME_ROOT_STORE_SUPPORTED) */
 
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(USE_NSS_CERTS)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(USE_NSS_CERTS) || BUILDFLAG(IS_WIN)
 BASE_FEATURE(kTrustStoreTrustedLeafSupport,
              "TrustStoreTrustedLeafSupport",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -306,9 +306,11 @@
 // Whether to use the new code paths needed to support partitioning Blob URLs.
 // This exists as a kill-switch in case an issue is identified with the Blob
 // URL implementation that causes breakage.
+// TODO(https://crbug.com/1407944): Kill-switch activated - investigate cause of
+// increased renderer hangs.
 BASE_FEATURE(kSupportPartitionedBlobUrl,
              "SupportPartitionedBlobUrl",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+             base::FEATURE_DISABLED_BY_DEFAULT);
 
 BASE_FEATURE(kAlpsParsing, "AlpsParsing", base::FEATURE_ENABLED_BY_DEFAULT);
 
diff --git a/net/base/features.h b/net/base/features.h
index 8723899a..e817cf2 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -222,7 +222,7 @@
 // TrustStore implementation will only use TRUSTED_ANCHOR.
 // TODO(https://crbug.com/1403034): remove this a few milestones after the
 // trusted leaf support has been launched on all relevant platforms.
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(USE_NSS_CERTS)
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(USE_NSS_CERTS) || BUILDFLAG(IS_WIN)
 NET_EXPORT BASE_DECLARE_FEATURE(kTrustStoreTrustedLeafSupport);
 #endif
 
diff --git a/net/base/network_anonymization_key.h b/net/base/network_anonymization_key.h
index d1fb4b5f..ae0d172 100644
--- a/net/base/network_anonymization_key.h
+++ b/net/base/network_anonymization_key.h
@@ -43,8 +43,8 @@
 
 // The following show how the `is_cross_site` boolean is populated for the
 // innermost frame in the chain.
-// a->a => is_cross_site = true
-// a->b => is_cross_site = false
+// a->a => is_cross_site = false
+// a->b => is_cross_site = true
 // a->b->a => is_cross_site = false
 // a->(sandboxed a [has nonce]) => is_cross_site = true
 
diff --git a/net/cert/internal/trust_store_win.cc b/net/cert/internal/trust_store_win.cc
index e09f023..1cb8d2d 100644
--- a/net/cert/internal/trust_store_win.cc
+++ b/net/cert/internal/trust_store_win.cc
@@ -11,6 +11,7 @@
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/scoped_blocking_call.h"
+#include "net/base/features.h"
 #include "net/cert/pki/cert_errors.h"
 #include "net/cert/pki/parsed_certificate.h"
 #include "net/cert/x509_util.h"
@@ -95,8 +96,11 @@
       CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, NULL, 0, nullptr));
   stores.intermediates = crypto::ScopedHCERTSTORE(CertOpenStore(
       CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, NULL, 0, nullptr));
+  stores.trusted_people = crypto::ScopedHCERTSTORE(CertOpenStore(
+      CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, NULL, 0, nullptr));
   stores.disallowed = crypto::ScopedHCERTSTORE(CertOpenStore(
       CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, NULL, 0, nullptr));
+  stores.InitializeAllCertsStore();
   return stores;
 }
 
@@ -105,6 +109,43 @@
   return TrustStoreWin::CertStores();
 }
 
+// static
+TrustStoreWin::CertStores TrustStoreWin::CertStores::CreateWithCollections() {
+  TrustStoreWin::CertStores stores;
+  stores.roots = crypto::ScopedHCERTSTORE(
+      CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
+  stores.intermediates = crypto::ScopedHCERTSTORE(
+      CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
+  stores.trusted_people = crypto::ScopedHCERTSTORE(
+      CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
+  stores.disallowed = crypto::ScopedHCERTSTORE(
+      CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
+  stores.InitializeAllCertsStore();
+  return stores;
+}
+
+void TrustStoreWin::CertStores::InitializeAllCertsStore() {
+  all = crypto::ScopedHCERTSTORE(
+      CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
+  if (is_null()) {
+    return;
+  }
+  // Add intermediate and root cert stores to the all_cert_store collection so
+  // SyncGetIssuersOf will find them. disallowed_cert_store is not added
+  // because the certs are distrusted; making them non-findable in
+  // SyncGetIssuersOf helps us fail path-building faster.
+  // `trusted_people` is not added because it can only contain end-entity
+  // certs, so checking it for issuers during path building is not necessary.
+  if (!CertAddStoreToCollection(all.get(), intermediates.get(),
+                                /*dwUpdateFlags=*/0, /*dwPriority=*/0)) {
+    return;
+  }
+  if (!CertAddStoreToCollection(all.get(), roots.get(),
+                                /*dwUpdateFlags=*/0, /*dwPriority=*/0)) {
+    return;
+  }
+}
+
 class TrustStoreWin::Impl {
  public:
   // Creates a TrustStoreWin.
@@ -112,79 +153,72 @@
     base::ScopedBlockingCall scoped_blocking_call(
         FROM_HERE, base::BlockingType::MAY_BLOCK);
 
-    crypto::ScopedHCERTSTORE root_cert_store(
-        CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
-    crypto::ScopedHCERTSTORE intermediate_cert_store(
-        CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
-    crypto::ScopedHCERTSTORE all_certs_store(
-        CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
-    crypto::ScopedHCERTSTORE disallowed_cert_store(
-        CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
-    if (!root_cert_store.get() || !intermediate_cert_store.get() ||
-        !all_certs_store.get() || !disallowed_cert_store.get()) {
-      return;
-    }
-
-    // Add intermediate and root cert stores to the all_cert_store collection so
-    // SyncGetIssuersOf will find them. disallowed_cert_store is not added
-    // because the certs are distrusted; making them non-findable in
-    // SyncGetIssuersOf helps us fail path-building faster.
-    if (!CertAddStoreToCollection(all_certs_store.get(),
-                                  intermediate_cert_store.get(),
-                                  /*dwUpdateFlags=*/0, /*dwPriority=*/0)) {
-      return;
-    }
-    if (!CertAddStoreToCollection(all_certs_store.get(), root_cert_store.get(),
-                                  /*dwUpdateFlags=*/0, /*dwPriority=*/0)) {
+    CertStores stores = CertStores::CreateWithCollections();
+    if (stores.is_null()) {
+      // If there was an error initializing the cert store collections, give
+      // up. The Impl object will still be created but any calls to its public
+      // methods will return no results.
       return;
     }
 
     // Grab the user-added roots.
-    GatherEnterpriseCertsForLocation(root_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.roots.get(),
                                      CERT_SYSTEM_STORE_LOCAL_MACHINE, L"ROOT");
     GatherEnterpriseCertsForLocation(
-        root_cert_store.get(), CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY,
+        stores.roots.get(), CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY,
         L"ROOT");
-    GatherEnterpriseCertsForLocation(root_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.roots.get(),
                                      CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
                                      L"ROOT");
-    GatherEnterpriseCertsForLocation(root_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.roots.get(),
                                      CERT_SYSTEM_STORE_CURRENT_USER, L"ROOT");
     GatherEnterpriseCertsForLocation(
-        root_cert_store.get(), CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
+        stores.roots.get(), CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
         L"ROOT");
 
     // Grab the user-added intermediates.
-    GatherEnterpriseCertsForLocation(intermediate_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.intermediates.get(),
                                      CERT_SYSTEM_STORE_LOCAL_MACHINE, L"CA");
     GatherEnterpriseCertsForLocation(
-        intermediate_cert_store.get(),
+        stores.intermediates.get(),
         CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY, L"CA");
-    GatherEnterpriseCertsForLocation(intermediate_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.intermediates.get(),
                                      CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
                                      L"CA");
-    GatherEnterpriseCertsForLocation(intermediate_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.intermediates.get(),
                                      CERT_SYSTEM_STORE_CURRENT_USER, L"CA");
     GatherEnterpriseCertsForLocation(
-        intermediate_cert_store.get(),
-        CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY, L"CA");
+        stores.intermediates.get(), CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
+        L"CA");
+
+    // Grab the user-added trusted server certs. Trusted end-entity certs are
+    // only allowed for server auth in the "local machine" store, but not in the
+    // "current user" store.
+    GatherEnterpriseCertsForLocation(stores.trusted_people.get(),
+                                     CERT_SYSTEM_STORE_LOCAL_MACHINE,
+                                     L"TrustedPeople");
+    GatherEnterpriseCertsForLocation(
+        stores.trusted_people.get(),
+        CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY, L"TrustedPeople");
+    GatherEnterpriseCertsForLocation(stores.trusted_people.get(),
+                                     CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
+                                     L"TrustedPeople");
 
     // Grab the user-added disallowed certs.
-    GatherEnterpriseCertsForLocation(disallowed_cert_store.get(),
+    GatherEnterpriseCertsForLocation(stores.disallowed.get(),
                                      CERT_SYSTEM_STORE_LOCAL_MACHINE,
                                      L"Disallowed");
     GatherEnterpriseCertsForLocation(
-        disallowed_cert_store.get(),
-        CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY, L"Disallowed");
-    GatherEnterpriseCertsForLocation(disallowed_cert_store.get(),
+        stores.disallowed.get(), CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY,
+        L"Disallowed");
+    GatherEnterpriseCertsForLocation(stores.disallowed.get(),
                                      CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE,
                                      L"Disallowed");
-    GatherEnterpriseCertsForLocation(disallowed_cert_store.get(),
-                                     CERT_SYSTEM_STORE_CURRENT_USER,
-                                     L"Disallowed");
     GatherEnterpriseCertsForLocation(
-        disallowed_cert_store.get(),
-        CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY, L"Disallowed");
+        stores.disallowed.get(), CERT_SYSTEM_STORE_CURRENT_USER, L"Disallowed");
+    GatherEnterpriseCertsForLocation(
+        stores.disallowed.get(), CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY,
+        L"Disallowed");
 
     // Auto-sync all of the cert stores to get updates to the cert store.
     // Auto-syncing on all_certs_store seems to work to resync the nested
@@ -193,24 +227,27 @@
     // are somewhat unclear. If and when root store changes are linked to
     // clearing various caches, this should be replaced with
     // CERT_STORE_CTRL_NOTIFY_CHANGE and CERT_STORE_CTRL_RESYNC.
-    if (!CertControlStore(all_certs_store.get(), 0, CERT_STORE_CTRL_AUTO_RESYNC,
-                          0)) {
+    if (!CertControlStore(stores.all.get(), 0, CERT_STORE_CTRL_AUTO_RESYNC,
+                          0) ||
+        !CertControlStore(stores.trusted_people.get(), 0,
+                          CERT_STORE_CTRL_AUTO_RESYNC, 0) ||
+        !CertControlStore(stores.disallowed.get(), 0,
+                          CERT_STORE_CTRL_AUTO_RESYNC, 0)) {
       PLOG(ERROR) << "Error enabling CERT_STORE_CTRL_AUTO_RESYNC";
     }
 
-    root_cert_store_ = std::move(root_cert_store);
-    intermediate_cert_store_ = std::move(intermediate_cert_store);
-    disallowed_cert_store_ = std::move(disallowed_cert_store);
-    all_certs_store_ = std::move(all_certs_store);
+    root_cert_store_ = std::move(stores.roots);
+    intermediate_cert_store_ = std::move(stores.intermediates);
+    trusted_people_cert_store_ = std::move(stores.trusted_people);
+    disallowed_cert_store_ = std::move(stores.disallowed);
+    all_certs_store_ = std::move(stores.all);
   }
 
-  // all_certs_store should be a combination of root_cert_store and
-  // intermediate_cert_store, but we ask callers to explicitly pass this in so
-  // that all the error checking can happen outside of the constructor.
-  Impl(CertStores stores, crypto::ScopedHCERTSTORE all_certs_store)
+  Impl(CertStores stores)
       : root_cert_store_(std::move(stores.roots)),
         intermediate_cert_store_(std::move(stores.intermediates)),
-        all_certs_store_(std::move(all_certs_store)),
+        all_certs_store_(std::move(stores.all)),
+        trusted_people_cert_store_(std::move(stores.trusted_people)),
         disallowed_cert_store_(std::move(stores.disallowed)) {}
 
   ~Impl() = default;
@@ -220,7 +257,8 @@
   void SyncGetIssuersOf(const ParsedCertificate* cert,
                         ParsedCertificateList* issuers) {
     if (!root_cert_store_.get() || !intermediate_cert_store_.get() ||
-        !all_certs_store_.get() || !disallowed_cert_store_.get()) {
+        !trusted_people_cert_store_.get() || !all_certs_store_.get() ||
+        !disallowed_cert_store_.get()) {
       return;
     }
     base::span<const uint8_t> issuer_span = cert->issuer_tlv().AsSpan();
@@ -248,7 +286,8 @@
   CertificateTrust GetTrust(const ParsedCertificate* cert,
                             base::SupportsUserData* debug_data) {
     if (!root_cert_store_.get() || !intermediate_cert_store_.get() ||
-        !all_certs_store_.get() || !disallowed_cert_store_.get()) {
+        !trusted_people_cert_store_.get() || !all_certs_store_.get() ||
+        !disallowed_cert_store_.get()) {
       return CertificateTrust::ForUnspecified();
     }
 
@@ -284,7 +323,35 @@
         // If we find at least one version of the cert that is trusted for TLS
         // Server Auth, we will trust the cert.
         if (IsCertTrustedForServerAuth(cert_from_store)) {
-          return CertificateTrust::ForTrustAnchor().WithEnforceAnchorExpiry();
+          if (base::FeatureList::IsEnabled(
+                  features::kTrustStoreTrustedLeafSupport)) {
+            // Certificates in the Roots store may be used as either trust
+            // anchors or trusted leafs (if self-signed).
+            return CertificateTrust::ForTrustAnchorOrLeaf()
+                .WithEnforceAnchorExpiry()
+                .WithRequireLeafSelfSigned();
+          } else {
+            return CertificateTrust::ForTrustAnchor().WithEnforceAnchorExpiry();
+          }
+        }
+      }
+    }
+
+    if (base::FeatureList::IsEnabled(features::kTrustStoreTrustedLeafSupport)) {
+      while ((cert_from_store = CertFindCertificateInStore(
+                  trusted_people_cert_store_.get(), X509_ASN_ENCODING, 0,
+                  CERT_FIND_SHA1_HASH, &cert_hash_blob, cert_from_store))) {
+        base::span<const uint8_t> cert_from_store_span = base::make_span(
+            cert_from_store->pbCertEncoded, cert_from_store->cbCertEncoded);
+        if (base::ranges::equal(cert_span, cert_from_store_span)) {
+          // If we find at least one version of the cert that is trusted for TLS
+          // Server Auth, we will trust the cert.
+          if (IsCertTrustedForServerAuth(cert_from_store)) {
+            // Certificates in the Trusted People store may be trusted leafs (if
+            // self-signed).
+            return CertificateTrust::ForTrustedLeaf()
+                .WithRequireLeafSelfSigned();
+          }
         }
       }
     }
@@ -313,6 +380,9 @@
   // Cert Collection for searching via SyncGetIssuersOf()
   crypto::ScopedHCERTSTORE all_certs_store_;
 
+  // Cert Collection containing all user-added trust leafs.
+  crypto::ScopedHCERTSTORE trusted_people_cert_store_;
+
   // Cert Collection for all disallowed certs.
   crypto::ScopedHCERTSTORE disallowed_cert_store_;
 };
@@ -335,21 +405,8 @@
 
 std::unique_ptr<TrustStoreWin> TrustStoreWin::CreateForTesting(
     CertStores stores) {
-  crypto::ScopedHCERTSTORE all_certs_store(
-      CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, NULL, 0, nullptr));
-
-  if (all_certs_store.get() && stores.intermediates.get()) {
-    CertAddStoreToCollection(all_certs_store.get(), stores.intermediates.get(),
-                             /*dwUpdateFlags=*/0, /*dwPriority=*/0);
-  }
-  if (all_certs_store.get() && stores.roots.get()) {
-    CertAddStoreToCollection(all_certs_store.get(), stores.roots.get(),
-                             /*dwUpdateFlags=*/0, /*dwPriority=*/0);
-  }
-
-  return base::WrapUnique(
-      new TrustStoreWin(std::make_unique<TrustStoreWin::Impl>(
-          std::move(stores), std::move(all_certs_store))));
+  return base::WrapUnique(new TrustStoreWin(
+      std::make_unique<TrustStoreWin::Impl>(std::move(stores))));
 }
 
 TrustStoreWin::TrustStoreWin(std::unique_ptr<Impl> impl)
diff --git a/net/cert/internal/trust_store_win.h b/net/cert/internal/trust_store_win.h
index b895979..9e4adce 100644
--- a/net/cert/internal/trust_store_win.h
+++ b/net/cert/internal/trust_store_win.h
@@ -25,6 +25,10 @@
     CertStores(CertStores&& other);
     CertStores& operator=(CertStores&& other);
 
+    // Create a CertStores object with the stores initialized with (empty)
+    // CERT_STORE_PROV_COLLECTION stores.
+    static CertStores CreateWithCollections();
+
     // Create a CertStores object with the stores pre-initialized with
     // in-memory cert stores for testing purposes.
     static CertStores CreateInMemoryStoresForTesting();
@@ -33,12 +37,22 @@
     // purposes.
     static CertStores CreateNullStoresForTesting();
 
+    // Returns true if any of the cert stores are not initialized.
+    bool is_null() const {
+      return !roots.get() || !intermediates.get() || !trusted_people.get() ||
+             !disallowed.get() || !all.get();
+    }
+
     crypto::ScopedHCERTSTORE roots;
     crypto::ScopedHCERTSTORE intermediates;
+    crypto::ScopedHCERTSTORE trusted_people;
     crypto::ScopedHCERTSTORE disallowed;
+    crypto::ScopedHCERTSTORE all;
 
    private:
     CertStores();
+
+    void InitializeAllCertsStore();
   };
 
   // Creates a TrustStoreWin.
diff --git a/net/cert/internal/trust_store_win_unittest.cc b/net/cert/internal/trust_store_win_unittest.cc
index 2bc20db..015d0189 100644
--- a/net/cert/internal/trust_store_win_unittest.cc
+++ b/net/cert/internal/trust_store_win_unittest.cc
@@ -10,8 +10,10 @@
 #include "base/memory/ptr_util.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_number_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/win/wincrypt_shim.h"
 #include "crypto/scoped_capi_types.h"
+#include "net/base/features.h"
 #include "net/cert/cert_net_fetcher.h"
 #include "net/cert/pki/cert_errors.h"
 #include "net/cert/pki/parsed_certificate.h"
@@ -30,10 +32,6 @@
 
 namespace {
 
-constexpr CertificateTrust ExpectedTrustForAnchor() {
-  return CertificateTrust::ForTrustAnchor().WithEnforceAnchorExpiry();
-}
-
 ::testing::AssertionResult ParseCertFromFile(
     base::StringPiece file_name,
     std::shared_ptr<const ParsedCertificate>* out_cert) {
@@ -54,8 +52,18 @@
   return ::testing::AssertionSuccess();
 }
 
-class TrustStoreWinTest : public testing::Test {
+class TrustStoreWinTest : public testing::TestWithParam<bool> {
  public:
+  TrustStoreWinTest() {
+    if (IsTrustedLeafSupportEnabled()) {
+      feature_list_.InitAndEnableFeature(
+          features::kTrustStoreTrustedLeafSupport);
+    } else {
+      feature_list_.InitAndDisableFeature(
+          features::kTrustStoreTrustedLeafSupport);
+    }
+  }
+
   void SetUp() override {
     ASSERT_TRUE(ParseCertFromFile("multi-root-A-by-B.pem", &a_by_b_));
     ASSERT_TRUE(ParseCertFromFile("multi-root-B-by-C.pem", &b_by_c_));
@@ -67,6 +75,26 @@
     ASSERT_TRUE(ParseCertFromFile("multi-root-F-by-E.pem", &f_by_e_));
   }
 
+  bool IsTrustedLeafSupportEnabled() const { return GetParam(); }
+
+  CertificateTrust ExpectedTrustForAnchor() const {
+    if (IsTrustedLeafSupportEnabled()) {
+      return CertificateTrust::ForTrustAnchorOrLeaf()
+          .WithEnforceAnchorExpiry()
+          .WithRequireLeafSelfSigned();
+    } else {
+      return CertificateTrust::ForTrustAnchor().WithEnforceAnchorExpiry();
+    }
+  }
+
+  CertificateTrust ExpectedTrustForPeer() const {
+    if (IsTrustedLeafSupportEnabled()) {
+      return CertificateTrust::ForTrustedLeaf().WithRequireLeafSelfSigned();
+    } else {
+      return CertificateTrust::ForUnspecified();
+    }
+  }
+
   // Returns true if |cert| successfully added to store, false otherwise.
   bool AddToStore(HCERTSTORE store,
                   std::shared_ptr<const ParsedCertificate> cert) {
@@ -112,9 +140,12 @@
 
   std::shared_ptr<const ParsedCertificate> a_by_b_, b_by_c_, b_by_f_, c_by_d_,
       c_by_e_, d_by_d_, e_by_e_, f_by_e_;
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
 };
 
-TEST_F(TrustStoreWinTest, GetTrustInitializationError) {
+TEST_P(TrustStoreWinTest, GetTrustInitializationError) {
   // Simulate an initialization error by using null stores.
   std::unique_ptr<TrustStoreWin> trust_store_win =
       TrustStoreWin::CreateForTesting(
@@ -125,9 +156,10 @@
             trust.ToDebugString());
 }
 
-TEST_F(TrustStoreWinTest, GetTrust) {
+TEST_P(TrustStoreWinTest, GetTrust) {
   ASSERT_TRUE(AddToStore(stores_.roots.get(), d_by_d_));
   ASSERT_TRUE(AddToStore(stores_.intermediates.get(), c_by_d_));
+  ASSERT_TRUE(AddToStore(stores_.trusted_people.get(), a_by_b_));
 
   std::unique_ptr<TrustStoreWin> trust_store_win = CreateTrustStoreWin();
   ASSERT_TRUE(trust_store_win);
@@ -136,6 +168,13 @@
   EXPECT_EQ(ExpectedTrustForAnchor().ToDebugString(),
             trust_store_win->GetTrust(d_by_d_.get(), nullptr).ToDebugString());
 
+  // Explicitly trusted peer should be trusted.
+  // (Although it wouldn't actually verify since it's not self-signed but has
+  // require_leaf_selfsigned set. That doesn't matter for the purposes of these
+  // tests.)
+  EXPECT_EQ(ExpectedTrustForPeer().ToDebugString(),
+            trust_store_win->GetTrust(a_by_b_.get(), nullptr).ToDebugString());
+
   // Intermediate for path building should not be trusted.
   EXPECT_EQ(CertificateTrust::ForUnspecified().ToDebugString(),
             trust_store_win->GetTrust(c_by_d_.get(), nullptr).ToDebugString());
@@ -154,7 +193,7 @@
 // - kMultiRootEByE: only has szOID_PKIX_KP_CLIENT_AUTH set
 // - kMultiRootCByE: only has szOID_ANY_ENHANCED_KEY_USAGE set
 // - kMultiRootCByD: no EKU usages set
-TEST_F(TrustStoreWinTest, GetTrustRestrictedEKU) {
+TEST_P(TrustStoreWinTest, GetTrustRestrictedEKU) {
   ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.roots.get(), d_by_d_,
                                            szOID_PKIX_KP_SERVER_AUTH));
   ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.roots.get(), e_by_e_,
@@ -191,6 +230,44 @@
             trust_store_win->GetTrust(f_by_e_.get(), nullptr).ToDebugString());
 }
 
+// Same as GetTrustRestrictedEKU but for the Trusted People store.
+TEST_P(TrustStoreWinTest, GetTrustTrustedPeopleRestrictedEKU) {
+  ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.trusted_people.get(),
+                                           d_by_d_, szOID_PKIX_KP_SERVER_AUTH));
+  ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.trusted_people.get(),
+                                           e_by_e_, szOID_PKIX_KP_CLIENT_AUTH));
+  ASSERT_TRUE(AddToStoreWithEKURestriction(
+      stores_.trusted_people.get(), c_by_e_, szOID_ANY_ENHANCED_KEY_USAGE));
+  ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.trusted_people.get(),
+                                           c_by_d_, nullptr));
+
+  std::unique_ptr<TrustStoreWin> trust_store_win = CreateTrustStoreWin();
+  ASSERT_TRUE(trust_store_win);
+
+  // TrustedPeople cert with EKU szOID_PKIX_KP_SERVER_AUTH usage set should be
+  // trusted.
+  EXPECT_EQ(ExpectedTrustForPeer().ToDebugString(),
+            trust_store_win->GetTrust(d_by_d_.get(), nullptr).ToDebugString());
+
+  // TrustedPeople cert with EKU szOID_ANY_ENHANCED_KEY_USAGE usage set should
+  // be trusted.
+  EXPECT_EQ(ExpectedTrustForPeer().ToDebugString(),
+            trust_store_win->GetTrust(c_by_e_.get(), nullptr).ToDebugString());
+
+  // TrustedPeople cert with EKU szOID_PKIX_KP_CLIENT_AUTH does not allow usage
+  // of cert for server auth, return UNSPECIFIED.
+  EXPECT_EQ(CertificateTrust::ForUnspecified().ToDebugString(),
+            trust_store_win->GetTrust(e_by_e_.get(), nullptr).ToDebugString());
+
+  // TrustedPeople cert with no EKU usages, return UNSPECIFIED.
+  EXPECT_EQ(CertificateTrust::ForUnspecified().ToDebugString(),
+            trust_store_win->GetTrust(c_by_d_.get(), nullptr).ToDebugString());
+
+  // Unknown cert has unspecified trust.
+  EXPECT_EQ(CertificateTrust::ForUnspecified().ToDebugString(),
+            trust_store_win->GetTrust(f_by_e_.get(), nullptr).ToDebugString());
+}
+
 // If duplicate certs are added to the root store with different EKU usages,
 // the cert should be trusted if any one of the usages is valid.
 // Root store set up as follows:
@@ -198,7 +275,7 @@
 // - kMultiRootDByD: only has szOID_PKIX_KP_CLIENT_AUTH EKU set
 // - kMultiRootDByD (dupe): only has szOID_PKIX_KP_SERVER_AUTH set
 // - kMultiRootDByD (dupe 2): no EKU usages set
-TEST_F(TrustStoreWinTest, GetTrustRestrictedEKUDuplicateCerts) {
+TEST_P(TrustStoreWinTest, GetTrustRestrictedEKUDuplicateCerts) {
   ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.roots.get(), d_by_d_,
                                            szOID_PKIX_KP_CLIENT_AUTH));
   ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.roots.get(), d_by_d_,
@@ -215,13 +292,15 @@
 }
 
 // Test that disallowed certs will be distrusted regardless of EKU settings.
-TEST_F(TrustStoreWinTest, GetTrustDisallowedCerts) {
+TEST_P(TrustStoreWinTest, GetTrustDisallowedCerts) {
   ASSERT_TRUE(AddToStore(stores_.roots.get(), d_by_d_));
   ASSERT_TRUE(AddToStore(stores_.roots.get(), e_by_e_));
+  ASSERT_TRUE(AddToStore(stores_.trusted_people.get(), f_by_e_));
 
   ASSERT_TRUE(AddToStoreWithEKURestriction(stores_.disallowed.get(), d_by_d_,
                                            szOID_PKIX_KP_CLIENT_AUTH));
   ASSERT_TRUE(AddToStore(stores_.disallowed.get(), e_by_e_));
+  ASSERT_TRUE(AddToStore(stores_.disallowed.get(), f_by_e_));
 
   std::unique_ptr<TrustStoreWin> trust_store_win = CreateTrustStoreWin();
   ASSERT_TRUE(trust_store_win);
@@ -230,6 +309,11 @@
   EXPECT_EQ(CertificateTrust::ForDistrusted().ToDebugString(),
             trust_store_win->GetTrust(e_by_e_.get(), nullptr).ToDebugString());
 
+  // F-by-E is in both trusted people and distrusted store. Distrust takes
+  // precedence.
+  EXPECT_EQ(CertificateTrust::ForDistrusted().ToDebugString(),
+            trust_store_win->GetTrust(f_by_e_.get(), nullptr).ToDebugString());
+
   // D-by-D is in root and in distrusted but without szOID_PKIX_KP_SERVER_AUTH
   // set. It should still be distrusted since the EKU settings aren't checked
   // on distrust.
@@ -243,7 +327,7 @@
                              expected_cert->der_cert().AsSpan());
 }
 
-TEST_F(TrustStoreWinTest, GetIssuersInitializationError) {
+TEST_P(TrustStoreWinTest, GetIssuersInitializationError) {
   // Simulate an initialization error by using null stores.
   std::unique_ptr<TrustStoreWin> trust_store_win =
       TrustStoreWin::CreateForTesting(
@@ -254,15 +338,20 @@
   ASSERT_EQ(0U, issuers.size());
 }
 
-TEST_F(TrustStoreWinTest, GetIssuers) {
+TEST_P(TrustStoreWinTest, GetIssuers) {
   ASSERT_TRUE(AddToStore(stores_.roots.get(), d_by_d_));
+
   ASSERT_TRUE(AddToStore(stores_.intermediates.get(), c_by_d_));
   ASSERT_TRUE(AddToStore(stores_.intermediates.get(), c_by_e_));
   ASSERT_TRUE(AddToStore(stores_.intermediates.get(), f_by_e_));
 
+  ASSERT_TRUE(AddToStore(stores_.trusted_people.get(), b_by_c_));
+
+  ASSERT_TRUE(AddToStore(stores_.disallowed.get(), b_by_f_));
+
   std::unique_ptr<TrustStoreWin> trust_store_win = CreateTrustStoreWin();
 
-  // No matching issuer.
+  // No matching issuer (Trusted People and Disallowed are not consulted).
   {
     ParsedCertificateList issuers;
     trust_store_win->SyncGetIssuersOf(a_by_b_.get(), &issuers);
@@ -295,5 +384,13 @@
   }
 }
 
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    TrustStoreWinTest,
+    testing::Values(true, false),
+    [](const testing::TestParamInfo<TrustStoreWinTest::ParamType>& info) {
+      return info.param ? "TrustedLeafSupported" : "TrustAnchorOnly";
+    });
+
 }  // namespace
 }  // namespace net
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 195b7c8..4f87051 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -3244,18 +3244,21 @@
     case CHANGE_PORT_ON_PATH_DEGRADING:
       ValidatePath(
           std::move(context),
-          std::make_unique<PortMigrationValidationResultDelegate>(this));
+          std::make_unique<PortMigrationValidationResultDelegate>(this),
+          quic::PathValidationReason::kPortMigration);
       break;
     case ON_SERVER_PREFERRED_ADDRESS_AVAILABLE:
       ValidatePath(
           std::move(context),
           std::make_unique<ServerPreferredAddressValidationResultDelegate>(
-              this));
+              this),
+          quic::PathValidationReason::kServerPreferredAddressMigration);
       break;
     default:
       ValidatePath(
           std::move(context),
-          std::make_unique<ConnectionMigrationValidationResultDelegate>(this));
+          std::make_unique<ConnectionMigrationValidationResultDelegate>(this),
+          quic::PathValidationReason::kConnectionMigration);
       break;
   }
 
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn
index 3b8e35e..db70dff2 100644
--- a/net/third_party/quiche/BUILD.gn
+++ b/net/third_party/quiche/BUILD.gn
@@ -70,6 +70,8 @@
     "overrides/quiche_platform_impl/quiche_url_utils_impl.h",
     "src/quiche/binary_http/binary_http_message.cc",
     "src/quiche/binary_http/binary_http_message.h",
+    "src/quiche/common/capsule.cc",
+    "src/quiche/common/capsule.h",
     "src/quiche/common/platform/api/quiche_bug_tracker.h",
     "src/quiche/common/platform/api/quiche_client_stats.h",
     "src/quiche/common/platform/api/quiche_containers.h",
@@ -429,8 +431,6 @@
     "src/quiche/quic/core/frames/quic_window_update_frame.cc",
     "src/quiche/quic/core/frames/quic_window_update_frame.h",
     "src/quiche/quic/core/handshaker_delegate_interface.h",
-    "src/quiche/quic/core/http/capsule.cc",
-    "src/quiche/quic/core/http/capsule.h",
     "src/quiche/quic/core/http/http_constants.cc",
     "src/quiche/quic/core/http/http_constants.h",
     "src/quiche/quic/core/http/http_decoder.cc",
@@ -1397,6 +1397,7 @@
   testonly = true
   sources = [
     "src/quiche/binary_http/binary_http_message_test.cc",
+    "src/quiche/common/capsule_test.cc",
     "src/quiche/common/platform/api/quiche_file_utils_test.cc",
     "src/quiche/common/platform/api/quiche_hostname_utils_test.cc",
     "src/quiche/common/platform/api/quiche_mem_slice_test.cc",
@@ -1515,7 +1516,6 @@
     "src/quiche/quic/core/crypto/transport_parameters_test.cc",
     "src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier_test.cc",
     "src/quiche/quic/core/frames/quic_frames_test.cc",
-    "src/quiche/quic/core/http/capsule_test.cc",
     "src/quiche/quic/core/http/http_decoder_test.cc",
     "src/quiche/quic/core/http/http_encoder_test.cc",
     "src/quiche/quic/core/http/http_frames_test.cc",
diff --git a/sandbox/policy/features.cc b/sandbox/policy/features.cc
index 52e0efe..19e94e2 100644
--- a/sandbox/policy/features.cc
+++ b/sandbox/policy/features.cc
@@ -43,7 +43,7 @@
 // Enables shared/fixed policy for Windows sandbox policies.
 BASE_FEATURE(kSharedSandboxPolicies,
              "SharedSandboxPolicies",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Emergency "off switch" for pipe security changes, which apply more
 // restrictions to sandboxed processes from opening or creating pipes. This
diff --git a/sandbox/policy/mac/audio.sb b/sandbox/policy/mac/audio.sb
index 6d9c500..e472f55 100644
--- a/sandbox/policy/mac/audio.sb
+++ b/sandbox/policy/mac/audio.sb
@@ -27,18 +27,14 @@
 
 ; Mach IPC.
 (allow mach-lookup
-  (global-name "com.apple.audio.SystemSoundServer-OSX")
-  (global-name "com.apple.audio.VDCAssistant")
+  (global-name "com.apple.audio.AudioComponentRegistrar")
   (global-name "com.apple.audio.audiohald")
   (global-name "com.apple.audio.coreaudiod")
+  (global-name "com.apple.audio.SystemSoundServer-OSX")
+  (global-name "com.apple.audio.VDCAssistant")
+  (xpc-service-name "com.apple.audio.SandboxHelper")
 )
 
-(if (>= os-version 1013)
-  (allow mach-lookup
-    (global-name "com.apple.audio.AudioComponentRegistrar")
-    (xpc-service-name "com.apple.audio.SandboxHelper")
-  ))
-
 ; sysctls.
 (allow sysctl-read
   (sysctl-name "hw.optional.avx1_0")
diff --git a/sandbox/policy/mac/common.sb b/sandbox/policy/mac/common.sb
index 9a24f01..726820e 100644
--- a/sandbox/policy/mac/common.sb
+++ b/sandbox/policy/mac/common.sb
@@ -64,8 +64,6 @@
       (global-name "com.apple.FontObjectsServer")
       (global-name "com.apple.fonts")
     )
-    (if (< os-version 1012)
-      (allow mach-lookup (global-name "com.apple.FontServer")))
     ; To allow accessing downloaded and other hidden fonts in
     ; /System/Library/Asssets/com_apple_MobileAsset_Font*.
     ; (https://crbug.com/662686)
@@ -176,12 +174,8 @@
   (path "/dev/urandom")
 )
 
-(if (>= os-version 1013)
-  (begin (allow file-read* (subpath "/private/var/db/timezone"))
-         (allow file-read-data (subpath "/usr/share/zoneinfo.default"))))
-
-(if (< os-version 1013)
-  (allow file-read-data (subpath "/usr/share/zoneinfo")))
+(allow file-read* (subpath "/private/var/db/timezone"))
+(allow file-read-data (subpath "/usr/share/zoneinfo.default"))
 
 ; Reads from /Library.
 (allow file-read-data
diff --git a/sandbox/policy/mac/gpu.sb b/sandbox/policy/mac/gpu.sb
index 31eea39..7e851b6 100644
--- a/sandbox/policy/mac/gpu.sb
+++ b/sandbox/policy/mac/gpu.sb
@@ -38,6 +38,10 @@
   (global-name "com.apple.system.opendirectoryd.membership") ; https://crbug.com/1126350#c5
   (global-name "com.apple.tsm.uiserver")
   (global-name "com.apple.windowserver.active")
+  ; Needed for VideoToolbox usage - https://crbug.com/767037
+  (xpc-service-name "com.apple.coremedia.videodecoder")
+  (xpc-service-name "com.apple.coremedia.videoencoder")
+  (xpc-service-name-regex #"\.apple-extension-service$")
 )
 
 ; Needed for metal decoding - https://crbug.com/957217
@@ -83,15 +87,6 @@
 (allow ipc-posix-shm-read-data
   (ipc-posix-name "apple.shm.notification_center"))
 
-
-; Needed for VideoToolbox usage - https://crbug.com/767037
-(if (>= os-version 1013)
-  (allow mach-lookup
-    (xpc-service-name "com.apple.coremedia.videodecoder")
-    (xpc-service-name "com.apple.coremedia.videoencoder")
-    (xpc-service-name-regex #"\.apple-extension-service$")
-))
-
 (allow sysctl-read
   (sysctl-name "hw.busfrequency_max")
   (sysctl-name "hw.cachelinesize")
diff --git a/sandbox/policy/mac/renderer.sb b/sandbox/policy/mac/renderer.sb
index 437a1b34..ae9acfb 100644
--- a/sandbox/policy/mac/renderer.sb
+++ b/sandbox/policy/mac/renderer.sb
@@ -6,21 +6,17 @@
 
 ; Put the denials first.
 ; crbug.com/799149: These operations are allowed by default.
-(if (>= os-version 1013)
-  (if (param-true? disable-sandbox-denial-logging)
-    (deny iokit-get-properties process-info* nvram* (with no-log))
-    (deny iokit-get-properties process-info* nvram*)
-))
+(if (param-true? disable-sandbox-denial-logging)
+  (deny iokit-get-properties process-info* nvram* (with no-log))
+  (deny iokit-get-properties process-info* nvram*)
+)
 
 ; Allow cf prefs to work.
 (allow user-preference-read)
 
 ; process-info
-(if (>= os-version 1013)
-  (begin
-    (allow process-info-pidinfo)
-    (allow process-info-setcontrol (target self))
-))
+(allow process-info-pidinfo)
+(allow process-info-setcontrol (target self))
 
 ; File reads.
 ; Reads from the home directory.
@@ -85,19 +81,18 @@
 )
 
 ; IOKit properties.
-(if (>= os-version 1013)
-  (allow iokit-get-properties
-    (iokit-property "CaseSensitive")
-    (iokit-property "CoreStorage Encrypted")
-    (iokit-property "Ejectable")
-    (iokit-property "Encrypted")
-    (iokit-property "IOClassNameOverride")
-    (iokit-property "IOMediaIcon")
-    (iokit-property "Product Identification")
-    (iokit-property "Protocol Characteristics")
-    (iokit-property "Removable")
-    (iokit-property "image-encrypted")
-))
+(allow iokit-get-properties
+  (iokit-property "CaseSensitive")
+  (iokit-property "CoreStorage Encrypted")
+  (iokit-property "Ejectable")
+  (iokit-property "Encrypted")
+  (iokit-property "IOClassNameOverride")
+  (iokit-property "IOMediaIcon")
+  (iokit-property "Product Identification")
+  (iokit-property "Protocol Characteristics")
+  (iokit-property "Removable")
+  (iokit-property "image-encrypted")
+)
 
 ; For V8 to use in thread calculations.
 (if (>= os-version 1014)
diff --git a/services/device/usb/usb_service_linux.cc b/services/device/usb/usb_service_linux.cc
index a089651..5a019d00 100644
--- a/services/device/usb/usb_service_linux.cc
+++ b/services/device/usb/usb_service_linux.cc
@@ -60,7 +60,7 @@
   return true;
 }
 
-void OnReadDescriptors(base::OnceCallback<void(bool)> callback,
+void OnReadDescriptors(base::OnceClosure callback,
                        scoped_refptr<UsbDeviceHandle> device_handle,
                        const GURL& landing_page) {
   UsbDeviceLinux* device =
@@ -70,18 +70,18 @@
     device->set_webusb_landing_page(landing_page);
 
   device_handle->Close();
-  std::move(callback).Run(true /* success */);
+  std::move(callback).Run();
 }
 
 void OnDeviceOpenedToReadDescriptors(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceClosure callback,
     scoped_refptr<UsbDeviceHandle> device_handle) {
   if (device_handle) {
     ReadWebUsbDescriptors(
         device_handle,
         base::BindOnce(&OnReadDescriptors, std::move(callback), device_handle));
   } else {
-    std::move(callback).Run(false /* failure */);
+    std::move(callback).Run();
   }
 }
 
@@ -269,12 +269,11 @@
                        base::BindOnce(&UsbServiceLinux::DeviceReady,
                                       weak_factory_.GetWeakPtr(), device)));
   } else {
-    DeviceReady(device, /*success=*/true);
+    DeviceReady(device);
   }
 }
 
-void UsbServiceLinux::DeviceReady(scoped_refptr<UsbDeviceLinux> device,
-                                  bool success) {
+void UsbServiceLinux::DeviceReady(scoped_refptr<UsbDeviceLinux> device) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   bool enumeration_became_ready = false;
@@ -287,10 +286,8 @@
 
   // If |device| was disconnected while descriptors were being read then it
   // will have been removed from |devices_by_path_|.
-  auto it = devices_by_path_.find(device->device_path());
-  if (it == devices_by_path_.end()) {
-    success = false;
-  } else if (success) {
+  bool device_added = base::Contains(devices_by_path_, device->device_path());
+  if (device_added) {
     DCHECK(!base::Contains(devices(), device->guid()));
     devices()[device->guid()] = device;
 
@@ -300,8 +297,6 @@
                   << "\", product=" << device->product_id() << " \""
                   << device->product_string() << "\", serial=\""
                   << device->serial_number() << "\", guid=" << device->guid();
-  } else {
-    devices_by_path_.erase(it);
   }
 
   if (enumeration_became_ready) {
@@ -312,7 +307,7 @@
     for (auto& callback : enumeration_callbacks_)
       std::move(callback).Run(result);
     enumeration_callbacks_.clear();
-  } else if (success && enumeration_ready()) {
+  } else if (device_added && enumeration_ready()) {
     NotifyDeviceAdded(device);
   }
 }
diff --git a/services/device/usb/usb_service_linux.h b/services/device/usb/usb_service_linux.h
index 0241768..ec800230 100644
--- a/services/device/usb/usb_service_linux.h
+++ b/services/device/usb/usb_service_linux.h
@@ -40,7 +40,7 @@
 
   void OnDeviceAdded(const std::string& device_path,
                      std::unique_ptr<UsbDeviceDescriptor> descriptor);
-  void DeviceReady(scoped_refptr<UsbDeviceLinux> device, bool success);
+  void DeviceReady(scoped_refptr<UsbDeviceLinux> device);
   void OnDeviceRemoved(const std::string& device_path);
   void HelperStarted();
 
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index a418137..72b5452 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -115,7 +115,11 @@
 
 # Internal-facing config for Skia library code.
 config("skia_library_config") {
-  defines = []
+  # Turn on SK_API to export Skia's public API
+  defines = [
+    "IS_SKIA_IMPL=1",
+    "SKIA_IMPLEMENTATION=1",
+  ]
 
   # Skia uses C++17 language features in its internal code. Previously Skia was built with
   # "-std=c++17". See http://crbug.com/1257145 for why this was a bad idea.
@@ -126,8 +130,6 @@
     defines += [ "SK_FREETYPE_MINIMUM_RUNTIME_VERSION=(((FREETYPE_MAJOR) * 0x01000000) | ((FREETYPE_MINOR) * 0x00010000) | ((FREETYPE_PATCH) * 0x00000100))" ]
   }
 
-  defines += [ "SKIA_IMPLEMENTATION=1" ]
-
   if (current_cpu == "arm") {
     if (arm_use_neon) {
       defines += [ "SK_ARM_HAS_NEON" ]
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h
index 0c63a28..3d0d7fe 100644
--- a/skia/config/SkUserConfig.h
+++ b/skia/config/SkUserConfig.h
@@ -122,6 +122,7 @@
 //#define SK_HISTOGRAM_BOOLEAN(name, sample)
 //#define SK_HISTOGRAM_EXACT_LINEAR(name, sample, value_max)
 //#define SK_HISTOGRAM_MEMORY_KB(name, sample)
+#include "base/component_export.h"
 #include "skia/ext/skia_histogram.h"
 
 // ===== Begin Chrome-specific definitions =====
@@ -136,6 +137,11 @@
  */
 #define SK_PDF_USE_HARFBUZZ_SUBSET
 
+#if !defined(SK_API)
+// Handle exporting using base/component_export.h
+#define SK_API COMPONENT_EXPORT(SKIA)
+#endif
+
 // Chromium does not use these fonts.  This define causes type1 fonts to be
 // converted to type3 when producing PDFs, and reduces build size.
 #define SK_PDF_DO_NOT_SUPPORT_TYPE_1_FONTS
diff --git a/testing/buildbot/chromium.cft.json b/testing/buildbot/chromium.cft.json
index 906af51e..b2d0a28 100644
--- a/testing/buildbot/chromium.cft.json
+++ b/testing/buildbot/chromium.cft.json
@@ -4213,7 +4213,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4232,7 +4232,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4251,7 +4251,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4271,7 +4271,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4290,7 +4290,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4309,7 +4309,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4328,7 +4328,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4347,7 +4347,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4366,7 +4366,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4385,7 +4385,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4405,7 +4405,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4424,7 +4424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4443,7 +4443,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4466,11 +4466,11 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 10
+          "shards": 15
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
@@ -4489,7 +4489,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4508,7 +4508,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4527,7 +4527,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4546,7 +4546,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4565,7 +4565,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4584,7 +4584,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4603,7 +4603,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4622,7 +4622,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4641,7 +4641,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4660,9 +4660,10 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
+          "inverse_quickrun_shards": 2,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "components_unittests",
@@ -4679,7 +4680,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4688,6 +4689,9 @@
         "test_id_prefix": "ninja://ui/compositor:compositor_unittests/"
       },
       {
+        "args": [
+          "--disable-features=WebRTC-H264WithOpenH264FFmpeg"
+        ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -4698,9 +4702,10 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
+          "quickrun_shards": 18,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
           "shards": 8
         },
@@ -4718,7 +4723,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4737,7 +4742,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4756,7 +4761,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4775,7 +4780,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4794,7 +4799,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4813,7 +4818,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4832,7 +4837,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4851,7 +4856,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4870,7 +4875,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4889,7 +4894,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4908,7 +4913,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4927,7 +4932,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4946,7 +4951,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4965,7 +4970,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4984,7 +4989,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5003,7 +5008,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5022,7 +5027,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5041,7 +5046,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5060,7 +5065,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5079,7 +5084,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5098,7 +5103,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5117,7 +5122,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5136,7 +5141,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5155,7 +5160,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5175,7 +5180,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5197,11 +5202,11 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
+          "shards": 9
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
@@ -5229,7 +5234,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5248,7 +5253,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5267,7 +5272,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5286,7 +5291,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5305,7 +5310,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5324,7 +5329,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5343,7 +5348,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5362,7 +5367,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5381,7 +5386,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5400,7 +5405,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5419,7 +5424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5438,7 +5443,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5457,7 +5462,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5476,7 +5481,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5495,7 +5500,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5514,7 +5519,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5533,7 +5538,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5552,7 +5557,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5571,7 +5576,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5591,7 +5596,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5610,7 +5615,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5629,7 +5634,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5648,7 +5653,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5667,7 +5672,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5687,7 +5692,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5706,7 +5711,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5725,7 +5730,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5744,7 +5749,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5763,7 +5768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5782,7 +5787,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5801,10 +5806,11 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
         },
         "test": "sync_integration_tests",
         "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
@@ -5820,7 +5826,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5839,7 +5845,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5858,7 +5864,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5877,7 +5883,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5896,7 +5902,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5915,7 +5921,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5942,7 +5948,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5961,7 +5967,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5980,7 +5986,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -5999,7 +6005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6018,7 +6024,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6037,7 +6043,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6056,7 +6062,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6075,7 +6081,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6101,7 +6107,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6140,11 +6146,12 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
+          "inverse_quickrun_shards": 24,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
+          "shards": 12
         },
         "test_id_prefix": "ninja://:blink_web_tests/"
       },
@@ -6180,11 +6187,12 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
+          "inverse_quickrun_shards": 36,
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 7
+          "shards": 18
         },
         "test_id_prefix": "ninja://:blink_wpt_tests/"
       },
@@ -6194,7 +6202,7 @@
         ],
         "check_flakiness_for_new_tests": false,
         "isolate_name": "chromedriver_py_tests",
-        "isolate_profile_data": true,
+        "isolate_profile_data": false,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
@@ -6208,7 +6216,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6228,7 +6236,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6253,7 +6261,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6277,7 +6285,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6301,7 +6309,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6324,7 +6332,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6345,7 +6353,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6368,7 +6376,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6389,7 +6397,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6419,7 +6427,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -6442,7 +6450,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "idempotent": false,
@@ -6468,7 +6476,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 24b06e5f..436d340 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -1479,7 +1479,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1497,7 +1497,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1515,7 +1515,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1534,7 +1534,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1552,7 +1552,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1570,7 +1570,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1588,7 +1588,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1606,7 +1606,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1624,7 +1624,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1642,7 +1642,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1661,7 +1661,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1679,7 +1679,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1697,7 +1697,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1715,7 +1715,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1737,7 +1737,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1755,7 +1755,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1773,7 +1773,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1791,7 +1791,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1809,7 +1809,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1827,7 +1827,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1845,7 +1845,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1863,7 +1863,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1881,7 +1881,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1899,7 +1899,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1917,7 +1917,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1935,7 +1935,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1954,7 +1954,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1972,7 +1972,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1990,7 +1990,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2008,7 +2008,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2026,7 +2026,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2044,7 +2044,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2062,7 +2062,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2080,7 +2080,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2098,7 +2098,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2116,7 +2116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2134,7 +2134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2152,7 +2152,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2170,7 +2170,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2188,7 +2188,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2206,7 +2206,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2224,7 +2224,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2242,7 +2242,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2260,7 +2260,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2278,7 +2278,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2296,7 +2296,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2314,7 +2314,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2332,7 +2332,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2350,7 +2350,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2368,7 +2368,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2387,7 +2387,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2405,7 +2405,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2424,7 +2424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2442,7 +2442,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2460,7 +2460,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2478,7 +2478,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2496,7 +2496,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2514,7 +2514,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2532,7 +2532,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2550,7 +2550,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2568,7 +2568,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2586,7 +2586,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2604,7 +2604,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2622,7 +2622,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2641,7 +2641,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2659,7 +2659,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2677,7 +2677,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2695,7 +2695,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2713,7 +2713,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2731,7 +2731,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2750,7 +2750,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2768,7 +2768,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2786,7 +2786,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2804,7 +2804,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2822,7 +2822,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2841,7 +2841,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2859,7 +2859,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2877,7 +2877,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2895,7 +2895,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2913,7 +2913,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2931,7 +2931,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2949,7 +2949,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2967,7 +2967,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2985,7 +2985,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3003,7 +3003,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3021,7 +3021,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3039,7 +3039,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3057,7 +3057,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3075,7 +3075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3093,7 +3093,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3111,7 +3111,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3129,7 +3129,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3147,7 +3147,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3165,7 +3165,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3183,7 +3183,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3208,7 +3208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3226,7 +3226,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3244,7 +3244,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3263,7 +3263,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3281,7 +3281,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3299,7 +3299,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3317,7 +3317,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3335,7 +3335,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3353,7 +3353,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3371,7 +3371,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3390,7 +3390,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3408,7 +3408,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3426,7 +3426,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3447,7 +3447,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3465,7 +3465,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3483,7 +3483,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3501,7 +3501,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3519,7 +3519,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3537,7 +3537,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3555,7 +3555,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3573,7 +3573,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3591,7 +3591,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3609,7 +3609,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3627,7 +3627,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3645,7 +3645,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3663,7 +3663,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3681,7 +3681,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3699,7 +3699,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3717,7 +3717,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3735,7 +3735,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3753,7 +3753,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3771,7 +3771,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3789,7 +3789,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3807,7 +3807,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3825,7 +3825,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3843,7 +3843,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3861,7 +3861,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3879,7 +3879,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3897,7 +3897,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3915,7 +3915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3933,7 +3933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3951,7 +3951,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3969,7 +3969,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3987,7 +3987,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4005,7 +4005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4023,7 +4023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4042,7 +4042,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4060,7 +4060,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4078,7 +4078,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4096,7 +4096,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4114,7 +4114,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4132,7 +4132,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4150,7 +4150,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4168,7 +4168,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4186,7 +4186,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4204,7 +4204,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4222,7 +4222,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4240,7 +4240,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4258,7 +4258,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -4277,7 +4277,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4295,7 +4295,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4313,7 +4313,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4331,7 +4331,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4349,7 +4349,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4367,7 +4367,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4386,7 +4386,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4404,7 +4404,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4422,7 +4422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4440,7 +4440,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4458,7 +4458,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4477,7 +4477,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4495,7 +4495,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4513,7 +4513,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4531,7 +4531,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4549,7 +4549,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4567,7 +4567,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4585,7 +4585,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4603,7 +4603,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4621,7 +4621,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4639,7 +4639,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4657,7 +4657,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4675,7 +4675,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4693,7 +4693,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4711,7 +4711,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4729,7 +4729,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4747,7 +4747,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4765,7 +4765,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4783,7 +4783,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4801,7 +4801,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -29898,7 +29898,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -29916,7 +29916,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -29934,7 +29934,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -29953,7 +29953,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -29971,7 +29971,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -29989,7 +29989,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30007,7 +30007,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30025,7 +30025,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30043,7 +30043,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30061,7 +30061,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30080,7 +30080,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30098,7 +30098,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30116,7 +30116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30134,7 +30134,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -30156,7 +30156,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30174,7 +30174,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30192,7 +30192,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30210,7 +30210,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30228,7 +30228,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30246,7 +30246,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30264,7 +30264,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30282,7 +30282,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30300,7 +30300,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30318,7 +30318,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30336,7 +30336,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30354,7 +30354,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -30373,7 +30373,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30391,7 +30391,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30409,7 +30409,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30427,7 +30427,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30445,7 +30445,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30463,7 +30463,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30481,7 +30481,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30499,7 +30499,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30517,7 +30517,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30535,7 +30535,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30553,7 +30553,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30571,7 +30571,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30589,7 +30589,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30607,7 +30607,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30625,7 +30625,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30643,7 +30643,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30661,7 +30661,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30679,7 +30679,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30697,7 +30697,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30715,7 +30715,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30733,7 +30733,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30751,7 +30751,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30769,7 +30769,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30787,7 +30787,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30806,7 +30806,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30824,7 +30824,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -30843,7 +30843,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30861,7 +30861,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30879,7 +30879,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30897,7 +30897,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30915,7 +30915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30933,7 +30933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30951,7 +30951,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30969,7 +30969,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -30987,7 +30987,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31005,7 +31005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31023,7 +31023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31041,7 +31041,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31059,7 +31059,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31077,7 +31077,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31095,7 +31095,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31113,7 +31113,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31131,7 +31131,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31150,7 +31150,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31168,7 +31168,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31186,7 +31186,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31204,7 +31204,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31222,7 +31222,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31241,7 +31241,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31259,7 +31259,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31277,7 +31277,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31295,7 +31295,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31313,7 +31313,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31331,7 +31331,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31349,7 +31349,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31367,7 +31367,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31385,7 +31385,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31403,7 +31403,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31421,7 +31421,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31439,7 +31439,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31457,7 +31457,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31475,7 +31475,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31493,7 +31493,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31511,7 +31511,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31529,7 +31529,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31547,7 +31547,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31565,7 +31565,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31583,7 +31583,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31608,7 +31608,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31628,7 +31628,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31648,7 +31648,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31672,7 +31672,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31690,7 +31690,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31708,7 +31708,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31727,7 +31727,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31745,7 +31745,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31763,7 +31763,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31781,7 +31781,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31799,7 +31799,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31817,7 +31817,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31835,7 +31835,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31854,7 +31854,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31872,7 +31872,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31890,7 +31890,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31908,7 +31908,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -31930,7 +31930,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31948,7 +31948,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31966,7 +31966,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -31984,7 +31984,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32002,7 +32002,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32020,7 +32020,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32038,7 +32038,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32056,7 +32056,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32074,7 +32074,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32092,7 +32092,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32110,7 +32110,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32128,7 +32128,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -32147,7 +32147,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32165,7 +32165,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32183,7 +32183,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32201,7 +32201,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32219,7 +32219,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32237,7 +32237,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32255,7 +32255,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32273,7 +32273,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32291,7 +32291,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32309,7 +32309,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32327,7 +32327,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32345,7 +32345,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32363,7 +32363,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32381,7 +32381,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32399,7 +32399,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32417,7 +32417,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32435,7 +32435,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32453,7 +32453,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32471,7 +32471,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32489,7 +32489,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32507,7 +32507,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32525,7 +32525,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32543,7 +32543,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32561,7 +32561,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32580,7 +32580,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32598,7 +32598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -32617,7 +32617,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32635,7 +32635,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32653,7 +32653,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32671,7 +32671,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32689,7 +32689,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32707,7 +32707,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32725,7 +32725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32743,7 +32743,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32761,7 +32761,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32779,7 +32779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32797,7 +32797,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32815,7 +32815,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32833,7 +32833,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32851,7 +32851,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32869,7 +32869,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32887,7 +32887,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32905,7 +32905,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32924,7 +32924,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32942,7 +32942,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32960,7 +32960,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32978,7 +32978,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -32996,7 +32996,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33015,7 +33015,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33033,7 +33033,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33051,7 +33051,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33069,7 +33069,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33087,7 +33087,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33105,7 +33105,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33123,7 +33123,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33141,7 +33141,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33159,7 +33159,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33177,7 +33177,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33195,7 +33195,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33213,7 +33213,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33231,7 +33231,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33249,7 +33249,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33267,7 +33267,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33285,7 +33285,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33303,7 +33303,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33321,7 +33321,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33339,7 +33339,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33357,7 +33357,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33382,7 +33382,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33402,7 +33402,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33422,7 +33422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33446,7 +33446,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33464,7 +33464,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33482,7 +33482,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33501,7 +33501,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33519,7 +33519,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33537,7 +33537,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33555,7 +33555,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33573,7 +33573,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33591,7 +33591,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33609,7 +33609,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33628,7 +33628,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33646,7 +33646,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33664,7 +33664,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33682,7 +33682,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -33704,7 +33704,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33722,7 +33722,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33740,7 +33740,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33758,7 +33758,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33776,7 +33776,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33794,7 +33794,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33812,7 +33812,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33830,7 +33830,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33848,7 +33848,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33866,7 +33866,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33884,7 +33884,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33902,7 +33902,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -33921,7 +33921,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33939,7 +33939,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33957,7 +33957,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33975,7 +33975,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -33993,7 +33993,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34011,7 +34011,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34029,7 +34029,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34047,7 +34047,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34065,7 +34065,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34083,7 +34083,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34101,7 +34101,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34119,7 +34119,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34137,7 +34137,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34155,7 +34155,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34173,7 +34173,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34191,7 +34191,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34209,7 +34209,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34227,7 +34227,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34245,7 +34245,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34263,7 +34263,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34281,7 +34281,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34299,7 +34299,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34317,7 +34317,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34335,7 +34335,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34354,7 +34354,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34372,7 +34372,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -34391,7 +34391,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34409,7 +34409,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34427,7 +34427,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34445,7 +34445,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34463,7 +34463,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34481,7 +34481,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34499,7 +34499,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34517,7 +34517,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34535,7 +34535,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34553,7 +34553,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34571,7 +34571,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34589,7 +34589,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34607,7 +34607,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34625,7 +34625,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34643,7 +34643,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34661,7 +34661,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34679,7 +34679,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34698,7 +34698,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34716,7 +34716,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34734,7 +34734,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34752,7 +34752,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34770,7 +34770,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34789,7 +34789,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34807,7 +34807,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34825,7 +34825,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34843,7 +34843,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34861,7 +34861,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34879,7 +34879,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34897,7 +34897,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34915,7 +34915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34933,7 +34933,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34951,7 +34951,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34969,7 +34969,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -34987,7 +34987,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35005,7 +35005,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35023,7 +35023,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35041,7 +35041,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35059,7 +35059,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35077,7 +35077,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35095,7 +35095,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35113,7 +35113,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35131,7 +35131,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35156,7 +35156,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35176,7 +35176,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -35196,7 +35196,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41101,7 +41101,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41118,7 +41118,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41135,7 +41135,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41153,7 +41153,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41170,7 +41170,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41187,7 +41187,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41204,7 +41204,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41221,7 +41221,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41238,7 +41238,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41255,7 +41255,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41273,7 +41273,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41290,7 +41290,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41307,7 +41307,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41327,7 +41327,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41344,7 +41344,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41361,7 +41361,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41378,7 +41378,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41395,7 +41395,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41412,7 +41412,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41429,7 +41429,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41446,7 +41446,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41463,7 +41463,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41480,7 +41480,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41497,7 +41497,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41514,7 +41514,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -41532,7 +41532,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41549,7 +41549,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41566,7 +41566,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41583,7 +41583,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41600,7 +41600,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41617,7 +41617,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41634,7 +41634,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41651,7 +41651,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41668,7 +41668,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41685,7 +41685,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41702,7 +41702,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41719,7 +41719,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41736,7 +41736,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41753,7 +41753,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41770,7 +41770,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41787,7 +41787,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41804,7 +41804,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41821,7 +41821,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41838,7 +41838,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41855,7 +41855,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41872,7 +41872,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41889,7 +41889,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41906,7 +41906,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41924,7 +41924,7 @@
           "dimension_sets": [
             {
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41941,7 +41941,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -41959,7 +41959,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41976,7 +41976,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -41993,7 +41993,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42010,7 +42010,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42027,7 +42027,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42044,7 +42044,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42061,7 +42061,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42078,7 +42078,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42095,7 +42095,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42112,7 +42112,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42129,7 +42129,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42146,7 +42146,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42163,7 +42163,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42180,7 +42180,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42197,7 +42197,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42214,7 +42214,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42231,7 +42231,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42249,7 +42249,7 @@
           "dimension_sets": [
             {
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42266,7 +42266,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42283,7 +42283,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42300,7 +42300,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42317,7 +42317,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42335,7 +42335,7 @@
           "dimension_sets": [
             {
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42352,7 +42352,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42369,7 +42369,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42386,7 +42386,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42403,7 +42403,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42420,7 +42420,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42437,7 +42437,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42454,7 +42454,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42471,7 +42471,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42488,7 +42488,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42505,7 +42505,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42522,7 +42522,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42539,7 +42539,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42556,7 +42556,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42573,7 +42573,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42590,7 +42590,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42607,7 +42607,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42624,7 +42624,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42641,7 +42641,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -42658,7 +42658,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.dev.json b/testing/buildbot/chromium.dev.json
index 35e9b47..6a0d0b90 100644
--- a/testing/buildbot/chromium.dev.json
+++ b/testing/buildbot/chromium.dev.json
@@ -129,7 +129,7 @@
             }
           ],
           "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
+          "shards": 8
         },
         "test": "browser_tests",
         "test_id_prefix": "ninja://chrome/test:browser_tests/"
@@ -147,7 +147,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 5
         },
         "test": "content_browsertests",
         "test_id_prefix": "ninja://content/test:content_browsertests/"
@@ -183,7 +184,8 @@
               "os": "Ubuntu-18.04"
             }
           ],
-          "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester-dev@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 3
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index bc908eb..993374ca 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -10805,6 +10805,130 @@
         },
         "test": "android_browsertests",
         "test_id_prefix": "ninja://chrome/test:android_browsertests/"
+      },
+      {
+        "args": [
+          "--disable-field-trial-config",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_cts_tests_no_field_trial"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webview_cts_tests_no_field_trial",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "cipd_packages": [
+            {
+              "cipd_package": "chromium/android_webview/tools/cts_archive",
+              "location": "android_webview/tools/cts_archive",
+              "revision": "C4m9-gZKvvtS0-KQ9cMRi6wEfZH_TeWSiXEgsgtGtsMC"
+            }
+          ],
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-18.04",
+              "pool": "chromium.tests.finch"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "generic_android28",
+              "path": ".android_emulator/generic_android28"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "generic_android28"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
+        },
+        "test": "webview_cts_tests",
+        "test_id_prefix": "ninja://android_webview/test:webview_cts_tests/"
+      },
+      {
+        "args": [
+          "--disable-field-trial-config",
+          "--gs-results-bucket=chromium-result-details",
+          "--recover-devices",
+          "--avd-config=../../tools/android/avd/proto/generic_android28.textpb"
+        ],
+        "merge": {
+          "args": [
+            "--bucket",
+            "chromium-result-details",
+            "--test-name",
+            "webview_ui_test_app_test_apk_no_field_trial"
+          ],
+          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
+        },
+        "name": "webview_ui_test_app_test_apk_no_field_trial",
+        "resultdb": {
+          "enable": true,
+          "has_native_resultdb_integration": true
+        },
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "cpu": "x86-64",
+              "os": "Ubuntu-18.04",
+              "pool": "chromium.tests.finch"
+            }
+          ],
+          "named_caches": [
+            {
+              "name": "generic_android28",
+              "path": ".android_emulator/generic_android28"
+            }
+          ],
+          "optional_dimensions": {
+            "60": [
+              {
+                "caches": "generic_android28"
+              }
+            ]
+          },
+          "output_links": [
+            {
+              "link": [
+                "https://luci-logdog.appspot.com/v/?s",
+                "=android%2Fswarming%2Flogcats%2F",
+                "${TASK_ID}%2F%2B%2Funified_logcats"
+              ],
+              "name": "shard #${SHARD_INDEX} logcats"
+            }
+          ],
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+        },
+        "test": "webview_ui_test_app_test_apk",
+        "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/"
       }
     ]
   },
@@ -93977,7 +94101,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -93998,7 +94122,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94019,7 +94143,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94041,7 +94165,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94062,7 +94186,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94083,7 +94207,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94105,7 +94229,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -94127,7 +94251,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94149,7 +94273,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94170,7 +94294,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94191,7 +94315,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94212,7 +94336,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94234,7 +94358,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94256,7 +94380,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94278,7 +94402,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94299,7 +94423,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94320,7 +94444,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94342,7 +94466,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -94374,7 +94498,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94396,7 +94520,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94417,7 +94541,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94439,7 +94563,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94460,7 +94584,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94482,7 +94606,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94503,7 +94627,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94524,7 +94648,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94545,7 +94669,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94566,7 +94690,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94587,7 +94711,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94608,7 +94732,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94630,7 +94754,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94651,7 +94775,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94673,7 +94797,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94694,7 +94818,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94715,7 +94839,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -94738,7 +94862,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -94760,7 +94884,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94782,7 +94906,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94803,7 +94927,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94824,7 +94948,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94845,7 +94969,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94866,7 +94990,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94887,7 +95011,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94908,7 +95032,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94929,7 +95053,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94950,7 +95074,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94971,7 +95095,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -94992,7 +95116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95013,7 +95137,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95034,7 +95158,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95055,7 +95179,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95076,7 +95200,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95097,7 +95221,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95118,7 +95242,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95139,7 +95263,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95160,7 +95284,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95181,7 +95305,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95202,7 +95326,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95223,7 +95347,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95244,7 +95368,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95265,7 +95389,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95287,7 +95411,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95308,7 +95432,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -95340,7 +95464,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95361,7 +95485,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95382,7 +95506,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95403,7 +95527,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95424,7 +95548,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95445,7 +95569,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95466,7 +95590,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95487,7 +95611,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95508,7 +95632,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95529,7 +95653,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95550,7 +95674,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95571,7 +95695,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95592,7 +95716,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95613,7 +95737,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95634,7 +95758,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95655,7 +95779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95676,7 +95800,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95697,7 +95821,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95718,7 +95842,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95740,7 +95864,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95761,7 +95885,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95782,7 +95906,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95803,7 +95927,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95824,7 +95948,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95846,7 +95970,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95867,7 +95991,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95888,7 +96012,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95909,7 +96033,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95930,7 +96054,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95951,7 +96075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95972,7 +96096,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -95993,7 +96117,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96014,7 +96138,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96035,7 +96159,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96057,7 +96181,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96078,7 +96202,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96099,7 +96223,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96120,7 +96244,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96147,7 +96271,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96168,7 +96292,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96189,7 +96313,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96210,7 +96334,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96231,7 +96355,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96252,7 +96376,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96274,7 +96398,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96295,7 +96419,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96316,7 +96440,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96355,7 +96479,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96393,7 +96517,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96431,7 +96555,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96470,7 +96594,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96495,7 +96619,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96517,7 +96641,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96539,7 +96663,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96561,7 +96685,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96582,7 +96706,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96604,7 +96728,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96626,7 +96750,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96648,7 +96772,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96669,7 +96793,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96691,7 +96815,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96712,7 +96836,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96734,7 +96858,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96756,7 +96880,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96777,7 +96901,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96799,7 +96923,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96820,7 +96944,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96843,7 +96967,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -96865,7 +96989,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96887,7 +97011,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96908,7 +97032,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96930,7 +97054,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96951,7 +97075,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -96973,7 +97097,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97012,7 +97136,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -97050,7 +97174,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -97088,7 +97212,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -97127,7 +97251,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -97152,7 +97276,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -97175,7 +97299,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -97197,7 +97321,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -97219,7 +97343,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -97241,7 +97365,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -97263,7 +97387,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.finch"
             }
           ],
@@ -97288,7 +97412,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97308,7 +97432,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97325,7 +97449,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -97343,7 +97467,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -97360,7 +97484,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -98664,7 +98788,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98685,7 +98809,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98706,7 +98830,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98728,7 +98852,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98749,7 +98873,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98770,7 +98894,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98791,7 +98915,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98812,7 +98936,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98833,7 +98957,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98854,7 +98978,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98876,7 +99000,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98897,7 +99021,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98918,7 +99042,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98942,7 +99066,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -98976,7 +99100,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99000,7 +99124,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99021,7 +99145,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99042,7 +99166,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99063,7 +99187,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99084,7 +99208,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99105,7 +99229,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99126,7 +99250,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99147,7 +99271,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99168,7 +99292,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99189,7 +99313,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99210,7 +99334,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99234,7 +99358,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99256,7 +99380,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99277,7 +99401,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99298,7 +99422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99319,7 +99443,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99340,7 +99464,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99361,7 +99485,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99382,7 +99506,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99403,7 +99527,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99424,7 +99548,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99445,7 +99569,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99466,7 +99590,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99487,7 +99611,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99508,7 +99632,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99529,7 +99653,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99550,7 +99674,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99571,7 +99695,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99592,7 +99716,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99613,7 +99737,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99634,7 +99758,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99655,7 +99779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99676,7 +99800,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99697,7 +99821,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99718,7 +99842,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99739,7 +99863,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99761,7 +99885,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99782,7 +99906,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99816,7 +99940,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99837,7 +99961,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99858,7 +99982,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99879,7 +100003,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99900,7 +100024,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99921,7 +100045,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99942,7 +100066,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99963,7 +100087,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -99984,7 +100108,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100005,7 +100129,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100026,7 +100150,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100047,7 +100171,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100068,7 +100192,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100089,7 +100213,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100110,7 +100234,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100131,7 +100255,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100152,7 +100276,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100173,7 +100297,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100194,7 +100318,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100216,7 +100340,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100237,7 +100361,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100258,7 +100382,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100279,7 +100403,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100300,7 +100424,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100322,7 +100446,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100343,7 +100467,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100364,7 +100488,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100385,7 +100509,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100406,7 +100530,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100427,7 +100551,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100448,7 +100572,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100469,7 +100593,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100490,7 +100614,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100511,7 +100635,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100532,7 +100656,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100553,7 +100677,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100574,7 +100698,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100603,7 +100727,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100624,7 +100748,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100645,7 +100769,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100666,7 +100790,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100687,7 +100811,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100708,7 +100832,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100729,7 +100853,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100750,7 +100874,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100778,7 +100902,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100819,7 +100943,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100861,7 +100985,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100891,7 +101015,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100913,7 +101037,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100940,7 +101064,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100966,7 +101090,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -100992,7 +101116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101017,7 +101141,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101040,7 +101164,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101065,7 +101189,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101088,7 +101212,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101120,7 +101244,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101145,7 +101269,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101173,7 +101297,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests.no-external-ip"
             }
           ],
@@ -101213,7 +101337,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
diff --git a/testing/buildbot/chromium.updater.json b/testing/buildbot/chromium.updater.json
index 55b2c792..9ae1891 100644
--- a/testing/buildbot/chromium.updater.json
+++ b/testing/buildbot/chromium.updater.json
@@ -525,7 +525,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -545,7 +545,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -569,7 +569,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -589,7 +589,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -613,7 +613,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -633,7 +633,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -700,7 +700,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
@@ -720,7 +720,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chromium.tests"
             }
           ],
diff --git a/testing/buildbot/chromium.webrtc.fyi.json b/testing/buildbot/chromium.webrtc.fyi.json
index 1978302..26beeb1 100644
--- a/testing/buildbot/chromium.webrtc.fyi.json
+++ b/testing/buildbot/chromium.webrtc.fyi.json
@@ -376,7 +376,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -397,7 +397,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -422,7 +422,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -443,7 +443,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -464,7 +464,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index dea946a..52270c5 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -31,7 +31,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -67,7 +67,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -139,7 +139,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -158,7 +158,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -177,7 +177,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -197,7 +197,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -216,7 +216,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -235,7 +235,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -254,7 +254,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -273,7 +273,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -292,7 +292,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -311,7 +311,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -331,7 +331,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -350,7 +350,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -369,7 +369,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -391,7 +391,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -423,7 +423,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -445,7 +445,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -464,7 +464,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -483,7 +483,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -502,7 +502,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -521,7 +521,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -540,7 +540,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -559,7 +559,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -578,7 +578,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -597,7 +597,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -616,7 +616,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "inverse_quickrun_shards": 2,
@@ -636,7 +636,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -658,7 +658,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "quickrun_shards": 18,
@@ -679,7 +679,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -698,7 +698,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -717,7 +717,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -736,7 +736,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -755,7 +755,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -774,7 +774,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -793,7 +793,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -812,7 +812,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -831,7 +831,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -850,7 +850,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -869,7 +869,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -888,7 +888,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -907,7 +907,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -926,7 +926,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -945,7 +945,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -964,7 +964,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -983,7 +983,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1002,7 +1002,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1021,7 +1021,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1040,7 +1040,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1059,7 +1059,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1078,7 +1078,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1097,7 +1097,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1116,7 +1116,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1136,7 +1136,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1155,7 +1155,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1187,7 +1187,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1206,7 +1206,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1225,7 +1225,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1244,7 +1244,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1263,7 +1263,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1282,7 +1282,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1301,7 +1301,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1320,7 +1320,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1339,7 +1339,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1358,7 +1358,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1377,7 +1377,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1396,7 +1396,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1415,7 +1415,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1434,7 +1434,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1453,7 +1453,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1472,7 +1472,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1491,7 +1491,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1510,7 +1510,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1529,7 +1529,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1549,7 +1549,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1568,7 +1568,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1587,7 +1587,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1606,7 +1606,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1625,7 +1625,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1645,7 +1645,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1664,7 +1664,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1683,7 +1683,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1702,7 +1702,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1721,7 +1721,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1740,7 +1740,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1759,7 +1759,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -1779,7 +1779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1798,7 +1798,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1817,7 +1817,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1836,7 +1836,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1855,7 +1855,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1874,7 +1874,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1901,7 +1901,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1920,7 +1920,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1939,7 +1939,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1958,7 +1958,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1977,7 +1977,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -1996,7 +1996,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2015,7 +2015,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2034,7 +2034,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2060,7 +2060,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2099,7 +2099,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "inverse_quickrun_shards": 24,
@@ -2140,7 +2140,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "inverse_quickrun_shards": 36,
@@ -2169,7 +2169,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2189,7 +2189,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2214,7 +2214,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2238,7 +2238,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2262,7 +2262,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2285,7 +2285,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2306,7 +2306,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2329,7 +2329,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2350,7 +2350,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2380,7 +2380,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2403,7 +2403,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "idempotent": false,
@@ -2429,7 +2429,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2450,7 +2450,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2468,7 +2468,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2486,7 +2486,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2505,7 +2505,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2523,7 +2523,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2541,7 +2541,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2559,7 +2559,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2577,7 +2577,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2595,7 +2595,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2613,7 +2613,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2632,7 +2632,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2650,7 +2650,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2668,7 +2668,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2689,7 +2689,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2707,7 +2707,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2725,7 +2725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2743,7 +2743,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2761,7 +2761,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2779,7 +2779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2797,7 +2797,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2815,7 +2815,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2833,7 +2833,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2851,7 +2851,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2869,7 +2869,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2891,7 +2891,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2910,7 +2910,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2928,7 +2928,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2946,7 +2946,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2964,7 +2964,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -2982,7 +2982,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3000,7 +3000,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3018,7 +3018,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3036,7 +3036,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3054,7 +3054,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3072,7 +3072,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3090,7 +3090,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3109,7 +3109,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3127,7 +3127,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3145,7 +3145,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3163,7 +3163,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3181,7 +3181,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3199,7 +3199,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3217,7 +3217,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3235,7 +3235,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3253,7 +3253,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3271,7 +3271,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3289,7 +3289,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3307,7 +3307,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3325,7 +3325,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3344,7 +3344,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3363,7 +3363,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -3382,7 +3382,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3400,7 +3400,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3418,7 +3418,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3436,7 +3436,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3454,7 +3454,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3472,7 +3472,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3490,7 +3490,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3508,7 +3508,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3526,7 +3526,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3544,7 +3544,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3562,7 +3562,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3580,7 +3580,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3598,7 +3598,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3616,7 +3616,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3634,7 +3634,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3652,7 +3652,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3670,7 +3670,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3688,7 +3688,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3707,7 +3707,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3725,7 +3725,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3743,7 +3743,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3761,7 +3761,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3779,7 +3779,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3798,7 +3798,7 @@
             {
               "cpu": "x86-64",
               "integrity": "high",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3816,7 +3816,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3834,7 +3834,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3852,7 +3852,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3870,7 +3870,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3888,7 +3888,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3907,7 +3907,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3925,7 +3925,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3943,7 +3943,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3961,7 +3961,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3979,7 +3979,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -3997,7 +3997,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4015,7 +4015,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4033,7 +4033,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4051,7 +4051,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4069,7 +4069,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4087,7 +4087,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4105,7 +4105,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4123,7 +4123,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4141,7 +4141,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4166,7 +4166,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4185,7 +4185,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4209,7 +4209,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4233,7 +4233,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4256,7 +4256,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4278,7 +4278,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
@@ -4308,7 +4308,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "hard_timeout": 960,
@@ -4332,7 +4332,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "idempotent": false,
@@ -4360,7 +4360,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "idempotent": false,
@@ -4386,7 +4386,7 @@
           "dimension_sets": [
             {
               "cpu": "x86-64",
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json
index 817a4f5..54ca8fe 100644
--- a/testing/buildbot/client.v8.fyi.json
+++ b/testing/buildbot/client.v8.fyi.json
@@ -2042,7 +2042,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -2078,7 +2078,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
diff --git a/testing/buildbot/internal.chrome.fyi.json b/testing/buildbot/internal.chrome.fyi.json
index 7a0c300..0be76d9 100644
--- a/testing/buildbot/internal.chrome.fyi.json
+++ b/testing/buildbot/internal.chrome.fyi.json
@@ -133,7 +133,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045",
+              "os": "Windows-10-19045",
               "pool": "chrome.tests.finch"
             }
           ],
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 94118c7..ad34029 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -1251,7 +1251,7 @@
   'win10': {
     'swarming': {
       'dimensions': {
-        'os': 'Windows-10-19042|Windows-10-19045',
+        'os': 'Windows-10-19045',
       },
     },
   },
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 21e8cdb..75d53d79 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -511,6 +511,10 @@
           '--target',
           'Release_x64',
         ],
+        'swarming': {
+          "shards": 12,
+          "inverse_quickrun_shards": 24,
+        },
       },
       'win10-rel-no-external-ip': {
         'args': [
@@ -820,6 +824,10 @@
           '--target',
           'Release_x64',
         ],
+        'swarming': {
+          "shards": 18,
+          "inverse_quickrun_shards": 36,
+        },
       },
       'win10-rel-no-external-ip': {
         'args': [
@@ -1125,6 +1133,11 @@
           '--disable-features=WebRTC-H264WithOpenH264FFmpeg',
           '--test-launcher-filter-file=../../testing/buildbot/filters/win.win-rel-cft.browser_tests.filter',
         ],
+        'swarming': {
+          # This is for slow test execution that often becomes a critical path of
+          # swarming jobs. crbug.com/868114
+          'shards': 15,
+        }
       },
       'win10-rel-no-external-ip': {
         # crbug.com/868082
@@ -1487,6 +1500,10 @@
         # TODO(crbug.com/1369158): Fix & re-enable.
         'isolate_profile_data': False,
       },
+      'win-rel-cft': {
+        # TODO(crbug.com/1369158): Fix & re-enable.
+        'isolate_profile_data': False,
+      },
     },
     'remove_from': [
       # Timeout happens sometimes (crbug.com/951799).
@@ -1577,6 +1594,11 @@
           'shards': 2,
         },
       },
+      'win-rel-cft': {
+        'swarming': {
+          'inverse_quickrun_shards': 2,
+        },
+      },
     },
   },
   'compositor_unittests': {
@@ -1819,6 +1841,15 @@
           ],
         },
       },
+      'win-rel-cft': {
+        # crbug.com/868082
+        'args': [
+          '--disable-features=WebRTC-H264WithOpenH264FFmpeg',
+        ],
+        'swarming': {
+          'quickrun_shards': 18,
+        },
+      },
       'win10-rel-no-external-ip': {
         # crbug.com/868082
         'args': [
@@ -2537,6 +2568,9 @@
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/win.win-rel-cft.interactive_ui_tests.filter',
         ],
+        'swarming': {
+          'shards': 9,
+        },
       },
     },
   },
@@ -3326,6 +3360,11 @@
           '--coverage-continuous-mode=1',
         ],
       },
+      'win-rel-cft': {
+        'swarming': {
+          'shards': 3,
+        },
+      },
     },
   },
   'system_webview_wpt': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index e1dd2fc..7d77f6a 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -1456,7 +1456,7 @@
               'cores': '8',
             },
           ],
-          'shards': 2,
+          'shards': 8,
         },
       },
       'content_browsertests': {
@@ -1466,6 +1466,7 @@
               'cores': '8',
             },
           ],
+          'shards': 5,
         },
       },
       'content_unittests': {
@@ -1484,6 +1485,7 @@
               'cores': '8',
             },
           ],
+          'shards': 3,
         },
       },
       'net_unittests': {
@@ -2248,7 +2250,29 @@
           '--disable-field-trial-config',
         ],
         'test': 'android_browsertests',
-      }
+      },
+      'webview_cts_tests_no_field_trial': {
+        'args': [
+          '--disable-field-trial-config',
+        ],
+        'swarming': {
+          'shards': 2,
+          'cipd_packages': [
+            {
+              "cipd_package": 'chromium/android_webview/tools/cts_archive',
+              'location': 'android_webview/tools/cts_archive',
+              'revision': 'C4m9-gZKvvtS0-KQ9cMRi6wEfZH_TeWSiXEgsgtGtsMC',
+            }
+          ]
+        },
+        'test': 'webview_cts_tests',
+      },
+      'webview_ui_test_app_test_apk_no_field_trial': {
+        'args': [
+          '--disable-field-trial-config',
+        ],
+        'test': 'webview_ui_test_app_test_apk',
+      },
     },
     'fieldtrial_browser_tests': {
       'browser_tests_no_field_trial': {
diff --git a/testing/buildbot/tryserver.blink.json b/testing/buildbot/tryserver.blink.json
index c50edb6..ca4c5b9 100644
--- a/testing/buildbot/tryserver.blink.json
+++ b/testing/buildbot/tryserver.blink.json
@@ -880,7 +880,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "hard_timeout": 2400,
@@ -917,7 +917,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "os": "Windows-10-19042|Windows-10-19045"
+              "os": "Windows-10-19045"
             }
           ],
           "hard_timeout": 2400,
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index fca7040..6edc80db 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1288,7 +1288,7 @@
         },
       },
 
-      # Mirrors Win x64 Builder and Win10 Tests x64.
+      # Mirrors "Win x64 Builder" and "Win10 Tests x64".
       'win-rel-cft': {
         'mixins': [
           'x86-64',
diff --git a/testing/unexpected_passes_common/argument_parsing.py b/testing/unexpected_passes_common/argument_parsing.py
index 86a2bc63..38315fd 100644
--- a/testing/unexpected_passes_common/argument_parsing.py
+++ b/testing/unexpected_passes_common/argument_parsing.py
@@ -37,20 +37,12 @@
                       default=False,
                       help='Automatically remove any expectations that are '
                       'determined to be stale from the expectation file.')
-  semi_stale_group = parser.add_mutually_exclusive_group()
-  semi_stale_group.add_argument(
-      '--modify-semi-stale-expectations',
-      action='store_true',
-      default=False,
-      help='If any semi-stale expectations are found, '
-      'prompt the user about the modification of '
-      'each one.')
-  semi_stale_group.add_argument('--narrow-semi-stale-expectation-scope',
-                                action='store_true',
-                                default=False,
-                                help='Automatically modify or split semi-stale '
-                                'expectations so they only apply to '
-                                'configurations that actually need them.')
+  parser.add_argument('--narrow-semi-stale-expectation-scope',
+                      action='store_true',
+                      default=False,
+                      help='Automatically modify or split semi-stale '
+                      'expectations so they only apply to configurations that '
+                      'actually need them.')
   parser.add_argument('-v',
                       '--verbose',
                       action='count',
diff --git a/testing/unexpected_passes_common/expectations.py b/testing/unexpected_passes_common/expectations.py
index 6b8c910d..93a86a6 100644
--- a/testing/unexpected_passes_common/expectations.py
+++ b/testing/unexpected_passes_common/expectations.py
@@ -81,7 +81,6 @@
 GIT_BLAME_REGEX = re.compile(
     r'^[\w\s]+\(.+(?P<date>\d\d\d\d-\d\d-\d\d)[^\)]+\)(?P<content>.*)$',
     re.DOTALL)
-EXPECTATION_LINE_REGEX = re.compile(r'^.*\[ .* \] .* \[ \w* \].*$', re.DOTALL)
 TAG_GROUP_REGEX = re.compile(r'# tags: \[([^\]]*)\]', re.MULTILINE | re.DOTALL)
 # Looks for cases of the group start and end comments with nothing but optional
 # whitespace between them.
@@ -217,7 +216,12 @@
       assert match
       date = match.groupdict()['date']
       line_content = match.groupdict()['content']
-      if EXPECTATION_LINE_REGEX.match(line):
+      stripped_line_content = line_content.strip()
+      # Auto-add comments and blank space, otherwise only add if the grace
+      # period has expired.
+      if not stripped_line_content or stripped_line_content.startswith('#'):
+        content += line_content
+      else:
         if six.PY2:
           date_parts = date.split('-')
           date = datetime.date(year=int(date_parts[0]),
@@ -231,8 +235,6 @@
         else:
           logging.debug('Omitting expectation %s because it is too new',
                         line_content.rstrip())
-      else:
-        content += line_content
     return content
 
   def RemoveExpectationsFromFile(self,
@@ -554,75 +556,6 @@
     """
     return typ_tags
 
-  def ModifySemiStaleExpectations(
-      self, stale_expectation_map: data_types.TestExpectationMap) -> Set[str]:
-    """Modifies lines from |stale_expectation_map| in |expectation_file|.
-
-    Prompts the user for each modification and provides debug information since
-    semi-stale expectations cannot be blindly removed like fully stale ones.
-
-    Args:
-      stale_expectation_map: A data_types.TestExpectationMap containing
-          semi-stale expectations.
-
-    Returns:
-      A set of strings containing URLs of bugs associated with the modified
-      (manually modified by the user or removed by the script) expectations.
-    """
-    expectations_to_remove = []
-    expectations_to_modify = []
-    modified_urls = set()
-    for expectation_file, e, builder_map in (
-        stale_expectation_map.IterBuilderStepMaps()):
-      with open(expectation_file) as infile:
-        file_contents = infile.read()
-      line, line_number = self._GetExpectationLine(e, file_contents,
-                                                   expectation_file)
-      expectation_str = None
-      if not line:
-        logging.error(
-            'Could not find line corresponding to semi-stale expectation for '
-            '%s with tags %s and expected results %s', e.test, e.tags,
-            e.expected_results)
-        expectation_str = '[ %s ] %s [ %s ]' % (' '.join(
-            e.tags), e.test, ' '.join(e.expected_results))
-      else:
-        expectation_str = '%s (approx. line %d)' % (line, line_number)
-
-      str_dict = result_output.ConvertBuilderMapToPassOrderedStringDict(
-          builder_map)
-      print('\nSemi-stale expectation:\n%s' % expectation_str)
-      result_output.RecursivePrintToFile(str_dict, 1, sys.stdout)
-
-      response = _WaitForUserInputOnModification()
-      if response == 'r':
-        expectations_to_remove.append(e)
-      elif response == 'm':
-        expectations_to_modify.append(e)
-
-      # It's possible that the user will introduce a typo while manually
-      # modifying an expectation, which will cause a parser error. Catch that
-      # now and give them chances to fix it so that they don't lose all of their
-      # work due to an early exit.
-      while True:
-        try:
-          with open(expectation_file) as infile:
-            file_contents = infile.read()
-          _ = expectations_parser.TaggedTestListParser(file_contents)
-          break
-        except expectations_parser.ParseError as error:
-          logging.error('Got parser error: %s', error)
-          logging.error(
-              'This probably means you introduced a typo, please fix it.')
-          _WaitForAnyUserInput()
-
-      modified_urls |= self.RemoveExpectationsFromFile(expectations_to_remove,
-                                                       expectation_file,
-                                                       RemovalType.STALE)
-    for e in expectations_to_modify:
-      modified_urls |= set(e.bug.split())
-    return modified_urls
-
   def NarrowSemiStaleExpectationScope(
       self, stale_expectation_map: data_types.TestExpectationMap) -> Set[str]:
     """Narrows the scope of expectations in |stale_expectation_map|.
@@ -843,33 +776,6 @@
     raise NotImplementedError()
 
 
-def _WaitForAnyUserInput() -> None:
-  """Waits for any user input.
-
-  Split out for testing purposes.
-  """
-  _get_input('Press any key to continue')
-
-
-def _WaitForUserInputOnModification() -> str:
-  """Waits for user input on how to modify a semi-stale expectation.
-
-  Returns:
-    One of the following string values:
-      i - Expectation should be ignored and left alone.
-      m - Expectation will be manually modified by the user.
-      r - Expectation should be removed by the script.
-  """
-  valid_inputs = ['i', 'm', 'r']
-  prompt = ('How should this expectation be handled? (i)gnore/(m)anually '
-            'modify/(r)emove: ')
-  response = _get_input(prompt).lower()
-  while response not in valid_inputs:
-    print('Invalid input, valid inputs are %s' % (', '.join(valid_inputs)))
-    response = _get_input(prompt).lower()
-  return response
-
-
 def _LineContainsGroupStartComment(line: str) -> bool:
   return FINDER_GROUP_COMMENT_START in line
 
@@ -1007,9 +913,3 @@
     content = content.replace(match, '')
 
   return content
-
-
-def _get_input(prompt: str) -> str:
-  if sys.version_info[0] == 2:
-    return raw_input(prompt)
-  return input(prompt)
diff --git a/testing/unexpected_passes_common/expectations_unittest.py b/testing/unexpected_passes_common/expectations_unittest.py
index 55ccc0a..b9cec94 100755
--- a/testing/unexpected_passes_common/expectations_unittest.py
+++ b/testing/unexpected_passes_common/expectations_unittest.py
@@ -184,7 +184,9 @@
 5f03bc04975c04 (Some R. Author    {today_date} 00:00:00 +0000  4)
 5f03bc04975c04 (Some R. Author    {today_date} 00:00:00 +0000  5)crbug.com/1234 [ tag1 ] testname [ Failure ]
 98637cd80f8c15 (Some R. Author    {yesterday_date} 00:00:00 +0000  6)[ tag2 ] testname [ Failure ] # Comment
-3fcadac9d861d0 (Some R. Author    {older_date} 00:00:00 +0000  7)[ tag1 ] othertest [ Failure ]"""
+3fcadac9d861d0 (Some R. Author    {older_date} 00:00:00 +0000  7)[ tag1 ] othertest [ Failure ]
+5f03bc04975c04 (Some R. Author    {today_date} 00:00:00 +0000  8)crbug.com/2345 testname [ Failure ]
+3fcadac9d861d0 (Some R. Author    {older_date} 00:00:00 +0000  9)crbug.com/3456 othertest [ Failure ]"""
     # pylint: enable=line-too-long
     blame_output = blame_output.format(today_date=today_str,
                                        yesterday_date=yesterday_str,
@@ -196,7 +198,8 @@
 # tags: [ tag2 ]
 # results: [ Failure ]
 
-[ tag1 ] othertest [ Failure ]"""
+[ tag1 ] othertest [ Failure ]
+crbug.com/3456 othertest [ Failure ]"""
     self.assertEqual(self.instance._GetNonRecentExpectationContent('', 1),
                      expected_content)
 
@@ -1101,183 +1104,6 @@
     self.assertEqual(filtered_tags, set(['win10', 'nvidia', 'release']))
 
 
-class ModifySemiStaleExpectationsUnittest(fake_filesystem_unittest.TestCase):
-  def setUp(self) -> None:
-    self.setUpPyfakefs()
-    self.instance = uu.CreateGenericExpectations()
-
-    self._input_patcher = mock.patch.object(expectations,
-                                            '_WaitForUserInputOnModification')
-    self._input_mock = self._input_patcher.start()
-    self.addCleanup(self._input_patcher.stop)
-
-    with tempfile.NamedTemporaryFile(delete=False, mode='w') as f:
-      f.write(FAKE_EXPECTATION_FILE_CONTENTS)
-      self.filename = f.name
-    with tempfile.NamedTemporaryFile(delete=False, mode='w') as f:
-      f.write(SECONDARY_FAKE_EXPECTATION_FILE_CONTENTS)
-      self.secondary_filename = f.name
-
-  def testEmptyExpectationMap(self) -> None:
-    """Tests that an empty expectation map results in a no-op."""
-    modified_urls = self.instance.ModifySemiStaleExpectations(
-        data_types.TestExpectationMap())
-    self.assertEqual(modified_urls, set())
-    self._input_mock.assert_not_called()
-    with open(self.filename) as f:
-      self.assertEqual(f.read(), FAKE_EXPECTATION_FILE_CONTENTS)
-
-  def testRemoveExpectation(self) -> None:
-    """Tests that specifying to remove an expectation does so."""
-    self._input_mock.return_value = 'r'
-    # yapf: disable
-    test_expectation_map = data_types.TestExpectationMap({
-        self.filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/test', ['win'], 'Failure', 'crbug.com/1234'):
-            data_types.BuilderStepMap(),
-        }),
-        self.secondary_filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/test', ['mac'], 'Failure', 'crbug.com/4567'):
-            data_types.BuilderStepMap(),
-        }),
-    })
-    # yapf: enable
-    modified_urls = self.instance.ModifySemiStaleExpectations(
-        test_expectation_map)
-    self.assertEqual(modified_urls, set(['crbug.com/1234', 'crbug.com/4567']))
-    expected_file_contents = """\
-# tags: [ win linux ]
-# results: [ Failure RetryOnFailure Skip Pass ]
-crbug.com/5678 crbug.com/6789 [ win ] foo/another/test [ RetryOnFailure ]
-
-[ linux ] foo/test [ Failure ]
-
-crbug.com/2345 [ linux ] bar/* [ RetryOnFailure ]
-crbug.com/3456 [ linux ] some/bad/test [ Skip ]
-crbug.com/4567 [ linux ] some/good/test [ Pass ]
-"""
-    with open(self.filename) as f:
-      self.assertEqual(f.read(), expected_file_contents)
-    expected_file_contents = """\
-# tags: [ mac ]
-# results: [ Failure ]
-
-"""
-    with open(self.secondary_filename) as f:
-      self.assertEqual(f.read(), expected_file_contents)
-
-  def testModifyExpectation(self) -> None:
-    """Tests that specifying to modify an expectation does not remove it."""
-    self._input_mock.return_value = 'm'
-    # yapf: disable
-    test_expectation_map = data_types.TestExpectationMap({
-        self.filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/test', ['win'], 'Failure', 'crbug.com/1234'):
-            data_types.BuilderStepMap(),
-        }),
-        self.secondary_filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/test', ['mac'], 'Failure', 'crbug.com/4567',
-            ): data_types.BuilderStepMap()
-        }),
-    })
-    # yapf: enable
-    modified_urls = self.instance.ModifySemiStaleExpectations(
-        test_expectation_map)
-    self.assertEqual(modified_urls, set(['crbug.com/1234', 'crbug.com/4567']))
-    with open(self.filename) as f:
-      self.assertEqual(f.read(), FAKE_EXPECTATION_FILE_CONTENTS)
-    with open(self.secondary_filename) as f:
-      self.assertEqual(f.read(), SECONDARY_FAKE_EXPECTATION_FILE_CONTENTS)
-
-  def testModifyExpectationMultipleBugs(self) -> None:
-    """Tests that modifying an expectation with multiple bugs works properly."""
-    self._input_mock.return_value = 'm'
-    # yapf: disable
-    test_expectation_map = data_types.TestExpectationMap({
-        self.filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/another/test', ['win'], 'RetryOnFailure',
-                'crbug.com/5678 crbug.com/6789'):
-            data_types.BuilderStepMap(),
-        }),
-    })
-    # yapf: enable
-    modified_urls = self.instance.ModifySemiStaleExpectations(
-        test_expectation_map)
-    self.assertEqual(modified_urls, set(['crbug.com/5678', 'crbug.com/6789']))
-    with open(self.filename) as f:
-      self.assertEqual(f.read(), FAKE_EXPECTATION_FILE_CONTENTS)
-    with open(self.secondary_filename) as f:
-      self.assertEqual(f.read(), SECONDARY_FAKE_EXPECTATION_FILE_CONTENTS)
-
-  def testIgnoreExpectation(self) -> None:
-    """Tests that specifying to ignore an expectation does nothing."""
-    self._input_mock.return_value = 'i'
-    # yapf: disable
-    test_expectation_map = data_types.TestExpectationMap({
-        self.filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/test', ['win'], 'Failure', 'crbug.com/1234'):
-            data_types.BuilderStepMap(),
-        }),
-        self.secondary_filename:
-        data_types.ExpectationBuilderMap({
-            data_types.Expectation(
-                'foo/test', ['mac'], 'Failure', 'crbug.com/4567',
-            ): data_types.BuilderStepMap()
-        }),
-    })
-    # yapf: enable
-    modified_urls = self.instance.ModifySemiStaleExpectations(
-        test_expectation_map)
-    self.assertEqual(modified_urls, set())
-    with open(self.filename) as f:
-      self.assertEqual(f.read(), FAKE_EXPECTATION_FILE_CONTENTS)
-    with open(self.secondary_filename) as f:
-      self.assertEqual(f.read(), SECONDARY_FAKE_EXPECTATION_FILE_CONTENTS)
-
-  def testParserErrorCorrection(self) -> None:
-    """Tests that parser errors are caught and users can fix them."""
-
-    def TypoSideEffect() -> str:
-      with open(self.filename, 'w') as outfile:
-        outfile.write(FAKE_EXPECTATION_FILE_CONTENTS_WITH_TYPO)
-      return 'm'
-
-    def CorrectionSideEffect() -> None:
-      with open(self.filename, 'w') as outfile:
-        outfile.write(FAKE_EXPECTATION_FILE_CONTENTS)
-
-    self._input_mock.side_effect = TypoSideEffect
-    with mock.patch.object(expectations,
-                           '_WaitForAnyUserInput') as any_input_mock:
-      any_input_mock.side_effect = CorrectionSideEffect
-      # yapf: disable
-      test_expectation_map = data_types.TestExpectationMap({
-          self.filename:
-          data_types.ExpectationBuilderMap({
-              data_types.Expectation(
-                  'foo/test', ['win'], 'Failure', 'crbug.com/1234'):
-              data_types.BuilderStepMap(),
-          }),
-      })
-      # yapf: enable
-      self.instance.ModifySemiStaleExpectations(test_expectation_map)
-      any_input_mock.assert_called_once()
-      with open(self.filename) as infile:
-        self.assertEqual(infile.read(), FAKE_EXPECTATION_FILE_CONTENTS)
-
-
 class NarrowSemiStaleExpectationScopeUnittest(fake_filesystem_unittest.TestCase
                                               ):
   def setUp(self) -> None:
diff --git a/testing/unexpected_passes_common/result_output.py b/testing/unexpected_passes_common/result_output.py
index b6a0b098a..0544094 100644
--- a/testing/unexpected_passes_common/result_output.py
+++ b/testing/unexpected_passes_common/result_output.py
@@ -236,7 +236,6 @@
 FullOrNeverPassStepValue = List[str]
 PartialPassStepValue = Dict[str, List[str]]
 PassStepValue = Union[FullOrNeverPassStepValue, PartialPassStepValue]
-OrderedPassStringDict = OrderedDict[str, Dict[str, PassStepValue]]
 
 UnmatchedResultsType = Dict[str, data_types.ResultListType]
 UnusedExpectation = Dict[str, List[data_types.Expectation]]
@@ -694,55 +693,3 @@
     output_str += AddBugTypeToOutputString(orphaned_urls, 'Fixed:')
 
   file_handle.write('Affected bugs for CL description:\n%s' % output_str)
-
-
-def ConvertBuilderMapToPassOrderedStringDict(
-    builder_map: data_types.BuilderStepMap) -> OrderedPassStringDict:
-  """Converts |builder_map| into an ordered dict split by pass type.
-
-  Args:
-    builder_map: A data_types.BuildStepMap.
-
-  Returns:
-    A collections.OrderedDict in the following format:
-    {
-      result_output.FULL_PASS: {
-        builder_name: [
-          step_name (total passes / total builds)
-        ],
-      },
-      result_output.NEVER_PASS: {
-        builder_name: [
-          step_name (total passes / total builds)
-        ],
-      },
-      result_output.PARTIAL_PASS: {
-        builder_name: {
-          step_name (total passes / total builds): [
-            failure links,
-          ],
-        },
-      },
-    }
-
-    The ordering and presence of the top level keys is guaranteed.
-  """
-  # This is similar to what we do in
-  # result_output._ConvertTestExpectationMapToStringDict, but we want the
-  # top-level grouping to be by pass type rather than by builder, so we can't
-  # re-use the code from there.
-  # Ordered dict used to ensure that order is guaranteed when printing out.
-  str_dict = collections.OrderedDict()
-  str_dict[FULL_PASS] = {}
-  str_dict[NEVER_PASS] = {}
-  str_dict[PARTIAL_PASS] = {}
-  for builder_name, step_name, stats in builder_map.IterBuildStats():
-    step_str = AddStatsToStr(step_name, stats)
-    if stats.did_fully_pass:
-      str_dict[FULL_PASS].setdefault(builder_name, []).append(step_str)
-    elif stats.did_never_pass:
-      str_dict[NEVER_PASS].setdefault(builder_name, []).append(step_str)
-    else:
-      str_dict[PARTIAL_PASS].setdefault(builder_name, {})[step_str] = list(
-          stats.failure_links)
-  return str_dict
diff --git a/testing/unexpected_passes_common/result_output_unittest.py b/testing/unexpected_passes_common/result_output_unittest.py
index 5c4f738..6e62e8e 100755
--- a/testing/unexpected_passes_common/result_output_unittest.py
+++ b/testing/unexpected_passes_common/result_output_unittest.py
@@ -765,73 +765,6 @@
                                   'Fixed: 1, 2\n'))
 
 
-class ConvertBuilderMapToPassOrderedStringDictUnittest(unittest.TestCase):
-  def testEmptyInput(self) -> None:
-    """Tests that an empty input doesn't cause breakage."""
-    output = result_output.ConvertBuilderMapToPassOrderedStringDict(
-        data_types.BuilderStepMap())
-    expected_output = collections.OrderedDict()
-    expected_output[result_output.FULL_PASS] = {}
-    expected_output[result_output.NEVER_PASS] = {}
-    expected_output[result_output.PARTIAL_PASS] = {}
-    self.assertEqual(output, expected_output)
-
-  def testBasic(self) -> None:
-    """Tests that a map is properly converted."""
-    builder_map = data_types.BuilderStepMap({
-        'fully pass':
-        data_types.StepBuildStatsMap({
-            'step1': uu.CreateStatsWithPassFails(1, 0),
-        }),
-        'never pass':
-        data_types.StepBuildStatsMap({
-            'step3': uu.CreateStatsWithPassFails(0, 1),
-        }),
-        'partial pass':
-        data_types.StepBuildStatsMap({
-            'step5': uu.CreateStatsWithPassFails(1, 1),
-        }),
-        'mixed':
-        data_types.StepBuildStatsMap({
-            'step7': uu.CreateStatsWithPassFails(1, 0),
-            'step8': uu.CreateStatsWithPassFails(0, 1),
-            'step9': uu.CreateStatsWithPassFails(1, 1),
-        }),
-    })
-    output = result_output.ConvertBuilderMapToPassOrderedStringDict(builder_map)
-
-    expected_output = collections.OrderedDict()
-    expected_output[result_output.FULL_PASS] = {
-        'fully pass': [
-            'step1 (1/1 passed)',
-        ],
-        'mixed': [
-            'step7 (1/1 passed)',
-        ],
-    }
-    expected_output[result_output.NEVER_PASS] = {
-        'never pass': [
-            'step3 (0/1 passed)',
-        ],
-        'mixed': [
-            'step8 (0/1 passed)',
-        ],
-    }
-    expected_output[result_output.PARTIAL_PASS] = {
-        'partial pass': {
-            'step5 (1/2 passed)': [
-                'http://ci.chromium.org/b/build_id0',
-            ],
-        },
-        'mixed': {
-            'step9 (1/2 passed)': [
-                'http://ci.chromium.org/b/build_id0',
-            ],
-        },
-    }
-    self.assertEqual(output, expected_output)
-
-
 def _Dedent(s: str) -> str:
   output = ''
   for line in s.splitlines(True):
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 8294b2e..a223d3f 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -8814,7 +8814,8 @@
             "platforms": [
                 "android",
                 "chromeos",
-                "fuchsia",
+                "chromeos_lacros",
+                "ios",
                 "linux",
                 "mac",
                 "windows"
@@ -11860,6 +11861,21 @@
             ]
         }
     ],
+    "UseSimplifiedMessagePumpKqueueLoop": [
+        {
+            "platforms": [
+                "mac"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "UseSimplifiedMessagePumpKqueueLoop"
+                    ]
+                }
+            ]
+        }
+    ],
     "UseSnappyForParkableStrings": [
         {
             "platforms": [
diff --git a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
index 3d91f59..6d80953b 100644
--- a/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
+++ b/third_party/blink/renderer/core/html/canvas/canvas_async_blob_creator.cc
@@ -182,6 +182,9 @@
   DCHECK(image);
   image_ = image->MakeUnaccelerated();
 
+  DCHECK(image_);
+  DCHECK(!image_->IsTextureBacked());
+
   sk_sp<SkImage> skia_image =
       image_->PaintImageForCurrentFrame().GetSwSkImage();
   DCHECK(skia_image);
diff --git a/third_party/blink/renderer/core/html/parser/html_construction_site.cc b/third_party/blink/renderer/core/html/parser/html_construction_site.cc
index 0d2b0a2..0e7d87ba 100644
--- a/third_party/blink/renderer/core/html/parser/html_construction_site.cc
+++ b/third_party/blink/renderer/core/html/parser/html_construction_site.cc
@@ -172,7 +172,8 @@
                                                 RecomputeMode recompute_mode) {
   switch (whitespace_mode) {
     case WhitespaceMode::kNewlineThenWhitespace:
-      DCHECK(WTF::NewlineThenWhitespaceStringsTable::IsCommon(string));
+      DCHECK(WTF::NewlineThenWhitespaceStringsTable::IsNewlineThenWhitespaces(
+          string));
       if (string.length() <
           WTF::NewlineThenWhitespaceStringsTable::kTableSize) {
         return WTF::NewlineThenWhitespaceStringsTable::GetStringForLength(
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
index 2ccf1569..3b1d0eac 100644
--- a/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
+++ b/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
@@ -223,9 +223,13 @@
     unsigned length = 0;
     for (unsigned i = start; i < end_; ++i) {
       const UChar ch = (*characters_)[i];
-      if (ch == '\n' && length == 0) {
-        ++length;
-        continue;
+      if (length == 0) {
+        if (ch == '\n') {
+          ++length;
+          continue;
+        }
+        // Otherwise, it's a random whitespace string. Drop the mode.
+        whitespace_mode = WhitespaceMode::kAllWhitespace;
       }
 
       if (ch == ' ') {
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index 94843c3..414e305 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -212,12 +212,16 @@
     max_state_stack_depth_ =
         std::max(state_stack_.size(), max_state_stack_depth_);
 
-    cc::PaintFlags extra_flags;
-    extra_flags.setAlphaf(static_cast<float>(globalAlpha()));
-    if (GetState().ShouldDrawShadows())
+    if (GetState().ShouldDrawShadows()) {
+      cc::PaintFlags extra_flags;
+      extra_flags.setAlphaf(static_cast<float>(globalAlpha()));
       extra_flags.setImageFilter(StateGetFilter());
-    canvas->saveLayer(extra_flags);
-  } else {
+      canvas->saveLayer(extra_flags);
+    } else {
+      canvas->saveLayerAlphaf(globalAlpha());
+    }
+  } else if (StateHasFilter() || GetState().ShouldDrawShadows() ||
+             GetState().GlobalComposite() != SkBlendMode::kSrcOver) {
     cc::PaintFlags flags;
     flags.setBlendMode(GetState().GlobalComposite());
     // This ComposePaintFilter will work always, whether there is only
@@ -226,6 +230,8 @@
         GetState().ShadowAndForegroundImageFilter(), StateGetFilter()));
     flags.setAlphaf(static_cast<float>(globalAlpha()));
     canvas->saveLayer(flags);
+  } else {
+    canvas->saveLayerAlphaf(globalAlpha());
   }
 
   ValidateStateStack();
diff --git a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc
index 77c17c6..c7bf89c1 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc
@@ -152,11 +152,14 @@
   DCHECK(!RuntimeEnabledFeatures::FedCmMultipleIdentityProvidersEnabled(
       execution_context_));
 
-  // Checking if document load is completed is equivalent to checking if
-  // this method was called during or after the window.onload event. If document
-  // load is completed, there is no delay caused by window onload and hence, the
-  // early return.
-  if (resolver->DomWindow()->document()->IsLoadCompleted()) {
+  bool is_after_window_onload =
+      resolver->DomWindow()->document()->IsLoadCompleted();
+  UMA_HISTOGRAM_BOOLEAN("Blink.FedCm.IsAfterWindowOnload",
+                        is_after_window_onload);
+
+  // If this method is called after window onload, there will not be any delay
+  // caused by window onload so we do not record any metrics for it.
+  if (is_after_window_onload) {
     return;
   }
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester_test.cc b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester_test.cc
index e617db9f..1a2dbfa8 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester_test.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester_test.cc
@@ -29,6 +29,8 @@
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   WebIdentityRequester* web_identity_requester =
       MakeGarbageCollected<WebIdentityRequester>(WrapPersistent(context));
+
+  // Start window onload delay timer before the window onload event.
   web_identity_requester->StartWindowOnloadDelayTimer(WrapPersistent(resolver));
 
   // Before the window onload event is fired, the histogram should not have been
@@ -43,6 +45,8 @@
   base::RunLoop().RunUntilIdle();
   histogram_tester.ExpectTotalCount(
       "Blink.FedCm.Timing.WindowOnloadDelayDuration", 1);
+  histogram_tester.ExpectUniqueSample("Blink.FedCm.IsAfterWindowOnload", false,
+                                      1);
 }
 
 // Test that the window onload delay duration is NOT recorded when timer is
@@ -68,6 +72,8 @@
   base::RunLoop().RunUntilIdle();
   histogram_tester.ExpectTotalCount(
       "Blink.FedCm.Timing.WindowOnloadDelayDuration", 0);
+  histogram_tester.ExpectUniqueSample("Blink.FedCm.IsAfterWindowOnload", true,
+                                      1);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
index 083e8e25..a0617ca 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
@@ -56,7 +56,7 @@
       return VideoTrackRecorder::CodecId::kVp8;
     case media::VideoCodec::kVP9:
       return VideoTrackRecorder::CodecId::kVp9;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
     case media::VideoCodec::kH264:
       return VideoTrackRecorder::CodecId::kH264;
 #endif
@@ -73,7 +73,7 @@
       return media::VideoCodec::kVP8;
     case VideoTrackRecorder::CodecId::kVp9:
       return media::VideoCodec::kVP9;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
     case VideoTrackRecorder::CodecId::kH264:
       return media::VideoCodec::kH264;
 #endif
@@ -111,7 +111,7 @@
     codec_id = VideoTrackRecorder::CodecId::kVp8;
   if (codecs_str.Find("vp9") != kNotFound)
     codec_id = VideoTrackRecorder::CodecId::kVp9;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
   if (codecs_str.Find("h264") != kNotFound)
     codec_id = VideoTrackRecorder::CodecId::kH264;
   wtf_size_t avc1_start = codecs_str.Find("avc1");
@@ -165,7 +165,7 @@
   static const char* const kVideoCodecs[] = {
     "vp8",
     "vp9",
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
     "h264",
     "avc1",
 #endif
@@ -317,10 +317,13 @@
       const VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb =
           media::BindToCurrentLoop(WTF::BindRepeating(
               &MediaRecorderHandler::OnEncodedVideo, WrapWeakPersistent(this)));
+      auto on_video_error_cb = media::BindToCurrentLoop(
+          WTF::BindOnce(&MediaRecorderHandler::OnVideoEncodingError,
+                        WrapWeakPersistent(this)));
       video_recorders_.emplace_back(std::make_unique<VideoTrackRecorderImpl>(
           video_codec_profile_, video_tracks_[0],
           std::move(on_encoded_video_cb), std::move(on_track_source_changed_cb),
-          video_bits_per_second_));
+          std::move(on_video_error_cb), video_bits_per_second_));
     }
   }
 
@@ -354,6 +357,9 @@
   DCHECK(IsMainThread());
   // Don't check |recording_| since we can go directly from pause() to stop().
 
+  // TODO(crbug.com/719023): The video recorder needs to be flushed to retrieve
+  // the last N frames with some codecs.
+
   // Ensure any stored data inside the muxer is flushed out before invalidation.
   muxer_ = nullptr;
   invalidated_ = true;
@@ -460,7 +466,7 @@
       case VideoTrackRecorder::CodecId::kVp9:
         mime_type.Append("video/webm;codecs=");
         break;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
       case VideoTrackRecorder::CodecId::kH264:
         mime_type.Append("video/x-matroska;codecs=");
         break;
@@ -478,7 +484,7 @@
       case VideoTrackRecorder::CodecId::kVp9:
         mime_type.Append("vp9");
         break;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
       case VideoTrackRecorder::CodecId::kH264:
         mime_type.Append("avc1");
         if (video_codec_profile_.profile && video_codec_profile_.level) {
@@ -725,4 +731,10 @@
   visitor->Trace(recorder_);
 }
 
+void MediaRecorderHandler::OnVideoEncodingError() {
+  if (recorder_) {
+    recorder_->OnError("Video encoding failed.");
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
index 4ea224e..5527720 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
@@ -127,6 +127,8 @@
   void UpdateTrackLiveAndEnabled(const MediaStreamComponent& track,
                                  bool is_video);
 
+  void OnVideoEncodingError();
+
   // Set to true if there is no MIME type configured upon Initialize()
   // and the video track's source supports encoded output, giving
   // this class the freedom to provide whatever it chooses to produce.
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
index 8128e327..a200e60e 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
@@ -75,7 +75,7 @@
 static const MediaRecorderTestParams kMediaRecorderTestParams[] = {
     {true, false, "video/webm", "vp8", true},
     {true, false, "video/webm", "vp9", true},
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
     {true, false, "video/x-matroska", "avc1", false},
 #endif
     {false, true, "audio/webm", "opus", true},
@@ -215,6 +215,16 @@
   MediaRecorderHandlerTest()
       : MediaRecorderHandlerFixture(GetParam().has_video,
                                     GetParam().has_audio) {}
+
+  bool IsCodecSupported() {
+#if !BUILDFLAG(RTC_USE_H264)
+    // Test requires OpenH264 encoder. It can't use the VEA encoder.
+    if (std::string(GetParam().codecs) == "avc1") {
+      return false;
+    }
+#endif
+    return true;
+  }
 };
 
 // Checks that canSupportMimeType() works as expected, by sending supported
@@ -240,7 +250,7 @@
   EXPECT_TRUE(media_recorder_handler_->CanSupportMimeType(
       mime_type_video, example_good_codecs_3));
   const String example_good_codecs_4("H264");
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
   EXPECT_TRUE(media_recorder_handler_->CanSupportMimeType(
       mime_type_video, example_good_codecs_4));
 #else
@@ -322,8 +332,9 @@
 // contained encoded data in writeData().
 TEST_P(MediaRecorderHandlerTest, EncodeVideoFrames) {
   // Video-only test.
-  if (GetParam().has_audio)
+  if (GetParam().has_audio || !IsCodecSupported()) {
     return;
+  }
 
   AddTracks();
 
@@ -467,8 +478,9 @@
 // Starts up recording and forces a WebmMuxer's libwebm error.
 TEST_P(MediaRecorderHandlerTest, WebmMuxerErrorWhileEncoding) {
   // Video-only test: Audio would be very similar.
-  if (GetParam().has_audio)
+  if (GetParam().has_audio || !IsCodecSupported()) {
     return;
+  }
 
   AddTracks();
 
@@ -698,7 +710,7 @@
   media_recorder_handler_ = nullptr;
 }
 
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
 
 struct H264ProfileTestParams {
   const bool has_audio;
@@ -763,7 +775,7 @@
     kMediaRecorderPassthroughTestParams[] = {
         {"video/webm;codecs=vp8", media::VideoCodec::kVP8},
         {"video/webm;codecs=vp9", media::VideoCodec::kVP9},
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
         {"video/x-matroska;codecs=avc1", media::VideoCodec::kH264},
 #endif
 };
diff --git a/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc b/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc
index 9310aa0e..e7dba6e 100644
--- a/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/vea_encoder.cc
@@ -67,8 +67,6 @@
       force_next_frame_to_be_keyframe_(false),
       on_error_cb_(on_error_cb) {
   DCHECK(gpu_factories_);
-  DCHECK_GE(size.width(), kVEAEncoderMinResolutionWidth);
-  DCHECK_GE(size.height(), kVEAEncoderMinResolutionHeight);
 }
 
 VEAEncoder::~VEAEncoder() {
@@ -114,9 +112,13 @@
       output_buffer->mapping.GetMemoryAsSpan<char>(metadata.payload_size_bytes);
   std::string data(data_span.begin(), data_span.end());
 
-  const auto front_frame = frames_in_encode_.front();
+  auto front_frame = frames_in_encode_.front();
   frames_in_encode_.pop();
 
+  if (metadata.encoded_size) {
+    front_frame.first.visible_rect_size = *metadata.encoded_size;
+  }
+
   on_encoded_video_cb_.Run(front_frame.first, std::move(data), std::string(),
                            front_frame.second, metadata.key_frame);
 
@@ -151,8 +153,11 @@
   TRACE_EVENT0("media", "VEAEncoder::EncodeFrame");
   DVLOG(3) << __func__;
 
-  if (input_visible_size_ != frame->visible_rect().size() && video_encoder_)
+  if (input_visible_size_ != frame->visible_rect().size() && video_encoder_) {
+    // TODO(crbug.com/719023): This is incorrect. Flush() should instead be
+    // called to ensure submitted outputs are retrieved first.
     video_encoder_.reset();
+  }
 
   if (!video_encoder_) {
     bool use_native_input =
@@ -161,7 +166,7 @@
   }
 
   if (error_notified_) {
-    DVLOG(3) << "An error occurred in VEA encoder";
+    DLOG(ERROR) << "An error occurred in VEA encoder";
     return;
   }
 
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
index 6ada2b9..c2c49cf 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
@@ -111,7 +111,7 @@
 } kPreferredCodecIdAndVEAProfiles[] = {
     {CodecId::kVp8, media::VP8PROFILE_MIN, media::VP8PROFILE_MAX},
     {CodecId::kVp9, media::VP9PROFILE_MIN, media::VP9PROFILE_MAX},
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
     {CodecId::kH264, media::H264PROFILE_MIN, media::H264PROFILE_MAX}
 #endif
 };
@@ -130,7 +130,7 @@
 
 void NotifyEncoderSupportKnown(base::OnceClosure callback) {
   if (!Platform::Current()) {
-    DVLOG(2) << "Couldn't access the render thread";
+    DLOG(ERROR) << "Couldn't access the render thread";
     std::move(callback).Run();
     return;
   }
@@ -138,7 +138,7 @@
   media::GpuVideoAcceleratorFactories* const gpu_factories =
       Platform::Current()->GetGpuFactories();
   if (!gpu_factories || !gpu_factories->IsGpuVideoEncodeAcceleratorEnabled()) {
-    DVLOG(2) << "Couldn't initialize GpuVideoAcceleratorFactories";
+    DLOG(ERROR) << "Couldn't initialize GpuVideoAcceleratorFactories";
     std::move(callback).Run();
     return;
   }
@@ -149,14 +149,14 @@
 // Obtains video encode accelerator's supported profiles.
 media::VideoEncodeAccelerator::SupportedProfiles GetVEASupportedProfiles() {
   if (!Platform::Current()) {
-    DVLOG(2) << "Couldn't access the render thread";
+    DLOG(ERROR) << "Couldn't access the render thread";
     return media::VideoEncodeAccelerator::SupportedProfiles();
   }
 
   media::GpuVideoAcceleratorFactories* const gpu_factories =
       Platform::Current()->GetGpuFactories();
   if (!gpu_factories || !gpu_factories->IsGpuVideoEncodeAcceleratorEnabled()) {
-    DVLOG(2) << "Couldn't initialize GpuVideoAcceleratorFactories";
+    DLOG(ERROR) << "Couldn't initialize GpuVideoAcceleratorFactories";
     return media::VideoEncodeAccelerator::SupportedProfiles();
   }
   return gpu_factories->GetVideoEncodeAcceleratorSupportedProfiles().value_or(
@@ -169,7 +169,7 @@
   return enumerator;
 }
 
-static void UmaHistogramForCodec(bool uses_acceleration, CodecId codec_id) {
+void UmaHistogramForCodec(bool uses_acceleration, CodecId codec_id) {
   int histogram_index = kUnknownHistogram;
   if (uses_acceleration) {
     switch (codec_id) {
@@ -179,7 +179,7 @@
       case CodecId::kVp9:
         histogram_index = kVp9HwHistogram;
         break;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
       case CodecId::kH264:
         histogram_index = kH264HwHistogram;
         break;
@@ -195,7 +195,7 @@
       case CodecId::kVp9:
         histogram_index = kVp9SwHistogram;
         break;
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
       case CodecId::kH264:
         histogram_index = kH264SwHistogram;
         break;
@@ -208,6 +208,14 @@
                             static_cast<int>(kLastHistogram));
 }
 
+bool MustUseVEA(CodecId codec_id) {
+#if BUILDFLAG(USE_PROPRIETARY_CODECS) && !BUILDFLAG(RTC_USE_H264)
+  return codec_id == CodecId::kH264;
+#else
+  return false;
+#endif
+}
+
 }  // anonymous namespace
 
 VideoTrackRecorder::VideoTrackRecorder(
@@ -234,13 +242,6 @@
         vea_supported_profiles) {
   for (const auto& supported_profile : vea_supported_profiles) {
     const media::VideoCodecProfile codec = supported_profile.profile;
-#if BUILDFLAG(IS_ANDROID)
-    // TODO(mcasas): enable other codecs, https://crbug.com/638664.
-    static_assert(media::VP8PROFILE_MAX + 1 == media::VP9PROFILE_MIN,
-                  "VP8 and VP9 VideoCodecProfiles should be contiguous");
-    if (codec < media::VP8PROFILE_MIN || codec > media::VP9PROFILE_MAX)
-      continue;
-#endif
     for (auto& codec_id_and_profile : kPreferredCodecIdAndVEAProfiles) {
       if (codec >= codec_id_and_profile.min_profile &&
           codec <= codec_id_and_profile.max_profile) {
@@ -576,34 +577,49 @@
                                                       size_t width,
                                                       size_t height,
                                                       double framerate) {
+  if (!MustUseVEA(codec)) {
+    if (width < kVEAEncoderMinResolutionWidth) {
+      return false;
+    }
+    if (height < kVEAEncoderMinResolutionHeight) {
+      return false;
+    }
+  }
+
   const auto profiles = GetCodecEnumerator()->GetSupportedProfiles(codec);
   if (profiles.empty())
     return false;
 
-  // Now we only consider the first profile.
-  // TODO(crbug.com/931035): Handle multiple profile cases.
-  const media::VideoEncodeAccelerator::SupportedProfile& profile = profiles[0];
+  for (const auto& profile : profiles) {
+    if (profile.profile == media::VIDEO_CODEC_PROFILE_UNKNOWN) {
+      return false;
+    }
 
-  if (profile.profile == media::VIDEO_CODEC_PROFILE_UNKNOWN)
-    return false;
+    const gfx::Size& min_resolution = profile.min_resolution;
+    DCHECK_GE(min_resolution.width(), 0);
+    const size_t min_width = static_cast<size_t>(min_resolution.width());
+    DCHECK_GE(min_resolution.height(), 0);
+    const size_t min_height = static_cast<size_t>(min_resolution.height());
 
-  const gfx::Size& min_resolution = profile.min_resolution;
-  const size_t min_width = static_cast<size_t>(
-      std::max(kVEAEncoderMinResolutionWidth, min_resolution.width()));
-  const size_t min_height = static_cast<size_t>(
-      std::max(kVEAEncoderMinResolutionHeight, min_resolution.height()));
+    const gfx::Size& max_resolution = profile.max_resolution;
+    DCHECK_GE(max_resolution.width(), 0);
+    const size_t max_width = static_cast<size_t>(max_resolution.width());
+    DCHECK_GE(max_resolution.height(), 0);
+    const size_t max_height = static_cast<size_t>(max_resolution.height());
 
-  const gfx::Size& max_resolution = profile.max_resolution;
-  DCHECK_GE(max_resolution.width(), 0);
-  const size_t max_width = static_cast<size_t>(max_resolution.width());
-  DCHECK_GE(max_resolution.height(), 0);
-  const size_t max_height = static_cast<size_t>(max_resolution.height());
+    const bool width_within_range = max_width >= width && width >= min_width;
+    const bool height_within_range =
+        max_height >= height && height >= min_height;
 
-  const bool width_within_range = max_width >= width && width >= min_width;
-  const bool height_within_range = max_height >= height && height >= min_height;
-  const bool valid_framerate = framerate * profile.max_framerate_denominator <=
-                               profile.max_framerate_numerator;
-  return width_within_range && height_within_range && valid_framerate;
+    const bool valid_framerate =
+        framerate * profile.max_framerate_denominator <=
+        profile.max_framerate_numerator;
+
+    if (width_within_range && height_within_range && valid_framerate) {
+      return true;
+    }
+  }
+  return false;
 }
 
 VideoTrackRecorderImpl::VideoTrackRecorderImpl(
@@ -611,10 +627,11 @@
     MediaStreamComponent* track,
     OnEncodedVideoCB on_encoded_video_cb,
     base::OnceClosure on_track_source_ended_cb,
+    base::OnceClosure on_error_cb,
     uint32_t bits_per_second)
     : VideoTrackRecorder(std::move(on_track_source_ended_cb)),
       track_(track),
-      should_pause_encoder_on_initialization_(false) {
+      on_error_cb_(std::move(on_error_cb)) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
   DCHECK(track_);
   DCHECK(track_->GetSourceType() == MediaStreamSource::kTypeVideo);
@@ -699,9 +716,26 @@
     bool allow_vea_encoder,
     scoped_refptr<media::VideoFrame> frame,
     base::TimeTicks capture_time) {
-  DVLOG(3) << __func__ << frame->visible_rect().size().ToString();
+  DVLOG(3) << __func__ << frame->AsHumanReadableString();
   DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
 
+  const gfx::Size& input_size = frame->visible_rect().size();
+  const bool can_use_vea = CanUseAcceleratedEncoder(
+      codec_profile.codec_id, input_size.width(), input_size.height());
+
+#if BUILDFLAG(USE_PROPRIETARY_CODECS) && !BUILDFLAG(RTC_USE_H264)
+  if (MustUseVEA(codec_profile.codec_id) &&
+      (!allow_vea_encoder || !can_use_vea)) {
+    // This should only happen if the H264 isn't supported by the VEA or an
+    // an error was thrown while using the VEA for encoding.
+    DLOG(ERROR) << "Can't use VEA, but must be able to use VEA...";
+    if (on_error_cb_) {
+      std::move(on_error_cb_).Run();
+    }
+    return;
+  }
+#endif
+
   // Avoid reinitializing |encoder_| when there are multiple frames sent to the
   // sink to initialize, https://crbug.com/698441.
   if (encoder_)
@@ -709,13 +743,10 @@
 
   DisconnectFromTrack();
 
-  const gfx::Size& input_size = frame->visible_rect().size();
   std::unique_ptr<Encoder> encoder;
   base::WeakPtr<Encoder> weak_encoder;
   scoped_refptr<base::SequencedTaskRunner> encoding_task_runner;
-  if (allow_vea_encoder &&
-      CanUseAcceleratedEncoder(codec_profile.codec_id, input_size.width(),
-                               input_size.height())) {
+  if (allow_vea_encoder && can_use_vea) {
     // TODO(b/227350897): remove once codec histogram is verified working
     UMA_HISTOGRAM_BOOLEAN("Media.MediaRecorder.VEAUsed", true);
     UmaHistogramForCodec(true, codec_profile.codec_id);
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h
index d6a3bc3..87a1c193 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h
@@ -59,7 +59,7 @@
   enum class CodecId {
     kVp8,
     kVp9,
-#if BUILDFLAG(RTC_USE_H264)
+#if BUILDFLAG(USE_PROPRIETARY_CODECS)
     kH264,
 #endif
     kLast
@@ -261,6 +261,7 @@
                          MediaStreamComponent* track,
                          OnEncodedVideoCB on_encoded_video_cb,
                          base::OnceClosure on_track_source_ended_cb,
+                         base::OnceClosure on_error_cb,
                          uint32_t bits_per_second);
 
   VideoTrackRecorderImpl(const VideoTrackRecorderImpl&) = delete;
@@ -312,7 +313,10 @@
       base::TimeTicks capture_time)>
       initialize_encoder_cb_;
 
-  bool should_pause_encoder_on_initialization_;
+  bool should_pause_encoder_on_initialization_ = false;
+
+  base::OnceClosure on_error_cb_;
+
   base::WeakPtrFactory<VideoTrackRecorderImpl> weak_factory_{this};
 };
 
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
index a33da97..7ab6ee5 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
@@ -81,6 +81,8 @@
       return media::VideoCodec::kVP8;
     case VideoTrackRecorder::CodecId::kVp9:
       return media::VideoCodec::kVP9;
+// Note: The H264 tests in this file are written explicitly for OpenH264 and
+// will fail for hardware encoders that aren't 1 in 1 out.
 #if BUILDFLAG(RTC_USE_H264)
     case VideoTrackRecorder::CodecId::kH264:
       return media::VideoCodec::kH264;
@@ -124,6 +126,12 @@
         .Times(testing::AnyNumber());
     EXPECT_CALL(*mock_source_, OnCapturingLinkSecured(_))
         .Times(testing::AnyNumber());
+    EXPECT_CALL(*mock_source_, GetCropVersion())
+        .Times(testing::AnyNumber())
+        .WillRepeatedly(Return(0));
+    EXPECT_CALL(*mock_source_, SetCanDiscardAlpha(_))
+        .Times(testing::AnyNumber());
+
     auto platform_track = std::make_unique<MediaStreamVideoTrack>(
         mock_source_, WebPlatformMediaStreamSource::ConstraintsOnceCallback(),
         true /* enabled */);
@@ -137,7 +145,9 @@
     EXPECT_TRUE(scheduler::GetSingleThreadTaskRunnerForTesting()
                     ->BelongsToCurrentThread());
 
-    ON_CALL(*platform_, GetGpuFactories()).WillByDefault(Return(nullptr));
+    EXPECT_CALL(*platform_, GetGpuFactories())
+        .Times(testing::AnyNumber())
+        .WillRepeatedly(Return(nullptr));
   }
 
   VideoTrackRecorderTest(const VideoTrackRecorderTest&) = delete;
@@ -163,6 +173,8 @@
         ConvertToBaseOnceCallback(CrossThreadBindOnce(
             &VideoTrackRecorderTest::OnSourceReadyStateEnded,
             CrossThreadUnretained(this))),
+        ConvertToBaseOnceCallback(CrossThreadBindOnce(
+            &VideoTrackRecorderTest::OnFailed, CrossThreadUnretained(this))),
         0u /* bits_per_second */);
   }
 
@@ -183,6 +195,7 @@
                                                   capture_time);
   }
 
+  void OnFailed() { FAIL(); }
   void OnError() { video_track_recorder_->OnError(); }
 
   bool CanEncodeAlphaChannel() {
diff --git a/third_party/blink/renderer/modules/webaudio/audio_context.cc b/third_party/blink/renderer/modules/webaudio/audio_context.cc
index 47804466..e577271 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_context.cc
@@ -494,11 +494,12 @@
 
   // Reject all pending resolvers for setSinkId() before closing AudioContext.
   for (auto& set_sink_id_resolver : set_sink_id_resolvers_) {
-    set_sink_id_resolver->RejectWithDOMException(
+    set_sink_id_resolver->Reject(MakeGarbageCollected<DOMException>(
         DOMExceptionCode::kInvalidStateError,
         "Cannot resolve pending promise from setSinkId(), AudioContext is "
-        "going away");
+        "going away"));
   }
+  set_sink_id_resolvers_.clear();
 }
 
 bool AudioContext::IsContextCleared() const {
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
index 3e39bf55..606d230 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -58,6 +58,14 @@
   texture_descriptor_.sampleCount = 1;
 }
 
+GPUCanvasContext::~GPUCanvasContext() {
+  // Perform destruction that's safe to do inside a GC (as in it doesn't touch
+  // other GC objects).
+  if (swap_buffers_) {
+    swap_buffers_->Neuter();
+  }
+}
+
 void GPUCanvasContext::Trace(Visitor* visitor) const {
   visitor->Trace(device_);
   visitor->Trace(texture_);
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
index 6e1cdb056..66d3446 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
@@ -51,6 +51,8 @@
   GPUCanvasContext(const GPUCanvasContext&) = delete;
   GPUCanvasContext& operator=(const GPUCanvasContext&) = delete;
 
+  ~GPUCanvasContext() override;
+
   void Trace(Visitor*) const override;
 
   // CanvasRenderingContext implementation
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc
index 5dce592..1d612d6 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_swap_buffer_provider.cc
@@ -122,8 +122,11 @@
     return;
   }
 
-  DCHECK(client_);
-  client_->OnTextureTransferred();
+  // The client's lifetime is independent of the swap buffers that can be kept
+  // alive longer due to pending shared image callbacks.
+  if (client_) {
+    client_->OnTextureTransferred();
+  }
 
   current_swap_buffer_->mailbox_texture->Dissociate();
   current_swap_buffer_->mailbox_texture = nullptr;
diff --git a/third_party/blink/renderer/platform/graphics/graphics_context.cc b/third_party/blink/renderer/platform/graphics/graphics_context.cc
index c603823..4b454464 100644
--- a/third_party/blink/renderer/platform/graphics/graphics_context.cc
+++ b/third_party/blink/renderer/platform/graphics/graphics_context.cc
@@ -268,7 +268,7 @@
 
 void GraphicsContext::BeginLayer(float opacity) {
   DCHECK(canvas_);
-  canvas_->saveLayerAlpha(static_cast<uint8_t>(opacity * 255));
+  canvas_->saveLayerAlphaf(opacity);
 
 #if DCHECK_IS_ON()
   ++layer_count_;
diff --git a/third_party/blink/renderer/platform/graphics/test/mock_paint_canvas.h b/third_party/blink/renderer/platform/graphics/test/mock_paint_canvas.h
index 2066bedb..c265f47d 100644
--- a/third_party/blink/renderer/platform/graphics/test/mock_paint_canvas.h
+++ b/third_party/blink/renderer/platform/graphics/test/mock_paint_canvas.h
@@ -29,8 +29,8 @@
   MOCK_METHOD1(saveLayer, int(const cc::PaintFlags& flags));
   MOCK_METHOD2(saveLayer,
                int(const SkRect& bounds, const cc::PaintFlags& flags));
-  MOCK_METHOD1(saveLayerAlpha, int(uint8_t alpha));
-  MOCK_METHOD2(saveLayerAlpha, int(const SkRect& bounds, uint8_t alpha));
+  MOCK_METHOD1(saveLayerAlphaf, int(float alpha));
+  MOCK_METHOD2(saveLayerAlphaf, int(const SkRect& bounds, float alpha));
   MOCK_METHOD0(restore, void());
   MOCK_CONST_METHOD0(getSaveCount, int());
   MOCK_METHOD1(restoreToCount, void(int save_count));
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
index 61742c0..a91336b4 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_adapter.cc
@@ -310,7 +310,7 @@
       ConvertToBaseRepeatingCallback(CrossThreadBindRepeating(
           &RTCVideoDecoderAdapter::Impl::OnOutput, weak_decoder_this_));
   video_decoder_->Initialize(
-      config, /*low_delay=*/false,
+      config, /*low_delay=*/true,
       /*cdm_context=*/nullptr,
       base::BindOnce(
           [](base::OnceCallback<void(bool)> cb,
diff --git a/third_party/blink/renderer/platform/wtf/text/string_statics.cc b/third_party/blink/renderer/platform/wtf/text/string_statics.cc
index c26ba77..843a24df 100644
--- a/third_party/blink/renderer/platform/wtf/text/string_statics.cc
+++ b/third_party/blink/renderer/platform/wtf/text/string_statics.cc
@@ -99,18 +99,22 @@
   }
 }
 
-bool NewlineThenWhitespaceStringsTable::IsCommon(const StringView& view) {
+bool NewlineThenWhitespaceStringsTable::IsNewlineThenWhitespaces(
+    const StringView& view) {
   if (view.empty()) {
     return false;
   }
-  if (!view.Is8Bit()) {
-    return false;
-  }
   if (view[0] != '\n') {
     return false;
   }
-  return std::all_of(view.Characters8() + 1, view.Characters8() + view.length(),
-                     [](LChar ch) { return ch == ' '; });
+  if (view.Is8Bit()) {
+    return std::all_of(view.Characters8() + 1,
+                       view.Characters8() + view.length(),
+                       [](LChar ch) { return ch == ' '; });
+  }
+  return std::all_of(view.Characters16() + 1,
+                     view.Characters16() + view.length(),
+                     [](UChar ch) { return ch == ' '; });
 }
 
 void StringStatics::Init() {
diff --git a/third_party/blink/renderer/platform/wtf/text/wtf_string.h b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
index dd942858..a7723248 100644
--- a/third_party/blink/renderer/platform/wtf/text/wtf_string.h
+++ b/third_party/blink/renderer/platform/wtf/text/wtf_string.h
@@ -695,7 +695,7 @@
     return g_table_[string_length];
   }
 
-  static bool IsCommon(const StringView& view);
+  static bool IsNewlineThenWhitespaces(const StringView& view);
 
  private:
   static const String (&g_table_)[kTableSize];
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
index 4ad6ca5..8338db7 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations.py
@@ -29,7 +29,6 @@
 import contextlib
 import json
 import logging
-import posixpath
 import optparse
 import re
 import traceback
@@ -326,13 +325,6 @@
     virtual_suites = port.virtual_test_suites()
     virtual_suites.sort(key=lambda s: s.full_prefix)
 
-    wpt_tests = set()
-    for wpt_dir in port.WPT_DIRS:
-        with contextlib.suppress(FileNotFoundError):
-            wpt_tests.update(
-                posixpath.join(wpt_dir, url)
-                for url in port.wpt_manifest(wpt_dir).all_urls())
-
     failures = []
     for suite in virtual_suites:
         suite_comps = suite.full_prefix.split(port.TEST_PATH_SEPARATOR)
@@ -360,7 +352,7 @@
                 continue
             base_comps = base.split(port.TEST_PATH_SEPARATOR)
             absolute_base = port.abspath_for_test(base)
-            if fs.isfile(absolute_base) or base in wpt_tests:
+            if fs.isfile(absolute_base):
                 del base_comps[-1]
             elif not fs.isdir(absolute_base):
                 failure = 'Base "{}" in virtual suite "{}" must refer to a real file or directory'.format(
diff --git a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
index 468a5c5..f07eeca 100644
--- a/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
+++ b/third_party/blink/tools/blinkpy/web_tests/lint_test_expectations_unittest.py
@@ -26,11 +26,9 @@
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import json
 import optparse
 import textwrap
 import unittest
-from unittest.mock import patch
 
 from blinkpy.common import exit_codes
 from blinkpy.common.host_mock import MockHost
@@ -494,42 +492,6 @@
             self.host, self.options)
         self.assertFalse(res)
 
-    def test_check_virtual_test_suites_any_js(self):
-        suites = [
-            VirtualTestSuite(prefix='wpt-any-js',
-                             platforms=['Linux', 'Mac', 'Win'],
-                             bases=[
-                                 'external/wpt/test.any.html',
-                                 'external/wpt/test.any.worker.html'
-                             ],
-                             args=['--arg']),
-        ]
-        fs = self.host.filesystem
-        fs.write_text_file(
-            fs.join(self.port.web_tests_dir(), 'virtual', 'wpt-any-js',
-                    'README.md'), '')
-        manifest = {
-            'items': {
-                'testharness': {
-                    'test.any.js': [
-                        'df2f8b048c370d3ab009946d73d7de6f8a412471',
-                        ['test.any.html', {}],
-                        ['test.any.worker.html', {}],
-                    ],
-                },
-            },
-        }
-        manifest_path = fs.join(self.port.web_tests_dir(), 'external', 'wpt',
-                                'MANIFEST.json')
-        with fs.open_text_file_for_writing(manifest_path) as manifest_file:
-            json.dump(manifest, manifest_file)
-        with patch.object(self.port,
-                          'virtual_test_suites',
-                          return_value=suites):
-            self.assertEqual(
-                lint_test_expectations.check_virtual_test_suites(
-                    self.host, self.options), [])
-
     def test_check_virtual_test_suites_redundant(self):
         self.port.virtual_test_suites = lambda: [
             VirtualTestSuite(prefix='foo', platforms=['Linux', 'Mac', 'Win'], bases=['test/sub', 'test'], args=['--foo']),
diff --git a/third_party/blink/tools/blinkpy/web_tests/stale_expectation_removal/remove_stale_expectations.py b/third_party/blink/tools/blinkpy/web_tests/stale_expectation_removal/remove_stale_expectations.py
index 9bfa6045..5abd985 100644
--- a/third_party/blink/tools/blinkpy/web_tests/stale_expectation_removal/remove_stale_expectations.py
+++ b/third_party/blink/tools/blinkpy/web_tests/stale_expectation_removal/remove_stale_expectations.py
@@ -91,13 +91,6 @@
                 'Unused expectations removed from %s. Stale comments, etc. '
                 'may still need to be removed.\n' % expectation_file)
 
-    # These two options are mutually exclusive.
-    if args.modify_semi_stale_expectations:
-        affected_urls |= expectations_instance.ModifySemiStaleExpectations(
-            semi_stale)
-        stale_message += ('Semi-stale expectations modified in expectation '
-                          'files. Stale comments, etc. may still need to be '
-                          'removed.\n')
     if args.narrow_semi_stale_expectation_scope:
         affected_urls |= expectations_instance.NarrowSemiStaleExpectationScope(
             semi_stale)
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 8d29551..1783293 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -6346,6 +6346,8 @@
 crbug.com/1406027 [ Win ] virtual/media-foundation-for-clear-dcomp/media/controls/overflow-menu-hide-on-resize.html [ Failure ]
 crbug.com/1289607 [ Linux ] external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.html [ Failure ]
 crbug.com/1408294 [ Debug Linux ] virtual/gpu/external/wpt/mediacapture-record/MediaRecorder-canvas-media-source.https.html [ Failure ]
+crbug.com/1408828 [ Mac11-arm64 ] svg/animations/target-condition-crash.html [ Timeout ]
+crbug.com/1408800 [ Mac10.14 ] virtual/web-bluetooth-new-permissions-backend/external/wpt/bluetooth/requestDevice/canonicalizeFilter/empty-services-member.https.window.html [ Timeout ]
 
 # Sheriff 2022-10-07
 crbug.com/1372556 [ Linux ] external/wpt/css/css-text/text-transform/text-transform-capitalize-* [ Failure Pass ]
@@ -6890,22 +6892,6 @@
 # TODO(crbug.com/1401396): Re-enable this test
 external/wpt/webrtc/simulcast/setParameters-active.https.html [ Pass Timeout ]
 
-# image-set() failures (sheriff 2022-12-16)
-external/wpt/css/css-images/image-set/image-set-empty-url-rendering.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-invalid-resolution-rendering-2.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-content-rendering.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-type-unsupported-rendering-2.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-unordered-res-rendering.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-first-match-rendering.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-rendering.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-rendering-2.html [ Failure Pass ]
-external/wpt/css/css-images/image-set/image-set-invalid-resolution-rendering.html [ Failure Pass ]
-
-# TODO(crbug.com/1402194): Re-enable this test
-crbug.com/1402194 [ Mac ] external/wpt/css/css-images/image-set/image-set-no-res-rendering-2.html [ Failure Pass ]
-crbug.com/1402194 [ Mac ] external/wpt/css/css-images/image-set/image-set-no-res-rendering.html [ Failure Pass ]
-
 # Flaky CSP tests. To be re-enabled.
 crbug.com/1400930 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-general.html [ Pass Timeout ]
 crbug.com/1399780 external/wpt/content-security-policy/embedded-enforcement/subsumption_algorithm-nonces.html [ Pass Timeout ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 690a7f09..fb94bd7 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1696,7 +1696,7 @@
     "bases": [
       "external/wpt/html/infrastructure/safe-passing-of-structured-data/cross-origin-transfer-resizable-arraybuffer.html",
       "external/wpt/html/infrastructure/safe-passing-of-structured-data/messagechannel.any.js",
-      "external/wpt/html/infrastructure/safe-passing-of-structured-data/window-postmessage.window.html",
+      "external/wpt/html/infrastructure/safe-passing-of-structured-data/window-postmessage.window.js",
       "external/wpt/html/webappapis/structured-clone/structured-clone.any.js",
       "external/wpt/webidl/ecmascript-binding/allow-resizable.html",
       "external/wpt/workers/semantics/structured-clone/dedicated.html",
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index a2c92db..e15f438 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -467594,7 +467594,7 @@
     ],
     "reactions": {
      "Animation.html": [
-      "47eff97497c65e1324947d26825c1539677cb7d9",
+      "f8d3bb86ed78ac3d0a804d7bd56f0b97bd95d481",
       [
        null,
        {}
diff --git a/third_party/blink/web_tests/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt b/third_party/blink/web_tests/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt
new file mode 100644
index 0000000..baf1499
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/FileAPI/BlobURL/cross-partition.tentative.https-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+FAIL Blob URL shouldn't be revocable from a cross-partition iframe promise_test: Unhandled rejection with value: "Blob URL was revoked in not-same-top-level-site iframe: URL.revokeObjectURL did revoke"
+FAIL Blob URL shouldn't be revocable from a cross-partition dedicated worker promise_test: Unhandled rejection with value: "Blob URL was revoked in not-same-top-level-site dedicated worker: URL.revokeObjectURL did revoke"
+FAIL Blob URL shouldn't be revocable from a cross-partition shared worker promise_test: Unhandled rejection with value: "Blob URL was revoked in not-same-top-level-site shared worker: URL.revokeObjectURL did revoke"
+PASS Blob URL shouldn't be revocable from a service worker
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Animation.html b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Animation.html
index 47eff97..f8d3bb8 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Animation.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Animation.html
@@ -21,7 +21,7 @@
     document.body.appendChild(instance);
     assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
 
-    const animation = instance.animate([{'borderColor': 'rgb(0, 0, 255)'}]);
+    const animation = instance.animate([{'borderColor': 'rgb(0, 0, 255)'}], 1);
     animation.commitStyles();
 
     const logEntries = element.takeLog();
@@ -35,7 +35,7 @@
     const instance = document.createElement(element.name);
     document.body.appendChild(instance);
 
-    let animation = instance.animate([{'borderColor': 'rgb(0, 0, 255)'}]);
+    let animation = instance.animate([{'borderColor': 'rgb(0, 0, 255)'}], 1);
     animation.commitStyles();
 
     assert_array_equals(element.takeLog().types(), ['constructed', 'connected', 'attributeChanged']);
@@ -55,7 +55,7 @@
     document.body.appendChild(instance);
     assert_array_equals(element.takeLog().types(), ['constructed', 'connected']);
 
-    const animation = instance.animate([{'borderColor': 'rgb(0, 0, 255)'}]);
+    const animation = instance.animate([{'borderColor': 'rgb(0, 0, 255)'}], 1);
     animation.commitStyles();
 
     assert_array_equals(element.takeLog().types(), []);
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/app-simple.js b/third_party/blink/web_tests/external/wpt/payment-handler/app-simple.js
index 833a01f47..9e70c08 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/app-simple.js
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/app-simple.js
@@ -1,3 +1,7 @@
+self.addEventListener('canmakepayment', event => {
+  event.respondWith(true);
+});
+
 self.addEventListener('paymentrequest', event => {
   const expectedId = 'test-payment-request-identifier';
   if (event.paymentRequestId !== expectedId) {
@@ -17,11 +21,16 @@
   }
 
   const methodData = event.methodData[0];
-  const expectedMethodName = window.location.origin + '/payment-handler/payment-app/';
-  if (methodData.supportedMethods !== expectedMethodName) {
-    const msg = `Expected payment method name "${expectedMethodName}", but got "${
-      methodData.supportedMethods
-    }"`;
+  const expectedMethodNamePrefix = 'http';
+  if (!methodData.supportedMethods.startsWith(expectedMethodNamePrefix)) {
+    const msg = `Expected payment method name "${methodData.supportedMethods}" to start with ${expectedMethodNamePrefix}"`;
+    event.respondWith(Promise.reject(new Error(msg)));
+    return;
+  }
+
+  const expectedMethodNameSuffix = '/payment-handler/payment-request-event-manual-manifest.json';
+  if (!methodData.supportedMethods.endsWith(expectedMethodNameSuffix)) {
+    const msg = `Expected payment method name "${methodData.supportedMethods}" to end with ${expectedMethodNameSuffix}"`;
     event.respondWith(Promise.reject(new Error(msg)));
     return;
   }
@@ -69,6 +78,7 @@
   }
 
   event.respondWith({
-    methodName: expectedMethodName,
+    methodName: methodData.supportedMethods,
+    details: {status: 'success'},
   });
 });
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual-manifest.json b/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual-manifest.json
new file mode 100644
index 0000000..f9722976
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual-manifest.json
@@ -0,0 +1,15 @@
+{
+  "default_applications": ["payment-request-event-manual-manifest.json"],
+  "name": "Test Payment Handler",
+  "icons": [
+    {
+      "src": "/images/rgrg-256x256.png",
+      "sizes": "256x256",
+      "type": "image/png"
+    }
+  ],
+  "serviceworker": {
+    "src": "app-simple.js",
+    "scope": "payment-request-event-manual-payment-app/"
+  }
+}
diff --git a/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual.https.html b/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual.https.html
index e595dd21..9cd2035 100644
--- a/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual.https.html
+++ b/third_party/blink/web_tests/external/wpt/payment-handler/payment-request-event-manual.https.html
@@ -2,87 +2,68 @@
 <meta charset="utf-8">
 <title>Tests for PaymentRequestEvent</title>
 <link rel="help" href="https://w3c.github.io/payment-handler/#the-paymentrequestevent">
-<link rel="manifest" href="/payment-handler/basic-card.json">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="register-and-activate-service-worker.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
 <p>When the payment sheet is shown, please authorize the mock payment.</p>
 <script>
-async function setInstrumentsAndRunTests(registration) {
-  const methodName = window.location.origin + '/payment-handler/payment-app/';
-  await registration.paymentManager.instruments.clear();
-  await registration.paymentManager.instruments.set('instrument-key', {
-    name: 'Instrument Name',
-    icons: [
-      {src: '/images/rgrg-256x256.png', sizes: '256x256', type: 'image/png'},
+promise_test(async t => {
+  const methodName = window.location.origin + '/payment-handler/'
+      + 'payment-request-event-manual-manifest.json';
+  await test_driver.bless('invoking a payment app');
+  const response = await new PaymentRequest(
+    [
+      {supportedMethods: methodName, data: {}},
+      {supportedMethods: 'interledger', data: {supportedNetworks: ['mir']}},
     ],
-    method: methodName,
-    capabilities: {supportedNetworks: ['mir']},
-  });
-  runTests();
-}
-
-function runTests() {
-  promise_test(async t => {
-    const response = await new PaymentRequest(
-      [
-        {supportedMethods: methodName, data: {}},
-        {supportedMethods: 'interledger', data: {supportedNetworks: ['mir']}},
+    {
+      id: 'test-payment-request-identifier',
+      total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
+      displayItems: [
+        {label: 'Item 1', amount: {currency: 'CAD', value: '0.005'}},
+        {label: 'Item 2', amount: {currency: 'EUR', value: '0.005'}},
       ],
-      {
-        id: 'test-payment-request-identifier',
-        total: {label: 'Total', amount: {currency: 'USD', value: '0.01'}},
-        displayItems: [
-          {label: 'Item 1', amount: {currency: 'CAD', value: '0.005'}},
-          {label: 'Item 2', amount: {currency: 'EUR', value: '0.005'}},
-        ],
-        modifiers: [
-          {
-            supportedMethods: methodName,
-            data: {supportedNetworks: ['mir']},
-            total: {
-              label: 'MIR total',
-              amount: {currency: 'USD', value: '0.0099'},
-            },
-            additionalDisplayItems: [
-              {label: 'Item 3', amount: {currency: 'GBP', value: '-0.0001'}},
-            ],
+      modifiers: [
+        {
+          supportedMethods: methodName,
+          data: {supportedNetworks: ['mir']},
+          total: {
+            label: 'MIR total',
+            amount: {currency: 'USD', value: '0.0099'},
           },
-          {
-            supportedMethods: methodName,
-            data: {supportedNetworks: ['visa']},
-            total: {
-              label: 'VISA total',
-              amount: {currency: 'USD', value: '0.0098'},
-            },
-            additionalDisplayItems: [
-              {label: 'Item 4', amount: {currency: 'CNY', value: '-0.0002'}},
-            ],
+          additionalDisplayItems: [
+            {label: 'Item 3', amount: {currency: 'GBP', value: '-0.0001'}},
+          ],
+        },
+        {
+          supportedMethods: methodName,
+          data: {supportedNetworks: ['visa']},
+          total: {
+            label: 'VISA total',
+            amount: {currency: 'USD', value: '0.0098'},
           },
-          {
-            supportedMethods: 'interledger',
-            data: {},
-            total: {
-              label: 'Prepaid total',
-              amount: {currency: 'USD', value: '0.0097'},
-            },
-            additionalDisplayItems: [
-              {label: 'Item 5', amount: {currency: 'JPY', value: '-0.0003'}},
-            ],
+          additionalDisplayItems: [
+            {label: 'Item 4', amount: {currency: 'CNY', value: '-0.0002'}},
+          ],
+        },
+        {
+          supportedMethods: 'interledger',
+          data: {},
+          total: {
+            label: 'Prepaid total',
+            amount: {currency: 'USD', value: '0.0097'},
           },
-        ],
-      },
-    ).show();
-    const promise = response.complete('success');
-    assert_equals(response.requestId, 'test-payment-request-identifier');
-    assert_equals(response.methodName, methodName);
-    return promise;
-  }, 'Can perform payment');
-}
-
-registerAndActiveServiceWorker(
-  'app-simple.js',
-  'payment-app/',
-  setInstrumentsAndRunTests,
-);
+          additionalDisplayItems: [
+            {label: 'Item 5', amount: {currency: 'JPY', value: '-0.0003'}},
+          ],
+        },
+      ],
+    },
+  ).show();
+  const promise = response.complete('success');
+  assert_equals(response.requestId, 'test-payment-request-identifier');
+  assert_equals(response.methodName, methodName);
+  return promise;
+}, 'Can perform payment');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-sinkid-setsinkid.https.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-sinkid-setsinkid.https.html
index c4fbe41e..61d2586 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-sinkid-setsinkid.https.html
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audiocontext-interface/audiocontext-sinkid-setsinkid.https.html
@@ -107,5 +107,16 @@
                       iframeAudioContext.setSinkId('some_random_device_id'));
 },'setSinkId() should fail with InvalidStateError when calling from a' +
   'detached document');
+
+// Pending setSinkId() promises should be rejected with a
+// DOMException of InvalidStateError when the context is closed.
+// See: crbug.com/1408376
+promise_test(async t => {
+  const audioContext = new AudioContext();
+  promise_rejects_dom(t, 'InvalidStateError',
+                      audioContext.setSinkId('some_random_device_id'));
+  await audioContext.close();
+},'pending setSinkId() should be rejected with InvalidStateError when' +
+  'AudioContext is closed');
 </script>
 </html>
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-mixed-alpha2-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-mixed-alpha2-expected.png
index a2e97d5..dfe344cf 100644
--- a/third_party/blink/web_tests/platform/mac/fast/borders/border-mixed-alpha2-expected.png
+++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-mixed-alpha2-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/border-mixed-alpha2-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/border-mixed-alpha2-expected.png
deleted file mode 100644
index 63879a6..0000000
--- a/third_party/blink/web_tests/platform/win/fast/borders/border-mixed-alpha2-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/closure_compiler/compile_js.gni b/third_party/closure_compiler/compile_js.gni
index 02362d1..225cf0e 100644
--- a/third_party/closure_compiler/compile_js.gni
+++ b/third_party/closure_compiler/compile_js.gni
@@ -9,7 +9,7 @@
   # Enable closure type-checking for Chrome's web technology-based UI. This
   # enables the webui_closure_compile target which does a no-op without this
   # flag enabled. Requires Java.
-  enable_js_type_check = is_chromeos_ash || is_android
+  enable_js_type_check = is_chromeos_ash
 }
 
 script_path = "//third_party/closure_compiler"
@@ -289,8 +289,8 @@
 
 # Defines a target that compiles a group of js_library targets.
 template("js_type_check") {
-  # js_type_check is not supported on Desktop.
-  assert(is_chromeos_ash || is_android || is_ios)
+  # js_type_check is only supported on ChromeOS Ash.
+  assert(is_chromeos_ash)
   if (enable_js_type_check) {
     js_binary(target_name) {
       sources = []
diff --git a/third_party/netty-tcnative/README.chromium b/third_party/netty-tcnative/README.chromium
index 377ab58..98d9859 100644
--- a/third_party/netty-tcnative/README.chromium
+++ b/third_party/netty-tcnative/README.chromium
@@ -33,3 +33,29 @@
 
      // Get a stack of all certs in the chain
      STACK_OF(X509) *sk = ctx->untrusted;
+diff --git a/c/ssl_private.h b/c/ssl_private.h
+index e101f08..9cfe24a 100644
+--- a/c/ssl_private.h
++++ b/c/ssl_private.h
+@@ -49,20 +49,21 @@
+ #endif
+ 
+ #include "apr_thread_rwlock.h"
+ #include "apr_atomic.h"
+ #include <stdbool.h>
+ 
+ /* OpenSSL headers */
+ #include <openssl/opensslv.h>
+ #include <openssl/ssl.h>
+ #include <openssl/err.h>
++#include <openssl/hmac.h>
+ #include <openssl/x509.h>
+ #include <openssl/pem.h>
+ #include <openssl/pkcs12.h> 
+ #include <openssl/crypto.h>
+ #include <openssl/evp.h>
+ #include <openssl/rand.h>
+ #include <openssl/x509v3.h>
+ 
+ #define ERR_LEN 256
+ 
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 99909fb4..39e1fbe 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -34239,12 +34239,14 @@
 </action>
 
 <action name="TabStrip">
+  <obsolete>The feature was deprecated and code deleted.</obsolete>
   <owner>yusufo@chromium.org</owner>
   <owner>wychen@chromium.org</owner>
   <description>User actions about conditional tab strip.</description>
 </action>
 
 <action name="TabStrip.SessionVisibility">
+  <obsolete>The feature was deprecated and code deleted.</obsolete>
   <owner>yusufo@chromium.org</owner>
   <owner>wychen@chromium.org</owner>
   <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 3d67d7b2..d960bd8 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -349,6 +349,7 @@
   <int value="0" label="Not Enabled"/>
   <int value="1" label="User Enabled"/>
   <int value="2" label="OS Enabled"/>
+  <int value="3" label="User Disabled"/>
 </enum>
 
 <enum name="AccessibilityTreeUnserializeError">
@@ -29746,6 +29747,15 @@
   <int value="16" label="Failed to create a hardware signing key."/>
 </enum>
 
+<enum name="DTKeyRotationCommandError">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Timeout"/>
+  <int value="2" label="COM Class not registered"/>
+  <int value="3" label="COM Class not implementing the interface"/>
+  <int value="4" label="Updater concurrency"/>
+  <int value="5" label="User installation"/>
+</enum>
+
 <enum name="DTKeyRotationResult">
   <int value="0" label="Succeeded"/>
   <int value="1" label="Failed"/>
@@ -29753,6 +29763,7 @@
   <int value="3" label="Failed Key Conflict"/>
   <int value="4" label="Failed OS Restriction"/>
   <int value="5" label="Failed Invalid Permissions"/>
+  <int value="6" label="Failed Invalid Installation"/>
 </enum>
 
 <enum name="DTKeyTrustLevel">
@@ -49653,6 +49664,7 @@
   <int value="-2147012851" label="WININET_E_INVALID_CA"/>
   <int value="-2147009295" label="ERROR_INSTALL_PACKAGE_NOT_FOUND"/>
   <int value="-2146959355" label="CO_E_SERVER_EXEC_FAILURE"/>
+  <int value="-2146762496" label="TRUST_E_NOSIGNATURE"/>
   <int value="-2146435043" label="SCARD_E_NO_SERVICE"/>
   <int value="-2140143615" label="MF_INDEX_SIZE_ERR"/>
   <int value="-2140143608" label="MF_NOT_FOUND_ERR"/>
@@ -61860,7 +61872,6 @@
   <int value="487605950" label="PerformantSplitViewResizing:disabled"/>
   <int value="487810392" label="EnablePalmOnToolTypePalm:enabled"/>
   <int value="491258649" label="UseFirstPartySet"/>
-  <int value="491334698" label="ConditionalTabStripAndroid:enabled"/>
   <int value="492113129" label="ExperimentalAppBanners:enabled"/>
   <int value="492355659" label="SurfaceSyncThrottling:disabled"/>
   <int value="492849345" label="ImprovedDesksKeyboardShortcuts:disabled"/>
@@ -62740,7 +62751,6 @@
   <int value="1005684777" label="PictureInPicture:disabled"/>
   <int value="1006080779" label="ForcePreferredIntervalForVideo:disabled"/>
   <int value="1006608931" label="ArcEnableUnifiedAudioFocus:disabled"/>
-  <int value="1006691801" label="ConditionalTabStripAndroid:disabled"/>
   <int value="1007444341" label="enable-prefixed-encrypted-media"/>
   <int value="1008677979"
       label="AutofillUseImprovedLabelDisambiguation:disabled"/>
@@ -75055,6 +75065,16 @@
       label="The permission request is delivered to phone's Exo package"/>
 </enum>
 
+<enum name="OnDeviceToServerSpeechRecognitionFallbackReason">
+  <int value="0" label="Device does not support SODA"/>
+  <int value="1" label="User's language is not supported by SODA"/>
+  <int value="2" label="SODA binary is not installed"/>
+  <int value="3" label="SODA binary and language packs are downloading"/>
+  <int value="4" label="SODA installation failed"/>
+  <int value="5" label="SODA installation error needs reboot"/>
+  <int value="6" label="Enforced by flag for dev"/>
+</enum>
+
 <enum name="OnServiceConnectedTimedOutResult">
   <int value="0" label="AlreadyConnected">
     OnServiceConnected is already called. Everything worked as expected.
@@ -88819,6 +88839,12 @@
   <int value="2" label="Write error"/>
 </enum>
 
+<enum name="RestoreTabStateException">
+  <int value="0" label="File not found"/>
+  <int value="1" label="Closed by interrupt exception"/>
+  <int value="2" label="IO exception"/>
+</enum>
+
 <enum name="RestrictedPrefetchReused">
   <int value="0" label="Restricted prefetch not reused"/>
   <int value="1" label="Restricted prefetch reused"/>
@@ -92444,6 +92470,8 @@
   <int value="73" label="Creation of shortcuts succeeded."/>
   <int value="74" label="DMToken deletion failed."/>
   <int value="75" label="DMToken deletion succeeded."/>
+  <int value="76" label="Failed Device Trust Rotation: Invalid Permissions"/>
+  <int value="77" label="Failed Device Trust Rotation: Conflict"/>
 </enum>
 
 <enum name="SetupSingletonAcquisitionResult">
@@ -98866,6 +98894,9 @@
 </enum>
 
 <enum name="TabStripReasonToShow">
+  <obsolete>
+    Deprecated as of 01/2023.
+  </obsolete>
   <summary>The reason why conditional tab strip is showing.</summary>
   <int value="0" label="TabSwitched"/>
   <int value="1" label="NewTab"/>
@@ -98881,6 +98912,9 @@
 </enum>
 
 <enum name="TabStripUserStatus">
+  <obsolete>
+    Deprecated as of 01/2023.
+  </obsolete>
   <summary>
     The user status of conditional tab strip in a feature-specific session.
   </summary>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index 9708573..534671c 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -264,7 +264,8 @@
     Tracks the enabled state for the Page Zoom option on the main app menu. The
     state will be one of the following enumerated states: 0) not enabled, 1)
     enabled explicitly by the user on the Accessibility Page Zoom setting, 2)
-    enabled automatically if the user has an Android OS-wide default font size.
+    enabled automatically if the user has an Android OS-wide default font size,
+    3) disabled explicitly by the user on the Accessibility Page Zoom setting.
     Recorded each time the app menu is opened.
   </summary>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index a320398e..b1fa106 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -4119,6 +4119,19 @@
   <token key="TabletOrClamshell" variants="DisplayModes"/>
 </histogram>
 
+<histogram name="Ash.Projector.OnDeviceToServerSpeechRecognitionFallbackReason"
+    enum="OnDeviceToServerSpeechRecognitionFallbackReason"
+    expires_after="2023-12-17">
+  <owner>xiqiruan@chromium.org</owner>
+  <owner>yilkal@chromium.org</owner>
+  <owner>cros-projector@google.com</owner>
+  <summary>
+    Records the fallback reason of using server based speech recognition instead
+    of on device speech recogniton. This metric is recorded on server based
+    speech recognition in projector session.
+  </summary>
+</histogram>
+
 <histogram name="Ash.Projector.PendingScreencastBatchIOTaskDuration" units="ms"
     expires_after="2023-10-17">
   <owner>xiqiruan@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index c712339..bde0e711 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -976,6 +976,17 @@
   </summary>
 </histogram>
 
+<histogram name="Blink.FedCm.IsAfterWindowOnload" enum="Boolean"
+    expires_after="M120">
+  <owner>tanzachary@chromium.org</owner>
+  <owner>web-identity-eng@google.com</owner>
+  <summary>
+    Records whether the FedCM request is made before or after the window onload
+    event completes. Records once per API call when the
+    FedCmMultipleIdentityProviders flag is disabled.
+  </summary>
+</histogram>
+
 <histogram name="Blink.FedCm.IsSignInUser" enum="Boolean"
     expires_after="2023-06-11">
   <owner>yigu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml
index 20eba05..7a5336a5 100644
--- a/tools/metrics/histograms/metadata/cookie/histograms.xml
+++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -415,9 +415,7 @@
   </summary>
   <token key="QueryType">
     <variant name="ComputeMetadata"/>
-    <variant name="FindOwner"/>
     <variant name="FindOwners"/>
-    <variant name="Sets"/>
   </token>
 </histogram>
 
@@ -454,7 +452,6 @@
     <variant name="ContextReadyToServeQueries"/>
     <variant name="ReadCommandLineSet"/>
     <variant name="ReadComponentSets"/>
-    <variant name="ReadPersistedSets"/>
     <variant name="ReadyToServeQueries"/>
   </token>
 </histogram>
diff --git a/tools/metrics/histograms/metadata/cryptohome/histograms.xml b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
index f960d00..72043a4 100644
--- a/tools/metrics/histograms/metadata/cryptohome/histograms.xml
+++ b/tools/metrics/histograms/metadata/cryptohome/histograms.xml
@@ -509,10 +509,9 @@
 </histogram>
 
 <histogram name="Cryptohome.LECredential.{Operation}{Action}"
-    enum="CryptohomeLECredError" expires_after="2023-01-22">
+    enum="CryptohomeLECredError" expires_after="2023-07-22">
   <owner>pmalani@chromium.org</owner>
   <owner>apronin@chromium.org</owner>
-  <owner>mnissler@chromium.org</owner>
   <owner>allenwebb@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -544,7 +543,7 @@
 </histogram>
 
 <histogram name="Cryptohome.LegacyCodePathUsage.{Location}"
-    enum="BooleanCodePathUsage" expires_after="2022-01-09">
+    enum="BooleanCodePathUsage" expires_after="2023-07-09">
   <owner>hardikgoyal@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
@@ -907,7 +906,7 @@
 </histogram>
 
 <histogram name="Cryptohome.TpmResults" enum="CryptohomeTpmResults"
-    expires_after="2022-10-30">
+    expires_after="2023-10-30">
   <owner>afakhry@chromium.org</owner>
   <summary>
     The errors resulting from interacting with the Trusted Platform Module (TPM)
@@ -1121,7 +1120,7 @@
   </token>
 </histogram>
 
-<histogram name="CryptohomeClient" units="ms" expires_after="2022-07-24">
+<histogram name="CryptohomeClient" units="ms" expires_after="2023-07-24">
   <owner>zuan@chromium.org</owner>
   <owner>cros-hwsec+uma@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 43e067e..d6a443c 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -924,6 +924,39 @@
   </token>
 </histogram>
 
+<histogram name="Enterprise.DeviceTrust.KeyRotationCommand.Error"
+    enum="DTKeyRotationCommandError" expires_after="2023-12-01">
+  <owner>seblalancette@chromium.org</owner>
+  <owner>cbe-device-trust-eng@google.com</owner>
+  <summary>
+    Recorded when the browser received a failed response when triggering a
+    Device Trust key rotation command. The browser will then attempt to
+    categorize the failure using the given enum.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.DeviceTrust.KeyRotationCommand.Error.Hresult"
+    enum="Hresult" expires_after="2023-12-01">
+  <owner>seblalancette@chromium.org</owner>
+  <owner>cbe-device-trust-eng@google.com</owner>
+  <summary>
+    Recorded when the browser failed to trigger a Device Trust key rotation
+    command through the updater for an unknown reason. This will capture the
+    unknown HRESULT returned via the COM APIs.
+  </summary>
+</histogram>
+
+<histogram name="Enterprise.DeviceTrust.KeyRotationCommand.ExitCode"
+    units="exit_code" expires_after="2023-12-01">
+  <owner>seblalancette@chromium.org</owner>
+  <owner>cbe-device-trust-eng@google.com</owner>
+  <summary>
+    Recorded when the browser received a failed response when triggering a
+    Device Trust key rotation command. The browser will then attempt to
+    categorize the failure using the given enum.
+  </summary>
+</histogram>
+
 <histogram name="Enterprise.DeviceTrust.Mac.SecureEnclaveOperation.{KeyType}"
     enum="DTSecureEnclaveOperationStatus" expires_after="2023-12-01">
   <owner>hmare@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
index 9fb911d..559b8dee 100644
--- a/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
+++ b/tools/metrics/histograms/metadata/histogram_suffixes_list.xml
@@ -5379,18 +5379,11 @@
   <affected-histogram name="Security.PageInfo.TimeOpen.Action"/>
   <affected-histogram name="Security.PageInfo.TimeOpen.NoAction"/>
   <affected-histogram name="Security.SafetyTips.Interaction"/>
-  <affected-histogram name="Security.SafetyTips.PageInfo.Action"/>
   <affected-histogram name="Security.SiteEngagement"/>
   <affected-histogram name="Security.SiteEngagementDelta"/>
   <affected-histogram name="Security.TimeOnPage2"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="SafetyTip_EntryPoint" separator=".">
-  <suffix name="DidFinishNavigation" label="DidFinishNavigation entry point"/>
-  <suffix name="VisibilityChanged" label="VisibilityChanged entry point"/>
-  <affected-histogram name="Security.SafetyTips.ReputationCheckComplete"/>
-</histogram_suffixes>
-
 <histogram_suffixes name="SB2RequestDestinations" separator=".">
   <suffix name="Checked"
       label="Resources that were checked. Logged before the resource starts
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index 59433d19..d4cfeff 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -2911,14 +2911,23 @@
   </summary>
 </histogram>
 
-<histogram name="ClientHints.FetchLatency" units="ms"
+<histogram name="ClientHints.FetchLatency{OperationType}" units="ms"
     expires_after="2023-06-25">
   <owner>miketaylr@chromium.org</owner>
   <owner>potassium-katabolism@google.com</owner>
   <summary>
     The latency (in milliseconds) to fetch the client hints for a given origin
-    from the Accept-CH cache.
+    from the Accept-CH cache for {OperationType}.
   </summary>
+  <token key="OperationType">
+    <variant name="_OriginTrialCheck"
+        summary="checking origin trial client hints"/>
+    <variant name="_PrefRead" summary="PrefService read"/>
+    <variant name="_PrerenderHost" summary="prerender host"/>
+    <variant name="_Total"
+        summary="all subcategories operations: PrefRead, PrerenderHost, and
+                 OriginTrialCheck"/>
+  </token>
 </histogram>
 
 <histogram name="ClientHints.PersistDuration" units="ms"
diff --git a/tools/metrics/histograms/metadata/security/histograms.xml b/tools/metrics/histograms/metadata/security/histograms.xml
index fae60f0..715a9b05 100644
--- a/tools/metrics/histograms/metadata/security/histograms.xml
+++ b/tools/metrics/histograms/metadata/security/histograms.xml
@@ -146,7 +146,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstMode.NavigationEvent"
-    enum="HttpsFirstModeNavigationEvent" expires_after="2023-01-15">
+    enum="HttpsFirstModeNavigationEvent" expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -168,7 +168,7 @@
 </histogram>
 
 <histogram name="Security.HttpsFirstMode.SettingEnabledAtStartup"
-    enum="BooleanEnabled" expires_after="2023-06-25">
+    enum="BooleanEnabled" expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -189,17 +189,6 @@
   </summary>
 </histogram>
 
-<histogram name="Security.MixedForm.InterstitialTriggerState"
-    enum="MixedFormInterstitialTriggeredState" expires_after="2022-06-26">
-  <owner>carlosil@chromium.org</owner>
-  <owner>security-enamel@chromium.org</owner>
-  <summary>
-    Logs when an interstitial was triggered (or would have been triggered but
-    was not due to the currently enabled experiment mode) and whether it was a
-    direct submission to an insecure URL, or a redirect through one.
-  </summary>
-</histogram>
-
 <histogram base="true" name="Security.PageEndReason" enum="PageEndReason"
     expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
@@ -262,7 +251,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.TimeOpen" units="ms"
-    expires_after="2023-03-30">
+    expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -272,7 +261,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.TimeOpen.Action" units="ms"
-    expires_after="2023-06-04">
+    expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -282,7 +271,7 @@
 </histogram>
 
 <histogram name="Security.PageInfo.TimeOpen.NoAction" units="ms"
-    expires_after="2023-03-30">
+    expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -363,34 +352,15 @@
   </summary>
 </histogram>
 
-<histogram name="Security.SafetyTips.PageInfo.Action"
-    enum="WebsiteSettingsAction" expires_after="2021-10-25">
-  <owner>jdeblasio@chromium.org</owner>
-  <owner>src/chrome/browser/lookalikes/OWNERS</owner>
-  <summary>
-    Tracks Page Info bubble actions along with the Safety Tip status of the
-    page.
-  </summary>
-</histogram>
-
-<histogram base="true" name="Security.SafetyTips.ReputationCheckComplete"
-    enum="SafetyTipStatus" expires_after="2022-05-01">
-  <owner>jdeblasio@chromium.org</owner>
-  <owner>src/chrome/browser/lookalikes/OWNERS</owner>
-  <summary>
-    Records the Safety Tip status of a page after navigation commit or page
-    visibility change. This is the same as SafetyTipShown, but with additional
-    suffixes for clarity.
-  </summary>
-</histogram>
-
 <histogram name="Security.SafetyTips.SafetyTipIgnoredPageLoad"
-    enum="SafetyTipStatus" expires_after="2021-12-26">
+    enum="SafetyTipStatus" expires_after="2023-06-25">
   <owner>jdeblasio@chromium.org</owner>
   <owner>src/chrome/browser/lookalikes/OWNERS</owner>
   <summary>
     Records the Safety Tip status of a page after navigation commit for a page
     where the Safety Tip has previously been ignored.
+
+    Note: This histogram was expired from 2021-12-26 until 2023-01-19.
   </summary>
 </histogram>
 
@@ -404,36 +374,6 @@
   </summary>
 </histogram>
 
-<histogram name="Security.SafetyTips.SafetyTipShown_AfterFlag"
-    enum="SafetyTipStatus" expires_after="2021-12-25">
-  <owner>jdeblasio@chromium.org</owner>
-  <owner>src/chrome/browser/lookalikes/OWNERS</owner>
-  <summary>
-    Records the Safety Tip status of a page after navigation commit or page
-    visibility change. This is the same as SafetyTipShown, but records *after*
-    the flag is checked to evaluate the impact of starts_active.
-  </summary>
-</histogram>
-
-<histogram name="Security.SafetyTips.StatusWithInitiator.{SafetyTipInitiator}"
-    enum="SafetyTipStatus" expires_after="2021-10-25">
-  <owner>jdeblasio@chromium.org</owner>
-  <owner>meacer@chromium.org</owner>
-  <summary>
-    Records the Safety Tip status of a page after navigation commit, alongside
-    how the corresponding navigation was initiated. Only recorded on navigations
-    that were visible at commit time.
-  </summary>
-  <token key="SafetyTipInitiator">
-    <variant name="CrossOrigin" summary="Initiated by an unrelated origin"/>
-    <variant name="SameOrigin" summary="Initiated by the same origin"/>
-    <variant name="SameRegDomain"
-        summary="Initiated by the same registered domain"/>
-    <variant name="UnexpectedUrl" summary="Metrics failure"/>
-    <variant name="Unknown" summary="Initiator unknown"/>
-  </token>
-</histogram>
-
 <histogram name="Security.SCTAuditing.NumPersistedReportsLoaded"
     units="reports" expires_after="2023-07-09">
   <owner>cthomp@chromium.org</owner>
@@ -467,7 +407,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptIn.ReportDeduplicated" enum="Boolean"
-    expires_after="2023-01-15">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -478,7 +418,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptIn.ReportersHWM" units="reporters"
-    expires_after="2023-01-15">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -488,7 +428,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptIn.ReportSampled" enum="Boolean"
-    expires_after="2023-03-19">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -499,7 +439,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptIn.ReportSize" units="bytes"
-    expires_after="2023-03-19">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -509,7 +449,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptIn.ReportSucceeded" enum="Boolean"
-    expires_after="2023-06-04">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -520,7 +460,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptOut.DroppedDueToLogNotFound"
-    enum="Boolean" expires_after="2023-06-18">
+    enum="Boolean" expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
   <summary>
@@ -531,7 +471,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptOut.LookupQueryResult"
-    enum="SCTLookupQueryResult" expires_after="2023-06-18">
+    enum="SCTLookupQueryResult" expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>nsatragno@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
@@ -542,7 +482,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptOut.PopularSCTSkipped" enum="Boolean"
-    expires_after="2023-04-16">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>nsatragno@chromium.org</owner>
   <owner>trusty-transport@chromium.org</owner>
@@ -554,7 +494,7 @@
 </histogram>
 
 <histogram name="Security.SCTAuditing.OptOut.ReportCount" units="reports"
-    expires_after="2023-06-11">
+    expires_after="2023-07-15">
   <owner>cthomp@chromium.org</owner>
   <owner>jdeblasio@chromium.org</owner>
   <summary>
@@ -569,7 +509,7 @@
 </histogram>
 
 <histogram name="Security.SecurityLevel.DownloadStarted" enum="SecurityLevel"
-    expires_after="2023-01-15">
+    expires_after="2023-06-30">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -608,7 +548,7 @@
 </histogram>
 
 <histogram name="Security.SecurityLevel.OnCommit" enum="SecurityLevel"
-    expires_after="2023-02-12">
+    expires_after="2023-06-30">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
@@ -620,7 +560,7 @@
 </histogram>
 
 <histogram name="Security.SecurityLevel.OnComplete" enum="SecurityLevel"
-    expires_after="2023-03-19">
+    expires_after="2023-06-30">
   <owner>cthomp@chromium.org</owner>
   <owner>security-enamel@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 4683c7db..7a74687 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -1717,6 +1717,19 @@
   <token key="RecentlyClosedType" variants="RecentlyClosedType"/>
 </histogram>
 
+<histogram name="Tabs.RestoreTabStateException" enum="RestoreTabStateException"
+    expires_after="2023-06-25">
+  <owner>ckitagawa@chromium.org</owner>
+  <owner>fredmello@chromium.org</owner>
+  <summary>
+    [Android] TabState restoration may fail resulting in fallback restoration
+    from the TabStateList or aborting restoration altogether. TabState
+    restoration occurs on startup when restoring tab state from disk or when
+    merging multi-instance modes together. This histogram is emitted when
+    TabState restoration fails to indicate the cause of the failure.
+  </summary>
+</histogram>
+
 <histogram name="Tabs.SadTab.Feedback.Event" enum="SadTabEvent"
     expires_after="2023-07-09">
   <owner>sonnyrao@chromium.org</owner>
@@ -2783,6 +2796,9 @@
 
 <histogram name="TabStrip.ReasonToShow" enum="TabStripReasonToShow"
     expires_after="2021-02-01">
+  <obsolete>
+    Removed 01/2023. Feature deprecated and code deleted.
+  </obsolete>
   <owner>yusufo@chromium.org</owner>
   <owner>wychen@chromium.org</owner>
   <summary>
@@ -2844,6 +2860,9 @@
 
 <histogram name="TabStrip.UserStatus" enum="TabStripUserStatus"
     expires_after="2022-04-17">
+  <obsolete>
+    Removed 01/2023. Feature deprecated and code deleted.
+  </obsolete>
   <owner>yusufo@chromium.org</owner>
   <owner>wychen@chromium.org</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index de0320c..d40fb93 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,23 +6,23 @@
         },
         "win": {
             "hash": "0be9ae17456beffc25940507d40177c05922ef48",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/95b5b758ffac469fba8cda6cbbbffaea060d4c47/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/0d57f4770c40738e610deac22a59efc71ea4f329/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "6373f26144aad58f230d11d6a91efda5a09c9873",
             "full_remote_path": "perfetto-luci-artifacts/v31.0/linux-arm/trace_processor_shell"
         },
         "mac": {
-            "hash": "494041c9d29455be6cff9ea123e3cf73b5f90b33",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/20a9fe4bac7ab1ee546886c2b1653c87e346c0e0/trace_processor_shell"
+            "hash": "622120a168180957b3f08aba2edd6120e75da8f3",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/95b5b758ffac469fba8cda6cbbbffaea060d4c47/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "5f47ee79e59d00bf3889d30ca52315522c158040",
             "full_remote_path": "perfetto-luci-artifacts/v31.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "7763b7bcd345c552f88e25de96f64d4c401898a6",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/95b5b758ffac469fba8cda6cbbbffaea060d4c47/trace_processor_shell"
+            "hash": "21b42012a8a4c304bb52521129d60bc6ff215c2f",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/53971a4039d33587dcf88762c85c92b0faab412b/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/traffic_annotation/auditor/chromeos/safe_list.txt b/tools/traffic_annotation/auditor/chromeos/safe_list.txt
index 6346731..35ee61b 100644
--- a/tools/traffic_annotation/auditor/chromeos/safe_list.txt
+++ b/tools/traffic_annotation/auditor/chromeos/safe_list.txt
@@ -1,7 +1,6 @@
 # Chrome OS safelist for network annotator.
 # Please do not add any new safelist.
 #
-all,chromeos/printing/printer_config_cache.cc
 all,chromeos/ash/components/geolocation/simple_geolocation_request.cc
 all,chrome/browser/ash/policy/uploading/system_log_uploader.cc
 all,chromeos/geolocation/simple_geolocation_request.cc
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index fd26cfe..65d9e70c 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -329,7 +329,7 @@
  <item id="nearby_connections_wifi_lan" added_in_milestone="99" content_hash_code="06b30010" os_list="chromeos" file_path="chrome/services/sharing/nearby/platform/wifi_lan_medium.cc" />
  <item id="timezone_lookup" added_in_milestone="98" content_hash_code="01e64e71" os_list="chromeos" file_path="chromeos/ash/components/timezone/timezone_request.cc" />
  <item id="oma_download_handler_android" added_in_milestone="99" content_hash_code="03226fe2" os_list="android" file_path="chrome/android/java/src/org/chromium/chrome/browser/download/OMADownloadHandler.java" />
- <item id="wallpaper_google_photos_albums" added_in_milestone="99" content_hash_code="00248f64" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
+ <item id="wallpaper_google_photos_albums" added_in_milestone="99" content_hash_code="02f721fe" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
  <item id="webapk_create" added_in_milestone="99" content_hash_code="07b8fd35" os_list="android" file_path="chrome/browser/android/webapk/webapk_installer.cc" />
  <item id="webapk_update" added_in_milestone="99" content_hash_code="0763f8a7" os_list="android" file_path="chrome/browser/android/webapk/webapk_installer.cc" />
  <item id="safe_browsing_extension_telemetry" added_in_milestone="98" content_hash_code="06f81c76" os_list="linux,windows,chromeos" file_path="chrome/browser/safe_browsing/extension_telemetry/extension_telemetry_uploader.cc" />
@@ -421,4 +421,5 @@
  <item id="network_portal_detector" added_in_milestone="111" content_hash_code="023cdc21" os_list="chromeos" file_path="chrome/browser/ash/net/network_portal_detector_impl.cc" />
  <item id="safe_browsing_hashprefix_realtime_lookup" added_in_milestone="111" content_hash_code="07b1dc5e" os_list="linux,windows,chromeos,android" file_path="components/safe_browsing/core/browser/hashprefix_realtime/hash_realtime_service.cc" />
  <item id="android_feedback_connectivity_checker" added_in_milestone="111" content_hash_code="0011753d" os_list="android" file_path="chrome/android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java" />
+ <item id="printer_config_fetch" added_in_milestone="111" content_hash_code="078c2ad0" os_list="chromeos" file_path="chromeos/printing/printer_config_cache.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index ada8cb9..6ebdac35 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -286,6 +286,7 @@
       <annotation id="webapk_minter_install_request"/>
       <annotation id="network_portal_detector"/>
       <annotation id="android_feedback_connectivity_checker"/>
+      <annotation id="printer_config_fetch"/>
     </sender>
   </group>
   <group name="Admin Features" hidden="true">
diff --git a/ui/base/webui/web_ui_util.cc b/ui/base/webui/web_ui_util.cc
index 6c961d5f9..b7e2a471 100644
--- a/ui/base/webui/web_ui_util.cc
+++ b/ui/base/webui/web_ui_util.cc
@@ -171,12 +171,6 @@
   }
 }
 
-void ParsePathAndScale(const GURL& url,
-                       std::string* path,
-                       float* scale_factor) {
-  ParsePathAndImageSpec(url, path, scale_factor, nullptr);
-}
-
 void SetLoadTimeDataDefaults(const std::string& app_locale,
                              base::Value::Dict* localized_strings) {
   localized_strings->Set("fontfamily", GetFontFamily());
diff --git a/ui/base/webui/web_ui_util.h b/ui/base/webui/web_ui_util.h
index 378943b..db96ae63 100644
--- a/ui/base/webui/web_ui_util.h
+++ b/ui/base/webui/web_ui_util.h
@@ -57,11 +57,6 @@
                            float* scale_factor,
                            int* frame_index);
 
-// Parses a URL containing some path @{scale}x. If it does not contain a scale
-// factor then the default scale factor is returned.
-COMPONENT_EXPORT(UI_BASE)
-void ParsePathAndScale(const GURL& url, std::string* path, float* scale_factor);
-
 // Helper function to set some default values (e.g., font family, size,
 // language, and text direction) into the given dictionary. Requires an
 // application locale (i.e. g_browser_process->GetApplicationLocale()).
diff --git a/ui/base/webui/web_ui_util_unittest.cc b/ui/base/webui/web_ui_util_unittest.cc
index d9a49fa86..9c1306db 100644
--- a/ui/base/webui/web_ui_util_unittest.cc
+++ b/ui/base/webui/web_ui_util_unittest.cc
@@ -7,52 +7,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
-TEST(WebUIUtilTest, ParsePathAndScale) {
-  std::string path;
-
-  float factor = 0;
-  GURL url("http://some/random/username@email/and/more");
-  webui::ParsePathAndScale(url, &path, &factor);
-  EXPECT_EQ("random/username@email/and/more", path);
-  EXPECT_EQ(1.0f, factor);
-
-  factor = 0;
-  GURL url2("http://some/random/username/and/more");
-  webui::ParsePathAndScale(url2, &path, &factor);
-  EXPECT_EQ("random/username/and/more", path);
-  EXPECT_EQ(1.0f, factor);
-
-  factor = 0;
-  GURL url3("http://some/random/username/and/more@2ax");
-  webui::ParsePathAndScale(url3, &path, &factor);
-  EXPECT_EQ("random/username/and/more@2ax", path);
-  EXPECT_EQ(1.0f, factor);
-
-  factor = 0;
-  GURL url4("http://some/random/username/and/more@x");
-  webui::ParsePathAndScale(url4, &path, &factor);
-  EXPECT_EQ("random/username/and/more@x", path);
-  EXPECT_EQ(1.0f, factor);
-
-  factor = 0;
-  GURL url5("http://some/random/username@email/and/more@2x");
-  webui::ParsePathAndScale(url5, &path, &factor);
-  EXPECT_EQ("random/username@email/and/more", path);
-  EXPECT_EQ(2.0f, factor);
-
-  factor = 0;
-  GURL url6("http://some/random/username/and/more@1.4x");
-  webui::ParsePathAndScale(url6, &path, &factor);
-  EXPECT_EQ("random/username/and/more", path);
-  EXPECT_EQ(1.4f, factor);
-
-  factor = 0;
-  GURL url7("http://some/random/username/and/more@1.3x");
-  webui::ParsePathAndScale(url7, &path, &factor);
-  EXPECT_EQ("random/username/and/more", path);
-  EXPECT_EQ(1.3f, factor);
-}
-
 TEST(WebUIUtilTest, ParsePathAndImageSpec) {
   std::string path;
 
diff --git a/ui/base/x/BUILD.gn b/ui/base/x/BUILD.gn
index de5b20d..67a3aae2 100644
--- a/ui/base/x/BUILD.gn
+++ b/ui/base/x/BUILD.gn
@@ -61,6 +61,8 @@
     "x11_xrandr_interval_only_vsync_provider.h",
   ]
 
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
+
   defines = [ "IS_UI_BASE_X_IMPL" ]
 
   public_deps = [
@@ -122,7 +124,10 @@
     "x11_gl_egl_utility.h",
   ]
 
-  configs += [ "//third_party/khronos:khronos_headers" ]
+  configs += [
+    "//build/config/compiler:wexit_time_destructors",
+    "//third_party/khronos:khronos_headers",
+  ]
   deps = [
     ":x",
     "//base",
diff --git a/ui/base/x/selection_utils.cc b/ui/base/x/selection_utils.cc
index 95c351e..17f0c29 100644
--- a/ui/base/x/selection_utils.cc
+++ b/ui/base/x/selection_utils.cc
@@ -22,22 +22,17 @@
 namespace ui {
 
 std::vector<x11::Atom> GetTextAtomsFrom() {
-  static const std::vector<x11::Atom> atoms = {
-      x11::GetAtom(kMimeTypeLinuxUtf8String),
-      x11::GetAtom(kMimeTypeLinuxString), x11::GetAtom(kMimeTypeLinuxText),
-      x11::GetAtom(kMimeTypeText), x11::GetAtom(kMimeTypeTextUtf8)};
-  return atoms;
+  return {x11::GetAtom(kMimeTypeLinuxUtf8String),
+          x11::GetAtom(kMimeTypeLinuxString), x11::GetAtom(kMimeTypeLinuxText),
+          x11::GetAtom(kMimeTypeText), x11::GetAtom(kMimeTypeTextUtf8)};
 }
 
 std::vector<x11::Atom> GetURLAtomsFrom() {
-  static const std::vector<x11::Atom> atoms = {
-      x11::GetAtom(kMimeTypeURIList), x11::GetAtom(kMimeTypeMozillaURL)};
-  return atoms;
+  return {x11::GetAtom(kMimeTypeURIList), x11::GetAtom(kMimeTypeMozillaURL)};
 }
 
 std::vector<x11::Atom> GetURIListAtomsFrom() {
-  static const std::vector<x11::Atom> atoms = {x11::GetAtom(kMimeTypeURIList)};
-  return atoms;
+  return {x11::GetAtom(kMimeTypeURIList)};
 }
 
 void GetAtomIntersection(const std::vector<x11::Atom>& desired,
diff --git a/ui/chromeos/events/keyboard_capability.cc b/ui/chromeos/events/keyboard_capability.cc
index 44807190..46bfdfa 100644
--- a/ui/chromeos/events/keyboard_capability.cc
+++ b/ui/chromeos/events/keyboard_capability.cc
@@ -7,6 +7,9 @@
 #include "base/containers/contains.h"
 #include "base/containers/flat_set.h"
 #include "base/no_destructor.h"
+#include "ui/chromeos/events/event_rewriter_chromeos.h"
+#include "ui/chromeos/events/keyboard_layout_util.h"
+#include "ui/events/devices/device_data_manager.h"
 
 namespace ui {
 
@@ -64,4 +67,22 @@
   return base::Contains(*top_row_action_keys, key_code);
 }
 
+bool KeyboardCapability::HasLauncherButton(
+    const absl::optional<InputDevice>& keyboard) {
+  // Use current implementation. If keyboard is provided, launcher button
+  // depends on if this keyboard is layout2 type. If keyboard is not provided,
+  // launcher button depends on if any keyboard in DeviceDataManager is layout2
+  // type.
+  // TODO(zhangwenyu): Handle edge cases.
+  if (!keyboard.has_value()) {
+    // DeviceUsesKeyboardLayout2() relies on DeviceDataManager.
+    DCHECK(DeviceDataManager::HasInstance());
+    DCHECK(DeviceDataManager::GetInstance()->AreDeviceListsComplete());
+    return DeviceUsesKeyboardLayout2();
+  }
+
+  return EventRewriterChromeOS::GetKeyboardTopRowLayout(keyboard.value()) ==
+         KeyboardTopRowLayout::kKbdTopRowLayout2;
+}
+
 }  // namespace ui
diff --git a/ui/chromeos/events/keyboard_capability.h b/ui/chromeos/events/keyboard_capability.h
index a272fe9..568c75f 100644
--- a/ui/chromeos/events/keyboard_capability.h
+++ b/ui/chromeos/events/keyboard_capability.h
@@ -6,7 +6,9 @@
 #define UI_CHROMEOS_EVENTS_KEYBOARD_CAPABILITY_H_
 
 #include "base/containers/fixed_flat_map.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/base/accelerators/accelerator.h"
+#include "ui/events/devices/input_device.h"
 #include "ui/events/keycodes/keyboard_codes_posix.h"
 
 namespace ui {
@@ -136,6 +138,11 @@
   // TODO(zhangwenyu): Support all 4 legacy layouts and custom vivaldi layouts.
   bool IsTopRowKey(const ui::KeyboardCode& key_code) const;
 
+  // Check if a keyboard has a launcher button rather than a search button.
+  // TODO(zhangwenyu): Handle command key and window key cases.
+  bool HasLauncherButton(
+      const absl::optional<InputDevice>& keyboard = absl::nullopt);
+
  private:
   std::unique_ptr<Delegate> delegate_;
 };
diff --git a/ui/file_manager/file_manager/foreground/js/ui/multi_menu_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/multi_menu_unittest.js
index 63aa855..95bc3d10 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/multi_menu_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/multi_menu_unittest.js
@@ -447,3 +447,26 @@
   // Check the second sub menu is visible.
   assertFalse(secondSubMenu.hasAttribute('hidden'));
 }
+
+/**
+ * Tests that a keydown event that is not intended for the menu will not be
+ * consumed by the menu.
+ */
+export async function testMenuDoesNotConsumeNonMenuEvent() {
+  let eventConsumedByMenu = true;
+  const nonMenuEventKey = 'AudioVolumeUp';
+  // The event should be received by the `document.body` after it is ignored by
+  // the menu.
+  document.body.addEventListener('keydown', e => {
+    eventConsumedByMenu = false;
+    // Check this is the right keydown event.
+    assertEquals(nonMenuEventKey, e.key);
+    // Confirm this is not a menu event.
+    assertFalse(menubutton.isMenuEvent(e));
+  });
+  // Send the event to the menu.
+  sendKeyDown('#test-menu-button', nonMenuEventKey);
+  // Wait for the event to be received by the `document.body`.
+  await new Promise(resolve => window.requestAnimationFrame(() => resolve()));
+  assertFalse(eventConsumedByMenu);
+}
diff --git a/ui/gfx/canvas.cc b/ui/gfx/canvas.cc
index 70fbd82..4f6651e 100644
--- a/ui/gfx/canvas.cc
+++ b/ui/gfx/canvas.cc
@@ -111,11 +111,11 @@
 }
 
 void Canvas::SaveLayerAlpha(uint8_t alpha) {
-  canvas_->saveLayerAlpha(alpha);
+  canvas_->saveLayerAlphaf(alpha / 255.0f);
 }
 
 void Canvas::SaveLayerAlpha(uint8_t alpha, const Rect& layer_bounds) {
-  canvas_->saveLayerAlpha(RectToSkRect(layer_bounds), alpha);
+  canvas_->saveLayerAlphaf(RectToSkRect(layer_bounds), alpha / 255.0f);
 }
 
 void Canvas::SaveLayerWithFlags(const cc::PaintFlags& flags) {
diff --git a/ui/views/controls/button/label_button_border.cc b/ui/views/controls/button/label_button_border.cc
index 9d16738..c8e3fb6 100644
--- a/ui/views/controls/button/label_button_border.cc
+++ b/ui/views/controls/button/label_button_border.cc
@@ -106,7 +106,7 @@
     {
       // First, modulate the background by 1 - alpha.
       cc::PaintCanvasAutoRestore auto_restore_alpha(canvas->sk_canvas(), false);
-      canvas->sk_canvas()->saveLayerAlpha(sk_rect, 255 - fg_alpha);
+      canvas->SaveLayerAlpha(255 - fg_alpha, rect);
       state = native_theme_delegate->GetBackgroundThemeState(&extra);
       PaintHelper(this, canvas, state, rect, extra);
     }
diff --git a/ui/views/metadata/view_factory.h b/ui/views/metadata/view_factory.h
index f3816d9eec..d7dce6e 100644
--- a/ui/views/metadata/view_factory.h
+++ b/ui/views/metadata/view_factory.h
@@ -46,14 +46,14 @@
     return std::move(this->CopyAddressTo(view_address));
   }
 
-  template <typename View, typename Option>
-  Builder& CopyAddressTo(raw_ptr<View, Option>* view_address) & {
+  template <typename View, typename Traits>
+  Builder& CopyAddressTo(raw_ptr<View, Traits>* view_address) & {
     *view_address = view_ ? view_.get() : root_view_.get();
     return *static_cast<Builder*>(this);
   }
 
-  template <typename View, typename Option>
-  Builder&& CopyAddressTo(raw_ptr<View, Option>* view_address) && {
+  template <typename View, typename Traits>
+  Builder&& CopyAddressTo(raw_ptr<View, Traits>* view_address) && {
     return std::move(this->CopyAddressTo(view_address));
   }
 
diff --git a/ui/webui/resources/cr_components/color_change_listener/BUILD.gn b/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
index 601d716..1daa3ba 100644
--- a/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
+++ b/ui/webui/resources/cr_components/color_change_listener/BUILD.gn
@@ -11,6 +11,7 @@
   sources = [ "color_change_listener.mojom" ]
   public_deps = [ "//mojo/public/mojom/base" ]
   webui_module_path = "chrome://resources/cr_components/color_change_listener/"
+  use_typescript_sources = true
 }
 
 build_cr_component("build") {
@@ -21,9 +22,10 @@
     "colors_css_updater.ts",
   ]
 
-  mojo_files_deps = [ ":mojom_js__generator" ]
-  mojo_files = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/color_change_listener/color_change_listener.mojom-webui.js" ]
+  mojo_files_deps = [ ":mojom_ts__generator" ]
+  mojo_files = [ "$target_gen_dir/color_change_listener.mojom-webui.ts" ]
 
+  ts_use_local_config = false
   tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/color_change_listener"
   ts_deps = [ "//ui/webui/resources/mojo:library" ]
 }
diff --git a/ui/webui/resources/cr_components/color_change_listener/tsconfig_base.json b/ui/webui/resources/cr_components/color_change_listener/tsconfig_base.json
deleted file mode 100644
index 5502828..0000000
--- a/ui/webui/resources/cr_components/color_change_listener/tsconfig_base.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "extends": "../../../../../tools/typescript/tsconfig_base.json",
-  "compilerOptions": {
-    "allowJs": true
-  }
-}
diff --git a/ui/webui/resources/cr_components/customize_themes/BUILD.gn b/ui/webui/resources/cr_components/customize_themes/BUILD.gn
index 2d55310..9cb2e97 100644
--- a/ui/webui/resources/cr_components/customize_themes/BUILD.gn
+++ b/ui/webui/resources/cr_components/customize_themes/BUILD.gn
@@ -17,6 +17,7 @@
   ]
 
   webui_module_path = "chrome://resources/cr_components/customize_themes/"
+  use_typescript_sources = true
 }
 
 build_cr_component("build") {
@@ -34,8 +35,8 @@
 
   non_web_component_files = [ "browser_proxy.ts" ]
 
-  mojo_files_deps = [ ":mojom_js__generator" ]
-  mojo_files = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/customize_themes/customize_themes.mojom-webui.js" ]
+  mojo_files_deps = [ ":mojom_ts__generator" ]
+  mojo_files = [ "$target_gen_dir/customize_themes.mojom-webui.ts" ]
 
   tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/customize_themes"
   ts_deps = [
diff --git a/ui/webui/resources/cr_components/customize_themes/tsconfig_base.json b/ui/webui/resources/cr_components/customize_themes/tsconfig_base.json
index 3f69ccee..1912694 100644
--- a/ui/webui/resources/cr_components/customize_themes/tsconfig_base.json
+++ b/ui/webui/resources/cr_components/customize_themes/tsconfig_base.json
@@ -1,7 +1,6 @@
 {
   "extends": "../../../../../tools/typescript/tsconfig_base.json",
   "compilerOptions": {
-    "allowJs": true,
     "noUncheckedIndexedAccess": false,
     "noUnusedLocals": false,
     "strictPropertyInitialization": false
diff --git a/ui/webui/resources/cr_components/help_bubble/BUILD.gn b/ui/webui/resources/cr_components/help_bubble/BUILD.gn
index 21716ba2..5f20883 100644
--- a/ui/webui/resources/cr_components/help_bubble/BUILD.gn
+++ b/ui/webui/resources/cr_components/help_bubble/BUILD.gn
@@ -19,6 +19,7 @@
     "//ui/gfx/geometry/mojom",
   ]
 
+  use_typescript_sources = true
   webui_module_path = "chrome://resources/cr_components/help_bubble/"
 }
 
@@ -66,8 +67,8 @@
 }
 
 copy("copy_mojom") {
-  deps = [ ":mojo_bindings_js__generator" ]
-  sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom-webui.js" ]
+  deps = [ ":mojo_bindings_ts__generator" ]
+  sources = [ "$target_gen_dir/help_bubble.mojom-webui.ts" ]
   outputs = [ "$preprocess_folder_tmp/{{source_file_part}}" ]
 }
 
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.gni b/ui/webui/resources/cr_components/help_bubble/help_bubble.gni
index 6409638..01b45f4 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble.gni
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.gni
@@ -25,6 +25,6 @@
   "help_bubble_controller.ts",
 ]
 
-mojo_files = [ "help_bubble.mojom-webui.js" ]
+mojo_files = [ "help_bubble.mojom-webui.ts" ]
 
 ts_files = _web_component_files + _non_web_component_files
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom b/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom
index bcde6f7..6b09bde 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.mojom
@@ -155,4 +155,9 @@
   // Invoked to hide the help bubble anchored to `native_identifier` if it
   // should no longer be shown.
   HideHelpBubble(string native_identifier);
+
+  // Notifies the client that an external help bubble (i.e. one owned/displayed
+  // by the handler) anchored to `native_identifier` has been shown or hidden.
+  // The client may change the visual appearance of the anchor as a result.
+  ExternalHelpBubbleUpdated(string native_identifier, bool shown);
 };
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
index 6a68408..6dd7954 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble.ts
@@ -21,14 +21,15 @@
 import {assert, assertNotReached} from '//resources/js/assert_ts.js';
 import {isWindows} from '//resources/js/platform.js';
 import {DomRepeat, DomRepeatEvent, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {InsetsF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
 
 import {getTemplate} from './help_bubble.html.js';
 import {HelpBubbleArrowPosition, HelpBubbleButtonParams, Progress} from './help_bubble.mojom-webui.js';
 
-const ANCHOR_HIGHLIGHT_CLASS = 'help-anchor-highlight';
-
 const ACTION_BUTTON_ID_PREFIX = 'action-button-';
 
+export const ANCHOR_HIGHLIGHT_CLASS = 'help-anchor-highlight';
+
 export const HELP_BUBBLE_DISMISSED_EVENT = 'help-bubble-dismissed';
 export const HELP_BUBBLE_TIMED_OUT_EVENT = 'help-bubble-timed-out';
 
@@ -107,6 +108,7 @@
   timeoutTimerId: number|null = null;
   debouncedUpdate: ResizeListener|EventListenerOrEventListenerObject|null =
       null;
+  padding: InsetsF = new InsetsF();
 
   /**
    * HTMLElement corresponding to |this.nativeId|.
@@ -395,22 +397,22 @@
       case HelpBubbleArrowPosition.TOP_LEFT:
       case HelpBubbleArrowPosition.TOP_CENTER:
       case HelpBubbleArrowPosition.TOP_RIGHT:
-        offsetY += anchorRect.height + ANCHOR_OFFSET;
+        offsetY += anchorRect.height + ANCHOR_OFFSET + this.padding.bottom;
         break;
       case HelpBubbleArrowPosition.BOTTOM_LEFT:
       case HelpBubbleArrowPosition.BOTTOM_CENTER:
       case HelpBubbleArrowPosition.BOTTOM_RIGHT:
-        offsetY -= (helpBubbleRect.height + ANCHOR_OFFSET);
+        offsetY -= (helpBubbleRect.height + ANCHOR_OFFSET + this.padding.top);
         break;
       case HelpBubbleArrowPosition.LEFT_TOP:
       case HelpBubbleArrowPosition.LEFT_CENTER:
       case HelpBubbleArrowPosition.LEFT_BOTTOM:
-        offsetX += anchorRect.width + ANCHOR_OFFSET;
+        offsetX += anchorRect.width + ANCHOR_OFFSET + this.padding.right;
         break;
       case HelpBubbleArrowPosition.RIGHT_TOP:
       case HelpBubbleArrowPosition.RIGHT_CENTER:
       case HelpBubbleArrowPosition.RIGHT_BOTTOM:
-        offsetX -= (helpBubbleRect.width + ANCHOR_OFFSET);
+        offsetX -= (helpBubbleRect.width + ANCHOR_OFFSET + this.padding.left);
         break;
       default:
         assertNotReached();
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
index 1637ece4..bcf4789 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble_controller.ts
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert_ts.js';
+import {InsetsF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
 
 import {HelpBubbleElement} from './help_bubble.js';
 import {HelpBubbleParams} from './help_bubble.mojom-webui.js';
@@ -23,6 +24,7 @@
   private anchor_: HTMLElement|null = null;
   private showing_: boolean = false;
   private bubble_: HelpBubbleElement|null = null;
+  private padding_: InsetsF = new InsetsF();
 
   constructor(nativeId: string, root: ShadowRoot) {
     assert(nativeId && root);
@@ -51,7 +53,11 @@
     return this.nativeId_;
   }
 
-  track(trackable: Trackable): boolean {
+  getPadding() {
+    return this.padding_;
+  }
+
+  track(trackable: Trackable, padding: InsetsF): boolean {
     assert(!this.anchor_);
 
     let anchor: HTMLElement|null = null;
@@ -71,6 +77,7 @@
 
     anchor.dataset['nativeId'] = this.nativeId_;
     this.anchor_ = anchor;
+    this.padding_ = padding;
     return true;
   }
 
@@ -131,6 +138,7 @@
     this.bubble_.titleText = params.titleText || '';
     this.bubble_.progress = params.progress || null;
     this.bubble_.buttons = params.buttons;
+    this.bubble_.padding = this.padding_;
 
     if (params.timeout) {
       this.bubble_.timeoutMs = Number(params.timeout!.microseconds / 1000n);
diff --git a/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts b/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
index 88207aaa..220133d0a 100644
--- a/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
+++ b/ui/webui/resources/cr_components/help_bubble/help_bubble_mixin.ts
@@ -20,10 +20,10 @@
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {EventTracker} from 'chrome://resources/js/event_tracker.js';
-import {RectF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
+import {InsetsF, RectF} from 'chrome://resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
 import {dedupingMixin, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {HELP_BUBBLE_DISMISSED_EVENT, HELP_BUBBLE_TIMED_OUT_EVENT, HelpBubbleDismissedEvent, HelpBubbleElement} from './help_bubble.js';
+import {ANCHOR_HIGHLIGHT_CLASS, HELP_BUBBLE_DISMISSED_EVENT, HELP_BUBBLE_TIMED_OUT_EVENT, HelpBubbleDismissedEvent, HelpBubbleElement} from './help_bubble.js';
 import {HelpBubbleClientCallbackRouter, HelpBubbleClosedReason, HelpBubbleHandlerInterface, HelpBubbleParams} from './help_bubble.mojom-webui.js';
 import {HelpBubbleController, Trackable} from './help_bubble_controller.js';
 import {HelpBubbleProxyImpl} from './help_bubble_proxy.js';
@@ -70,7 +70,9 @@
               router.toggleFocusForAccessibility.addListener(
                   this.onToggleHelpBubbleFocusForAccessibility_.bind(this)),
               router.hideHelpBubble.addListener(
-                  this.onHideHelpBubble_.bind(this)));
+                  this.onHideHelpBubble_.bind(this)),
+              router.externalHelpBubbleUpdated.addListener(
+                  this.onExternalHelpBubbleUpdated_.bind(this)));
 
           this.helpBubbleAnchorObserver_ = new IntersectionObserver(
               entries => entries.forEach(
@@ -129,9 +131,19 @@
          * nativeId to a new element/selector. If the help bubble is already
          * showing, the registration will fail and return null. If successful,
          * this method returns the new controller.
+         *
+         * Optionally, an object may be supplied to add to the default margin
+         * around the anchor element in all 4 directions, e.g. {"top":5}
+         * adds 5 pixels to the margin at the top off the anchor element.
+         * The margin is used when calculating how far the help bubble should
+         * be spaced from the anchor element. Larger values equate to a larger
+         * visual gap. These values must be positive integers in the range
+         * [0, 20]. This option should be used sparingly where the help
+         * bubble would otherwise conceal important UI.
          */
-        registerHelpBubble(nativeId: string, trackable: Trackable):
-            HelpBubbleController|null {
+        registerHelpBubble(
+            nativeId: string, trackable: Trackable,
+            padding: Padding = {}): HelpBubbleController|null {
           if (this.helpBubbleControllerById_.has(nativeId)) {
             const ctrl = this.helpBubbleControllerById_.get(nativeId);
             if (ctrl && ctrl.isShowing()) {
@@ -141,7 +153,7 @@
           }
           const controller =
               new HelpBubbleController(nativeId, this.shadowRoot!);
-          controller.track(trackable);
+          controller.track(trackable, paddingToInsets(padding));
           this.helpBubbleControllerById_.set(nativeId, controller);
           // This can be called before or after `connectedCallback()`, so if the
           // component isn't connected and the observer set up yet, delay
@@ -335,6 +347,15 @@
             rect.y = bounds.y;
             rect.width = bounds.width;
             rect.height = bounds.height;
+
+            const bubble = this.helpBubbleControllerById_.get(nativeId);
+            if (bubble) {
+              const padding = bubble.getPadding();
+              rect.x -= padding.left;
+              rect.y -= padding.top;
+              rect.width += padding.left + padding.right;
+              rect.height += padding.top + padding.bottom;
+            }
           }
           this.helpBubbleHandler_.helpBubbleAnchorVisibilityChanged(
               nativeId, isVisible, rect);
@@ -381,6 +402,27 @@
         }
 
         /**
+         * This event is emitted by the mojo router.
+         */
+        private onExternalHelpBubbleUpdated_(nativeId: string, shown: boolean) {
+          if (!this.helpBubbleControllerById_.has(nativeId)) {
+            // Identifier not handled by this mixin.
+            return;
+          }
+
+          // Get the associated bubble anchor and verify that it is present.
+          const bubble = this.helpBubbleControllerById_.get(nativeId)!;
+          const anchor = bubble.getAnchor();
+          if (!anchor) {
+            return;
+          }
+
+          // Toggle the highlight class on or off as appropriate. Currently, no
+          // other action is needed.
+          anchor.classList.toggle(ANCHOR_HIGHLIGHT_CLASS, shown);
+        }
+
+        /**
          * This event is emitted by the help-bubble component
          */
         private onHelpBubbleDismissed_(e: HelpBubbleDismissedEvent) {
@@ -419,7 +461,7 @@
     });
 
 export interface HelpBubbleMixinInterface {
-  registerHelpBubble(nativeId: string, trackable: Trackable):
+  registerHelpBubble(nativeId: string, trackable: Trackable, padding?: Padding):
       HelpBubbleController|null;
   unregisterHelpBubble(nativeId: string): void;
   isHelpBubbleShowing(): boolean;
@@ -433,3 +475,23 @@
   notifyHelpBubbleAnchorCustomEvent(anchorId: string, customEvent: string):
       boolean;
 }
+
+export interface Padding {
+  top?: number;
+  left?: number;
+  bottom?: number;
+  right?: number;
+}
+
+export function paddingToInsets(padding: Padding) {
+  const insets = new InsetsF();
+  insets.top = clampPadding(padding.top);
+  insets.left = clampPadding(padding.left);
+  insets.bottom = clampPadding(padding.bottom);
+  insets.right = clampPadding(padding.right);
+  return insets;
+}
+
+function clampPadding(n: number = 0) {
+  return Math.max(0, Math.min(20, n));
+}
diff --git a/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json b/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json
index 3f69ccee..1912694 100644
--- a/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json
+++ b/ui/webui/resources/cr_components/help_bubble/tsconfig_base.json
@@ -1,7 +1,6 @@
 {
   "extends": "../../../../../tools/typescript/tsconfig_base.json",
   "compilerOptions": {
-    "allowJs": true,
     "noUncheckedIndexedAccess": false,
     "noUnusedLocals": false,
     "strictPropertyInitialization": false
diff --git a/ui/webui/resources/cr_components/history_clusters/BUILD.gn b/ui/webui/resources/cr_components/history_clusters/BUILD.gn
index bcd279c9..ab39d674 100644
--- a/ui/webui/resources/cr_components/history_clusters/BUILD.gn
+++ b/ui/webui/resources/cr_components/history_clusters/BUILD.gn
@@ -17,6 +17,7 @@
     "//url/mojom:url_mojom_gurl",
   ]
   webui_module_path = "chrome://resources/cr_components/history_clusters/"
+  use_typescript_sources = true
 }
 
 build_cr_component("build") {
@@ -42,8 +43,8 @@
     "shared_vars.css",
   ]
 
-  mojo_files_deps = [ ":mojo_bindings_js__generator" ]
-  mojo_files = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom-webui.js" ]
+  mojo_files_deps = [ ":mojo_bindings_ts__generator" ]
+  mojo_files = [ "$target_gen_dir/history_clusters.mojom-webui.ts" ]
 
   tsc_dir = "$root_gen_dir/ui/webui/resources/preprocessed/cr_components/history_clusters"
   ts_definitions = [ "//tools/typescript/definitions/metrics_private.d.ts" ]
diff --git a/ui/webui/resources/cr_components/history_clusters/tsconfig_base.json b/ui/webui/resources/cr_components/history_clusters/tsconfig_base.json
index 3f69ccee..1912694 100644
--- a/ui/webui/resources/cr_components/history_clusters/tsconfig_base.json
+++ b/ui/webui/resources/cr_components/history_clusters/tsconfig_base.json
@@ -1,7 +1,6 @@
 {
   "extends": "../../../../../tools/typescript/tsconfig_base.json",
   "compilerOptions": {
-    "allowJs": true,
     "noUncheckedIndexedAccess": false,
     "noUnusedLocals": false,
     "strictPropertyInitialization": false
diff --git a/ui/webui/resources/cr_components/most_visited/BUILD.gn b/ui/webui/resources/cr_components/most_visited/BUILD.gn
index aec4c74..c1d671873 100644
--- a/ui/webui/resources/cr_components/most_visited/BUILD.gn
+++ b/ui/webui/resources/cr_components/most_visited/BUILD.gn
@@ -21,6 +21,7 @@
     "//skia/public/mojom",
     "//url/mojom:url_mojom_gurl",
   ]
+  use_typescript_sources = true
   webui_module_path = "chrome://resources/cr_components/most_visited/"
 }
 
@@ -29,12 +30,6 @@
   minify = optimize_webui
 }
 
-copy("copy_mojom") {
-  deps = [ ":mojom_js__generator" ]
-  sources = [ "$root_gen_dir/mojom-webui/ui/webui/resources/cr_components/most_visited/most_visited.mojom-webui.js" ]
-  outputs = [ "$target_gen_dir/{{source_file_part}}" ]
-}
-
 copy("copy_src") {
   sources = ts_files
   outputs = [ "$target_gen_dir/{{source_file_part}}" ]
@@ -52,9 +47,9 @@
     "//ui/webui/resources/mojo:library",
   ]
   extra_deps = [
-    ":copy_mojom",
     ":copy_src",
     ":html_wrapper_files",
+    ":mojom_ts__generator",
   ]
 }
 
diff --git a/ui/webui/resources/cr_components/most_visited/most_visited.gni b/ui/webui/resources/cr_components/most_visited/most_visited.gni
index a17e16f..4e6dc9a 100644
--- a/ui/webui/resources/cr_components/most_visited/most_visited.gni
+++ b/ui/webui/resources/cr_components/most_visited/most_visited.gni
@@ -22,6 +22,6 @@
   "window_proxy.ts",
 ]
 
-mojo_files = [ "most_visited.mojom-webui.js" ]
+mojo_files = [ "most_visited.mojom-webui.ts" ]
 
 ts_files = _web_component_files + _non_web_component_files
diff --git a/ui/webui/resources/cr_components/most_visited/tsconfig_base.json b/ui/webui/resources/cr_components/most_visited/tsconfig_base.json
index 3f69ccee..1912694 100644
--- a/ui/webui/resources/cr_components/most_visited/tsconfig_base.json
+++ b/ui/webui/resources/cr_components/most_visited/tsconfig_base.json
@@ -1,7 +1,6 @@
 {
   "extends": "../../../../../tools/typescript/tsconfig_base.json",
   "compilerOptions": {
-    "allowJs": true,
     "noUncheckedIndexedAccess": false,
     "noUnusedLocals": false,
     "strictPropertyInitialization": false
diff --git a/ui/webui/resources/js/ios/BUILD.gn b/ui/webui/resources/js/ios/BUILD.gn
deleted file mode 100644
index 25fd7147..0000000
--- a/ui/webui/resources/js/ios/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2019 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-js_type_check("closure_compile") {
-  deps = [ ":web_ui" ]
-}
-
-js_library("web_ui") {
-  deps = [ ":mojo_api" ]
-}
-
-js_library("mojo_api") {
-}
diff --git a/ui/wm/core/cursor_loader.cc b/ui/wm/core/cursor_loader.cc
index 20a96a3..eb840093 100644
--- a/ui/wm/core/cursor_loader.cc
+++ b/ui/wm/core/cursor_loader.cc
@@ -50,6 +50,7 @@
 
 bool CursorLoader::SetDisplayData(display::Display::Rotation rotation,
                                   float scale) {
+  DCHECK_GT(scale, 0);
   if (rotation_ == rotation && scale_ == scale)
     return false;
 
diff --git a/ui/wm/core/cursor_loader_unittest.cc b/ui/wm/core/cursor_loader_unittest.cc
index 3f222a6..6e199b4 100644
--- a/ui/wm/core/cursor_loader_unittest.cc
+++ b/ui/wm/core/cursor_loader_unittest.cc
@@ -118,4 +118,30 @@
   EXPECT_EQ(GetCursorHotspot(custom_cursor), kHotspot);
 }
 
+// Test the cursor image cache when fallbacks for system cursors are used.
+TEST_F(CursorLoaderTest, ImageCursorCache) {
+  CursorLoader cursor_loader(/*use_platform_cursors=*/false);
+  ui::Cursor cursor(CursorType::kPointer);
+  cursor_loader.SetPlatformCursor(&cursor);
+
+  // CursorLoader should keep a ref in its cursor cache.
+  auto platform_cursor = cursor.platform();
+  cursor.SetPlatformCursor(nullptr);
+  EXPECT_FALSE(platform_cursor->HasOneRef());
+
+  // Invalidate the cursor cache by changing the rotation.
+  cursor_loader.SetDisplayData(display::Display::ROTATE_90,
+                               cursor_loader.scale());
+  EXPECT_TRUE(platform_cursor->HasOneRef());
+
+  // Invalidate the cursor cache by changing the scale.
+  cursor_loader.SetPlatformCursor(&cursor);
+  platform_cursor = cursor.platform();
+  cursor.SetPlatformCursor(nullptr);
+  EXPECT_FALSE(platform_cursor->HasOneRef());
+  cursor_loader.SetDisplayData(cursor_loader.rotation(),
+                               cursor_loader.scale() * 2);
+  EXPECT_TRUE(platform_cursor->HasOneRef());
+}
+
 }  // namespace wm